news 2026/9/2 12:36:50

多LLM模型自由切换:capsule-react注册表解析、优先级路由与“绝不伪造模型“原则

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
多LLM模型自由切换:capsule-react注册表解析、优先级路由与“绝不伪造模型“原则

多LLM模型自由切换:capsule-react注册表解析、优先级路由与"绝不伪造模型"原则

【免费下载链接】capsule-reactReAct loop coordinator. Stateless state machine for reasoning-and-action cycle. Part of Unicity AOS.项目地址: https://gitcode.com/gh_mirrors/ca/capsule-react

在 Astrid OS 的 AI 智能体架构中,capsule-react(包名astrid-capsule-react)是驱动"推理—行动"循环的核心协调胶囊。它本身不调用任何大模型,却决定了每个请求由哪个 LLM 提供商、哪个模型来回答——通过注册表解析、两级优先级路由和缓存同步机制,你可以在 Anthropic、OpenAI 兼容端点(如 Ollama 的qwen2.5-coder:32bllama3.3:70b)之间自由切换,而它保证:没有可选模型时宁可终止回合,也绝不伪造一个模型 ID。

一句话理解:它是"调度员",不是"答题者"

capsule-react 是一个无状态状态机,通过 IPC 事件总线协调五个协作胶囊:Session(会话历史)、Identity(系统提示词)、Prompt Builder(提示组装)、Provider(LLM 流式生成)、Tool Router(工具分发)。它的状态机循环如下:

Idle → AwaitingIdentity → AwaitingPromptBuild → Streaming → AwaitingTools → Streaming → … → Idle

(状态机定义见 Phase 枚举,整体架构说明见 README.md)

正因为模型选择与推理逻辑解耦,切换 LLM 只需改变"发往哪个 topic、携带哪个 model 字段",其余胶囊一行代码都不用动。

注册表解析:一个请求如何找到它的模型

每次要发出 LLM 请求前,react 都会调用active_llm()解析"当前生效的提供商 + 模型",其解析顺序是四层兜底(实现见 active_llm()):

优先级来源说明
1️⃣本主体(per-principal)KV 缓存由注册表广播预热,命中则零 IPC 开销
2️⃣运维环境变量覆盖仅携带 topic,不携带模型 ID
3️⃣懒加载:向注册表胶囊查询通过registry.v1.get_active_model往返,5 秒超时,结果回写缓存
4️⃣合理默认 topic仅指向 Anthropic topic,模型为None

注意一个关键细节:缓存键react.llm_provider_model按主体隔离的,"一个主体的模型选择不会钉死其他所有主体"(KV 键定义)。注册表查询通道在 Capsule.toml 中声明,响应通道在 subscribe 配置 中声明。

解析函数 parse_active_provider 只认两种输入:request_topic(必须以llm.v1.request.generate.前缀开头,否则视为伪造直接拒绝)+id(选中的模型 ID)。模型 ID 对它而言是不透明字符串——冒号包裹的llama3.3:70b也会原样透传,react 从不拆解或改写它。

优先级路由:单次请求覆盖可以"赢过"注册表

真正发出请求前,resolve_request_model()再做一次两级优先级裁决(源码):

  1. 单次请求覆盖:网关随 prompt 传来的context.model,仅对当前回合生效;
  2. 注册表选择ProviderEntry.id

每一级都会跳过空串与纯空白值,空白覆盖永远不会"影子屏蔽"一个可用的注册表 ID。

这个覆盖的生命周期被精心设计(TurnState 字段):

  • ✅ 同一回合内经历多次"工具调用 → 继续生成"迭代时,覆盖持续生效
  • ✅ 用户发出新 prompt 时,reset_conversation_turn()将其清空,绝不泄漏到下一轮对话(重置逻辑,回归测试 override_cleared_on_new_turn)。

所以你可以做到:全局用注册表选的模型 A,个别请求临时指定模型 B,回合结束后一切自动回到 A。

"绝不伪造模型":没有选择时的终止行为

这是 capsule-react 最值得称道的设计原则。旧实现曾有一个字面量兜底(历史上是一个 Claude 模型 ID)——这很危险:把一个 Claude ID 盖在非 Anthropic 提供商的请求上,会产生诡异的失败。

现在,当两级优先级都解析不出可用模型时:

  • 解析结果为None→ 触发 fail_no_model_selected:
  • 向用户推送一条可操作的错误:"No LLM model is selected. Runastrid modelsto choose one, or install/configure an LLM provider."
  • 清理在途映射、重置回合、回到Idle不发出一条llm.v1.request.generate.*请求;
  • 空 ID、纯空白 ID 一律视为"不存在",而不是"空模型名"(回归测试 whitespace_only_model_id_is_absent_across_paths)。

由于注册表在安装任意提供商时会自动选择默认提供商,None意味着真的什么都没有可用——此时终止回合是唯一诚实的行为。

缓存一致性:切换模型时,缓存必须"成组搬家"

多模型切换最容易出的 bug 是"新 topic 配旧模型"。react 的 handle_model_changed 拦截器订阅registry.v1.active_model_changed广播,处理三种信号(决策函数):

广播载荷动作场景
携带合法 topic +id写入 topic 与模型 ID,并缓存上下文窗口/最大输出 token正常切换
合法 topic 但id写入 topic,删除旧模型 ID迁移窗口,防止新 topic 配旧模型
裸 JSONnull删除全部 4 个缓存键astrid models unset清除选择

那 4 个必须成组清除的键由 cleared_cache_keys 统一列出——上下文窗口限制若不一起删掉,新提供商会继续被旧提供商的 token 预算钳制。此外,任何前缀不匹配的 topic(如evil.topic)都会走RejectTopic分支被拒之门外,形成与懒加载路径对称的纵深防御(测试见 active_provider_rejects_bad_prefix_topic)。

快速上手与延伸阅读

📌用户视角:用astrid models系列命令选择/清除模型,react 侧无需任何配置;网关侧可通过请求上下文里的model字段做单请求级覆盖。

📖 想深入源码,建议按这条线索阅读 src/lib.rs:

  1. KV 缓存键定义 —— 理解"缓存了什么";
  2. resolve_request_model —— 优先级路由全貌;
  3. fail_no_model_selected —— "绝不伪造"的终止路径;
  4. fetch_active_llm_topic_from_registry —— 注册表懒加载与缓存回填。

构建与部署相关配置见 Cargo.toml 与 Capsule.toml(构建命令见 README.md)。整套选择逻辑由 tests 模块 中的十余个回归测试钉死,包括空 ID、空白 ID、伪造 topic、清除广播等边界场景——这正是"多模型自由切换"能放心运行的底气所在。

【免费下载链接】capsule-reactReAct loop coordinator. Stateless state machine for reasoning-and-action cycle. Part of Unicity AOS.项目地址: https://gitcode.com/gh_mirrors/ca/capsule-react

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 12:35:02

Sunshine 快速上手指南:15 分钟把 PC 变成家庭游戏串流服务器

Sunshine 快速上手指南:15 分钟把 PC 变成家庭游戏串流服务器 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想在客厅电视上打 3A 大作,或在地铁里用平板接…

作者头像 李华
网站建设 2026/9/2 12:30:24

Carbon 语言上手指南:从装好工具链到跑通素数筛

Carbon 语言上手指南:从装好工具链到跑通素数筛 【免费下载链接】carbon-lang Carbon Languages main repository: documents, design, implementation, and related tools. (NOTE: Carbon Language is experimental; see README) 项目地址: https://gitcode.com/…

作者头像 李华
网站建设 2026/9/2 12:26:12

SpringCloudAlibaba 基于Nacos Config的配置中心

关于 Spring Cloud Config Spring Cloud Config 用于跨多个应用程序和环境存储和提供分布式配置。此配置存储理想地在Git版本控制下进行版本管理,并且可以在应用程序运行时进行修改。虽然它非常适合使用所有支持的配置文件格式以及Environment、PropertySource 或 V…

作者头像 李华
网站建设 2026/9/2 12:24:23

PocketBase与HTMX组合:极简全栈Web开发实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/2 12:18:47

项目反应理论在AI安全评估中的应用:从题库优化到能力量化

1. 先搞清楚 IRT 在 AI 安全里到底解决什么问题如果你关注大模型的安全对齐、能力评估或者红队测试,可能会发现一个现象:我们经常用一堆问题去“考”模型,然后统计它的正确率或违规率。但这里有个关键问题被忽略了——我们用来测试的这些问题…

作者头像 李华