
Cách Ghi Lại Phiên Claude Code, và Mọi Tác Nhân Khác Không Chịu Hợp Tác: Cẩm Nang Thực Chiến
- openaiMỚIOpenAI: GPT-6 Astra2026-09-0455Trí tuệ77Lập trình
- googleMỚIGoogle: Gemini 3.8 Flash2026-09-0247Trí tuệ76Lập trình
- qwenMỚIQwen: Qwen3.8 Max (0902)2026-09-0247Trí tuệ72Lập trình
- anthropicMỚIAnthropic: Claude Fable 5.12026-09-0157Trí tuệ82Lập trình
- AlibabaMỚIQwen: Qwen3.8 Flash2026-08-26$0.15 / $0.47 trên 1 triệu token
- z-aiMỚIZ.ai: GLM 5.3 Flash2026-08-2646Trí tuệ72Lập trình
- DeepSeekDeepSeek: DeepSeek V4 Flash Vision (Exp)2026-08-21$0.15 / $0.29 trên 1 triệu token
- z-aiZ.ai: GLM 5.32026-08-1849Trí tuệ75Lập trình
- obsidianQwen3.8 27B2026-08-1541Trí tuệ68Lập trình
- qwenQwen: Qwen3.8 27B (free)2026-08-13qwen/qwen3.8-27b-free
- deepseekDeepSeek: DeepSeek V4 Pro 08132026-08-1242Trí tuệ69Lập trình
- grokSpaceXAI: Grok 4.62026-08-1251Trí tuệ77Lập trình
- metaMeta: Muse Spark 1.22026-08-0547Trí tuệ72Lập trình
- qwenQwen: Qwen3.8 Max2026-08-0347Trí tuệ72Lập trình
- deepseekDeepSeek: DeepSeek V4 Flash 07312026-07-3141Trí tuệ69Lập trình
- minimaxMiniMax: MiniMax-H32026-07-31minimax/minimax-h3
- qwenQwen: Qwen3.7 Flash2026-07-27$0.03 / $0.13 trên 1 triệu token
- orcaOrcaDub: OrcaDub 1.02026-07-27orca/dub
- anthropicAnthropic: Claude Opus 52026-07-2454Trí tuệ78Lập trình
- googleGoogle: Gemini 3.6 Flash2026-07-2140Trí tuệ69Lập trình
{{1}}Vâng: bạn có thể ghi lại một phiên Claude Code ngay hôm nay, và thứ bạn nhận được là toàn bộ mọi thứ (mọi lượt phản hồi của mô hình, mọi lời gọi công cụ, mọi tệp mà tác nhân đã đụng tới) trong một dạng bạn có thể phát lại. Đó là phiên bản ngắn gọn, và nó vẫn đúng ở thời điểm hiện tại.{{/1}} {{2}}Phiên bản dài hơn là: khả năng ghi lại được quyết định theo từng harness, dựa trên hai câu hỏi — liệu harness có thể được trỏ tới một proxy hay không, và liệu định dạng wire của nó có được hiểu khi lưu lượng truy cập đến hay không. Claude Code vượt qua cả hai, và Codex CLI đăng nhập bằng khóa API cũng vậy. Một tác nhân có URL nhà cung cấp được mã hóa cứng trong mã nguồn, một tác nhân chạy trong container hoặc trên VPS, và một harness đăng nhập bằng tài khoản thuê bao — mỗi loại đi một con đường khác nhau, và một trong số đó, ở thời điểm hiện tại, không tới được đích.{{/2}}
Điều đã thay đổi là những tác nhân này không còn là bản demo. Chúng nằm trong repository của bạn với quyền truy cập shell, sửa tệp, chạy bộ kiểm thử, mở pull request. Khi một trong số chúng làm điều bạn không lường trước — dù là xóa nhầm tệp, lặp đi lặp lại cùng một bài kiểm thử thất bại, hay đốt cháy cả buổi chiều tính toán — thì phần cuộn lại của terminal không phải là bằng chứng. Nó chỉ là một bản kết xuất, và là một bản không đầy đủ.
Thứ bạn cần là dữ liệu truyền thực tế: những gì thực sự được gửi đến mô hình, những gì thực sự được trả về, và agent đã làm gì giữa các lượt. Bản ghi đó cũng chính là khởi đầu của một bộ đánh giá (eval suite), vì một phiên hoạt động được ghi lại là một bài kiểm tra hồi quy mà bạn có thể phát lại cho mô hình tiếp theo hoặc prompt tiếp theo. Vấn đề là mọi harness đều giả định rằng nó đang giao tiếp trực tiếp với nhà cung cấp của mình, và hầu như không cái nào giúp việc thay đổi điều đó trở nên dễ dàng.
Điều gì quyết định liệu một harness có thể được ghi lại hay không?
Mọi câu hỏi kiểu “bạn có thể ghi lại nó không” đều quy về cùng hai câu hỏi.
Điều đầu tiên: liệu harness có thể được trỏ tới một proxy không? Bốn cách tiếp cận giải quyết vấn đề này, theo thứ tự giảm dần về độ thuận tiện.
• Biến base-URL. Đường dẫn được tạo cho việc này: harness đọc biến môi trường base-URL do bạn thiết lập.
• Tự mình khởi tạo harness. Tiến trình con kế thừa môi trường của tiến trình cha, vì vậy một gateway khởi tạo một coding agent cũng bị thu thập mà không cần sự hợp tác của agent.
• Chặn bắt TLS. Đối với các bộ harness không đọc bất kỳ cấu hình nào, trình ghi sẽ khởi chạy agent và bạn chọn tham gia vào việc chặn bắt.
• Đính kèm. Khi agent chạy ở nơi mà recorder không thể khởi chạy nó, điều còn lại là đính kèm.
Nếu không có trường hợp nào trong số đó áp dụng, lưu lượng truy cập sẽ không bao giờ đến được bộ ghi âm và không có gì để bàn luận.
Thứ hai: khi lưu lượng truy cập đến, định dạng truyền trên đường dây của nó có được hiểu không? Việc bắt giữ các byte không phải là sản phẩm. Bộ ghi phải nhận diện được cuộc hội thoại mà nó đang thay mặt—bao gồm hình dạng các lời gọi công cụ, các khung phát trực tiếp, và các lần thử lại—nếu không thì bản ghi chỉ là một pcap, chứ không phải một bản phát lại. Một định dạng mà bộ ghi hiểu được sẽ tạo ra một phiên bạn có thể phát lại; một biệt ngữ riêng tư chỉ tạo ra bản ghi mà bạn chỉ có thể nhìn chằm chằm vào.
Câu trả lời khác nhau tùy theo từng harness, và nó khác nhau ở những chi tiết dễ làm sai: đó cũng chính là bài học rút ra khi so sánh cách mà harness của DeepSeek khác với Claude Code. Phần còn lại của bài viết này sẽ cho thấy hai câu hỏi đó trông như thế nào khi bạn thực sự chạy các harness.

Claude Code, Codex CLI và Agents SDK
Claude Code là chuẩn mực mà mọi thứ khác được đem ra so sánh, vì nó đọc ANTHROPIC_BASE_URL. Chỉ cần trỏ biến đó tới recorder, khởi động agent, là phiên làm việc sẽ hiện về từng lượt: các prompt, các lời gọi công cụ, các lần sửa tệp và các phản hồi của model xen giữa chúng. Chúng tôi đã kiểm chứng toàn trình bằng một ca sửa lỗi thực tế (một repository thực, một lỗi thực, một phiên chạy từ prompt đầu tiên tới bản sửa hoạt động được), và agent thật đầu tiên đó đã làm hỏng bốn thứ mà không một fixture nào từng gây ra. Cả bốn đều đã được sửa từ đó – nói thẳng ra, lưu lượng giả lập không thể giúp bạn lường trước những gì một agent thật sẽ làm khi bị bỏ lại một mình với codebase.
Với Codex CLI đăng nhập bằng khóa API, câu chuyện cũng tương tự khi dùng OPENAI_BASE_URL. Trỏ nó vào bộ ghi và bạn sẽ có phiên làm việc; không có gì khác thay đổi trong cách bạn sử dụng harness.
Các agent lập trình kế thừa con đường dễ nhất trong tất cả. Một tiến trình con kế thừa môi trường của tiến trình cha, vì vậy một gateway sinh ra agent viết mã cũng sẽ bị thu thập, mà không cần đến sự hợp tác của agent. Chỉ cần đặt biến base-URL một lần trong tiến trình thực hiện việc sinh ra, và mọi agent mà nó khởi chạy sẽ tự đi đến recorder. Nếu bạn chạy agent từ CI, từ orchestrator, hoặc qua Agents SDK, thì đây chính là con đường bạn đang đi.
Máy ghi trong tất cả các trường hợp này là OrcaReplay. Nó được cài đặt bằng npm i -g orcareplay, yêu cầu Node 20 trở lên và không có phụ thuộc native: không có gì để biên dịch, không có gì để build. Nó ghi lại cùng lưu lượng tác tử mà OrcaRouter định tuyến qua danh mục mô hình của OrcaRouter.

Một tác nhân không đọc biến base-URL nào.
Một số harness mã hóa cứng URL của nhà cung cấp trong mã nguồn. Không có biến môi trường, không có tệp cấu hình, không có cờ lệnh. Việc đặt ANTHROPIC_BASE_URL không có tác dụng gì, vì không có gì đọc nó. Nếu trình ghi có thể khởi chạy agent, thì vẫn còn một con đường, và đó là con đường mà người ta lo ngại nhất: đánh chặn TLS.
Chọn tham gia đúng nghĩa là một lựa chọn chủ động; nó tắt theo mặc định. Khi bạn bật tính năng này cho một lần chạy, trình ghi âm sẽ tạo ra một cơ quan cấp chứng chỉ duy nhất cho lần chạy đó và cơ quan đó chỉ được tác nhân do trình ghi âm khởi chạy tin cậy: nó được chuyển cho một tiến trình duy nhất đó, không được cài vào chuỗi khóa hệ thống của bạn, không để lại cho lần chạy tiếp theo. Khi lần chạy kết thúc, cơ quan này sẽ bị xóa. Tác nhân kết nối với máy chủ được mã hóa cứng của nó đúng như trước đây; trình ghi âm trả lời, và phiên làm việc đến như thể URL vốn đã có thể cấu hình từ đầu.
Điều mà tuyến cố ý từ chối cũng quan trọng như điều nó thực hiện. Nó chỉ đọc các máy chủ trong danh sách cho phép của mình chứ không đọc gì khác. Các máy chủ bên ngoài danh sách cho phép được chuyển qua đường hầm mà không bị đọc và được ghi nhận dưới dạng một địa chỉ và một số byte: bằng chứng rằng tác nhân đã liên lạc với một nơi nào đó, còn nội dung trao đổi thì không một byte nào được lưu lại. Ranh giới đó là một quyết định thiết kế, không phải là một hạn chế chúng ta chưa xử lý tới; cùng một nguyên tắc đó cũng xuyên suốt tường lửa tác nhân của OrcaRouter, nơi danh sách cho phép chính là sản phẩm chứ không phải là tác dụng phụ của việc ghi nhận.

Điểm mấu chốt cũng chính là điều đã nêu ở câu hỏi đầu tiên: việc đánh chặn hoạt động khi recorder khởi chạy agent. Một agent đã chạy sẵn bên trong container sẽ không bao giờ nhận được certificate authority của lần chạy đó, và nó sẽ không tin cậy câu trả lời của recorder.
Một {{KEEP}}agent{{/KEEP}} không nằm trên máy này.
Một container có môi trường riêng của nó. Biến base-URL bạn đặt trong shell của mình không thể chạm tới bên trong nó, và một recorder trên host không thể khởi chạy một tiến trình vốn đã tồn tại ở nơi khác: trên VPS, trong CI, trong một sandbox mà harness đã dựng lên mà không hỏi bạn. Phương thức thu thập dựa trên khởi chạy (launch-based capture) thất bại ở đây không phải vì agent khó khăn, mà vì recorder không bao giờ có thể chạm tới nó.
Chính trong trường hợp này, có orca attach: nó ghi lại một agent mà recorder không thể khởi chạy, chẳng hạn như một agent trong container hoặc trên VPS. Chiều hoạt động bị đảo ngược: thay vì recorder khởi động agent và trao cho nó một môi trường, nó gắn vào một agent đang chạy và ghi lại agent đó.
Điều mà attach không làm là trả lời câu hỏi thứ hai cho bạn. Nó giải quyết việc đưa lưu lượng truy cập đến bộ ghi; liệu lưu lượng đó có trở thành phiên bạn có thể phát lại hay không vẫn phụ thuộc vào việc định dạng đường truyền có được hiểu hay không. Gắn một agent nói được định dạng mà bộ ghi biết và bạn sẽ có một phiên phát lại được. Gắn một agent không nói được định dạng đó, và bạn đã tìm thấy bức tường — điều tìm ra có chủ đích thì rẻ hơn nhiều so với tìm ra giữa lúc sự cố.
Đăng nhập bằng gói đăng ký thay đổi điều gì?
Cùng một tệp nhị phân có thể được ghi lại hoặc không, tùy thuộc vào cách nó được đăng nhập. Codex CLI đăng nhập bằng API key sẽ bị ghi lại thông qua OPENAI_BASE_URL: trỏ nó vào bộ ghi là xong. Với cùng CLI đó, nếu đăng nhập bằng gói ChatGPT, nó sẽ ngừng hoàn toàn giao tiếp với endpoint này; nó liên lạc với backend riêng, được xác thực với tư cách bạn, và không có origin nào để viết lại. Biến base-URL vẫn tồn tại, nhưng bất cứ thứ gì bạn trỏ nó tới cũng không trở thành dịch vụ mà harness thực sự đang sử dụng.
Đây là câu hỏi thứ hai bị lỗi, không phải câu hỏi đầu tiên. Các byte có thể được làm cho di chuyển; bộ ghi thậm chí có thể thấy chúng. Nhưng cuộc hội thoại được gửi đến một backend mà bộ ghi không thể thay thế, trong một luồng không phải là API mà bộ ghi giao tiếp. Không có bản phát lại nào để tạo ra vì không có nguồn gốc nào mà bộ ghi có thể trở thành.
Đối với một harness đăng nhập bằng gói đăng ký, câu trả lời thẳng thắn ở thời điểm hiện tại là nó không thể ghi lại được, và bài học hữu ích là phương thức đăng nhập nằm trong quyết định về khả năng ghi lại. Nếu bạn cần bản ghi cho việc đánh giá hoặc cho nhật ký kiểm toán, hãy chạy các phiên cần ghi lại bằng API key và giữ gói đăng ký cho công việc tương tác — cách biến một phiên đã ghi thành một bài đánh giá hồi quy trình bày trọn vẹn vòng lặp đó. Và trước khi bạn chuẩn hóa trên bất kỳ harness nào, hãy đặt hai câu hỏi đó cho nó; chúng tôi vẫn làm chính xác điều đó với từng harness, gần đây nhất là với harness Prime Agent.
Bài học rút ra
Bạn có thể ghi lại một phiên Claude Code ngay hôm nay chỉ với một lệnh và một biến môi trường:
• npm i -g orcareplay
• Trỏ ANTHROPIC_BASE_URL vào máy ghi
• Chạy agent
Một Codex CLI dùng API key cũng ở cùng một khoảng cách như vậy. Một URL hardcode khiến bạn phải chọn tham gia cơ chế đánh chặn TLS vốn chỉ đọc allowlist của nó (cùng nguyên tắc mà tường lửa agent của OrcaRouter thực thi) và quên đi các chứng chỉ của chính nó khi phiên chạy kết thúc. Một container hoặc một VPS khiến bạn phải chạy lệnh orca attach. Đăng nhập bằng subscription khiến bạn mất chính bản ghi: harness đó sẽ không được ghi lại, và không có thay đổi cấu hình nào thay đổi được điều đó ngay hôm nay.
Toàn bộ quyết định trong một cái nhìn thoáng qua:
• Claude Code — Đăng nhập bằng API key so với định tuyến tới bộ ghiANTHROPIC_BASE_URL so với có thể ghi lại hôm nay: Có
• Codex CLI — Khóa API đăng nhập so với Đường dẫn đến bộ ghi OPENAI_BASE_URL so với Có thể ghi hôm nay Có
• Harness có URL nhà cung cấp được gắn cứng — Đăng nhập bất kỳ so với Định tuyến đến bộ ghi. Đánh chặn TLS theo tùy chọn, do bộ ghi khởi chạy, so với Ghi được hôm nay: Có.
• Agent trong container hoặc trên VPS — Sign-in Any so với Định tuyến tới máy ghi orca attach so với Hiện tại có thể ghi: Có, nếu định dạng wire được biết.
• Codex CLI — Đăng nhập: Gói đăng ký ChatGPT so với Đường dẫn đến bộ ghi âm: Không có so với Có thể ghi hôm nay: Không
Hàng cuối cùng là tổ hợp duy nhất hoàn toàn không có đường dẫn đến máy ghi âm.
Hãy đặt hai câu hỏi ấy trước khi bạn bắt đầu sử dụng dây an toàn, chứ không phải sau sự cố đầu tiên của bạn; câu trả lời rất dễ có được, và chúng quyết định liệu buổi mà một ngày nào đó bạn sẽ vô cùng cần đến có tồn tại hay không.
Ghi chú nguồn: mọi hành vi và số liệu trong bài viết này (các đường dẫn thu thập `ANTHROPIC_BASE_URL` và `OPENAI_BASE_URL`, bốn sự cố phát sinh sau fixture và cách khắc phục, vòng đời chứng chỉ TLS, hành vi danh sách cho phép và tunnel, lệnh `orca attach`, và các yêu cầu cài đặt) đều đến từ các lần chạy xác thực của chính chúng tôi trên các bộ kiểm thử được nêu tên, gần đây nhất là vào ngày 2026-09-04. Chúng tôi không trích dẫn điểm chuẩn của bên thứ ba vì chúng tôi không chạy bất kỳ điểm chuẩn nào.
