Skip to content

fix(routing): 根治模型路由×provider解析,修复 compaction 静默失效#202

Merged
yishuiliunian merged 1 commit into
mainfrom
fix/model-routing-provider-resolution
Jun 25, 2026
Merged

fix(routing): 根治模型路由×provider解析,修复 compaction 静默失效#202
yishuiliunian merged 1 commit into
mainfrom
fix/model-routing-provider-resolution

Conversation

@yishuiliunian

Copy link
Copy Markdown
Contributor

Summary

  • 纯 GPT 部署下 /compact 与 auto-compact 从不生效:摘要任务被 build_model_router 硬编码默认成 claude-haiku,无 Anthropic provider 时解析失败被静默成 Ok(false)(生产 session 涨到 68万 token 顶 25.6万 窗口、237 turn 0 次成功压缩)。
  • 从架构上根治"选模型→找 provider 两步各自决定、provider-盲默认散落、失败处理不一致"这一整类缺陷。

Changes

  • 唯一解析咽喉:新增 Kernel::resolve_task(kernel/resolve.rs);compaction 与 classifier 都经它解析,classifier 经 ProviderResolver trait 委托同一实现。
  • 回落主模型:删 build_model_router 硬编码摘要默认,未配置任务回落主模型;省钱靠显式 model_routing.summarization
  • 单一真相源 + 读写分离:SharedModelRouter(写)/ ModelRouterReader(读)共享同一 Arc,/model 切换被双方实时观测,single-writer 由类型固化(修 classifier stale)。
  • 早校验 + 大声失败:启动期 preflight 校验 settings.model + model_routing(软警告不 bail);provider 缺失时 compaction 发可见 Stream 提示而非终止语义的 Error
  • 卫生:hook prompt 删 claude-haiku 默认(无 model 则 skip);DEFAULT_MODEL 提取为 loopal-config SSOT。
  • 主要文件:loopal-kernel(resolve/preflight)、loopal-provider-api(SharedModelRouter)、loopal-provider(is_model_resolvable)、loopal-runtime(compaction/llm)、loopal-agent-server(wiring/preflight)。

Test plan

  • 新增:resolve_task/is_model_resolvable/preflight/SharedModelRouter 单测 + compaction provider-error e2e + reader 观测 /model 切换 e2e。
  • 本地:全量 94/94 通过、clippy 零警告、rustfmt、所有文件 ≤200 行。
  • CI passes

纯 GPT 部署下 /compact 与 auto-compact 从不生效:摘要任务被
build_model_router 硬编码默认成 claude-haiku,但无 Anthropic provider,
解析失败被静默成 Ok(false)。生产 session 因此上下文涨到 68万 token
顶 25.6万 窗口、237 turn 0 次成功压缩,切 gpt-5.4/5.5 都无效。

根因是"选模型→找 provider"两步各自决定、provider-盲默认散落、失败
处理不一致。本次从架构上收敛:

- Kernel::resolve_task 成为唯一 provider 感知解析咽喉;compaction 与
  classifier 都走它(classifier 经 ProviderResolver trait 委托同一实现)
- 删 build_model_router 的硬编码摘要默认;未配置任务回落主模型
  (ModelRouter::resolve 既有 fallback),省钱靠显式 model_routing.summarization
- SharedModelRouter/ModelRouterReader 读写句柄分离:runner 持写、
  classifier 持只读,共享单一 Arc,/model 切换被双方实时观测,
  single-writer 由类型固化(修 classifier stale)
- 启动期 preflight 校验 settings.model + model_routing,逐条不可解析报
  error/warn(软警告不 bail);provider 缺失时 compaction 发可见 Stream
  提示而非终止语义的 Error(避免子 agent 视图被弹回 root)
- 卫生:hook prompt 删 claude-haiku 默认(无 model 则 skip);
  DEFAULT_MODEL 提取为 loopal-config SSOT

测试:新增 resolve_task/is_model_resolvable/preflight/SharedModelRouter
单测 + compaction provider-error e2e + reader 观测 /model 切换 e2e;
全量 94/94 通过、clippy 零警告、所有文件 ≤200 行。
@yishuiliunian yishuiliunian merged commit c1ff1a3 into main Jun 25, 2026
4 checks passed
@yishuiliunian yishuiliunian deleted the fix/model-routing-provider-resolution branch June 25, 2026 10:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant