
这篇排障笔记解决一个很具体的现象Claude Code 系统提示词里的 Environment 段换成 glm-5.2 后只剩模型 ID没有展示名也没有知识截止日期。要复现这条链路先到 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册并创建 Key再把 Claude Code 的 Base URL 指向 https://taotoken.net/api。TaoToken 这里只负责 Key 与 Base URL 接入Environment 段如何生成仍取决于 Claude Code 源码里的 getSystemPrompt 和 computeSimpleEnvInfo。下面按源码分析、TaoToken 前置、可复制配置、打包导出、diff 验证、错排查的顺序走一遍。一、原问题与场景glm-5.2 在 Claude Code 的 Environment 段只剩模型 IDClaude Code 在生成系统提示词时会拼出一段描述当前运行环境的内容也就是常见的 Environment 段。这个段里通常包含工作目录、操作系统、当前模型名称、模型版本、知识截止日期等信息。目的是让模型在回答“你是谁”“你的知识截止到什么时候”这类问题时不依赖自己的记忆而是直接读取提示词里的明确说明。在源码层面getSystemPrompt 接收几个入参其中 tools、model、additionalWorkingDirectories、mcpClients 都是关键参数。本篇聚焦第二个参数 model。它会被传给 computeSimpleEnvInfo由这个函数负责生成 Environment 段里和模型有关的部分。与 model 相关的逻辑主要分两块一块是模型展示名与精确模型 ID另一块是知识截止日期。展示名由 getMarketingNameForModel 处理。它先调用 getCanonicalName 把传入的 modelId 规范化然后用一连串 includes 去匹配 Claude 型号。命中 claude-opus-4-6就返回 Opus 4.6命中 claude-sonnet-4-6就返回 Sonnet 4.6命中 claude-haiku-4-5就返回 Haiku 4.5。如果没有命中任何 Claude 型号就返回 undefined。glm-5.2 正好属于最后一种。知识截止日期由 getKnowledgeCutoff 处理套路基本一致。它同样先规范化 modelId再按 includes 匹配 Claude 型号。claude-opus-4-6 对应 May 2025claude-sonnet-4-6 对应 August 2025其他 Claude 型号各有自己的日期。匹配不到就返回 null。glm-5.2 不在这些 Claude 型号列表里所以拿不到 cutoff。于是 computeSimpleEnvInfo 在拼模型描述时会出现两个分支。如果 marketingName 存在就生成带展示名和精确 ID 的描述如果 marketingName 是 undefined就退化成只带模型 ID 的描述。知识截止日期也类似cutoff 为 null 时对应那行不会出现。因此现象就很清楚了claude-opus-4-6 能匹配到展示名 Opus 4.6也能匹配到知识截止 May 2025Environment 段里会同时出现展示名、精确模型 ID 和知识截止行。glm-5.2 两个函数都匹配不上最后只剩类似 “powered by the model glm-5.2” 这种只带模型 ID 的形式。这不是 TaoToken 的 Base URL 改坏了提示词而是 getSystemPrompt 内部匹配范围只覆盖 Claude 型号。TaoToken 只影响模型请求通道不改变源码里的 includes 判断。二、TaoToken 前置创建 Key并把 Claude Code Base URL 设为 https://taotoken.net/api要让 Claude Code 真实走到 glm-5.2 这条模型通道先处理接入信息。打开 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册账号然后在控制台创建 API Key。这个 Key 后面会替换配置里的 YOUR_API_KEY不要直接提交到仓库也不要写进公开脚本。接下来是 Base URL。Claude Code 的 Base URL 填https://taotoken.net/api注意两点。第一不要带 /v1。Claude Code 自己会在 Base URL 后面拼 API 路径如果 Base URL 已经带了 /v1很容易出现重复路径。第二不要加 UTM 参数。UTM 是给网页来源统计用的不是 API 地址的一部分。API 地址保持 https://taotoken.net/api 即可。在 Claude Code 里常见做法是改 settings.json或者用 ANTHROPIC_* 环境变量。settings.json 可以放在用户级配置里也可以放在项目级配置里具体取决于你的使用方式。核心是让 Claude Code 读取到 ANTHROPIC_BASE_URL 和认证信息。认证字段常见的是 ANTHROPIC_AUTH_TOKEN有些环境也会用 ANTHROPIC_API_KEY按你当前 Claude Code 版本的接入文档为准。模型名可以先写 glm-5.2方便后面验证通道。需要再次强调TaoToken 负责的是 Key 和 Base URL。你后面要在源码里复现 Environment 段差异仍然需要改 src/entrypoints/cli.tsx 里的 model 参数并且重新打包。Base URL 配通只代表请求能到模型不代表 getMarketingNameForModel 和 getKnowledgeCutoff 会认识 glm-5.2。三、可复制配置settings.json、ANTHROPIC_* 与 src/entrypoints/cli.tsx 的 dump 行先给一份 settings.json 示例。字段名按你的 Claude Code 版本可能略有差异但思路一致{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: glm-5.2 } }如果你更习惯环境变量也可以这样export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_AUTH_TOKENYOUR_API_KEY export ANTHROPIC_MODELglm-5.2这里 Base URL 仍然是 https://taotoken.net/api不带 /v1也不带 UTM。配置完成后Claude Code 的模型请求会走 TaoToken 的 Base URL。接下来才是源码复现部分。打开 src/entrypoints/cli.tsx找到 dump 系统提示词那一行。原文实操是把 getSystemPrompt 的 model 参数先写成 claude-opus-4-6再写成 glm-5.2。第一轮先改成const prompt await getSystemPrompt([], claude-opus-4-6);然后重新打包并导出bun devkit/build.ts bun dist/cli.js --dump-system-prompt a.txt第二轮把同一行的 model 参数换成 glm-5.2const prompt await getSystemPrompt([], glm-5.2);再次打包并导出到另一个文件bun devkit/build.ts bun dist/cli.js --dump-system-prompt b.txt最后做 diffdiff a.txt b.txt这里有个容易忽略的点dump 系统提示词通常需要打开对应的 feature 开关例如 DUMP_SYSTEM_PROMPT。实验做完后把 feature 里的 DUMP_SYSTEM_PROMPT 去掉把 cli.tsx 里的 dump 行改回原样再重新打包恢复默认。不要把实验配置留在工作区里。四、验证请求与成功结果bun devkit/build.ts 后 diff a.txt 与 b.txt验证分两层。第一层是 TaoToken 通道是否通第二层是源码 dump 结果是否符合预期。先看 TaoToken 通道。你可以用 curl 直接请求完整 URL 可以写 https://taotoken.net/api/v1/messages但 Claude Code 的 Base URL 仍然只填 https://taotoken.net/api。请求示例curl https://taotoken.net/api/v1/messages \ -H x-api-key: YOUR_API_KEY \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d {model:glm-5.2,max_tokens:64,messages:[{role:user,content:说一句你好}]}如果返回 HTTP 200并且 content 里有正常文本说明 Key、Base URL、模型名这条通道已经可用。如果返回 401优先检查 Key 是否替换返回 404优先检查 Base URL 是否多写了 /v1返回模型不存在检查 model 名是否写错。第二层看 dump 结果。diff a.txt b.txt 时重点看 Environment 段不要被全文其他差异干扰。a.txt 对应 claude-opus-4-6预期能看到展示名 Opus 4.6、精确模型 ID claude-opus-4-6以及知识截止 May 2025。b.txt 对应 glm-5.2预期与模型相关的描述退化只保留模型 ID 形式不再出现展示名和知识截止日期。如果你只想快速定位可以grep -n -A 8 -i Environment a.txt grep -n -A 8 -i Environment b.txt然后对比这两个片段。b.txt 的 Environment 段如果只有 glm-5.2 这个模型 ID没有展示名和 cutoff就说明复现成功。a.txt 如果能同时看到 Opus 4.6 和 May 2025说明 Claude 型号匹配逻辑正常。这个差异与 TaoToken 的 Base URL 无关它只是证明源码里的 getMarketingNameForModel 和 getKnowledgeCutoff 只认 Claude 型号。五、本篇常见错排查Base URL 带 /v1、Key 未替换、打包缓存与 DUMP_SYSTEM_PROMPT第一个高频错误是 Base URL 写成 https://taotoken.net/api/v1。Claude Code 会在 Base URL 后面继续拼 /v1/messages 之类的路径结果变成重复路径常见表现是 404 或路由异常。正确写法是 https://taotoken.net/api。第二个错误是 Base URL 后面带了 UTM 参数比如把网页推广链接直接粘进 settings.json。API 地址不认这些参数轻则请求异常重则鉴权失败。官网链接可以带 UTMAPI 地址不要带。第三个错误是 Key 没替换。配置里保留 YOUR_API_KEY请求会 401。还有一种情况是字段名写错比如把 ANTHROPIC_AUTH_TOKEN 写成别的变量Claude Code 读不到认证信息表现同样像 Key 失效。第四个错误是 settings.json 位置不对或 JSON 格式错。项目级配置和用户级配置作用范围不同JSON 多一个逗号也会导致整个文件解析失败。改完以后可以用 Claude Code 启动日志确认它实际读取了哪个配置文件。第五个错误是把 ANTHROPIC_MODEL 和 dump 实验里的 model 参数混为一谈。ANTHROPIC_MODEL 影响真实请求走哪个模型src/entrypoints/cli.tsx 里的 model 参数决定导出系统提示词时传给 getSystemPrompt 的值。要对比 Environment 段必须改 cli.tsx并且重新执行 bun devkit/build.ts。第六个错误是打包缓存。改完 cli.tsx 后没有重新打包bun dist/cli.js 读到的还是旧代码导出的 a.txt 和 b.txt 自然没有差异。每次改 model 参数后都要重新 build。第七个错误是忘记打开或忘记恢复 DUMP_SYSTEM_PROMPT。没有打开时--dump-system-prompt 可能不生效实验后不恢复又会污染后续开发。建议实验前后都检查一遍 feature 开关和 cli.tsx。第八个错误是 diff 看错范围。a.txt 和 b.txt 全文可能有很多无关差异比如时间戳或路径。只看 Environment 段即可。必要时用 grep 截取上下文再比较模型描述行和知识截止行。第九个错误是 model 参数实际没有传成 glm-5.2。比如被别名、环境变量或默认值覆盖导致 getCanonicalName 拿到的仍是 Claude 型号。确认 dump 行里传入的字符串就是 glm-5.2。第十个错误是终端换行或编码造成 diff 噪音。Windows 下 CRLF、重定向编码、终端宽度都可能影响输出。可以先统一换行格式再看关键段落。六、语义一致 CTA继续从 API Keys 与接入文档复现 Claude Code 源码链路回到本篇目标Claude Code 系统提示词里 glm-5.2 的 Environment 段只剩模型 ID是因为 getMarketingNameForModel 和 getKnowledgeCutoff 只对 Claude 型号做 includes 匹配。TaoToken 在这里负责 Key 与 Base URL让你能把 Claude Code 的模型请求接到 https://taotoken.net/api但不改变源码匹配逻辑。要复现完整链路先配通 TaoToken 通道再改 src/entrypoints/cli.tsx 的 model 参数执行 bun devkit/build.ts分别导出 a.txt / b.txt最后 diff 看 Environment 段。如果你卡在 Key、Base URL、settings.json 或 ANTHROPIC_* 配置上建议先看 API Keys 页面和接入文档按实际控制台里的字段核对 API Keyshttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_contentapi-keysutm_campaignrewrite 接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_contentdocutm_campaignrewrite拿到 Key 并配好 Base URL 后你就能继续按原文改 src/entrypoints/cli.tsx、重新打包、导出系统提示词观察 claude-opus-4-6 与 glm-5.2 在 Environment 段里的实际差异。