Claude Code 最容易让人血压升高的场景,是「方向对了,细节错了」:功能做出来了,但它顺手把你已经满意的代码也重构了一遍。要根治它,我现在的做法分两层:先通过 TaoToken 的官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 拿一把稳定 Key,把 Claude Code 接到兼容通道上,避免中途被 401 打断;再在项目根目录的 CLAUDE.md 里写死一条约束:「其他部分不动」。
这两件事缺一不可。连接不稳时,你没法连续追问,也就没法把「只改这里」的命令一条条说清楚;连接稳了但约束没写,模型照样会按自己的审美发挥。你会看到它把字段重命名、把函数顺序打乱、把老代码"升级"成新写法——每一条都像是改进,但每一条都不在你这次的改动范围内。本文就从这两个点展开,先讲清"顺手重构"这个偏差,再给出可复制的配置文件和 CLAUDE.md 约束写法。
1. Claude Code 又"好心"把我的代码重构了
"方向对了,细节错了"这个偏差,占所有"不对"的情况里相当大的比例。它的典型表现是:你让它往订单列表里加一个状态字段,它做完了,还顺手把另外三个字段改了名,理由是旧命名不统一;你让它修一个空指针异常,它修好了,还把旁边函数的缩进和变量风格也改了,因为"既然都读到这段代码了"。
这种改动最危险的地方在于,它不是完全错误的代码,它甚至看起来更规范了。但你没法确定那三个被重命名的字段有没有被其他模块引用,也没精力把这次 diff 里所有"顺手改"的部分逐个检查,于是验收成本反而比动手改代码还高。更麻烦的是,等你在 review 里质疑它时,Claude Code 通常会给出一套"这样更合理"的解释,好像你才是那个阻碍项目变好的人。
1.1 最贵的错:方向对了,约束没说
为什么模型会这样做?因为 Claude 在训练时被要求"把代码写得更好",它看到一个局部可以改进的地方,就会倾向去改。它不是故意违抗你,而是你的指令里没有给它划边界。你只说「加一个字段」,没说「除此之外什么都别动」——于是它把"让代码更好"当成了和你明确指令同权重的目标。
解决方法不是每次把需求重复三遍,也不是在 prompt 里长篇大论地讲角色设定。关键是追加指令:"这次只改我指出的地方,其他部分不动。"然后把这个约束沉淀到项目根目录的 CLAUDE.md 里,让每次会话都读到它。原文章里数过一个比例:这种"方向对了、细节坏了"的情况占所有偏差的 60%-70%,也是修起来最便宜的一种——补一句约束,而不是推倒重来。
1.2 连接不稳会让"发挥"变本加厉
我之前还碰到过另一个麻烦:连接在连续几次请求后突然断掉。一旦出现 401 或超时,当前会话直接作废。重新开一个会话,CLAUDE.md 还在,但你刚才追加的那条"其他部分不动"的临时指令已经丢了。于是模型带着一个全新的上下文,又从头开始"好心"地发挥一圈。
也就是说,连接不稳不只是浪费几分钟的问题,它会让约束失效的频率变高。你每次都在重新教育同一个模型,而它在每次教育之间都失忆了一遍。这也是为什么我先处理连接,再处理 prompt 约束——顺序反了的话,你今天写进 CLAUDE.md 的规则,明天可能因为一次断线重连而根本没被新会话加载,或者因为 Key 失效而让整个配置形同虚设。
2. 先把连接钉住:Claude Code 环境变量指到 TaoToken
既然问题出在会话连续性,第一步不是急着调 prompt,而是确保你配的这个 Claude Code 能稳定跑完整段对话。我这边用的是 TaoToken 的兼容通道,把 Anthropic 系的请求统一接到一个固定的 Base URL 上,再把 Key 和模型 ID 填进 Claude Code 的环境变量。这样做的好处是,你不用在多个供应商之间反复改配置,会话中途也不会因为流量波动被踢下线。
2.1 从官网拿 Key,顺手看两眼模型广场
先去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 注册并登录。进入控制台后创建一把 API Key,复制出来的字符串就是后面配置里的 YOUR_API_KEY。创建 Key 时,页面会同时展示模型广场入口,不要凭印象填模型 ID,以模型广场当时列出的 ID 为准——不同时期可用的模型会调整,写错模型 ID 的表现通常是 404 或者 model not found。
注意区分两个地址:给人点的是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end ,注册、创建 Key、查用量都在这上面;填进工具的 Base URL 是 https://taotoken.net/api ,末尾不要加 /v1,也不要带任何 UTM 参数。这两个混了,最容易出现的状况是拿官网地址当接口地址,请求根本发不到模型上,报错还非常难懂。
2.2 settings.json 里把环境变量写清楚
Claude Code 的配置文件位置在 ~/.claude/settings.json。在 env 节点下加入下面三项,然后保存:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "YOUR_MODEL_ID" } }YOUR_API_KEY 替换成你从官网控制台复制出来的那串,YOUR_MODEL_ID 替换成模型广场里实际存在的模型 ID。如果之前用过官方默认配置,settings.json 里可能已经有旧的 ANTHROPIC_BASE_URL,直接覆盖即可,不要保留两套。改完不需要重启机器,重新打开一个 Claude Code 会话就生效。如果你平时在办公电脑和家里换着写代码,记得把这份 settings.json 同步过去,或者用 dotfiles 管理,不然另一台机器还是会走旧通道。
配置好之后,你连续追问十几次、二十几次,连接不会像以前那样时不时断掉。这是后续所有约束能被听进去的前提——人在对话里能保持前后一致,机器也一样,前提是对话本身没断。
3. CLAUDE.md 加一句"其他部分不动"
连接稳定之后,第二步是把约束写进项目的长期记忆。Claude Code 每次启动会话都会优先读项目根目录的 CLAUDE.md,所以你对"改动边界"的要求放在这里,比临时在 prompt 里说更可靠。每次新会话都会自动加载,不需要你重新交代一遍。
3.1 追加指令,不要重来
在项目根目录的 CLAUDE.md 末尾追加下面这段,注意是追加,不是把整个文件重写:
## 代码修改约束 - 只修改用户明确指出的位置,其他部分不动。 - 不要顺手重命名、重构、改变量名、改函数签名、调整缩进风格。 - 如果发现"值得优化"的相邻代码,先列成待确认清单,等用户同意后再改。 - 每次改完,自查一遍 diff:里面是否夹带了本次需求外的改动。核心是第一条。原文章的观察里,关键就是要明确说出"其他部分不动"这半句;不说,Claude 就可能把已经满意的代码也重构一遍,然后你又多出一堆要检查的东西。加上之后,大部分"顺手"行为会被挡掉,剩下那些偶发越界,可以在对话里当场追加指示就行。
追加时不要把 CLAUDE.md 里已有的内容推翻。它是项目级记忆,里面可能已经写了代码风格、目录结构、测试命令等约定。你要做的只是增加一段"修改边界"的说明,让原有的规则和新加的限制共同生效。注意这里的顺序:CLAUDE.md 是每次会话都会读的,所以写进去之后,后续新开的会话都会默认带上这条边界。
3.2 方向歪了和数据过度的处理可别搞混
需要区分两种状况。第一种是方向歪了:整个实现思路就不是你想要的,比如该用异步流处理的,它给你写了个同步阻塞版本。这种不要试图逐行修补,直接否定,补上你预期的技术方向,让它重来。修补一个用错架构的实现,改到最后往往比从头写还费劲,而且你每改一行都要对抗它最初的设计假设。
第二种是做了你没让它做的事,也就是"做多了"。这种情况不要再补一条新指令了事,先把多余改动撤回,比如把那些不在本次需求内的文件恢复原样,然后再在 CLAUDE.md 里补一句"只改我点名的文件"。和第一种不同,做多了是方向对但边界失控,修法是画边界,不是推倒重来。撤回时推荐用 git checkout 精确还原单个文件,不要 git reset 整个工作区,否则你自己写了一半的代码也会被回滚掉。
4. 验证:连续追问时,约束不再被 401 打断
配置都改完后,先别急着接大任务,花五分钟做一轮验证。验证目标有两个:一是确认请求能稳定发到模型并且持续返回,二是确认 CLAUDE.md 的约束真的生效了。两个都通过,后面写大功能时才不会一边查逻辑一边提防它乱动。
4.1 先用一个小需求试会话是否稳定
找一个小改动,比如让 Claude Code 给某个函数加一行注释。连续追问四五轮:加注释、改注释、再改回去。以前走不稳的连接,通常在这几轮里就会暴露 401 或超时;走 TaoToken 通道后,这几轮应该全程干净。这个测试的目的不是验证模型聪明不聪明,而是验证通道稳不稳。通道稳了,才能进入下一步,否则你后面所有约束测试都会被断线干扰。
如果中途断了,按第 5 章的排查看是 Key 问题、Base URL 问题还是模型 ID 问题。修完之后重新打开会话再跑一轮。注意每次改动配置后,旧会话里通常不会生效,一定要新开一个 Claude Code 会话再验证。
4.2 故意踩一次"顺手优化"看它动不动
再做一个更针对性的测试:让它给一个已有函数加一个参数,然后观察 diff。重点不是看它有没有把参数加上,而是看它有没有顺手动其他东西。如果 diff 里只有你要求的那个函数,说明 CLAUDE.md 的边界约束生效了;如果它又改了别的,回到第 3 章检查 CLAUDE.md 是否被正确加载。可以在对话里输入请列出当前项目根目录的 CLAUDE.md 中与修改约束相关的条目,确认它读到了那几条规则。
这个测试很值得做。因为你调动约束之后,它可能平时不犯,但模型是概率性的,偶然还会越过一次。这时候不需要每次改 CLAUDE.md,在当场追加一句"这次改动不需要优化命名,保持原有变量名",通常就能拉回来。当场约束和文件约束结合,是性价比最高的组合。
5. 排障:401 和 Base URL 末尾多 /v1
这一路配下来,我实际遇到的错主要是两个,都在配置阶段就会暴露,越早发现越好。
5.1 401 认证失败
表现是请求发出去后立刻返回 401,或者提示 invalid x-api-key。先检查 settings.json 里 ANTHROPIC_AUTH_TOKEN 复制的是不是完整字符串,开头结尾有没有被 shell 截掉空格。再确认这把 Key 确实在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 控制台创建过,而不是把官网页面地址本身当成了 Key。如果确认 Key 没问题但还是 401,看一下系统时间是不是和标准时间差太多,个别签名校验对时间偏移很敏感。
5.2 Base URL 末尾多了 /v1
Claude Code 的官方示例里,Anthropic 的 Base URL 常被写成 https://api.anthropic.com/v1 。沿用这个习惯,就容易把 https://taotoken.net/api 错写成 https://taotoken.net/api/v1 。TaoToken 的兼容通道是直接填 https://taotoken.net/api ,v1 已经内部处理掉了。多加 /v1 会返回 404 或者 route not found,这个报错很容易误导人,看起来像模型不存在,其实是地址路径不对。
另外提醒一下:模型 ID 不要在多个工具之间互相抄,Claude Code 里能用的 ID,和模型广场里展示的并不总是一模一样,以 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 模型广场当时列表为准。改完配置后重新打开会话再试一次。这两个错修完之后,我的连接就没有再中途断过了,后面调 CLAUDE.md 约束时才有了真正的连续上下文。
6. 跑通之后,去 TaoToken 控制台核一下调用记录
配置保存后,先在 TaoToken 模型对话 里用同一把 Key 发一条测试消息,确认模型 ID 和 Base URL 没填错。若要长期写代码,可以打开 Coding Plan 看套餐是否够用;Key 在 控制台 API Keys 创建。Claude Code 环境变量对照见 接入文档。
如果用量列表里能看到刚才那几轮测试调用,说明整套链路已经通了。之后你在 CLAUDE.md 里追加的每一条约束,都会在每一次新会话中生效;连接稳定了,你也能在关键节点上反复追问下去,不用再担心话说一半被 401 打断。以后遇到它又想"顺手优化"时,你就知道:不是要重新调教一遍,只要把那句"其他部分不动"写进该写的地方。