这篇排障笔记解决一个很具体的现象:Claude Code 系统提示词里的 Environment 段,换成 glm-5.2 后只剩模型 ID,没有展示名,也没有知识截止日期。要复现这条链路,先到 TaoToken 官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_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 段只剩模型 ID
Claude 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 2025,claude-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 2025,Environment 段里会同时出现展示名、精确模型 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_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_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_URL=https://taotoken.net/api export ANTHROPIC_AUTH_TOKEN=YOUR_API_KEY export ANTHROPIC_MODEL=glm-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.2:
const prompt = await getSystemPrompt([], 'glm-5.2');再次打包并导出到另一个文件:
bun devkit/build.ts bun dist/cli.js --dump-system-prompt > b.txt最后做 diff:
diff 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 地址不认这些参数,轻则请求异常,重则鉴权失败。官网链接可以带 UTM,API 地址不要带。
第三个错误是 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 Keys:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_content=api-keys&utm_campaign=rewrite 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_content=doc&utm_campaign=rewrite
拿到 Key 并配好 Base URL 后,你就能继续按原文改 src/entrypoints/cli.tsx、重新打包、导出系统提示词,观察 claude-opus-4-6 与 glm-5.2 在 Environment 段里的实际差异。