Codex bắt đầu mã hóa prompt của sub-agent
(github.com/openai)- Khi MultiAgentV2 của Codex CLI mã hóa các thông điệp
spawn_agent,send_message,followup_task, một hồi quy về dấu vết kiểm toán đã xảy ra: nội dung ủy quyền trở nên không thể đọc được với con người trong rollout, lịch sử và trace của agent cha - Sau PR #26210 được merge vào ngày 5 tháng 6 năm 2026,
InterAgentCommunication.contentbị để trống, payload chỉ được lưu trongencrypted_content, còn lịch sử phía nhận và log giao tiếp cũng ghi lại bản mã - Vấn đề không phụ thuộc vào gói đăng ký, model hay nền tảng; nó áp dụng cho các bản build từ 0.137.0 trở đi khi MultiAgentV2 được bật, và tách biệt với #26753, vấn đề xử lý lỗi xác thực request của schema công cụ mã hóa
- Cách sửa được đề xuất là lưu đồng thời
messagemã hóa dành cho model nhận và trường plaintext bắt buộc dành cho kiểm toán cục bộ; việc định danh truyền tiếp dùng bản mã hoặc ID, đồng thời áp dụng cùng giới hạn kích thước cho dữ liệu kiểm toán plaintext - Prototype cho
spawn_agentđã được triển khai trong một snapshot commit riêng, nhưng vẫn còn việc áp dụng cùng hợp đồng chosend_message,followup_task, cũng như các màn hình lịch sử, replay và debug; issue hiện vẫn ở trạng thái Open
Phạm vi phát sinh và điều kiện hồi quy
- PR thay đổi mã hóa #26210 được merge vào ngày 5 tháng 6 năm 2026; đối tượng bị ảnh hưởng là các bản build từ 0.137.0 trở đi có chứa thay đổi này và bật MultiAgentV2
- Các công cụ bị ảnh hưởng là
spawn_agent,send_message,followup_task; không phụ thuộc vào gói đăng ký, model, hệ điều hành hay môi trường terminal - Đây là hồi quy được xác nhận từ hành vi của code đã merge, không phải trạng thái môi trường cục bộ, nên báo cáo Codex doctor không liên quan
- Các bước tái hiện như sau
- Bật MultiAgentV2 trong bản build có chứa PR #26210
- Để model gọi một trong các công cụ
spawn_agent,send_message,followup_task - Kiểm tra tác vụ của sub-agent trong rollout, lịch sử và trace của agent cha
- Chỉ thấy bản mã thay vì nội dung tác vụ hoặc thông điệp
Thông tin kiểm toán cục bộ đã biến mất
- Bản thân việc truyền mã hóa có thể được hiểu là tăng cường quyền riêng tư, nhưng triển khai hiện tại loại bỏ nội dung mà con người có thể đọc được ngay cả trong lịch sử rollout cục bộ, bản rút gọn trace, cũng như các màn hình kiểm toán và debug phía agent cha
- Kết quả là khi rà soát rollout sau đó, rất khó trả lời các câu hỏi sau
spawn_agentđã giao tác vụ gì cho agent con- Đã gửi thông điệp gì cho sub-agent
- Vì sao một thread con cụ thể được tạo ra
- Issue #26753 là vấn đề schema công cụ mã hóa trả về lỗi 400 trong quá trình xác thực request; issue lần này xử lý khả năng kiểm toán và khả năng debug sau khi schema đã được chấp thuận
- Mục tiêu không nhất thiết là đảo ngược việc truyền mã hóa, mà là duy trì mã hóa đồng thời vẫn cho phép đọc nội dung ủy quyền ở cục bộ
Luồng dữ liệu của code hiện tại
InterAgentCommunication::new_encrypted()khởi tạocontentbằng chuỗi rỗng và chỉ lưu payload trongencrypted_content- Constructor thông thường
new()lưu plaintext vàocontentvà để trốngencrypted_content - Constructor mã hóa thì ngược lại: để trống
contentvà đưa giá trị vàoencrypted_content
- Constructor thông thường
to_model_input_item()nếu cóencrypted_contentthì chỉ đưa phần mở đầuNEW_TASKhoặcMESSAGEcùng payload mã hóa vàoResponseItem::AgentMessage- Vì vậy, ngay cả khi chỉ điền
contentở runtime,ResponseItemcó thể đọc được cũng không tự động được lưu bền vững - Cần có một đường lưu kiểm toán cục bộ riêng
- Vì vậy, ngay cả khi chỉ điền
communication_from_tool_message()truyền trực tiếpmessagecủa công cụ vàonew_encrypted(), tạo đối tượng giao tiếp không cócontentplaintext- Xử lý đối số của
send_messagevàfollowup_taskchỉ deserializetargetvàmessageđã mã hóamessagerỗng bị từ chối, nhưng không có trường plaintext đi kèm riêng- Đường truyền thông điệp dùng chung dùng nguyên giá trị này để tạo
InterAgentCommunication
Vì sao bản mã còn lại trong lịch sử và log
- Đường ghi phía nhận lưu
ResponseItemdành cho model doto_model_input_item()tạo ra vào lịch sử hội thoại và rollout- Với giao tiếp mã hóa, mục này chứa payload truyền mã hóa chứ không phải câu chữ kiểm toán có thể đọc được
- Trong rollout,
InterAgentCommunicationMetadatavàResponseItemtương ứng được lưu bền vững cùng nhau
- Log giao tiếp có cấu trúc cũng thay thế
contentcủa sự kiện bằngencrypted_contentnếucontenttrống - Trong cấu trúc này, bản mã đi vào cả các trường được hiển thị như thông điệp dành cho con người đọc, nên yêu cầu duy trì mã hóa khi truyền và yêu cầu bảo toàn dữ liệu kiểm toán cục bộ chưa được tách rời
Hợp đồng nội dung kép được đề xuất
messagemã hóa hiện có được giữ làm payload truyền tới model nhận- Thêm một trường kiểm toán plaintext bắt buộc cho từng công cụ giao tiếp MultiAgentV2
spawn_agent:task_messagesend_message,followup_task: tên nhất quán nhưtask_messagehoặcmessage_text
- Từ chối giá trị kiểm toán plaintext rỗng tại ranh giới handler
InterAgentCommunicationlưu cả hai giá trịencrypted_content:messageđã mã hóacontent: bản sao kiểm toán mà con người có thể đọc
- Không thay đổi
to_model_input_item(), để model nhận chỉ nhận bản mã chứ không phải bản sao kiểm toán cục bộ - Lưu bền vững trường plaintext trong lời gọi công cụ của agent cha và rollout, đồng thời giữ trường này trong các cạnh tương tác của trace có cấu trúc và log giao tiếp cục bộ
- Tương quan giữa lời gọi công cụ và mục truyền tới agent con được xác định bằng bản mã hoặc ID, không phải bằng việc khớp plaintext
- Trường plaintext là metadata kiểm toán, không thay thế định danh của việc truyền mã hóa
- Áp dụng cùng giới hạn kích thước bắt buộc như thông điệp ủy quyền tương ứng cho trường kiểm toán plaintext mới, để mục rollout hoặc context không phình to vô hạn
Prototype spawn_agent và các việc còn lại
- Snapshot commit
ignatremizov@df9a7c4triển khai cấu trúc được đề xuất chospawn_agent - Schema v2
spawn_agentchỉ địnhtask_messagelà trường bắt buộc - Sau khi thực hiện xác thực
task_message, code cấu thành đồng thời plaintext và bản mã- Đưa bản sao kiểm toán plaintext vào
content - Giữ payload mã hóa dành cho model nhận trong
encrypted_content
- Đưa bản sao kiểm toán plaintext vào
- Trong phần rút gọn trace rollout, code cũng tách nội dung kiểm toán và nội dung dùng để ghép việc truyền, và liên kết việc truyền bằng bản mã trong khi áp dụng nội dung kiểm toán plaintext
- Việc còn lại là áp dụng cùng hợp đồng nội dung kép cho
send_messagevàfollowup_task, đồng thời đảm bảo mọi màn hình lịch sử, replay và debug hướng tới người dùng đọc bản sao kiểm toán thay vì bản mã
Điều kiện hoàn tất và trạng thái hiện tại
- Phải đọc được plaintext của v2
spawn_agent,send_message,followup_tasktrong rollout và lịch sử của agent cha - Ngay cả khi mã hóa được bật, model con chỉ được nhận payload truyền đã mã hóa
- Các cạnh trace rollout có cấu trúc phải chứa
message_contentplaintext có giới hạn kích thước - Log giao tiếp phải dùng nội dung kiểm toán plaintext nếu có, và không được thay thế trường thông điệp có thể đọc bằng bản mã
- Resume và replay phải bảo toàn bản sao kiểm toán nhưng không được inject nó vào context của model con
- Hành vi giao tiếp v1 plaintext hiện có không được thay đổi
- Cần có regression test cho cả ba công cụ v2 để xác minh đồng thời dữ liệu kiểm toán cục bộ có thể đọc được và input model nhận đã mã hóa
- Trên trang được cung cấp, issue đang ở trạng thái Open và không có kết quả cho thấy bản sửa đã được merge vào upstream repository
1 bình luận
Ý kiến trên Hacker News
Tiêu đề này dễ gây hiểu nhầm. Nói chính xác hơn là Codex bắt đầu mã hóa prompt của các tác tử cấp dưới để ẩn khỏi người dùng
Tiêu đề gốc là “Codex starts encrypting prompts, uses ciphertext for inference instead”
ultracủa GPT-5.6 phân tán công việc cho nhiều tác tử cấp dưới. Trước đây chế độ này chỉ có trên web UI, và có lẽ tương ứng với chế độ pro trước kiaNếu họ huấn luyện bằng rollout học tăng cường toàn phần với các tác tử tương tác với nhau, thì có vẻ OpenAI đang coi các prompt này như dấu vết suy luận thô để ngăn người khác trực tiếp dùng chúng cho việc huấn luyện
Blob nén mờ đục mà endpoint nén chuyên dụng trả về cũng có thể là biểu diễn trong không gian tiềm ẩn của cuộc hội thoại chứ không phải văn bản; việc độ trung thực nén của OpenAI cao hơn hẳn các bên khác cũng củng cố suy đoán này. Có thể họ đã áp dụng kỹ thuật tương tự cho prompt của tác tử cấp dưới, và cũng khiến người ta tò mò liệu có dùng blob mã hóa khi tạo các tác tử cấp dưới thuộc những loại mô hình khác nhau hay không
Tôi từng xem quy trình làm việc và các tác tử cấp dưới của Claude rồi kết luận rằng “cái này ngay từ đầu không nên được chạy”; trong khi đó người dùng Codex về cơ bản phải mù quáng đốt token cho các chỉ thị bàn giao được mã hóa và các tác vụ shell mà bộ điều phối chuyển cho tác tử cấp dưới
Chúng tôi cũng từng muốn cho phép chọn nhà cung cấp AI mà doanh nghiệp ưa dùng hoặc bị bắt buộc dùng, cùng với API key riêng của họ, và đưa ra gói giá đơn giản; nhưng rồi nhanh chóng nhận ra rằng prompt backend có thể bị lộ cho khách hàng. Nếu có được vết thực thi chi tiết thì người ta khá dễ reverse engineer những gì chúng tôi làm, nên cuối cùng chúng tôi bỏ ý tưởng đó
Giờ thì tôi đã hiểu vì sao công cụ cục bộ của tôi để kiểm tra các phiên tác tử lập trình lại ngừng hoạt động trong một số tình huống
Đây là một quyết định thiết kế khá thú vị: không rõ sẽ có bao nhiêu người chấp nhận các lệnh mã hóa bên ngoài chạy trên máy tính của người dùng
Việc mã hóa nội dung để giấu khỏi người dùng là kiểu mà RIAA từng dùng cho DRM vì lo vi phạm bản quyền; nên tôi cũng tự hỏi liệu đây có phải là một lựa chọn chống lại người dùng hay không
Chính vì kiểu hành vi này mà tôi vẫn tiếp tục dùng endpoint Chat Completions. OpenAI đã âm thầm đẩy người dùng rời khỏi Chat Completions sang Responses API, nơi việc làm rối dễ hơn
Trong Chat Completions, bạn có thể tự kiểm soát quy trình suy luận, nên nếu bật các tính năng thử nghiệm và chỉnh một số tùy chọn hơi rối rắm thì hiện tại còn có thể tạo tác tử Monte Carlo Tree Search (MCTS) tùy biến với mô hình GPT-5.6
Trong VS Copilot, bạn có thể dùng đến gpt5.5 bằng token API và cấu hình mô hình của người dùng, nhưng dòng gpt5.6 hiện không hoạt động. Có lẽ vì nó không ép
reasoning_effortvềnoneđể đáp ứng hành vi mở rộng rào cản gia nhập mới nàyCác mô hình mới ra gần đây đều là mô hình suy luận, nên theo khuyến nghị thì nên dùng Responses API
Cũng tò mò liệu họ có chặn việc dùng gói đăng ký GPT trong công cụ thực thi thay thế hay không. Nếu không thì đây không phải vấn đề quá lớn, và bản thân
codex clilà một công cụ thực thi bình thường đến mức đáng ngạc nhiênapp-servertồn tại chính là để hỗ trợ kiểu tích hợp đó, nên nếu muốn gỡ khỏi Codex thì họ sẽ phải tháo bỏ một phần rất lớnTôi cũng tích hợp rất dễ qua RPC API của
app-server, nên dùng Codex nhiều nhất, và giờ gần như dùng toàn bộ qua phần tích hợp tự làm thay vì Codex TUI đã được công khaiNhưng nếu họ mã hóa các prompt v.v. là đầu vào suy luận thực tế trên đĩa cục bộ để chỉ backend OpenAI nhìn thấy, thì dù tích hợp có dễ đến đâu, cũng không thể biết chuyện gì đang diễn ra. Khó hiểu vì sao đội ngũ lại cho rằng đây là một lựa chọn tốt
Nếu OpenAI cũng đi theo con đường đó thì tôi sẽ quay lại Claude hoặc mua thêm một chiếc Spark để chạy cục bộ
https://github.com/openai/codex/blob/main/codex-rs/responses...
Tiêu đề HN trước đó gây hiểu lầm rất lớn vì nghe như đang suy luận trực tiếp trên bản mã. Muốn làm vậy thì cần mã hóa đồng hình tiên tiến hơn rất nhiều so với mức hiện được biết đến
Trước đây agent gửi prompt bản rõ cho sub-agent và nó cũng được giữ nguyên trong log cùng dữ liệu phiên, nên ngay cả khi dùng tính năng sub-agent thử nghiệm, vẫn có thể mở dữ liệu ra để xem hoạt động nội bộ
Giờ nếu dùng Sol hoặc Terra, sub-agent sẽ nhận bản mã do backend tạo ra và dùng nó lại cho suy luận trên backend OpenAI. Có vẻ Luna không bị ảnh hưởng, và chỉ các tin nhắn giữa những agent được ủy quyền mới bị mã hóa chứ không phải toàn bộ phiên
Suy luận nội bộ của OpenAI không diễn ra trên bản mã, nhưng với người dùng cục bộ thì chỉ còn thấy bản mã thay vì bản rõ. Để làm rõ điều này nên tiêu đề đã được đổi thành “Codex starts encrypting sub-agent prompts”
Gần đây trên Twitter có báo cáo rằng sub-agent GPT-5.6 đã lỡ xóa thư mục home của người dùng
Không rõ việc không còn thấy sub-agent định làm gì có khiến ngay cả các cơ chế an toàn cũng thất bại hay không
https://x.com/mattshumer_/status/2076794038456385546?s=20
Đây là cách truyền khóa cache qua client để giảm lượng token sử dụng. Có thể dễ dàng lách bằng cách dùng công cụ tác vụ con khác, nên không thể là biện pháp phòng vệ chống chưng cất mô hình
Tò mò chính xác việc mã hóa diễn ra ở đâu. Tôi cứ nghĩ agent chính gọi sub-agent ở cục bộ, nhưng không rõ liệu Codex có cấu trúc gọi sub-agent từ máy chủ OpenAI trước khi chạm tới máy cục bộ hay không
Với Sol hoặc Terra, bản mã do backend OpenAI tạo ra được truyền thay cho prompt, và sub-agent lại dùng nó cho suy luận trên backend. Có vẻ Luna không bị ảnh hưởng, và chỉ các tin nhắn giữa những agent được ủy quyền mới bị mã hóa chứ không phải toàn bộ phiên, nên giờ chỉ backend OpenAI mới có thể giải mã phần nội dung đó
Tôi đã thắc mắc vì sao dịch vụ bán lại trên chợ đen của Trung Quốc từ hôm qua không còn hoạt động, và có lẽ là vì thay đổi này
Có vẻ mục đích chính là cản trở các nỗ lực proxy một lượng lớn yêu cầu và phản hồi của người dùng để phục vụ huấn luyện model cạnh tranh
Nhưng với người dùng trả phí thì đây là một cách triển khai tệ hại, vì khi có vấn đề xảy ra hoàn toàn không có cách nào tìm ra nguyên nhân, nên rất khó dùng tính năng đa agent cho đúng nghĩa