
如何录制 Claude Code 会话,以及其他所有不合作的智能体:实用实地指南
- openai新OpenAI: GPT-6 Astra2026-09-0455智能77代码
- google新Google: Gemini 3.8 Flash2026-09-0247智能76代码
- qwen新Qwen: Qwen3.8 Max (0902)2026-09-0247智能72代码
- anthropic新Anthropic: Claude Fable 5.12026-09-0157智能82代码
- Alibaba新Qwen: Qwen3.8 Flash2026-08-26$0.15 / $0.47 每百万 tokens
- z-ai新Z.ai: GLM 5.3 Flash2026-08-2646智能72代码
- DeepSeekDeepSeek: DeepSeek V4 Flash Vision (Exp)2026-08-21$0.15 / $0.29 每百万 tokens
- z-aiZ.ai: GLM 5.32026-08-1849智能75代码
- obsidianQwen3.8 27B2026-08-1541智能68代码
- qwenQwen: Qwen3.8 27B (free)2026-08-13qwen/qwen3.8-27b-free
- deepseekDeepSeek: DeepSeek V4 Pro 08132026-08-1242智能69代码
- grokSpaceXAI: Grok 4.62026-08-1251智能77代码
- metaMeta: Muse Spark 1.22026-08-0547智能72代码
- qwenQwen: Qwen3.8 Max2026-08-0347智能72代码
- deepseekDeepSeek: DeepSeek V4 Flash 07312026-07-3141智能69代码
- minimaxMiniMax: MiniMax-H32026-07-31minimax/minimax-h3
- qwenQwen: Qwen3.7 Flash2026-07-27$0.03 / $0.13 每百万 tokens
- orcaOrcaDub: OrcaDub 1.02026-07-27orca/dub
- anthropicAnthropic: Claude Opus 52026-07-2454智能78代码
- googleGoogle: Gemini 3.6 Flash2026-07-2140智能69代码
是的:你现在就可以录制 Claude Code 会话,你得到的是完整的一切——每一次模型轮次、每一次工具调用、代理触碰过的每一个文件——而且可以重放。简而言之就是这样,今天也确实如此。更长的版本是:可录制性取决于每个框架(harness),由两个问题决定:该框架能否被指向一个代理?流量到达后,其传输格式能否被理解?Claude Code 两项都满足,使用 API 密钥登录的 Codex CLI 也是如此。一个在源码中硬编码了提供方 URL 的代理、一个在容器或 VPS 中运行的代理,以及一个以订阅方式登录的框架,各自走的是不同的路径;而其中一种,在今天,无法到达。
变化在于,这些智能体不再是演示品。它们驻留在你的代码仓库中,拥有 shell 访问权限,能编辑文件、运行测试套件、提交 pull request。当其中一个做出了你未曾预料的事情——无论是删错了文件、在同一个失败的测试上反复循环,还是烧掉整个下午的计算资源——终端回滚并不能作为证据。它只是一种呈现,而且是不完整的呈现。
你真正需要的是“线上数据”:实际发送给模型的请求、实际返回的内容,以及代理在回合之间执行的操作。这份记录同时也是一个评估套件的起点,因为捕获到的会话就是一个回归测试,你可以针对下一个模型或下一条提示词重放它。问题在于,每个测试框架都假设自己直接与它的服务提供商通信,而几乎没有任何框架让这种替换变得容易。
什么决定了能否记录测试工具?
每一个“你能录下来吗”式的问题,最终都归结为同样的两个问题。
第一个:能否将测试工具指向代理?四条路径可以解决这一问题,按便利程度降序排列。
• base-URL 变量。为此构建的路由:测试工具会读取一个 base-URL 环境变量,而你来设置它。
• 自行启动 harness。子进程会继承其父进程的环境,因此,即使编程智能体不配合,派生出编程智能体的网关也会被捕获。
• TLS 拦截。对于完全不读取任何配置的测试工具,记录器会启动代理,而您可选择加入拦截。
• 附加。当代理运行在录制器无法启动它的环境中时,剩下的就是附加。
如果这些情况都不适用,流量就永远不会到达记录器,那也就没什么可讨论的了。
第二点:流量到达后,它的线上格式能否被理解?捕获字节并不等于产品。录制器必须识别它所代理的对话,包括工具调用的形态、流式帧以及重试,否则录制结果只是 pcap,而不是回放。录制器能理解的格式能产生可回放的会话;私有方言产生的捕获,你只能盯着看。
答案因评测框架而异,且差异恰恰体现在容易出错的细节上:这正是比较DeepSeek 评测框架与 Claude Code 之间的差异所得出的教训。本文的其余部分将展示实际运行这些评测框架时,这两个问题会是什么样子。

Claude Code、Codex CLI 以及 Agents SDK
Claude Code 是其他一切工具被拿来对照衡量的基准案例,因为它读取ANTHROPIC_BASE_URL。将该变量设置为记录器,启动智能体,会话就会逐轮抵达:提示词、工具调用、文件编辑,以及它们之间模型的回复。我们针对一次真实的 bug 修复做了端到端验证(一个真实仓库、一个真实缺陷、一个从第一条提示词一路运行到修复成功的会话),而这第一个真实智能体就破坏了四个任何测试夹具都未曾产生的问题。这四者事后均已被修复——这其实是在坦率地说明:合成流量并不能让你准备好面对真实智能体独自面对一段代码库时会做的事情。
使用 API key 登录的 Codex CLI 的情况也是一样的:通过 OPENAI_BASE_URL 将其指向记录器,即可获得会话;除此以外,使用 harness 的方式没有任何变化。
编程代理继承的是所有路径中最简单的一种。子进程会继承其父进程的环境,因此,生成编码代理的网关也会被捕获,且无需代理的配合。只需在负责生成的进程中设置一次 base-URL 变量,它启动的每个代理都会自行到达记录器。如果你通过 CI、编排器或 Agents SDK 运行代理,那么你已经走在这条路径上了。
所有这些情况下的记录器都是 OrcaReplay。它可通过运行 npm i -g orcareplay 来安装,需要 Node 20 或更高版本,且没有原生依赖:无需编译,也无需构建。它捕获的正是 OrcaRouter 在 OrcaRouter 的模型目录中所路由的同一智能体流量。

不读取任何 base-URL 变量的代理
某些 harness 会在源代码中硬编码提供商 URL,既没有环境变量,也没有配置文件或标志位。设置ANTHROPIC_BASE_URL不会起任何作用,因为没有代码会读取它。如果记录器能够启动该 agent,那就仍然存在一条途径,而且正是人们最担心的那条:TLS 拦截。
选择加入本就意味着主动选择;默认情况下它是关闭的。当您为某次运行启用它时,记录器会生成一个仅属于该次运行的证书颁发机构(CA),并且该 CA 只受记录器启动的那个代理信任:它被交给那一个进程,不会安装到您的系统钥匙串中,也不会为下次运行留存。当运行结束时,该 CA 即被删除。代理照常连接到其硬编码主机;记录器响应请求,于是会话建立时的表现就好像该 URL 一直是可以配置的一样。
路由刻意拒绝读取的内容,与它实际读取的内容同样重要。它只读取允许列表上的主机,除此之外一概不读。允许列表之外的主机不经读取便被隧道传输,仅记录为一个地址和一个字节数——这证明代理确实联系了某个对象,却未曾留下通信内容的哪怕一个字节。这一边界是有意的设计决策,而不是一个我们尚未触及的局限;同样的原则贯穿于OrcaRouter 的代理防火墙,其中允许列表本身就是产品,而不是记录行为产生的副产品。

难点正是第一个问题中提到的那一个:只有当录制器启动代理时,拦截才会生效。已经运行在容器内的代理从未收到该次运行的证书颁发机构,因此它不会信任录制器的应答。
不在本机上的代理
容器拥有自己的环境。你在 shell 中设置的 base-URL 变量无法传递到容器内部;宿主机上的记录器也无法启动一个已经存在于其他位置的进程——例如 VPS 上、CI 中,或是测试框架在你不知情的情况下构建的沙箱里。基于启动的捕获在这里之所以失败,并不是因为代理难以处理,而是因为记录器根本接触不到它。
正是针对这种情况,可以使用 orca attach:它可以记录一个无法由记录器启动的 agent,例如容器中或 VPS 上的 agent。方向反转了:不再是记录器启动 agent 并把环境传给它,而是附加到一个已在运行的 agent 上并加以记录。
Attach 不会替你回答第二个问题。它解决的是把流量送到记录器的问题;至于这些流量能否成为你可回放的会话,仍取决于线格式是否被理解。挂接一个能说记录器所识别格式的代理,你就能获得可回放的会话。挂接一个不能识别的,你就会撞上那堵墙——而在有意测试时发现这堵墙,比在事故中途才发现要便宜得多。
订阅登录会改变什么?
同一个二进制文件是否可被记录,取决于它的登录方式。要捕获使用 API 密钥登录的 Codex CLI,可以通过设置环境变量OPENAI_BASE_URL:将其指向记录器即可。若让同一个 CLI 使用 ChatGPT 订阅登录,它就会彻底停止与该端点通信;它会以你的身份进行认证,并与其自身的后端通信,因此没有可改写的源地址。base-URL 变量仍然存在,但无论你将它指向何处,那个地址都不会成为 harness 实际使用的服务。
失败的是第二个问题,不是第一个。字节可以被移动,记录器甚至能看到它们。但对话面向的是一个记录器无法代替的后端,而且其流程不是记录器所说的 API。没有可以生成的重放,因为没有记录器能够成为的源点。
对于通过订阅登录的框架,如今最诚实的答案是:它无法被录制;而有益的教训是,登录方式本身就是决定可录制性的一部分。如果你需要录制内容用于评估或审计跟踪,那就用 API 密钥来运行要录制的会话,订阅登录则留给交互式工作——如何将录制会话变成回归评估正是对这个循环的端到端说明。而且,在把任何框架定为标准之前,先向它提出这两个问题;我们对每个框架都坚持这么做,最近一次就是Prime Agent 框架。
要点
只需一条命令和一个环境变量,即可记录今天的 Claude Code 会话:
• npm i -g orcareplay
• 将 ANTHROPIC_BASE_URL 指向记录器
• 运行代理
使用 API 密钥的 Codex CLI 也同样遥远。硬编码 URL 的代价是选择接受 TLS 拦截——该拦截只读取其允许列表(OrcaRouter 的 agent 防火墙也遵循同样的纪律)——并在运行结束时忘掉自己的证书。而容器或 VPS 的代价是运行orca attach。订阅登录的代价则是录制本身:该 harness 不会被录制,而且如今没有任何配置更改能改变这一点。
整个决策一目了然:
• Claude Code — 登录 API 密钥 vs 路由到记录器ANTHROPIC_BASE_URL vs 今日可记录:是
• Codex CLI — 登录 API 密钥 vs 路由到记录器OPENAI_BASE_URL vs 目前可记录:是
• 使用硬编码提供程序 URL 的 Harness — 任意登录 vs 路由至记录器;由记录器启动的可选 TLS 拦截,vs 目前可录制:是
• 容器内或 VPS 上的 Agent — 任意登录 vs 路由至记录器 orca attach vs 目前可录制:可以,前提是线路格式已知
• Codex CLI — 使用 ChatGPT 订阅登录与到录制器的路由:无;今日可录制:否。
最后一行是唯一完全没有通向记录器的路径的组合。
在采用工具之前先问这两个问题,而不是等到第一次事故之后;答案很容易获得,而它们决定了你将来某天急需的那次会话是否存在。
来源说明:本文中的每一项行为和数字——`ANTHROPIC_BASE_URL` 和 `OPENAI_BASE_URL` 的捕获路径、fixture 运行后出现的四处故障及其修复、TLS 证书生命周期、允许列表与隧道行为、`orca attach`、安装要求——均来自我们针对文中点名的各个 harness 的验证运行,最近一次为 2026-09-04。我们未引用任何第三方基准,因为我们未运行过任何基准。
