fix(gateway,loop,tools): 失败回合必落可见回复 + knowledge 角色可信
根因(agent-191,均给出文件:行): 1) knowledge 的 persona 在 schema 里是 optional,模型省略时工具把空串透给 memory.Retriever → 硬校验 ErrMissingPersona → 模型只能重复调用同一堵墙。 修:新增 tool/turncontext.go(loop 播种本回合角色),knowledge 依次取 「参数 → 本回合角色 → 可消化拒绝」,拒绝文案明确「重试不会成功」。 2) persistAssistantReply 对空文本直接 return,而三条正常收尾出口(空回复 / 轮次用尽 / 回合内部报错)都会给空文本 ⇒ 历史只剩 user 消息、客户端静默。 修:新增 session_turn_reply.go 的 persistTurnReply(唯一落库入口 + 按原因 的中文诚实说明);中断 / 陈旧代次 / 静默内部流程(backthink、子代理调度) 仍不落库,真实文本行为逐字未改。 测试:knowledge_test 改断言 + turn_persona_test(新)+ session_turn_reply_test(新,7 条) 变异:去掉 loop 角色发布 ⇒ loop×2 + gateway「工具执行次数 = 0, want 2」红
This commit is contained in:
1 parent
3be70f8232
commit
18381f65fd
9 files changed
+838
-11
No files matched your search
@@ -54,6 +54,12 @@ func (l *Loop) Run(ctx context.Context, sessionID string, messages []model.Messa
|
||||
// Dispatcher.Invoke 据此做前置软判。作用域同样限于本次 Run,
|
||||
// 子代理 Run 各自播种一份,并发 run 绝不共享。
|
||||
ctx = tool.WithRoundAllowSet(ctx)
|
||||
// 同时把本回合**角色**发布给工具(tool/turncontext.go):knowledge 这类
|
||||
// 需要角色作用域的工具据此查到「以谁的名义」检索。不发布的话,模型省略
|
||||
// 可选参数 persona 时工具会把空角色透给记忆存储,换回一条它无从纠正的
|
||||
// ErrMissingPersona(切片 KB1 的真因)。取值与提示词/记忆同源(personaFor),
|
||||
// 因此工具看到的就是本轮说话的角色,不会出现两个角色。
|
||||
ctx = tool.WithTurnPersona(ctx, l.personaFor(ctx))
|
||||
ctx = withLoopSession(ctx, sessionID)
|
||||
|
||||
l.emitTurnBoundary(ctx, model.StreamKindTurnStart)
|
||||
|
||||
Reference in new issue
Block a user