- Codex CLI được thiết kế như một tác nhân thực hiện các thay đổi phần mềm chất lượng cao một cách an toàn và hiệu quả trong môi trường cục bộ
- Cấu trúc cốt lõi là vòng lặp tác nhân (agent loop), kết nối tuần hoàn giữa đầu vào của người dùng, suy luận của mô hình và lời gọi công cụ để thực hiện các tác vụ có ý nghĩa
- Trong quá trình vòng lặp vận hành, cấu trúc prompt, quản lý cửa sổ ngữ cảnh và cache prompt là những yếu tố then chốt quyết định hiệu năng và độ ổn định
- Codex giao tiếp với mô hình thông qua Responses API, và mỗi yêu cầu được tạo thành từ một payload JSON hoàn chỉnh để duy trì cơ chế hoạt động không trạng thái (stateless)
- Cấu trúc này cho phép các tính năng nâng cao như Zero Data Retention (ZDR), cache prompt, nén tự động (compaction), đồng thời tạo nền tảng cho thiết kế tác nhân ở quy mô lớn
Tổng quan về vòng lặp tác nhân của Codex
- Codex CLI vận hành xoay quanh cấu trúc vòng lặp điều phối tương tác giữa người dùng, mô hình và công cụ
- Nhận đầu vào của người dùng và xây dựng prompt để gửi cho mô hình
- Khi mô hình tạo phản hồi hoặc yêu cầu lời gọi công cụ (tool call), tác nhân sẽ thực thi và thêm kết quả trở lại prompt
- Khi mô hình không còn gọi công cụ nữa và tạo ra thông điệp assistant, một lượt tương tác kết thúc
- Mỗi lượt là một phần của cuộc hội thoại (conversation), trong đó toàn bộ thông điệp trước đó và lịch sử gọi công cụ đều được đưa vào prompt của yêu cầu tiếp theo
- Vì độ dài prompt bị giới hạn bởi cửa sổ ngữ cảnh (context window) của mô hình, Codex cần quản lý giới hạn này
Responses API và cấu trúc giao tiếp của Codex
- Codex CLI gửi yêu cầu HTTP tới Responses API để thực hiện suy luận mô hình
- Endpoint API thay đổi tùy theo cấu hình và có thể dùng trong các môi trường OpenAI, ChatGPT, Azure, cục bộ (LM Studio, Ollama, v.v.)
- Yêu cầu API được cấu thành dưới dạng payload JSON, với các trường chính như sau
- thông điệp system/developer: thiết lập ngữ cảnh cơ bản của mô hình
- instructions: danh sách công cụ mà mô hình có thể gọi
- tools: định nghĩa công cụ do Codex CLI, Responses API hoặc người dùng (như máy chủ MCP) cung cấp
- input: danh sách thông điệp bao gồm lịch sử hội thoại và thông tin môi trường
- Codex đọc cấu hình
~/.codex/config.toml cùng với AGENTS.md, các tệp skills trong dự án để tự động chèn chỉ dẫn người dùng và thông tin môi trường
Cấu trúc prompt và xử lý sự kiện
- Codex cấu thành từng thông điệp dưới dạng đối tượng JSON (
type, role, content) rồi gửi tới Responses API
- Máy chủ tạo prompt cho mô hình dựa trên JSON này và trả phản hồi qua luồng SSE (Server-Sent Events)
- Sự kiện
response.output_text.delta được dùng cho đầu ra streaming
- Sự kiện
response.output_item.added được thêm vào input của yêu cầu tiếp theo để duy trì vòng lặp
- Hệ thống được thiết kế để prompt trước đó trở thành tiền tố (prefix) chính xác của prompt mới, nhờ đó có thể tận dụng cache prompt (prompt caching)
Tối ưu hiệu năng: cache và thiết kế không trạng thái
- Codex không sử dụng
previous_response_id, nhờ đó duy trì cấu trúc yêu cầu hoàn toàn không trạng thái (stateless)
- Điều này cho phép hỗ trợ khách hàng Zero Data Retention (ZDR) và giảm thiểu việc lưu giữ dữ liệu
- Cache prompt tái sử dụng cùng một tiền tố để tuyến tính hóa chi phí lấy mẫu (sampling)
- Cache hit chỉ xảy ra khi tiền tố khớp chính xác với prompt
- Thay đổi trong danh sách công cụ, mô hình, cấu hình sandbox hay thư mục làm việc sẽ gây ra cache miss
- Việc thay đổi động các công cụ MCP có thể làm mất cache, nên Codex phản ánh thay đổi bằng cách chèn thông điệp mới
Quản lý cửa sổ ngữ cảnh và nén tự động (compaction)
- Khi cuộc hội thoại kéo dài, hệ thống thực hiện nén hội thoại (compaction) để tránh vượt quá cửa sổ ngữ cảnh
- Ban đầu, việc tóm tắt được thực hiện thủ công bằng lệnh
/compact, nhưng hiện nay hệ thống tự động dùng endpoint /responses/compact của Responses API
- Endpoint này trả về mục
type=compaction và encrypted_content đã mã hóa để duy trì khả năng hiểu của mô hình
- Khi vượt quá auto_compact_limit, Codex sẽ tự động chạy nén để đảm bảo tính liên tục của cuộc hội thoại
Kết luận và hướng đi tiếp theo
- Vòng lặp tác nhân của Codex là cấu trúc cốt lõi tích hợp suy luận mô hình, gọi công cụ, cache và quản lý ngữ cảnh
- Cấu trúc này cho phép thiết kế tác nhân hiệu năng cao, không trạng thái và ưu tiên bảo mật
- Ở các bài viết tiếp theo, nội bộ của Codex như kiến trúc CLI, triển khai sử dụng công cụ, mô hình sandbox sẽ được đề cập thêm
1 bình luận
Ý kiến trên Hacker News
Điểm hay nhất của bài blog này là nó hoàn toàn không gây ngạc nhiên. Codex CLI là mã nguồn mở, nên có thể xem bên trong mà không cần reverse engineering
Cách Eric Traut (nhà phát triển nổi tiếng với Pyright) giao tiếp cũng rất tuyệt. Ông ấy tham gia tích cực vào issue và PR
Kho lưu trữ GitHub
Tôi cũng đã đóng góp một vài cải tiến cho CLI, đồng thời đều đặn theo dõi các bản phát hành và PR để mở rộng hiểu biết
Điều thú vị là phần nén (compaction) được thực hiện như một “thông điệp được mã hóa nhằm bảo toàn sự hiểu biết tiềm ẩn của mô hình”
Khi vượt quá auto_compact_limit, Codex tự động dùng endpoint này để giảm ngữ cảnh hội thoại một cách hiệu quả
Điều khiến tôi ngạc nhiên khi xem bên trong Codex là reasoning token được giữ lại trong vòng lặp gọi tool của agent, nhưng lại bị xóa mỗi khi chuyển sang lượt người dùng mới
Vì vậy nó có thể giữ ngữ cảnh qua nhiều lượt, nhưng giữa các yêu cầu liên quan của người dùng thì một phần ngữ cảnh có thể bị mất
Tôi cho mô hình ghi lại tiến độ, kế hoạch hoặc nội dung debug vào file Markdown để nó hoạt động như một dạng snapshot giữa nhiều cửa sổ ngữ cảnh
Kho lưu trữ GitHub
Điều tôi thực sự muốn ở Codex là tính năng checkpoint kiểu Copilot. Có vài issue liên quan trên GitHub (#2788, #3585) nhưng có vẻ đây chưa phải ưu tiên của nhóm
Tôi muốn biết khi tổng hợp chỉ thị người dùng trong agent loop, họ quản lý việc duy trì ngữ cảnh trong hội thoại nhiều lượt như thế nào. Cũng muốn biết họ đã thử các kỹ thuật điều chỉnh động khi yêu cầu người dùng thay đổi hay chưa
Tôi thích Codex, nhưng nó có cảm giác chậm hơn giao diện web ChatGPT. Khi cần trao đổi ý tưởng nhanh, tôi vẫn thấy copy-paste trên web hiệu quả hơn
Codex thường bắt đầu sửa nhầm đoạn mã không liên quan, khiến vòng phản hồi chậm và khá bực bội. Dù vậy, khi hoạt động tốt thì nó rất xuất sắc. Mong rằng một ngày nào đó nó sẽ nhanh như web mà vẫn làm việc được cục bộ
Không hẳn là mới, nhưng đây vẫn là một bài viết đáng giá. Tôi muốn việc phản tư (reflect) về loop hay lịch sử trong các coding CLI dạng agent trở nên dễ dàng hơn. Tôi từng thử cách truy vấn lịch sử chat qua MCP, nhưng phải chỉ định tường minh nên khá bất tiện. Có lẽ học liên tục sẽ giải quyết được kiểu vấn đề này
Kiểu hành vi này cũng có thể quan sát qua OTEL telemetry. Tôi hay dùng headless codex exec, nhưng hỗ trợ telemetry tích hợp còn thiếu nên rất khó debug
Vì vậy tôi tự làm codex-plus để dùng. Nó phản chiếu nguyên giao diện codex exec, được xây trên TypeScript SDK, và sau khi chạy sẽ xuất log phiên tới remote OpenTelemetry collector để có thể phân tích bằng codex-plus-log-viewer
Phần mô tả skill khiến tôi thấy hơi lạ
Liên kết mã liên quan
Tôi thắc mắc tại sao họ không đơn giản là cho lộ trực tiếp file, mà lại để mô hình yêu cầu nó như file thông thường
Tôi từng tò mò không biết có ai dùng Codex CLI một cách nghiêm túc chưa. Tôi đã thử extension Codex cho VSCode, Gemini CLI và Claude Code CLI, và tất cả đều có hiệu năng rất tệ.
Nhưng Codex CLI mới viết bằng Rust thì nhanh đến mức điên rồ. UX cũng hoàn hảo, cả những chi tiết nhỏ như phím tắt đều được làm tốt. Theo từng nói rằng “đáng lẽ nên tập trung cải thiện mô hình thay vì tối ưu CLI”, nhưng sau khi dùng thì tôi hoàn toàn không thể đồng ý
Bài viết liên quan: Scribe Swebench Benchmark