适用版本:Claude Code 2.1.233(2026-08 实测)。目标:拿到该版本实际发送给 API 中转的完整提示词(system 数组 + 动态上下文 + tools schema)。

背景事实(先说结论)

  • Claude Code 2.1.233 的系统提示词打包在 claude.exe 内(minified JS / 压缩资源)。strings 只能提取到随包 SDK 文档(如 # Tool Use — C#),无法还原提示词正文。
  • 本机经 CC Switch(cc-switch.exe,监听 127.0.0.1:15721)中转。~/.claude/settings.json 的 env 里写死 ANTHROPIC_BASE_URL=http://127.0.0.1:15721,且所有模型(opus/sonnet/haiku/fable)都映射到 deepseek-v4-flash。
  • 关键:base URL 非官方 Anthropic 主机时,claude 使用 SDK 精简提示词(开头 "You are a Claude agent, built on Anthropic's Claude Agent SDK."),不是网上流传的经典 Claude Code 完整版(## System Constraints / ## Tool Use 那种数万 token 版本)。
  • settings.json 的 env 优先级高于 shell 环境变量:export ANTHROPIC_BASE_URL=... 无效,claude 仍走 settings 里的值。想改必须改文件本身。

实测提示词构成(110KB 请求)

部分大小内容
system 数组(3 块)~6.3KB① billing header ② 一句话身份声明 ③ 主提示词:# Harness(终端输出、权限被拒要调整不重试、并行工具调用、file:line 引用)、# Session-specific guidance、# Memory(文件持久记忆)、# Environment、# Context management
首条 user message 的 <system-reminder>~21.9KB# claudeMd(用户全局 CLAUDE.md 原样注入,19KB)+ # currentDate
tools schema27 个工具Agent、Bash、Edit、Read、Write、Glob、Grep、WebSearch、WebFetch、CronCreate、Workflow(描述 19KB)、EnterWorktree、Skill 等。详细行为说明主要在这里
system role message~6KBAgent 工具的可用子代理类型说明
system role message49B<total_tokens>N tokens left</total_tokens>(每轮注入剩余 token 提醒)

其他:thinking: {type: adaptive, display: omitted}(思维链运行但不显示)、max_tokens: 64000。

抓取步骤(MITM 拦截本地中转)

前置:本机有 CC Switch 中转(或任何本地 Anthropic 兼容中转)。

  1. 确认中转与配置:读 ~/.claude/settings.json 的 env;netstat -ano | grep <port> 确认监听。
  2. 写本地 MITM:node http 代理,监听 127.0.0.1:15999,把收到的完整请求 body 存文件,再转发到真实中转(15721)。参考脚本见文末。
  3. 改配置指向 MITM:备份 settings.json → 把 env.ANTHROPIC_BASE_URL 改为 http://127.0.0.1:15999 → 保存。
  4. 触发请求:claude -p "你的问题" --no-session-persistence。
  5. 分析:解析 JSON,导出 system 数组、首条 user message 的 <system-reminder>、tools 名称与描述长度。
  6. 清理:恢复 settings.json(从备份);杀掉 MITM 进程;确认 claude 恢复正常。

失败点与坑(全部实测踩过)

  • 杀 node 进程会误杀 CC Switch 后端:Get-Process node | Stop-Process -Force 会把 cc-switch 的 node 后端一起杀掉 → 15721 无监听 → claude 报 Connection refused。恢复方法:重启 cc-switch.exe,等几秒端口回来。
  • --settings 覆盖会丢掉 AUTH_TOKEN:--settings <file> 整体替换 env,ANTHROPIC_AUTH_TOKEN 丢失 → claude 卡认证超时 180s。不要用这个方式改 base url。
  • node 脚本路径坑:Windows 版 node 把 /c/tmp/x 解析成 C:\c\tmp\x → 启动即 ENOENT 崩溃。脚本内一律用 C:/tmp/x。
  • 直接抓 exe 不可行:提示词是 minified JS 字符串常量,strings 输出的是 SDK 文档和转义后的零散片段。
  • 第三方 CDN 不可靠:raw.githubusercontent.com 的 prompts/sys-prompts.txt 已 404(仓库重构);jsdelivr / npmmirror 走代理时 SSL 偶发断连。本地 exe + MITM 是最稳路径。

参考 MITM 脚本(node)

const http = require('http');
const fs = require('fs');
const server = http.createServer((req, res) => {
  let body = [];
  req.on('data', c => body.push(c));
  req.on('end', () => {
    const payload = Buffer.concat(body);
    if (req.url.includes('messages')) fs.writeFileSync('C:/tmp/cc-full-request.json', payload);
    const r = http.request({ host: '127.0.0.1', port: 15721, method: req.method,
      path: req.url, headers: { ...req.headers, host: '127.0.0.1:15721' } }, rp => {
      res.writeHead(rp.statusCode, rp.headers);
      rp.pipe(res);
    });
    r.on('error', e => { res.writeHead(502); res.end('err'); });
    r.end(payload);
  });
});
server.listen(15999, '127.0.0.1');

启动:powershell -Command "Start-Process -FilePath 'C:\Program Files\nodejs\node.exe' -ArgumentList 'C:\tmp\mitm.js' -WindowStyle Hidden"(bash 工具会话结束会回收子进程,需独立进程)。

如何迁移到其他环境

  • 换版本:抓包结果随版本变,重新走一遍流程即可。
  • 无中转直连官方:ANTHROPIC_BASE_URL 指向官方时是完整提示词(经典版),抓包方法同样适用,但需注意官方域名走 TLS,用 https MITM(装本地 CA)或抓进程内存。

相关概念


本文归档于个人知识库 · 领域:CS & AI · 模块:04 Project_CS_AI/AI apps