UNPKG

cloudflare-image-mcp

Version:
135 lines 5.52 kB
import { getModelByName } from '../models/index.js'; /** * Generate dynamic tool schema for generate_image based on the configured model's capabilities */ export function generateImageToolSchema(defaultModel) { const model = getModelByName(defaultModel); const config = model.config; // Base properties that are always available const properties = { prompt: { type: 'string', description: 'Text description of a single image to generate. Quantity is controlled by num_outputs params, not the prompt. Include compositions like collage/grid only when the user explicitly requests it.', }, seed: { type: 'number', description: 'Random seed for reproducible results', }, num_outputs: { type: 'number', description: 'Number of images to generate (range: 1-8, default: 1). Tip: If user requests multiple images but doesn\'t specify a count, use 4 for a good variety.', default: 1, minimum: 1, maximum: 8, }, }; // Conditionally add size parameter if supported if (config.supportsSize) { properties.size = { type: 'string', description: `Image size in format "widthxheight" (e.g., "1024x1024"). Default: ${config.defaultSize || '1024x1024'}`, default: config.defaultSize || '1024x1024', }; } // Conditionally add negativePrompt parameter if supported if (config.supportsNegativePrompt) { properties.negativePrompt = { type: 'string', description: 'Text describing what to avoid in the image', default: '', }; } // Conditionally add steps parameter with model-specific constraints properties.steps = { type: 'number', description: `Number of diffusion steps (range: 1-${config.maxSteps}, default: ${config.defaultSteps})`, default: config.defaultSteps, minimum: 1, maximum: config.maxSteps, }; // Conditionally add guidance parameter if supported if (config.supportsGuidance) { let guidanceDescription = `How closely to follow the prompt`; // Add model-specific guidance information if (config.guidanceRange) { guidanceDescription += ` (range: ${config.guidanceRange}`; if (config.defaultGuidance) { guidanceDescription += `, default: ${config.defaultGuidance}`; } guidanceDescription += ')'; } else if (config.defaultGuidance) { guidanceDescription += ` (default: ${config.defaultGuidance})`; } // Add model-specific notes if (config.guidanceValues) { guidanceDescription += `. Recommended values: ${config.guidanceValues.join(', ')}`; } if (model.name.includes('dreamshaper-8-lcm')) { guidanceDescription += '. Note: LCM model works best with lower guidance (1.0-2.0)'; } else if (model.name.includes('phoenix-1.0')) { guidanceDescription += '. Note: Use contrast 3.5 for medium, 4.0 for high contrast. Alchemy mode requires contrast ≥2.5'; } else if (model.name.includes('lucid-origin')) { guidanceDescription += '. Note: Use contrast 3.5 for medium quality'; } properties.guidance = { type: 'number', description: guidanceDescription, default: config.defaultGuidance || 7.5, }; } // Note: Image-to-image parameters (imageB64, strength) are not currently supported // by any of the available models, so they're not included in the dynamic schema // Build description with model-specific information let description = `Generate an image using ${model.name}`; // Add model-specific capabilities const capabilities = []; if (config.supportsNegativePrompt) capabilities.push('negative prompts'); if (config.supportsSize) capabilities.push('custom sizes'); if (config.supportsGuidance) capabilities.push('guidance control'); if (capabilities.length > 0) { description += ` with support for: ${capabilities.join(', ')}`; } // Add recommended usage if (config.recommendedFor) { description += `. Recommended for: ${config.recommendedFor}`; } // Add special notes if any if (config.notes) { description += `. ${config.notes}`; } return { name: 'generate_image', description, inputSchema: { type: 'object', properties, required: ['prompt'], }, }; } /** * Generate model-specific parameter validation message */ export function generateParameterValidationMessage(params, modelName, modelConfig) { const unsupportedParams = []; if (params.negativePrompt && !modelConfig.supportsNegativePrompt) { unsupportedParams.push('negativePrompt'); } if (params.size && params.size !== '1024x1024' && !modelConfig.supportsSize) { unsupportedParams.push('size'); } if (params.guidance && params.guidance !== 7.5 && !modelConfig.supportsGuidance) { unsupportedParams.push('guidance'); } if (unsupportedParams.length === 0) { return ''; } return `Note: The following parameters are not supported by ${modelName} and were ignored: ${unsupportedParams.join(', ')}`; } //# sourceMappingURL=tool-schema-generator.js.map