1. 为什么你的 Claude Code 总在“自由发挥”
Claude Code 是 Anthropic 推出的终端编码代理,能读文件、跑命令、改代码、调工具,适合已经在用命令行做开发的工程师。但很多人第一次用就发现一个尴尬现象:明明在对话里说了“用 pnpm 不要用 npm”,下一轮它又敲出npm install;明明项目里有一套发布流程,它每次都要重新问一遍。问题不在模型能力,而在你把指令放错了位置。
Anthropic 官方那份调教指南把七种自定义机制按“加载时机、上下文开销、执行权限”三条线拆开,核心结论其实一句话:指令放哪里,决定了它什么时候生效、能不能被压缩掉、模型有没有选择权。CLAUDE.md 是常驻入口,skills 是按需加载的流程手册,subagents 是隔离上下文的副手,hooks 是代码层确定性拦截。把它们摆对位置,Claude Code 才会“乖乖听话”。
这篇不空谈机制,直接给你一套可复制的骨架:以 CLAUDE.md 为入口,串联 skills 与 subagents,把 TaoToken 的统一 Key 和 API 通道写进settings.json与config.toml,最后跑一次真实调用验证配置是否一次成型。适合正在用 Claude Code 做多工具协作、又不想每次手动改环境变量的开发者。
2. TaoToken 前置:统一 Key 与 API 通道
TaoToken 在这里扮演的角色是“统一入口”。Claude Code 本身支持通过环境变量指定 Anthropic 兼容的 API 地址和 Key,TaoToken 提供的就是这样一个兼容通道,让你不用在多个工具之间来回切换 Key。官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api (这个地址不加 UTM 参数,直接用于配置)。
你需要先拿到一个可用的 Key。进入控制台创建:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,然后在 API Keys 页面生成:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。生成后复制那串以sk-开头的字符串,后面配置里会用到。
注意:Key 只显示一次,建议生成后立刻写进本地环境变量或配置文件,不要提交到 Git 仓库。项目级配置里用占位符,真实值放用户级或系统环境变量。
配置前先确认两件事:一是 Claude Code 已安装并能运行claude --version;二是你的 shell 能读到环境变量。下面所有配置都围绕这两个前提展开。
3. 可复制配置:CLAUDE.md + skills + subagents 骨架
3.1 CLAUDE.md 入口文件
在项目根目录建CLAUDE.md,控制在 200 行以内,只放“始终要记住的事实”:构建命令、目录布局、编码规范、指向其他文件的索引。流程性内容一律挪到 skills。
# 项目约定 ## 构建与测试 - 包管理器:pnpm(禁止使用 npm / yarn) - 安装依赖:pnpm install - 运行测试:pnpm test - 类型检查:pnpm typecheck ## 目录布局 - src/api/ 后端接口,改动需走路径限定规则 - src/web/ 前端页面 - .claude/skills/ 按需加载的流程手册 - .claude/agents/ 隔离子代理定义 ## 编码规范 - 提交信息用语义化格式:feat / fix / chore - 新增文件必须带类型标注 - 详细流程见 .claude/skills/ 下对应 SKILL.md这份文件会话开始就进上下文,长会话压缩后还会重新读一遍,所以它适合放“永远成立”的约定,不适合放“偶尔才用”的步骤。
3.2 skills 按需加载流程
在.claude/skills/下建文件夹,每个 skill 一个SKILL.md。会话开始只加载名称和描述,主体在调用时才进上下文。下面是一个发布检查 skill:
--- name: release-check description: 发布前检查清单,包含测试、类型检查、变更日志 --- # 发布检查流程 1. 运行 pnpm test,确认全部通过 2. 运行 pnpm typecheck,确认无类型错误 3. 检查 CHANGELOG.md 是否已更新 4. 确认版本号符合语义化规范 5. 输出检查结果摘要,不自动提交调用方式有两种:斜杠命令/release-check,或任务自动匹配。流程性指令放这里,CLAUDE.md 就不会被 30 行 runbook 撑爆。
3.3 subagents 隔离上下文
在.claude/agents/下建 markdown 文件,用 YAML frontmatter 定义名称、描述和工具权限,主体变成该 subagent 的系统提示。适合“中间结果很多、之后不再引用”的副任务,比如依赖审计。
--- name: dep-audit description: 扫描依赖包的安全公告并汇总升级建议 model: claude-sonnet-4-20250514 tools: - Read - Bash --- # 依赖审计子代理 你负责扫描指定目录下的依赖清单,逐个查询安全公告, 最终只返回一份汇总报告:包名、当前版本、建议版本、风险等级。 不要返回中间查询过程。subagent 在自己的全新上下文窗口里运行,回到主会话的只有最终消息。主线程不会被 200 个包的中间结果塞满。
3.4 settings.json 与 config.toml 统一 Key
Claude Code 的配置分两层:settings.json管行为与权限,config.toml管模型与 API 通道。把 TaoToken 的 Key 和基址写进去,所有工具共用一套。
settings.json(放在.claude/settings.json或用户级配置目录):
{ "permissions": { "allow": ["Bash(pnpm *)", "Read", "Edit"], "deny": ["Bash(rm -rf *)"] }, "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "${TAOTOKEN_API_KEY}" } }config.toml(模型与通道配置):
[api] base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" timeout_seconds = 120 [model] default = "claude-sonnet-4-20250514" max_tokens = 8192 [behavior] respect_claude_md = true load_skills_on_demand = true真实 Key 放系统环境变量,别写进文件:
export TAOTOKEN_API_KEY="sk-你的真实Key"这样settings.json里只留${TAOTOKEN_API_KEY}占位符,提交到仓库也不会泄露。
4. 验证请求:跑一次真实调用
配置写完必须验证,否则你永远不知道是 Key 错了、地址错了,还是模型名写错了。先做一次最小请求,确认通道通。
curl -s https://taotoken.net/api/v1/messages \ -H "x-api-key: $TAOTOKEN_API_KEY" \ -H "anthropic-version: 2023-06-01" \ -H "content-type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "max_tokens": 64, "messages": [{"role": "user", "content": "只回复两个字:通了"}] }'预期返回里能看到content字段和模型输出。如果返回 401,是 Key 问题;返回 404,是 base_url 或路径问题;返回 400,多半是模型名或请求体格式问题。
通道通了之后,再验证 Claude Code 是否读到了配置:
claude --version claude -p "读取 CLAUDE.md,告诉我这个项目用什么包管理器"如果它回答pnpm,说明 CLAUDE.md 已生效。再试 skill:
claude -p "/release-check 现在执行发布检查"它应该按 SKILL.md 里的五步走,而不是自由发挥。最后验证 subagent:
claude -p "用 dep-audit 子代理扫描 src/api 的依赖"主会话只应收到汇总报告,中间查询过程不出现。三步都过,说明 CLAUDE.md + skills + subagents + TaoToken 通道这套骨架一次成型。
5. 本篇常见错排查
Key 读不到:${TAOTOKEN_API_KEY}没展开,多半是环境变量没 export 或 shell 没重载。跑echo $TAOTOKEN_API_KEY确认非空,再重启终端。
base_url 写错:常见错误是写成https://taotoken.net/api/v1又在请求里拼/v1/messages,变成双/v1。base_url 只写到/api,路径由客户端拼。
CLAUDE.md 不生效:确认文件在项目根目录,且settings.json里respect_claude_md为 true。子目录的 CLAUDE.md 只在读取该目录文件时才加载,别指望它全局常驻。
skill 不触发:检查SKILL.md的 frontmatter 是否有name和description,两者缺一不可。斜杠命令调用时名称要和name字段一致。
subagent 结果污染主上下文:如果 subagent 主体里写了“返回中间过程”,主会话就会被塞满。主体里明确要求“只返回最终汇总”,隔离才有意义。
权限被拦:settings.json的deny列表里如果有Bash(rm -rf *),而你的 skill 恰好要清理临时目录,就会被拦。按需调整 allow/deny,别一刀切。
长会话后指令失效:CLAUDE.md 压缩后会重新注入,但 skills 按共享预算重新注入,调用太多时最早的会被丢弃。会话里别堆十几个 skill,按需调用。
6. 下一步:把配置用起来
配置骨架搭好之后,日常使用就三件事:项目根目录维护 CLAUDE.md,流程性内容沉淀成 skill,重上下文副任务交给 subagent。TaoToken 的统一 Key 让这套配置在多个工具间复用,不用每换一个工具就改一次环境变量。
想验证模型对话效果,直接进模型对话页面试:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite 。长期做编码和 Agent 编排,建议看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。接入细节和参数说明在文档里:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。Key 管理和新建都在 API Keys 页面:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。
我自己的习惯是:CLAUDE.md 只留构建命令和目录索引,超过 150 行就往外挪;skill 一个流程一个文件,描述写清楚触发条件;subagent 只在“中间结果会撑爆上下文”时才用。这三条守住,Claude Code 基本不会跑偏。