"""Agent 可调用的工具定义和实现。""" from app.services.image_gen import generate_images from app.services.view_transform import transform_view # OpenAI Function Calling 格式的工具定义 TOOL_DEFINITIONS = [ { "type": "function", "function": { "name": "generate_image", "description": ( "根据文字描述生成图片。prompt 必须是英文。" "如果用户提供了参考图,会自动传入 ref_image_url 参数。" "若当前生图模型为 Stable Diffusion XL,可在正提示后单独一行写 ---NEGATIVE--- 再写负向提示;" "不传则服务端会使用该模型的默认负向词。" ), "parameters": { "type": "object", "properties": { "prompt": { "type": "string", "description": "英文图片描述 prompt,详细描述要生成的图片内容、风格、颜色等", }, "num_images": { "type": "integer", "description": "生成图片数量,1-4 张", "default": 1, "minimum": 1, "maximum": 4, }, }, "required": ["prompt"], }, }, }, { "type": "function", "function": { "name": "transform_view", "description": ( "将一张图片转换为多个不同视角。" "使用 Zero123++ 模型从单张图片生成 6 个固定视角的图片。" "适用于建筑、物体等需要从不同角度查看的场景。" "输入图片必须是正方形(或会被自动裁切为正方形),建议分辨率 >= 320x320。" "输出 6 个视角:方位角 30°/90°/150°/210°/270°/330°," "仰角交替为 30°/-20°(正俯视/微仰视)。" "此工具需要参考图作为输入——必须先有用户上传的图片才能使用。" ), "parameters": { "type": "object", "properties": {}, "required": [], }, }, }, ] async def execute_tool( tool_name: str, arguments: dict, ref_image_urls: list[str] | None = None, image_model: str | None = None, ) -> dict: """执行工具调用,返回结果。""" if tool_name == "generate_image": prompt = arguments["prompt"] num_images = arguments.get("num_images", 1) result = await generate_images( prompt=prompt, num_images=num_images, ref_image_urls=ref_image_urls, model_id=image_model, ) valid_urls = [u for u in result.urls if not u.startswith("[")] errors = [u for u in result.urls if u.startswith("[")] return { "success": len(valid_urls) > 0, "images": valid_urls, "errors": errors, "prompt_used": prompt, "effective_prompt": result.effective_prompt, "negative_prompt": result.negative_prompt, "model_name": result.model_name, "model_id": result.model_id, } if tool_name == "transform_view": if not ref_image_urls: return { "success": False, "error": "视角变换需要一张输入图片,请先上传参考图", } result = await transform_view(ref_image_urls[0]) return result return {"success": False, "error": f"未知工具: {tool_name}"}