import { getAllToolConfigs } from "@/lib/db/queries"; export type RuntimeToolName = | "getWeather" | "createDocument" | "updateDocument" | "requestSuggestions" | "generateVideo"; export type AgentProjectToolName = | RuntimeToolName | "respondDirect" | "analyzeImage" | "generateImage" | "editImage" | "removeBackground" | "enhanceImage" | "extendImage" | "resizeImage" | "boxCutout" | "publishToCanvas" | "useSelectedCanvasImage" | "useLatestResultImage" | "useOriginalUploadImage"; export type ToolRegistry = Record; export interface AgentProjectToolDefinition { name: AgentProjectToolName; title: string; description: string; category: "conversation" | "image" | "video" | "document" | "utility" | "canvas"; runtimeTool?: RuntimeToolName; requiresImage?: boolean; requiresCanvasSelection?: boolean; requiresHistoryImage?: boolean; requiresCurrentUpload?: boolean; producesMedia?: boolean; } export interface AgentToolContext { hasImage?: boolean; hasCanvasSelection?: boolean; hasHistoryImage?: boolean; hasCurrentUpload?: boolean; } const RUNTIME_TOOL_DEFINITIONS: Array = [ { name: "getWeather", title: "天气查询", description: "查询天气并在对话中直接回答用户。", category: "utility", runtimeTool: "getWeather", }, { name: "createDocument", title: "创建文档", description: "按用户要求创建文档、草稿或结构化内容。", category: "document", runtimeTool: "createDocument", }, { name: "updateDocument", title: "更新文档", description: "继续修改已有文档、方案或草稿内容。", category: "document", runtimeTool: "updateDocument", }, { name: "requestSuggestions", title: "内容建议", description: "生成补充建议、优化意见或下一步选项。", category: "document", runtimeTool: "requestSuggestions", }, { name: "generateVideo", title: "视频生成", description: "根据文本或参考图生成视频。", category: "video", runtimeTool: "generateVideo", producesMedia: true, }, ]; const INTERNAL_AGENT_TOOLS: AgentProjectToolDefinition[] = [ { name: "respondDirect", title: "直接回复", description: "仅对话、解释、建议或策略讨论,不执行生图生视频。", category: "conversation", }, { name: "analyzeImage", title: "图片分析", description: "对当前图或历史图做识别、风格分析、质量评估、品牌/营销建议。", category: "image", requiresImage: true, }, { name: "generateImage", title: "图片生成", description: "根据文本或参考风格生成新图片。", category: "image", producesMedia: true, }, { name: "editImage", title: "图片编辑", description: "基于当前图进行抠图、换背景、增强、调色、尺寸调整、局部重绘等。", category: "image", requiresImage: true, producesMedia: true, }, { name: "removeBackground", title: "抠图去背", description: "提取主体、去除背景,适合商品图、人像、元素裁切。", category: "image", requiresImage: true, producesMedia: true, }, { name: "enhanceImage", title: "清晰增强", description: "提升清晰度、细节和质感,适合低清图修复与放大前预处理。", category: "image", requiresImage: true, producesMedia: true, }, { name: "extendImage", title: "扩图补边", description: "向四周延展画面,适合改比例、补全背景或生成更大构图。", category: "image", requiresImage: true, producesMedia: true, }, { name: "resizeImage", title: "尺寸调整", description: "调整画布尺寸、背景色与构图位置,适合电商主图、社媒比例适配。", category: "image", requiresImage: true, producesMedia: true, }, { name: "boxCutout", title: "框选抠图", description: "对目标图中的局部区域做框选裁切,再提取被框选主体。", category: "image", requiresImage: true, producesMedia: true, }, { name: "publishToCanvas", title: "发布到画布", description: "把当前结果图继续发送到无限画布或作为新的画布结果节点。", category: "canvas", producesMedia: false, }, { name: "useSelectedCanvasImage", title: "使用选中图", description: "将当前画布里选中的图片作为本轮分析或编辑目标。", category: "canvas", requiresImage: true, requiresCanvasSelection: true, }, { name: "useLatestResultImage", title: "使用最新结果图", description: "将上一轮生成结果作为连续对话和继续编辑的目标图。", category: "canvas", requiresImage: true, requiresHistoryImage: true, }, { name: "useOriginalUploadImage", title: "使用原上传图", description: "将最近上传的原图作为分析、修图或对比基准。", category: "canvas", requiresImage: true, requiresCurrentUpload: true, }, ]; const DEFAULT_RUNTIME_TOOLS = RUNTIME_TOOL_DEFINITIONS.map((tool) => tool.runtimeTool); function getAllAgentToolDefinitions(): AgentProjectToolDefinition[] { return [...INTERNAL_AGENT_TOOLS, ...RUNTIME_TOOL_DEFINITIONS]; } function matchesAgentToolContext( tool: AgentProjectToolDefinition, context?: AgentToolContext, ) { if (!context) return true; if (tool.requiresImage && !context.hasImage) return false; if (tool.requiresCanvasSelection && !context.hasCanvasSelection) return false; if (tool.requiresHistoryImage && !context.hasHistoryImage) return false; if (tool.requiresCurrentUpload && !context.hasCurrentUpload) return false; return true; } /** * 获取启用的运行时工具列表 * 从数据库读取工具配置,如果工具未配置则默认启用 */ export async function getEnabledTools(): Promise { try { const configs = await getAllToolConfigs(); const enabledTools: RuntimeToolName[] = []; for (const toolName of DEFAULT_RUNTIME_TOOLS) { const config = configs.find((c) => c.toolName === toolName); if (!config || config.isEnabled) { enabledTools.push(toolName); } } return enabledTools; } catch (error) { console.error("Failed to get enabled tools, using defaults:", error); return [...DEFAULT_RUNTIME_TOOLS]; } } export async function getEnabledAgentToolDefinitions(): Promise { return getEnabledAgentToolDefinitionsForContext(); } export async function getEnabledAgentToolDefinitionsForContext( context?: AgentToolContext, ): Promise { const runtimeTools = await getEnabledTools(); return getAllAgentToolDefinitions().filter((tool) => { if (!tool.runtimeTool) return true; return runtimeTools.includes(tool.runtimeTool); }).filter((tool) => matchesAgentToolContext(tool, context)); }