资讯详情

宿主组合与 agent preset,TaoToken 换 llm 凭据

📅 2026/9/19 1:06:55 | 华诺云谱 👁 阅读
宿主组合与 agent preset,TaoToken 换 llm 凭据
1. 换 llm 凭据前先把 dump-config 里的 llm 行分成两个平面你在 DSH 里执行pnpm dsh --profile web --dump-config看到llm行还挂着旧baseUrl但agent-presets子树里又冒出一条同名覆盖这时不要先改行序。到 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentdsh-llm-plane 拿 KeyBase URL 记为https://taotoken.net/api然后回到配置树判断这条llm行到底属于宿主组合还是 agent preset。这是 DSH 配置维护者最容易踩的坑。组合是 DSH 的“源代码”但组合不是一张平铺的表。dump-config输出里同时存在宿主组合、用户补丁、profile 补丁、家目录补丁、临时--patch以及被agent-presets委派出去的 agent 预设。每一行最终值都可能来自不同层而每一层又可能只改一个字段。换 LLM 供应商时如果只把顶层llm行的baseUrl改成https://taotoken.net/api却忘了某个 preset 内部还有一条llm覆盖运行时真正拿到的可能还是旧 Key。所以本篇不按“注册账号 → 复制 Key → 粘贴”的泛流程写而是按 DSH 配置维护者的视角把“读配置树”这个动作钉死在两个平面上宿主组合顶层功能行负责提供默认 LLM 通道、会话、工具、安全、系统提示等基础能力。agent preset委派给子 agent 的预设可能自己声明llm、system-prompt、工具面或沙箱策略。preset 被激活后它的行可能覆盖宿主组合。每改一行先问自己这行属于宿主组合还是 agent preset这不是分类游戏而是决定你改完会不会被覆盖。下面用四个练习和三类客户端配置把dump-config、--patch、!!js、加载 vs 激活全部串起来。2. 练习 1base 与 full 对照给 llm 行打上 [HOST] 或 [PRESET]先不碰任何凭据只观察。准备两个输出文件pnpm dsh --profile web --dump-config --default-only /tmp/base.yml pnpm dsh --profile web --dump-config /tmp/full.yml diff -u /tmp/base.yml /tmp/full.yml--default-only让你只看 bundle 层不含用户补丁。full.yml则是当前 profile 的最终组合。两份文件一对比多出来的行通常来自三个地方用户 profile 补丁、家目录级补丁、以及本次命令行的--patch。先别急着改先把来源层标出来。在full.yml里找七类行llm、session、agent-loop、tools、system-prompt、sandbox-policy、agent-presets。它们可以粗略归到七个功能分组基础设施负责底层服务与运行时环境。编排agent-loop这类驱动代理循环的行。设置凭据llm行通常在这里出现决定模型供应商、Base URL、Key 的读取方式。持久化session行负责会话状态。安全sandbox-policy决定命令执行边界。模型面工具tools行给模型暴露可调用工具。委派agent-presets行定义子 agent 预设。llm行属于“设置凭据”但它不一定只出现在宿主组合。如果agent-presets下某个 preset 内部也有llm字段那它属于“委派”平面里的模型覆盖。你要在/tmp/full.yml旁边写一份标注文件例如# /tmp/plane-notes.yml llm: - source: base.yml path: top-level plane: host-composition note: 宿主组合默认 llm换 TaoToken 时先改这里 - source: full.yml path: agent-presets[preset-name].llm plane: agent-preset note: 如果该 preset 被激活它的 llm 会覆盖宿主组合必须一起检查其中preset-name要你根据自己的full.yml替换不要照抄。验收标准是你能不看文件说出 base 的七个功能分组并解释为什么bash-sandbox与pwsh-sandbox是互斥的。原因不是行序而是同一时刻只能挂载一个 shell 沙箱服务键两个都激活会形成冲突。这个判断逻辑同样适用于llm不是“哪个写在后面”而是“哪个平面被激活”。一个实用命令是把所有疑似行拉出来看缩进grep -n -A10 -E name: (llm|agent-presets|system-prompt|sandbox-policy) /tmp/full.yml缩进在顶层- name: llm的标[HOST]缩进在agent-presets:内部、且被某个 preset 条目包裹的标[PRESET]。如果同一份输出里既有[HOST]又有[PRESET]最终值要看激活后的覆盖关系。换 TaoToken 凭据时最安全的做法是让两个平面都指向同一套baseUrl与 Key 读取逻辑而不是只改一处。3. TaoToken 接入Claude Code、Codex、CC Switch 三件套的配置落地DSH 组合里的llm行只是宿主侧的一层。真实开发环境里你还会同时使用 Claude Code、Codex、CC Switch。它们不是同一个配置文件不能把ANTHROPIC_*套到 Codex 上。先到 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contenttaotoken-key 创建 KeyBase URL 统一使用https://taotoken.net/apiKey 先写成占位YOUR_API_KEY。3.1 Claude Codesettings.json 与 ANTHROPIC_*Claude Code 侧走ANTHROPIC_*环境变量。典型settings.json片段如下{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY } }如果你用 shell 临时验证可以这样export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_AUTH_TOKENYOUR_API_KEY注意这两个变量只属于 Claude Code 的协议面。不要把ANTHROPIC_BASE_URL写进 Codex 配置里否则会在启动时报模型供应商不匹配。3.2 Codexconfig.toml 与独立 env_keyCodex 使用config.toml模型供应商走自己的model_providers段落model gpt-5-codex model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY然后在 shell 里提供 Keyexport TAOTOKEN_API_KEYYOUR_API_KEY这里的关键点是Codex 只认TAOTOKEN_API_KEY不认ANTHROPIC_AUTH_TOKEN。如果你在 CC Switch 里同时维护多个工具务必把变量名分开。3.3 CC Switch 三件套供应商条目、Claude Code 目标、Codex 目标CC Switch 可以理解成一个本地配置切换器但它的落地点仍然是三件套供应商条目名称写TaoTokenBase URL 填https://taotoken.net/apiKey 填YOUR_API_KEY。Claude Code 目标把供应商条目映射到 Claude Code 的settings.json最终写入ANTHROPIC_BASE_URL与ANTHROPIC_AUTH_TOKEN。Codex 目标把供应商条目映射到 Codex 的config.toml最终写入model_providers.taotoken.base_url与env_key。切换完成后在终端里分别跑一次最小验证Claude Code 发起一次对话Codex 发起一次代码补全。不要只看 CC Switch 界面显示成功要看实际请求是否走到https://taotoken.net/api。如果 DSH 的llm行也准备切到 TaoToken建议让 DSH 通过环境变量读取同一个 Key而不是在多个 YAML 里复制明文。回到 DSH 组合llm行可以写成- name: llm config: provider: anthropic # 保持你原来的协议面只替换 baseUrl 与 apiKey baseUrl: https://taotoken.net/api apiKey: !!js process.env.TAOTOKEN_API_KEY如果这个llm行位于agent-presets内部那么它属于[PRESET]不是[HOST]。你必须在/tmp/plane-notes.yml里标清楚否则后续排障时会误以为顶层已经改完。4. 练习 2 与 3patch 整行替换、!!js 挂载求值换 Key 时别被旧值反杀4.1 --patch 是整行替换不是深合并先做一个临时覆盖pnpm dsh --profile web --dump-config --patch /tmp/llm-patch.yml /tmp/full-patched.yml/tmp/llm-patch.yml内容示例- name: llm config: provider: anthropic baseUrl: https://taotoken.net/api apiKey: YOUR_API_KEY # 原行里还有哪些字段这里必须重述否则整行替换后会丢验收时看/tmp/full-patched.ymlllm行的baseUrl和apiKey是否变成 TaoToken 的值同时其他行是否不受影响。卡点在于--patch不是深合并。你只写baseUrl与apiKeyllm行原有的provider、超时、重试、模型映射可能直接消失。换凭据时先把full.yml里的原始llm行完整复制出来再改其中两三个字段。4.2 !!js 在挂载时求值不是每次读取在--dump-config输出里搜!!jsgrep -n !!js /tmp/full.yml你会看到类似表达式apiKey: !!js process.env.TAOTOKEN_API_KEY profilePath: !!js dshHomePath(profiles/web/cordis.patch.yml) serviceLabel: !!js ctx.serviceName这三个行为不同process.env.TAOTOKEN_API_KEY挂载时从进程环境读取。你在启动 DSH 后再export新 Key当前进程不一定能看到。dshHomePath(profiles/web/cordis.patch.yml)挂载时解析 DSH 家目录路径。路径变化要重新挂载。ctx.serviceName只有相关服务通过inject激活后才可引用。如果 inject 还没满足这个表达式拿不到值。所以换 TaoToken Key 时有两种策略用!!js process.env.TAOTOKEN_API_KEYKey 不进 YAML但改完环境变量要重新启动或重新挂载。在用户补丁层写纯值YOUR_API_KEYHMR 能看到变化但 Key 会进文件适合本地临时调试不适合共享。理解这一点后--patch和!!js就不会互相甩锅--patch决定最终 YAML 值!!js决定这个值在挂载时如何解析。排障时先看--dump-config的最终文本再看表达式求值环境。5. 练习 4把 TaoToken 覆盖写进 profile 补丁验证家目录优先级与 HMR现在把临时覆盖持久化。profile 目录通常在$DSH_HOME/profiles/web/cordis.patch.yml$DSH_HOME默认是~/.dsh。往里面加# 不要留空文件或只有注释解析为空会加载失败 - name: llm config: provider: anthropic baseUrl: https://taotoken.net/api apiKey: !!js process.env.TAOTOKEN_API_KEY - name: system-prompt config: persona: | 你是 DSH web profile 的配置维护者。 每次改一行配置先判断它属于宿主组合还是 agent preset。保存后不重启直接观察 Web UI 或下一次--dump-config是否反映新值。用户补丁层有 HMR纯 YAML 字段变化通常能被看到。但注意!!js是挂载时求值如果你改的是process.env.TAOTOKEN_API_KEY还是需要重新挂载进程。接着做家目录级补丁$DSH_HOME/cordis.patch.yml内容可以写- name: llm config: provider: anthropic baseUrl: https://taotoken.net/api apiKey: !!js process.env.TAOTOKEN_API_KEY优先级是家目录级 profile 级。验证方式pnpm dsh --profile web --dump-config | grep -n -A8 name: llm如果你在 profile 级写了旧 Key在家目录级写了 TaoToken Key最终应该看到家目录级生效。这里有个硬性卡点补丁文件为空或只有注释会加载失败因为解析结果不是列表。禁用某行用disabled: true不要直接删行。删行会让上层补丁静默失效之后你再看--dump-config会误以为某行从未存在。web-app 层强调“禁用而非删除”就是为了让覆盖链保持可追踪。回到平面问题profile 补丁和家目录补丁只是改变最终值不改变行本身属于[HOST]还是[PRESET]。如果agent-presets内部也有一条llm你需要在 profile 补丁里对该 preset 做同样覆盖或者明确让宿主组合的llm成为唯一来源。最忌讳的是顶层改了 TaoTokenpreset 里还留着旧供应商运行时按 preset 激活结果走。6. 加载 vs 激活inject 决定谁先拿到 Key行序不重要组合里行的先后顺序没有语义。把llm行放在文件第一行还是最后一行不会决定它是否先加载。真正驱动激活的是服务依赖某行声明inject: [service...]后该插件进入 waiting直到对应服务出现。这也是为什么“把新行插在文件哪里”不重要而“它 inject 了什么”才重要。调试激活问题时看服务键而不是行序。换 TaoToken 凭据时典型现象是--dump-config里llm行已经显示https://taotoken.net/api但某个子 agent 仍访问旧地址。此时先查agent-presets是否覆盖再查该 preset 是否激活。!!js ctx.serviceName返回 undefined。此时查相关服务是否通过 inject 激活而不是去改行序。某行被disabled: true后上层补丁没生效。此时查禁用行是否阻断了服务键而不是删掉它。你可以把排查路径固定成三步--dump-config看最终值确定llm行最终baseUrl、apiKey、provider是什么。定位来源层用diff对比base.yml与full.yml再用/tmp/plane-notes.yml判断是[HOST]还是[PRESET]。修改对应层验证宿主组合改顶层llmagent preset 改 preset 内部llm临时验证用--patch持久化用 profile 补丁或家目录补丁。这三步同样适用于 Claude Code、Codex、CC Switch。如果 DSH 已经切到 TaoToken但 Claude Code 还读着旧的ANTHROPIC_BASE_URL那不是 DSH 组合的问题而是客户端三件套没同步。反之如果 Claude Code 已经指向https://taotoken.net/api但 DSH 的 preset 里还有旧 Key那也不是客户端问题而是 agent preset 平面没覆盖。7. 排障闭环三步定位与产物清单把本篇的练习产物固定下来它们是你后续所有配置变更的对照基线/tmp/base.ymlbundle 层默认组合。/tmp/full.yml当前 profile 最终组合。/tmp/plane-notes.ymlllm行平面标注区分[HOST]与[PRESET]。$DSH_HOME/profiles/web/cordis.patch.yml你写的 profile 补丁。$DSH_HOME/cordis.patch.yml家目录级补丁。完整命令可以整理成一段export DSH_HOME$HOME/.dsh export TAOTOKEN_API_KEYYOUR_API_KEY pnpm dsh --profile web --dump-config --default-only /tmp/base.yml pnpm dsh --profile web --dump-config /tmp/full.yml diff -u /tmp/base.yml /tmp/full.yml grep -n -A10 -E name: (llm|agent-presets|system-prompt|sandbox-policy) /tmp/full.yml然后按平面写标注按层改配置按三步验证。每改一行先想它属于哪个平面宿主组合还是 agent preset。这个习惯建立后换 LLM 凭据不再是“找一个 Key 粘进去”而是“先确定最终值从哪一层来再决定改哪一层”。如果你还没有 TaoToken Key可以先到官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentdump-config 查看入口Base URL 仍使用https://taotoken.net/api。配置完成后按下面路径逐项验证先用 模型对话 确认 TaoToken 侧模型可用需要长期编码任务查看 Coding Plan到 API Keys 创建或轮换 Key把YOUR_API_KEY替换成真实值Claude Code 的完整接入细节参考 Claude Code 文档。最后再确认一次dump-config里的llm行标的是[HOST]还是[PRESET]TaoToken 的 Base URL 是否写成https://taotoken.net/api!!js是否在挂载时已经拿到正确的TAOTOKEN_API_KEYClaude Code 用ANTHROPIC_*Codex 用config.tomlCC Switch 三件套各自独立。把这四点对齐宿主组合与 agent preset 就不会在换凭据时互相覆盖。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。