From 63bdf04da287c847fdca8dc2e2ac4264de0370e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=97=A0=E9=97=BB=E9=A3=8E?= Date: Tue, 16 Jun 2026 15:40:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BB=88=E6=AD=A2=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E8=B0=83=E7=94=A8=E4=BF=A1=E5=8F=B7=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=95=88=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | Bin 54 -> 94 bytes backend/my_work/agents/function_tool.go | 15 +++++++++++++++ backend/my_work/routers/apiAIChat.go | 14 ++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/.gitignore b/.gitignore index 7d6d50702893aeec2e243d31bc37fd9ea656784a..3bc1785debb43cdb33670b3dd69d52fb2bd47848 100644 GIT binary patch delta 23 dcmXqun_$MD#!$qN&ydGZ!jK9iQzptv0suvd1(5&% delta 4 Lcmazun_vb219Smf diff --git a/backend/my_work/agents/function_tool.go b/backend/my_work/agents/function_tool.go index 0931f5c..c741e40 100644 --- a/backend/my_work/agents/function_tool.go +++ b/backend/my_work/agents/function_tool.go @@ -22,6 +22,21 @@ type FunctionToolRuntime struct { UserInfo *CurrentUserInfo } +// terminalFunctionTools 标记一些"调用即结束"的工具: +// 这类工具的返回结果已经包含了用户问题所需的全部数据,调用之后无需再让模型 +// 决定是否继续调用其他工具,直接进入最终回答生成阶段,可以省掉一轮模型请求。 +var terminalFunctionTools = map[string]bool{ + "ops_ai_assistant": true, + "ops_ai_assistant_schedule_query": true, + "ops_ai_assistant_purchase_query": true, +} + +// IsTerminalFunctionTool 判断给定工具名是否为终止工具。命名匹配采用与 +// FunctionToolSchemas / ExecuteFunctionTool 一致的"小写并裁剪空格"规则。 +func IsTerminalFunctionTool(name string) bool { + return terminalFunctionTools[strings.ToLower(strings.TrimSpace(name))] +} + func FunctionToolSchemas(configs []ToolConfig) []FunctionToolSchema { tools := make([]FunctionToolSchema, 0) for _, config := range configs { diff --git a/backend/my_work/routers/apiAIChat.go b/backend/my_work/routers/apiAIChat.go index e4cfb47..3f2b57f 100644 --- a/backend/my_work/routers/apiAIChat.go +++ b/backend/my_work/routers/apiAIChat.go @@ -947,6 +947,7 @@ func runOpenAIToolLoop(ctx context.Context, profile models.ConfigsAIChatOpenAI_, toolExecuted = true messages = append(messages, openaiMessage{Role: "assistant", Content: message.Content, ToolCalls: message.ToolCalls}) + terminalToolName := "" for _, toolCall := range message.ToolCalls { toolName := strings.TrimSpace(toolCall.Function.Name) parsedArgs := parseJSONTraceValue(toolCall.Function.Arguments) @@ -974,6 +975,19 @@ func runOpenAIToolLoop(ctx context.Context, profile models.ConfigsAIChatOpenAI_, trace(toolName, "execute", status, "工具执行完成:"+toolName, data) } messages = append(messages, openaiMessage{Role: "tool", ToolCallID: toolCall.ID, Name: toolName, Content: string(resultJSON)}) + // 终止工具:仅在工具自身执行成功时短路。失败时仍交给模型重试或换工具。 + if status == "success" && terminalToolName == "" && agents.IsTerminalFunctionTool(toolName) { + terminalToolName = toolName + } + } + if terminalToolName != "" { + if trace != nil { + trace(terminalToolName, "tool_call", "success", "命中终止工具,跳过下一轮工具决策,直接生成最终回答", map[string]interface{}{ + "tool": terminalToolName, + "round": round + 1, + }) + } + return messages, toolExecuted, nil } } return messages, toolExecuted, fmt.Errorf("工具调用超过最大轮数")