From a3a5cd4feea17e4751e3724b542e79d735a514d0 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Sat, 29 Aug 2026 14:43:23 +0800 Subject: [PATCH] =?UTF-8?q?fix(agent):=20=E4=BF=AE=E6=AD=A3=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E6=8F=90=E7=A4=BA=E8=AF=8D=E7=9A=84=E5=9B=9E=E5=A4=8D?= =?UTF-8?q?=E6=8A=95=E9=80=92=E8=A7=84=E5=88=99=EF=BC=8C=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E4=BA=8B=E5=AE=9E=E6=80=A7=E7=BA=A6=E6=9D=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题一:提示词说反话,导致 qq 回复大量丢失。 v2 架构曾有「回复自动回投来源通道」的能力(IOManager.routes + RegisterOutputRoute), 但 304c3ae 'remove IO route mapping' 删掉了整套路由映射。此后: - outputCh 唯一消费者(cmd/homed/main.go)只处理 memory_candidate,其余静默丢弃, output.go 末尾的 EmitTextTo 兜底成为死路 - ResponseCh 只剩 webui /api/v1/chat、cli、clawhubadapter 三处同步 HTTP 用途, 不再承担渠道投递;qq 走 InjectInterruptText → interruptCh,ResponseCh 恒为 nil - emitResponse 从不调 GetDevice(),纯文本对异步通道 = 丢弃 提示词却仍写着「直接返回纯文本即可送达,无需额外工具」「output_send 不是回复的必要步骤」。 实测近 12h 6 次 qq 输入仅 1 次送达,规律是 tools 含 output_send__qq 才到,否则全丢, 且 agent 自认为已回复。现改为明确区分同步/异步通道并要求显式 output_send__。 问题二:无事实性约束,工具失败时模型编造内容。 qq_get_message 30 次调用有 9 次返回 not_found:true(NapCat 响应解析失败), 模型未如实说明,转而虚构消息正文——包括一条不存在的 message_id=1321159191 (全 journal 零命中、不在任何调用记录里)配上完全虚构的正文 「我想搭一个 Dify 工作流,想做一个人脸识别系统 demo」,用户从未说过。 虚构内容经 formatMergedTimeline 回灌【对话时序】后被当作既有事实反复复述放大 (两条消息 reasoning_content 达 180KB / 220KB)。 现补充:工具返回 not_found/空结果必须如实说明不得猜测;【对话时序】是历史事实摘要 不是当前任务;无依据的人名/需求/数字/路径直接说不知道。 注:set() 用 INSERT OR IGNORE,改此默认值只影响新部署; 本机运行实例的 config.db core.agent.system_prompt 已同步更新(改前备份)。 验证:重新部署后实测 agent 明确回答 qq 需 output_send__qq 且纯文本会被丢弃; 对 message_id=1321159191 如实报告 not_found 并声明「正文完全不知道,绝不猜」。 --- internal/config/registry.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/internal/config/registry.go b/internal/config/registry.go index d743095..1fdbc22 100644 --- a/internal/config/registry.go +++ b/internal/config/registry.go @@ -568,11 +568,21 @@ func (r *ConfigRegistry) seedDBValues(dataDir string) { WebUI 概览页展示你的立绘,可通过 /mascot.webp 直接访问。如输出通道支持图片引用,可借此发送自己的立绘。 -回复会自动发送到用户的输入来源通道,直接返回纯文本即可送达,无需额外工具。 -输出门工具 output_send__{通道名} 仅用于主动向指定通道推送消息(群发、主动通知、向其他通道发言),不是回复的必要步骤。用 output_list_channels 查看可用通道。 -使用 output_send__{通道名}_help 查看每个通道的格式说明。 +【回复投递规则 —— 必读,违反会导致用户收不到任何回复】 +除 webui / cli 这类同步请求通道外,纯文本回复不会自动送达任何通道。 +面向 qq、wechat、a2a、acp 等异步通道时,必须显式调用 output_send__{通道名} 把内容发出去; +只返回纯文本会被直接丢弃,用户永远收不到,而你会误以为已经回复过了。 +用 output_list_channels 查看可用通道,output_send__{通道名}_help 查看该通道的 meta/格式要求 +(qq 等通道的 meta 需要 group_id 或 user_id 指明发给谁,缺失会发送失败)。 输出通道可多次调用,长消息应当分多次发出而不是一口气发完。 +【事实性约束 —— 不得编造】 +只根据工具真实返回的内容作答。当 qq_get_message 等工具返回 not_found:true、 +"解析 NapCat 响应失败"、"未找到" 或空结果时,说明你没有拿到消息正文: +必须如实说明未取到,或换 qq_get_history 等工具重试,绝不允许凭 message_id 猜测或虚构正文。 +【对话时序】里的历史条目是过去发生的事实摘要,不是当前任务;不要把其中的内容当成用户此刻的新要求。 +涉及具体人名、需求、数字、路径时,若上下文中没有依据,直接说不知道,不要补全细节。 + 当用户上传图片或音频时,系统会自动附着媒体内容。如果模型不支持直接处理多媒体,请调用对应的媒体处理工具。`) set("core.input_processing.image.fallback_provider", "")