Mười phút sau khi bắt đầu test OpenAI Agents API mới, mình gõ đúng câu lệnh mình hay dùng để kiểm tra một agent runtime mới: “Tạo file tree.py, in cây thư mục hiện tại, chạy nó, và cho mình biết nó in ra cái gì thật sự.” Cố tình chọn task nhàm chán. Một harness mà không xử lý nổi script năm dòng thì mọi thứ khác cũng vô nghĩa.
Agents API, public beta từ 10/9, chạy ổn. Session được tạo, sandbox khởi động, script được viết, chạy, kết quả báo về qua event stream. Sau đó mình chạy y hệt prompt đó qua Claude Code với một subagent làm cùng việc. Cũng ổn. Kết quả giống nhau, nhưng hình dạng của sự tin tưởng cần có để đến được kết quả đó thì khác hẳn.
Đó mới là câu chuyện thật ở đây — không phải cái nào “tốt hơn,” mà là mỗi cái đặt đường nối (seam) ở đâu, thứ bạn phải suy nghĩ tới khi có gì đó hỏng lúc 2 giờ sáng.
OpenAI ra mắt cái gì
Bốn đối tượng: một Agent (model, instructions, tools, MCP servers), một Environment sandbox tùy chọn, một Session bền vững, và event stream mà session đó đẩy ngược về cho bạn. Bạn chọn sandbox được host sẵn — của OpenAI, hoặc của đối tác như E2B, Modal, Daytona, Cloudflare, Vercel và vài cái khác — hoặc không dùng gì cả và để model chỉ suy luận chứ không thực thi code.
client.beta.agents.sessions.create(
agent={
"model": "gpt-6-astra",
"instructions": "Write clean code, run it, and report the actual output."
},
environment={"type": "openai_hosted"},
input="Create tree.py, a Python script that prints a readable tree of the current directory.",
stream=True,
)
Mọi thứ sau lệnh gọi đó là việc của OpenAI: giữ session sống, nén context khi đầy, khôi phục khi crash giữa chừng, điều phối sub-agent nếu task tách ra nhiều nhánh. Bạn chỉ tiêu thụ event — agent.session.turn.completed, turn.failed, session.failed — và điều khiển từ bên ngoài. Đây chính là Codex harness, cái đang chạy phía sau tính năng coding của ChatGPT, giờ được gọi trực tiếp, tính phí chỉ theo token model, tool call, và compute của sandbox.
Claude Code làm khác ở đâu
Claude Code không đưa bạn một event stream trỏ vào hộp đen — nó chạy vòng lặp điều phối ngay trong process của bạn, và các subagent nó sinh ra thì nhìn thấy được, ngắt được, kiểm tra được trong lúc đang chạy. Khi mình chạy task tree.py qua một subagent của Claude Code, mình nhìn thấy từng tool call ngay lúc nó xảy ra, không chỉ là event kết thúc. Nếu subagent đó đi lệch hướng — ví dụ nó quyết định rm -rf cái gì đó không nên — mình sẽ thấy tool-use block trước khi nó thực thi, ngay trong context mình đang làm việc.
Đó là cái đánh đổi. Mô hình của OpenAI coi harness là hạ tầng: bạn thuê độ tin cậy, bạn không sở hữu các kiểu lỗi. Mô hình của Claude Code coi harness là thứ bạn vận hành bên trong: nhìn thấy nhiều hơn, nhưng bạn cũng là người phải xây rào chắn, vì không có ai nén context hay khôi phục session giúp bạn trừ khi bạn tự nối dây việc đó.
Không cái nào sai. Chúng được xây cho ngân sách chấp nhận lỗi khác nhau.
Chuyện này quan trọng ở đâu với một team thật
Bọn mình chạy ba loại công việc agent tự động cùng lúc: triage khách hàng (chịu lỗi thấp, cần vòng lặp con người nhanh), dọn dữ liệu nội bộ (chịu lỗi vừa, chạy theo batch, retry được), và script khám phá một lần mà kỹ sư bấm chạy rồi đi ăn trưa (chịu lỗi cao, không ai canh).
Loại script khám phá là chỗ Agents API của OpenAI phát huy ngay lập tức. Bạn không muốn phải canh việc nén context cho một script ai đó bấm chạy trước giờ ăn trưa. Việc khôi phục session là việc của người khác — đó là tính năng, không phải lỗ hổng.
Loại triage là chỗ mình vẫn giữ Claude Code, cụ thể vì lỗi cần hiện ra trước mắt con người ngay lúc nó xảy ra, không phải dựng lại sau đó từ log event. Khi agent xử lý ticket hỗ trợ của bọn mình phân loại nhầm một ticket có nguy cơ churn thành mức ưu tiên thấp tháng trước, việc sửa mất bốn phút vì mình đang xem trực tiếp chuỗi suy luận trong cùng session. Một event stream mình phải query lại sau đó sẽ tốn cả buổi chiều.
Phần mà không benchmark nào nói cho bạn
Chi phí không phải là yếu tố phân biệt như người ta tưởng — cả hai đều rơi vào cùng một khoảng khi tính cả compute sandbox lẫn thực thi local. Yếu tố phân biệt thật sự nằm ở tổ chức: team bạn muốn một agent runtime hoạt động như một dịch vụ cloud được quản lý (mờ, đáng tin, tính phí gọn gàng), hay một cái hoạt động như thư viện bạn import vào công việc bạn đang trực tiếp chịu trách nhiệm?
Nếu bạn là startup năm người đang gấp rút ra tính năng, bản managed mua lại cho bạn số giờ kỹ sư mà lẽ ra phải dùng để tự xây logic nén context và retry. Nếu bạn đang chạy agent trên dữ liệu production với team compliance hỏi “cho tôi xem chính xác model đã thấy gì và làm gì,” bạn muốn harness nằm trong process của mình, nơi bạn kiểm soát logging, chứ không phải phía sau event API của người khác.
Cuối cùng bọn mình chạy cả hai, có chủ đích, chia đúng theo ranh giới đó. Không phải vì đó là câu trả lời đẹp — vì đó là câu trả lời thật.
Tự test trong mười lăm phút
export OPENAI_API_KEY=sk-...
python3 -c "
from openai import OpenAI
client = OpenAI()
stream = client.beta.agents.sessions.create(
agent={'model': 'gpt-6-astra', 'instructions': 'Be concise. Run code, report real output.'},
environment={'type': 'openai_hosted'},
input='Write and run a script that lists the 5 largest files in /tmp.',
stream=True,
)
for event in stream:
print(event.type)
"
Xem các loại event chạy qua màn hình. Rồi chạy đúng task đó qua một subagent của Claude Code và xem tool call chạy qua terminal của chính bạn thay vì event. Khoảng cách giữa hai trải nghiệm đó mới là quyết định thật sự bạn đang đưa ra — không phải điểm benchmark nào cả.