From 1bc2bf5d8d1c01b51fb2ce71b1163c67bebf4c2f Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Sat, 15 Aug 2026 17:24:14 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20WebUI=20=E9=85=8D=E7=BD=AE=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E7=A7=91=E5=AD=A6=E8=AE=A1=E6=95=B0=E6=B3=95=20+=20?= =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E8=BE=93=E5=87=BA=E9=80=9A=E9=81=93=E5=BC=95?= =?UTF-8?q?=E5=AF=BC=E6=8F=90=E7=A4=BA=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - webui settings PUT: 整数型 float64(如 QQ 号)规范化为 int64 存储, 避免 fmt.Sprint 以科学计数法(2.198972886e+09)存库导致读取解析失败 - 系统提示词【输出规则】重写: 明确消息不会自动路由, 区分同步通道(直接返回文本)与异步通道(必须调用 output_send__{通道}), 引导模型优先回复当前输入通道并带正确 meta(user_id/group_id) --- internal/agent/core/tooldefs.go | 12 ++++++++---- internal/plugins/webui/handler.go | 6 ++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/internal/agent/core/tooldefs.go b/internal/agent/core/tooldefs.go index 044052c..81800b0 100644 --- a/internal/agent/core/tooldefs.go +++ b/internal/agent/core/tooldefs.go @@ -51,11 +51,15 @@ func (a *Agent) buildSystemPrompt(memContext string, userInput string) string { prompt += "\n\n【中断消息】长任务执行期间,工具/插件/定时器等会通过中断机制向你发送提醒(如 QQ 新消息、终端输出到达、定时器到点等)。中断消息以 system 角色注入,内容带 [中断消息] 前缀,**不是用户发言,但也必须认真处理**:优先停下当前长任务,针对中断内容作出响应或决定继续执行。不要忽略带 [中断消息] 前缀的 system 消息。" - prompt += "\n\n【输出规则】回复会自动发送到用户的输入来源通道,直接返回纯文本即可送达,无需调用任何工具。\n" - prompt += "- 输出门工具 output_send__{通道名} 用于主动向指定通道推送消息(如群发、主动通知、向其他通道发言),不是回复的必要步骤。除非用户要求在别的通道发送,否则不要使用。\n" - prompt += "- 用 output_send__{通道名}_help 查看该通道的 meta 格式和 type 枚举。\n" + prompt += "\n\n【输出规则】消息不会自动发送到对话来源通道,你必须自己决定如何回复:\n" + prompt += "- 当前输入来自哪个通道,就优先用哪个通道回复;不要串到其他通道(除非用户明确要求)。\n" + prompt += "- 当前输入来源通道(即对话发生的通道)是:" + a.currentOutputChannel + "。对应输出门工具是 output_send__{该通道名}。\n" + prompt += "- 同步通道(webui / cli / 终端):直接返回纯文本,内核会把文本交给等待方显示,无需调用工具。\n" + prompt += "- 异步通道(qq / wechat / 群聊等):返回纯文本**【不会】**自动送达用户,必须调用 output_send__{通道名} 工具(注意 meta 里带上正确的 user_id 或 group_id)才能真正把消息发出去。\n" + prompt += "- 不确定当前通道的发送方式时,先用 output_send__{通道名}_help 查看该通道的 meta 格式和 type 枚举,再决定。\n" prompt += "- 同一轮对话中可多次调用输出门工具。长消息应当分多次发出,而不是一口气发完。\n" - prompt += "- 需要多步执行的长任务:**必须先**用输出门工具向当前输入通道发一条确认消息告诉用户已收到(如「好的我去看看~」,也可以直接返回文本),**然后再**执行具体排查工具。确认消息不代表任务完成,发出后仍需继续执行实际工具并最终汇报结果。" + prompt += "- 需要多步执行的长任务:**必须先**向当前对话通道发一条确认消息告诉用户已收到(异步通道用输出门工具,同步通道直接返回文本),**然后再**执行具体排查工具。确认消息不代表任务完成,发出后仍需继续执行实际工具并最终汇报结果。\n" + prompt += "- 用户从其他渠道发来「在哪里/怎么样了」这类追问时,先回忆上次任务的通道与上下文,再回同一通道。" if a.indexer != nil { prompt += "\n\n" + a.indexer.BuildToolPrompt() diff --git a/internal/plugins/webui/handler.go b/internal/plugins/webui/handler.go index e91f27e..eb53caf 100644 --- a/internal/plugins/webui/handler.go +++ b/internal/plugins/webui/handler.go @@ -9,6 +9,7 @@ import ( "fmt" "io" "log" + "math" "net/http" "sort" "strconv" @@ -1410,6 +1411,11 @@ func (h *Handler) handleSettings(w http.ResponseWriter, r *http.Request) { writeJSON(w, http.StatusBadRequest, map[string]string{"error": "invalid request"}) return } + // 整数型 float64(如 QQ 号 2.198972886e+09)规范化为 int64, + // 避免被 fmt.Sprint 以科学计数法存库导致后续读取/解析失败。 + if f, ok := body.Value.(float64); ok && f == math.Trunc(f) && math.Abs(f) < 1e15 { + body.Value = int64(f) + } deleting := body.Value == nil if strings.HasPrefix(body.Key, "plugin.") { parts := strings.SplitN(body.Key, ".", 3)