mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-11-06 09:17:31 +00:00
fix(memory,llm): L2 预填充并入召回主路 + 回退换 provider 时换 model(视觉失效真因)
## 1. L2(冷上下文)预填充此前只走「注入文本」,等于没有
设计:prune 与 recall 是一对 —— 工具声明 ContextPolicy=prune + RecallPolicy=auto
时,工具输出既触发裁剪、也触发预填充(memoryPass → recallTextFor)。
但 L2 那一路只写在 buildSystemPrompt 里,query 用的是**注入文本**;
QQ 注入的是「来自「X」的私聊消息(message_id=…),先用 qq_get_message 取正文」,
与用户真正说的话毫无相似度 ⇒ 冷上下文预填充恒为空。
(现场:头天晚上讲的冷笑话,第二天早上完全唤不回;14 小时里
memory recall (input…) 只有 5 次、且 query 是元信息。)
改法:把 L2 检索并入 buildMemoryContext —— 输入路用输入文本、工具路用工具正文,
两条路共用同一次召回与预算;buildSystemPrompt 里那份重复注入删掉。
中断消息仍然 NoMemory + RecallPolicy=none(不裁剪、不召回、不进记忆),
这是设计要求,未改动。
## 2. 回退换 provider 时必须换 model(视觉失效的真因)
现场日志:
deepseek 402 Insufficient Balance
→ 回退 llmsproxy,但 req 仍带 model=「deepseek-flash」
→ llmsproxy 403 model_not_allowed
→ llmsproxy 被整源标记 unavailable(冷却)
→ 视觉回退 resolveModalFallback 跳过它 ⇒「配置了视觉却说没有视觉」
两处修正:
· 每个 provider 用自己的 model 发请求(model 是 provider 的属性)
· 403 区分「模型不被该 key 允许」与「凭证失效」:前者只否一个 model,
provider 仍可用于其他 model 与视觉回退
判据:internal/agent/core/provider_model_fallback_test.go
This commit is contained in:
@ -57,6 +57,12 @@ type Runtime struct {
|
||||
profiles *profileRegistry
|
||||
// active 记录**当前活跃档位**(由 inputch 输入的 SecurityProfile 选择)。
|
||||
active *profileActivator
|
||||
// eventPolicy 是**事件总线授权表**(谁能发/订阅什么事件)。
|
||||
//
|
||||
// ★ 它与凭据闸门无关:`core.security.enabled=false` 关掉的是凭据替换,
|
||||
// 而"插件不许发 raw_input"这类授权始终生效 —— 所以 Disabled Runtime
|
||||
// 同样持有默认策略(见 NewDisabledRuntime)。
|
||||
eventPolicy EventPolicy
|
||||
// principals 是**按主体**的能力策略(插件声明,内核执行)。
|
||||
//
|
||||
// ★ 它替代的正是"插件自己在 stage 里拦工具"那种实现
|
||||
@ -71,13 +77,14 @@ func NewRuntime(store *Store) *Runtime {
|
||||
return NewDisabledRuntime()
|
||||
}
|
||||
return &Runtime{
|
||||
gate: NewGate(store),
|
||||
enabled: true,
|
||||
policy: DefaultPolicy(),
|
||||
scopes: NewScopeRegistry(),
|
||||
principals: newPrincipalRegistry(),
|
||||
profiles: newProfileRegistry(),
|
||||
active: &profileActivator{},
|
||||
gate: NewGate(store),
|
||||
enabled: true,
|
||||
policy: DefaultPolicy(),
|
||||
eventPolicy: DefaultEventPolicy(),
|
||||
scopes: NewScopeRegistry(),
|
||||
principals: newPrincipalRegistry(),
|
||||
profiles: newProfileRegistry(),
|
||||
active: &profileActivator{},
|
||||
}
|
||||
}
|
||||
|
||||
@ -86,12 +93,13 @@ func NewDisabledRuntime() *Runtime {
|
||||
// 即使禁用也装一个策略表:否则"关闭凭据防火墙"会连带让工具策略失效,
|
||||
// 而这是两件不同的事(用户可以只要策略、不要凭据替换)。
|
||||
return &Runtime{
|
||||
enabled: false,
|
||||
policy: DefaultPolicy(),
|
||||
scopes: NewScopeRegistry(),
|
||||
principals: newPrincipalRegistry(),
|
||||
profiles: newProfileRegistry(),
|
||||
active: &profileActivator{},
|
||||
enabled: false,
|
||||
policy: DefaultPolicy(),
|
||||
eventPolicy: DefaultEventPolicy(),
|
||||
scopes: NewScopeRegistry(),
|
||||
principals: newPrincipalRegistry(),
|
||||
profiles: newProfileRegistry(),
|
||||
active: &profileActivator{},
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user