99 lines
3.7 KiB
Python
99 lines
3.7 KiB
Python
"""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}"}
|