kling_master_image
Convert images into dynamic videos by providing a motion description prompt, configuring duration, aspect ratio, and enhancing output precision with advanced settings.
Instructions
Kling 2.1 Master I2V - Premium image-to-video conversion
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| aspect_ratio | No | 16:9 | |
| cfg_scale | No | How closely to follow the prompt | |
| duration | No | Video duration in seconds | 5 |
| image_url | Yes | URL of the input image | |
| negative_prompt | No | What to avoid in the video | |
| prompt | Yes | Motion description prompt |
Implementation Reference
- src/index.ts:121-121 (registration)Registration of the 'kling_master_image' tool in the MODEL_REGISTRY.imageToVideo array, defining its id, endpoint, name, and description.{ id: 'kling_master_image', endpoint: 'fal-ai/kling-video/v2.1/master/image-to-video', name: 'Kling 2.1 Master I2V', description: 'Premium image-to-video conversion' },
- src/index.ts:380-390 (schema)Dynamic input schema generation for image-to-video tools, including kling_master_image, defining parameters like image_url, prompt, duration, etc.} else if (category === 'imageToVideo') { baseSchema.inputSchema.properties = { image_url: { type: 'string', description: 'URL of the input image' }, prompt: { type: 'string', description: 'Motion description prompt' }, duration: { type: 'string', enum: ['5', '10'], default: '5', description: 'Video duration in seconds' }, aspect_ratio: { type: 'string', enum: ['16:9', '9:16', '1:1'], default: '16:9' }, negative_prompt: { type: 'string', description: 'What to avoid in the video' }, cfg_scale: { type: 'number', default: 0.5, minimum: 0, maximum: 1, description: 'How closely to follow the prompt' } }; baseSchema.inputSchema.required = ['image_url', 'prompt']; }
- src/index.ts:404-408 (registration)Registration of image-to-video tools, including kling_master_image, in the list_tools handler by generating schemas dynamically.tools.push(this.generateToolSchema(model, 'textToVideo')); } for (const model of MODEL_REGISTRY.imageToVideo) { tools.push(this.generateToolSchema(model, 'imageToVideo')); }
- src/index.ts:478-482 (handler)Dispatch logic in the main tool call handler that routes kling_master_image calls to the image-to-video handler.} else if (MODEL_REGISTRY.textToVideo.find(m => m.id === name)) { return await this.handleTextToVideo(args, model); } else if (MODEL_REGISTRY.imageToVideo.find(m => m.id === name)) { return await this.handleImageToVideo(args, model); }
- src/index.ts:566-625 (handler)Core handler implementation for the kling_master_image tool. Processes arguments, configures FAL client, subscribes to the Kling endpoint via fal.subscribe, downloads and processes the generated video, and returns formatted content with download links and metadata.private async handleImageToVideo(args: any, model: any) { const { image_url, prompt, duration = '5', aspect_ratio = '16:9', negative_prompt, cfg_scale } = args; try { // Configure FAL client lazily with query config override configureFalClient(this.currentQueryConfig); const inputParams: any = { image_url, prompt }; // Add optional parameters if (duration) inputParams.duration = duration; if (aspect_ratio) inputParams.aspect_ratio = aspect_ratio; if (negative_prompt) inputParams.negative_prompt = negative_prompt; if (cfg_scale !== undefined) inputParams.cfg_scale = cfg_scale; const result = await fal.subscribe(model.endpoint, { input: inputParams }); const videoData = result.data as FalVideoResult; const videoProcessed = await downloadAndProcessVideo(videoData.video.url, model.id); return { content: [ { type: 'text', text: JSON.stringify({ model: model.name, id: model.id, endpoint: model.endpoint, input_image: image_url, prompt, video: { url: videoData.video.url, localPath: videoProcessed.localPath, ...(videoProcessed.dataUrl && { dataUrl: videoProcessed.dataUrl }), width: videoData.video.width, height: videoData.video.height, }, metadata: inputParams, download_path: DOWNLOAD_PATH, data_url_settings: { enabled: ENABLE_DATA_URLS, max_size_mb: Math.round(MAX_DATA_URL_SIZE / 1024 / 1024), }, autoopen_settings: { enabled: AUTOOPEN, note: AUTOOPEN ? "Files automatically opened with default application" : "Auto-open disabled" }, }, null, 2), }, ], }; } catch (error) { throw new Error(`${model.name} generation failed: ${error}`); } }