From 94835a5f1dc7b2fbdb78efe74f06fd57f604c704 Mon Sep 17 00:00:00 2001 From: kevin Date: Sat, 20 Jun 2026 00:53:21 +0800 Subject: [PATCH] =?UTF-8?q?fix(llm):=20=E5=90=AF=E7=94=A8=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E6=97=B6=E6=9C=80=E7=BB=88=E5=9B=9E=E5=A4=8D=E6=94=B9?= =?UTF-8?q?=E7=94=A8=E4=B8=BB=E5=9B=9E=E5=A4=8D=E9=85=8D=E7=BD=AE=E7=9A=84?= =?UTF-8?q?=20system=20prompt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 此前工具循环把工具路由 prompt 同时塞进最终回复和路由决策,导致用户在 「主 AI 回复配置」编辑的系统提示词被工具路由 prompt 覆盖、未加载到回复。 现在 finalMessages 用主回复 prompt,decisionMessages 用工具路由 prompt。 Co-Authored-By: Claude --- internal/toolrouter/loop.go | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/internal/toolrouter/loop.go b/internal/toolrouter/loop.go index e3bf03f..35b24e6 100644 --- a/internal/toolrouter/loop.go +++ b/internal/toolrouter/loop.go @@ -76,20 +76,31 @@ func RunAgentToolLoop(ctx context.Context, state *State, profile *llm.Profile, s } // 每轮调用都重新加载最新配置,确保管理员在 /admin/llm/api 保存后立即生效 cfg := state.effectiveConfig() - // Use tool router system prompt if available, otherwise fall back to primary system prompt - prompt := strings.TrimSpace(cfg.SystemPrompt) - if prompt == "" { - prompt = strings.TrimSpace(systemPrompt) + // 最终回复使用主回复配置的 system prompt(机器人人设/回复指引); + // 工具路由决策使用工具路由的 system prompt(指导如何调用工具), + // 为空时回退到主回复 prompt。两者分离,避免工具路由 prompt 覆盖主回复 prompt。 + primaryPrompt := strings.TrimSpace(systemPrompt) + routerPrompt := strings.TrimSpace(cfg.SystemPrompt) + if routerPrompt == "" { + routerPrompt = primaryPrompt } - if prompt != "" { - systemMessage := &model.ChatCompletionMessage{ + if primaryPrompt != "" { + primarySystemMessage := &model.ChatCompletionMessage{ Role: "system", Content: &model.ChatCompletionMessageContent{ - StringValue: &prompt, + StringValue: &primaryPrompt, }, } - finalMessages = append([]*model.ChatCompletionMessage{systemMessage}, finalMessages...) - decisionMessages = append([]*model.ChatCompletionMessage{systemMessage}, decisionMessages...) + finalMessages = append([]*model.ChatCompletionMessage{primarySystemMessage}, finalMessages...) + } + if routerPrompt != "" { + routerSystemMessage := &model.ChatCompletionMessage{ + Role: "system", + Content: &model.ChatCompletionMessageContent{ + StringValue: &routerPrompt, + }, + } + decisionMessages = append([]*model.ChatCompletionMessage{routerSystemMessage}, decisionMessages...) } for i := 0; i < maxAgentToolIterations; i++ { if emit != nil {