
1. 当 Claude Code 开始改自己的代码工程上到底发生了什么先说结论2026 年这波 Agentic Coding 最让人不安的不是模型变强而是 Agent 开始读自己产出的日志、改自己依赖的模块、再跑一遍自己写的测试。这个闭环一旦跑起来你面对的就不再是补全一段函数而是一个自指递归系统。Claude Code 是目前最适合拿来拆这个问题的样本因为它把工具调用、文件读写、命令执行都暴露在终端里可观测性比 IDE 插件好得多。我先把场景说清楚。假设你让 Claude Code 做一件事优化它自己项目里的一个工具函数parse_agent_log.py这个函数负责解析 Agent 每轮输出的 JSON 日志。任务本身是自指的——Agent 改的代码正是用来观测 Agent 自己的代码。这时候三个问题立刻冒出来第一它改完之后你怎么知道没把观测能力改坏第二递归调用自己时深度和 token 怎么控第三失败了怎么回滚到上一个能跑的版本这三个问题对应三个工程动作可观测性、收敛判定、失败回滚。下面我会用 TaoToken 作为统一 API 通道把 Claude Code 接进来然后构造一个真实的自指任务记录递归深度和 token 消耗最后对比人工介入前后的收敛曲线。全程可复制你跟着敲就行。适合谁看已经在用 Claude Code 或 Cline 做日常开发、想进一步把 Agent 放进 CI 或本地自动化流程的人对自指递归这个词好奇、但更想知道工程上怎么落地的人。不适合只想看哲学讨论的读者这篇全是配置和命令。核心检索词先埋在这Claude Code 自指递归 Agentic Coding 的可观测性与收敛判定是 2026 年 AI 编程 Agent 从能用走向可控的关键工程问题。下面从环境准备开始。2. TaoToken 统一 Key 接入 Claude Code 的前置配置Claude Code 默认走 Anthropic 官方通道但在国内做 Agentic Coding 实验网络和计费两块都容易卡住。TaoToken 提供的是 OpenAI 兼容 Anthropic 兼容的统一 API 通道一个 Key 可以同时给 Claude Code、Cline、Codex 用省得每个工具配一遍。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后在控制台生成 Key。这里要强调一点TaoToken 是合规的 API 聚合通道不是任何形式的非法中转你拿到的 Key 直接对应可计费的模型调用。配置前先确认两件事Node 版本 ≥ 18Claude Code CLI 已安装npm i -g anthropic-ai/claude-code。然后设置环境变量这是 Claude Code 读取通道的入口export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYsk-你的TaoToken密钥 export ANTHROPIC_MODELclaude-sonnet-4-5-20250929注意ANTHROPIC_BASE_URL后面不加任何路径Claude Code 会自己拼/v1/messages。如果你用的是 Cline 或 Roo Code 这类 VS Code 插件配置项名字不一样但三件套是一样的Base URL、API Key、Model ID。Cline 的 settings.json 片段如下路径在~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json同级目录{ apiProvider: anthropic, anthropicBaseUrl: https://taotoken.net/api, anthropicApiKey: sk-你的TaoToken密钥, anthropicModelId: claude-sonnet-4-5-20250929 }如果你用 Codex它读的是~/.codex/auth.json格式是{ OPENAI_API_KEY: sk-你的TaoToken密钥, OPENAI_BASE_URL: https://taotoken.net/api }三件套记牢Base URL 填https://taotoken.net/apiKey 填控制台生成的Model ID 填你要用的具体模型名。Model ID 写错是最常见的 401 来源之一后面排障会细说。配完之后先别急着跑自指任务用一条最小请求验证通道通不通curl https://taotoken.net/api/v1/messages \ -H x-api-key: sk-你的TaoToken密钥 \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d {model:claude-sonnet-4-5-20250929,max_tokens:64,messages:[{role:user,content:reply with ok}]}返回里出现content:[{type:text,text:ok}]就说明通道没问题。这一步别跳过很多人后面报错其实是 Key 或 Base URL 写错却以为是 Agent 逻辑问题。通道验证通过后再进 Claude Code 交互模式输入/status确认当前模型和通道看到 base URL 指向 taotoken 就对了。3. 构造自指任务让 Claude Code 改自己的日志解析器现在进入正题。我们要构造一个真实的自指任务让 Claude Code 优化它自己项目里用来解析 Agent 日志的脚本。先建一个最小项目mkdir -p ~/self-ref-agent cd ~/self-ref-agent git init然后写一个故意写得笨拙的parse_agent_log.py它负责从 Claude Code 每轮输出的 JSONL 里提取tool_use和token_usageimport json, sys def parse(path): rows [] with open(path) as f: for line in f: try: obj json.loads(line) except json.JSONDecodeError: continue if obj.get(type) assistant: for block in obj.get(message, {}).get(content, []): if block.get(type) tool_use: rows.append({ tool: block.get(name), input: block.get(input), tokens: obj.get(message, {}).get(usage, {}).get(output_tokens, 0) }) return rows if __name__ __main__: for r in parse(sys.argv[1]): print(r)这个脚本能跑但没有递归深度统计也没有按轮次聚合 token。现在让 Claude Code 来改它。启动交互模式claude然后输入任务提示词注意要显式要求它记录递归深度否则它只会做表面优化读取当前目录的 parse_agent_log.py为它增加两个能力1统计每条 assistant 消息在本次会话中的递归深度用消息序号近似2按 tool 名称聚合 output_tokens。改完后自己运行一次把改动前后的输出对比贴出来。不要修改文件名。Claude Code 会先读文件然后写新版本再执行python parse_agent_log.py sample.jsonl。这里的关键是它改的代码正是用来观测它自己行为的代码。这就是自指递归的工程形态——不是哲学悖论而是一个可运行的闭环。为了让它有日志可解析你需要先跑一次带日志输出的会话。Claude Code 支持--output-format json把每轮输出写成 JSONLclaude -p 列出当前目录文件 --output-format json sample.jsonl然后让 Agent 解析这个文件。实测下来第一次改完通常能跑通但递归深度统计经常写错——它会把message.id当成序号而实际上 JSONL 里没有稳定的轮次字段。这时候就触发了收敛判定问题Agent 自己跑测试、发现输出不对、再改一版。这个循环就是我们要观测的对象。4. 验证请求与成功结果记录递归深度和 token 消耗Agent 改完代码后你要做的不是看它说完成了而是自己跑一遍验证。三步验证动作构造自指任务、记录递归深度与 token 消耗、对比人工介入前后的收敛曲线。第一步已经在上一节做了现在做第二步。先看 Agent 自己跑出来的结果。它通常会在终端里贴出类似before: [{tool: Read, tokens: 120}, {tool: Bash, tokens: 340}] after: {Read: 120, Bash: 340} depth_map: {1: 120, 2: 340}但你要独立验证。用 TaoToken 的模型对话通道手动发一条请求确认模型 ID 和通道一致顺便记录这次调用的 tokencurl https://taotoken.net/api/v1/messages \ -H x-api-key: sk-你的TaoToken密钥 \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d {model:claude-sonnet-4-5-20250929,max_tokens:256,messages:[{role:user,content:用一句话说明递归深度统计为什么不能用 message.id}]}返回的usage.output_tokens就是这次调用的消耗。把每次 Agent 迭代的 token 记到一张表里这是收敛曲线的原始数据。我实测的一个典型序列是这样的迭代轮次动作output_tokens是否通过自测1初版改写1840否2修 depth 字段960否3改用 enumerate720是4人工介入后微调310是可以看到 token 消耗逐轮下降第 3 轮通过自测这就是收敛。如果第 5、6 轮 token 还在涨、自测还不过说明 Agent 陷入了自指震荡——它在反复改同一处逻辑这时候必须人工介入。人工介入的动作很简单在 Claude Code 里按 Esc 打断然后输入明确约束比如不要再用 message.id直接用文件行号作为 depth。介入后第 4 轮 token 骤降到 310收敛完成。把这张表画成曲线横轴轮次、纵轴 token你会看到一条先高后低的下降曲线人工介入点就是曲线拐点。这就是对比人工介入前后的收敛曲线的实操含义。成功结果的判定标准有三条脚本能跑通、输出字段符合预期、token 曲线收敛。三条都满足才算这次自指任务成功。缺任何一条都要回到排障环节。5. 本篇常见错排查401、local proxy failed 与 reading choices自指递归任务跑不起来九成是下面几类错误。我按真实报错逐个拆。401 Unauthorized / invalid x-api-key。这是最常见的。原因通常是 Key 复制时带了空格或者ANTHROPIC_API_KEY和ANTHROPIC_AUTH_TOKEN两个变量冲突。Claude Code 优先读ANTHROPIC_API_KEY如果你同时设了ANTHROPIC_AUTH_TOKEN它会用后者。排查命令echo $ANTHROPIC_API_KEY | head -c 8 echo $ANTHROPIC_BASE_URL确认 Base URL 是https://taotoken.net/api没有多余斜杠。如果 Key 没问题还报 401检查 Model ID 是否拼错比如把claude-sonnet-4-5-20250929写成claude-sonnet-4.5通道会拒绝。local proxy failed / ECONNREFUSED。这个报错说明 Claude Code 试图走本地代理端口但那个端口没服务。常见于之前配过其他工具留下的HTTP_PROXY环境变量。清掉unset HTTP_PROXY HTTPS_PROXY ALL_PROXY然后重启 Claude Code。注意不要用任何网络代理工具TaoToken 通道本身可直连配代理反而会引入这个错误。reading choices of undefined。这是 OpenAI 兼容格式的报错出现在 Cline 或 Codex 里。原因是通道返回的是 Anthropic 格式但客户端按 OpenAI 的choices字段解析。解决方法是确认客户端选的 provider 是 anthropic 而不是 openaiBase URL 保持https://taotoken.net/api。如果你在 Cline 里选了 OpenAI provider 却填了 Anthropic 通道就会报这个。OAuth token expired / Claude Code 要求登录。Claude Code 有时会忽略环境变量走它自己的 OAuth 流程。这时候在交互模式里输入/login会卡住。正确做法是退出后设置CLAUDE_CODE_USE_BEDROCK0并确保ANTHROPIC_API_KEY已导出再启动。如果还不行删掉~/.claude/下的凭据缓存重来。递归深度统计不准。这不是报错是逻辑坑。Agent 常用message.id当轮次但 JSONL 里同一轮可能有多个 assistant 消息。正确做法是用文件行号或显式计数器。人工介入时直接告诉它用enumerate比让它自己试快得多。把这几类错误对照着排查基本能覆盖自指任务 95% 的失败场景。剩下 5% 通常是模型能力问题换个 Model ID 再试。6. 把自指递归 Agent 接进日常流程从实验到可控跑通一次自指任务不难难的是让它稳定进日常流程。我的做法是给 Agent 加一层递归预算在项目根目录放一个agent_budget.toml限制单次任务的迭代轮次和 token 上限。[recursion] max_iterations 5 max_output_tokens 8000 rollback_on_fail true snapshot_dir .agent_snapshots然后在启动 Claude Code 前用脚本读这个配置每轮迭代后检查 token 累计值超了就自动git stash回滚到上一个快照。快照用git commit打 tag 就行不需要复杂工具git add -A git commit -m agent-iter-$N git tag iter-$N失败回滚就是git reset --hard iter-$((N-1))。这套机制让自指递归从跑一次看看变成可重复、可回滚、可计量的工程流程。长期做 Agentic Coding 的话建议把 TaoToken 的 Coding Plan 用起来它按编码场景做了额度优化比单次调用划算。入口在 https://taotoken.net/api-keys 生成 Key接入文档在 https://taotoken.net/doc 有各客户端的完整配置。验证模型行为用模型对话页 https://taotoken.net/chat 最快排障时先在那确认通道和模型 ID 没问题再回到 Claude Code 里查逻辑。最后说个真实经验自指递归任务里Agent 最容易在观测代码和被观测代码耦合的地方翻车。我的做法是把观测逻辑单独抽成一个不参与自改的模块Agent 只能改业务代码不能改观测代码。这样递归深度和 token 统计始终可信收敛判定才有依据。这个边界一旦划清自指递归就从玄学变成了可管理的工程问题。