资讯动态

把 OpenCode 与 Hermes 的 provider 配置改到 TaoToken 之后,架构对比焦点落在会话与记忆

发布时间:2026/9/14 8:12:50 来源:尧图企业网站定制
1. 先统一模型通道再对比 OpenCode 与 Hermes把 OpenCode 与 Hermes 的 provider 配置都指到 TaoToken 之后再读它们的源码看到的就不再是「OpenAI 的 tool_calls 为什么跟 Anthropic 的 tool_use 长得不一样」而是会话与记忆这两种不同取舍。第一步去 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 拿一个 API Key把两个工具的 Base URL 都填成 https://taotoken.net/api末尾不带 /v1模型 ID 以模型广场为准。为什么要先做这一步因为 OpenCode 与 Hermes 在 provider 层都花了很多力气做归一化但归一化的目的不同。OpenCode 基于 Vercel AI SDK 接了大量 ai-sdk/* provider它要的是 TUI、Web、SDK 订阅同一套 LLM 事件模型厂商之间的差异被挡在 SessionProcessor 外面。Hermes 的 provider/transport 面向多入口CLI、gateway、cron、插件系统都可能触发调用它要的是不管请求从哪里进来Agent 内核都能用同一套方式处理上下文、工具调用和记忆。如果带着「哪个模型哪个参数不对」的问题去看源码架构对比就会卡在适配层永远走不到主循环。TaoToken 把这一层统一掉了。它不是一个需要你改代码的 SDK而是一个兼容通道OpenCode 和 Hermes 都把它当普通 provider 来配。两端 Base URL 一致Key 一致模型 ID 也来自同一个模型广场。这样两家 Agent 的底层请求被同一套通道归一化剩下能对比的才是真正的架构差异session 怎么组织、memory 怎么沉淀、skills 是提示扩展还是自进化能力。2. 从 SessionPrompt 出发定位 OpenCode 的 Provider 适配层2.1 OpenCode 主循环不在 CLI 里在 session/prompt.tsOpenCode 是 TypeScript/Bun monorepo核心代码在 packages/opencode。如果只从目录结构判断很容易以为 CLI 命令或 tools 目录是核心但真正的主循环协调器是 session/prompt.ts 里的 SessionPrompt。它要做的事情很清晰把用户输入解析成 user message 和 parts根据 agent、model、session 状态组装 prompt加载系统提示、环境信息、skills 列表解析可用工具调用 LLM把流式事件交给 SessionProcessor根据工具调用、compaction、结构化输出、max steps 等条件决定继续还是退出。这个流程里provider 和 model 配置只占最下一层SessionPrompt 到 LLM Service再到 Provider/Model config再到 AI SDK streamText 或原生 runtime最后转成统一的 LLM events 交给上层。上层只关心来了 text、reasoning、tool-call、finish、error不关心具体厂商的原始响应字段。正是这一层设计让 OpenCode 可以对接多种模型而不至于让 TUI、JSON 输出、WebSocket、SDK 各做一套解析逻辑。可问题也出在这里provider 一多模型参数差异、工具调用格式差异、reasoning 数据结构的差异都会变成维护成本。2.2 opencode.json 里把 provider 指到 TaoToken要让 OpenCode 走 TaoToken不需要改源码在 opencode.json 里声明一个自定义 provider 就行。注意区分两个地址注册、创建 Key、看模型广场和用量去 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end填进工具的 Base URL用 https://taotoken.net/api末尾不要加 /v1。{ $schema: https://opencode.ai/config.json, provider: { taotoken: { npm: ai-sdk/openai-compatible, name: TaoToken, options: { baseURL: https://taotoken.net/api, apiKey: YOUR_API_KEY }, models: { MODEL_ID: { name: 模型广场显示的名称 } } } } }MODEL_ID 换成 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 模型广场里实际存在的模型 ID不要在配置里凭印象写模型名。保存后重启 opencode用 /models 切换到 taotoken 的模型发一句测试消息文本流式输出、工具调用事件都会从这条通道回来。提示Base URL 写错是 OpenCode 配置里最常见的报错来源。TaoToken 的端点是 https://taotoken.net/api不是 https://taotoken.net/api/v1。多一个 /v1请求就会落到不存在的路径。2.3 Provider 统一后OpenCode 的安全和工具设计才好看当 provider 层不再干扰视线OpenCode 真正值得注意的地方就露出来了权限系统不是事后补丁而是主循环里的基础设施。工具执行时拿到的 Tool.Context 包含 sessionID、assistant messageID、tool call id、当前 agent 名称、消息历史、metadata updater、ask() 权限询问函数。每一次工具调用都被挂在当前 session、当前 message、当前 call id 上事件系统和权限系统都能追踪。OpenCode 内置 agent 也被设计成一组工作模式build 是默认动手模式plan 默认禁止编辑只写计划文件general 和 explore 负责研究和搜索compaction、title、summary 是内部隐藏 agent。配置好 provider 之后这些模式的差异才真正可感知——同样一条模型通道切换到 plan 模式就只读不改切到 build 模式才允许写文件。若还卡在 provider 配置上很难体会到这层设计的意义。3. Hermes 的 provider/transport接 TaoToken 时到底在接什么3.1 Hermes 的 Provider 层为什么和 OpenCode 不像Hermes 的主循环和 OpenCode 有相似之处构造上下文、调用 provider、执行工具、循环直到完成。但 Hermes 额外引入了 gateway、cron、memory、skills、session search、curator。这意味着 provider 经常不是被 TUI 用户直接驱动而是由多个入口间接触发。所以 Hermes 的 provider/transport 设计得更像扩展点先定义「从哪进来」和「把请求送到哪」再谈用什么模型。如果你只把 Hermes 当成又一个 CLI 工具可能根本用不到这些机制但你想让 Agent 长期服务、跨任务积累经验provider 只是链条上最小的一段。3.2 把 Hermes 的 provider 配置段指到 TaoToken在 Hermes 的 provider/transport 配置里真正要交给下游的三个信息是 Base URL、API Key、模型 ID。把它映射到配置段就是下面这种形态[provider.taotoken] base_url https://taotoken.net/api api_key YOUR_API_KEY model MODEL_ID这是逻辑配置示意具体字段名以你使用的 Hermes 发行版里的 provider schema 为准。核心就这三项base_url 填 https://taotoken.net/apiapi_key 填从 TaoToken 创建的 YOUR_API_KEYmodel 填模型广场里的实际模型 ID。注意base_url 同样不带 /v1。配置完成后Hermes 的 gateway、cron、普通会话会共用同一条模型通道。此时 Hermes 不再需要为每个模型厂商单独维护一套请求差异provider/transport 层要做的事只剩下把 Agent 的意图送出去再拿回统一的流式事件。3.3 多入口一致性比模型数量更重要Hermes 真正关心的不是「支持多少家模型」而是「不同入口进来的任务是否共享同一套 Agent 状态」。一个通过 cron 触发的后台任务和一个从 gateway 接入的消息应该能访问同一批 memory 和 skills也应用同一套 provider 配置。TaoToken 在这里扮演的是通道角色让多入口的 provider 行为保持一致。通道统一后对比 Hermes 与 OpenCode 时才不会走偏到「谁家 provider 多」上去。4. 配置完成之后会话与记忆的差异才真正浮出水面4.1 OpenCode 的 session 是工作事务Hermes 的 session 要进长期状态OpenCode 的 session 不只是聊天记录它保存 session id、title、directory、project、workspace、agent、model、parent session、token、cost、summary、permission rules、message parts、revert 快照和时间戳。这带来一个结果开发者可以用 --continue 恢复最近会话用 --session 指定会话用 --fork 从旧会话分叉还可以 share、export、import。TUI 和 server 订阅同一套会话事件。换句话说OpenCode 的 session 模型更像一个可恢复的工作事务。它要保证任务中途断了还能捡起来继续权限规则不丢上下文不丢工具执行的状态也能追溯。开发者对一次 AI coding 工作的预期是「可恢复、可审计、可继续」OpenCode 的 session 就是为这个预期设计的。Hermes 也管理 session但它的着眼点是「这次任务对长期状态有什么影响」。主循环跑完不是终点还要看有没有值得沉淀的 memory有没有需要复习的 skill历史会话是否需要被 session search 召回。它的 session 不是为了服务一次本地编程任务而是服务于跨会话、跨任务的长期 Agent 行为。4.2 Memory从摘要到自进化OpenCode 的上下文过长时会自动 compaction也会生成 summary 维持会话摘要。它的记忆更接近「让一次长对话不崩溃」的手段。而 Hermes 的 memory 是分层体系memory manager 统一管理memory provider 决定存储方式skills 记录可复用的流程curator 定期整理技能库后台 review 在任务后复盘。这些机制合在一起形成了 OpenCode 没有的自进化闭环。拿 skills 举例。OpenCode 会扫描配置目录里的 skill/、.claude/skills//SKILL.md、.agents/skills//SKILL.md然后在 system prompt 中提示模型按需加载。这个定位是给 coding agent 临时加载专项说明相当于给模型一本可翻阅的手册。Hermes 的 skill 则是长期沉淀的操作经验库会记录 usage、后台 review、curator 整理把反复踩坑的流程变成未来可调用的能力。两者都有 SKILL.md但架构角色完全不同。4.3 架构差异对照对比项OpenCodeHermes核心目标AI 编程工作台长期运行的 Agent 环境主要用户场景本地仓库 coding、debug、重构自动化、记忆、技能沉淀、外部入口入口形态CLI、TUI、Desktop、Web、SDK、serverCLI、gateway、cron、插件式 provider主循环重点session、工具调用、权限、事件、compactioncontext 构建、工具循环、memory/skill 召回、后台复盘会话持久化SQLite session/message/part/token/cost/revertSessionDB、memory、skills、usage、curatorskills 角色辅助 prompt 扩展自进化闭环核心权限系统细粒度 ruleset、询问、记忆工具安全、approval、后台任务隔离这张表背后有一个更重要的判断OpenCode 优先把「一次编程任务」做得专业、稳定、可交互因此大量工程量放在权限 ruleset、message parts、event bus、processor、compaction 上。Hermes 优先让 Agent 在长期使用中不断积累、召回和扩展因此大量工程量放在 memory manager、skills、curator、session search、gateway、cron、background review 上。5. 用 TaoToken 跑通一次调用再看会话结构5.1 最小验证路径配置完成后验证路径分三段。先确认两端 Base URL 相同都是 https://taotoken.net/api再确认模型 ID 来自模型广场而不是惯性填入印象里的模型名最后看返回结构。OpenCode 端切到 taotoken 模型发一条「读一下当前目录结构」Hermes 端发一次普通会话或通过 gateway 触发一个任务。两者都返回流式文本和工具调用事件就说明 provider 层已统一后续的会话与记忆分析都建立在同一条模型通道上。5.2 排障只查最可能的三个点不需要把所有 HTTP 错误都背下来实际配置中遇到最多的就是三类401 认证失败API Key 没填对或复制时带了空格。回到 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 重新创建 Key替换掉配置里的 YOUR_API_KEY。404 路径错误Base URL 写成了 https://taotoken.net/api/v1。TaoToken 要求填 https://taotoken.net/api末尾不要带 /v1。模型 ID 不存在在模型广场核实当前可用的模型 ID再同步到 opencode.json 和 Hermes provider 配置里。排障时先回 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 查看用量页确认这次请求是否真的到达服务端。能记录到调用说明通道配置没问题问题通常在客户端记录不到则优先查 Base URL 和 Key。6. 目的先于模块架构对比的最后落点6.1 场景决定架构不反过来OpenCode 怕的是模型乱改文件、shell 命令不可控、工具调用状态无法展示、会话中断后不能继续所以它把工程量集中在权限系统、会话结构和事件驱动上。Hermes 怕的是每次任务从零开始、项目经验无法沉淀、技能越积越乱、Agent 离开当前终端就断掉所以它把工程量集中在记忆、技能、历史检索和外部入口上。这就是为什么说「目的先于模块」。一个 Agent 的主要生存场景决定了它长成什么样。OpenCode 生存在 IDE 和终端里自然重视工具安全、交互实时展示、会话恢复、多模型兼容。Hermes 生存在长期个人工作流里自然重视记忆、技能沉淀、历史检索、后台自动化。6.2 跑通通道之后再回到会话与记忆下次再翻这两个项目的源码可以带着一个问题去看这个 Agent 的核心场景是什么架构是怎么为这个场景服务的要保证这个判断不被 provider 配置干扰先把模型通道统一掉。打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建 API Key在模型广场选一个模型 ID把 OpenCode 和 Hermes 的 provider Base URL 都设为 https://taotoken.net/api然后各跑一次最小调用。一次请求走通之后再看它们的 session 组织、memory 分层、skills 定位对比会清晰很多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价