import { z } from 'zod';
import { VolcengineAPI } from './volcengine-api';
import {
VolcengineImageGenerationToolArgs,
SUPPORTED_SIZES,
DEFAULT_MODEL,
DEFAULT_SIZE,
DEFAULT_RESPONSE_FORMAT
} from './types';
export const generateImageSchema = z.object({
prompt: z.string().min(1, 'Prompt is required').max(1000, 'Prompt too long'),
model: z.string().default(DEFAULT_MODEL),
size: z.enum(SUPPORTED_SIZES).default(DEFAULT_SIZE),
seed: z.number().int().min(-1).max(2147483647).optional(),
guidance_scale: z.number().min(1).max(10).optional(),
watermark: z.boolean().default(true),
response_format: z.enum(['url', 'b64_json']).default(DEFAULT_RESPONSE_FORMAT),
});
export class ImageGenerationTools {
private api: VolcengineAPI;
constructor(apiKey: string) {
this.api = new VolcengineAPI(apiKey);
}
async generateImage(args: VolcengineImageGenerationToolArgs) {
try {
const validatedArgs = generateImageSchema.parse(args);
const request = {
model: validatedArgs.model,
prompt: validatedArgs.prompt,
response_format: validatedArgs.response_format,
size: validatedArgs.size,
seed: validatedArgs.seed,
guidance_scale: validatedArgs.guidance_scale,
watermark: validatedArgs.watermark,
};
const response = await this.api.generateImage(request);
return {
success: true,
data: {
model: response.model,
created: response.created,
images: response.data,
usage: response.usage,
},
};
} catch (error) {
return {
success: false,
error: error instanceof Error ? error.message : 'Unknown error occurred',
};
}
}
getToolDefinition() {
return {
name: 'generate_image',
description: 'Generate images using Volcengine\'s text-to-image API',
inputSchema: {
type: 'object',
properties: {
prompt: {
type: 'string',
description: 'Text prompt for image generation (max 1000 characters)',
},
model: {
type: 'string',
description: 'Model to use for image generation',
default: DEFAULT_MODEL,
},
size: {
type: 'string',
description: 'Image size dimensions',
enum: SUPPORTED_SIZES,
default: DEFAULT_SIZE,
},
seed: {
type: 'number',
description: 'Random seed for reproducible results (-1 for random)',
minimum: -1,
maximum: 2147483647,
},
guidance_scale: {
type: 'number',
description: 'How closely to follow the prompt (1-10)',
minimum: 1,
maximum: 10,
},
watermark: {
type: 'boolean',
description: 'Whether to add watermark to generated images',
default: true,
},
response_format: {
type: 'string',
description: 'Format for returned image data',
enum: ['url', 'b64_json'],
default: DEFAULT_RESPONSE_FORMAT,
},
},
required: ['prompt'],
},
};
}
}