Repository navigation
Conversation
Endpoint auditContract: pinned release artifact
Actionable client-only calls (0)none Actionable server-only operations (18)
Documented non-divergences (13)Client calls intentionally absent from the filtered contract (11)
Reason: Operational Agent Server endpoints intentionally excluded from the filtered public release artifact.
Reason: Client-ahead API stacked on the pending Agent Server meta-profiles implementation.
Reason: Client-ahead API stacked on the pending Agent Server pre-flight LLM validation endpoint. Server operations covered by an exposed browser URL (2)
Reason: RemoteWorkspace.startWorkspaceSession exposes these authenticated URLs for browser iframe and file requests; they are not HttpClient method calls. |
|
📁 PR Artifacts Notice This PR contains a |
Python API breakage checks — ✅ PASSEDResult: ✅ PASSED |
REST API breakage checks (OpenAPI) — ✅ PASSEDResult: ✅ PASSED |
Coverage Report •
|
|||||||||||||||||||||||||||||||||||
AGENT:
End-to-end evidence: live qualification (box, ChatGPT subscription OAuth, no API key, read-only, isolated CODEX_HOME, non-fast)
The user asked for these runs to use gpt-6-luna / max instead of gpt-6.1-sol, since structured output is a transport / App Server feature. The transport does not depend on the model. gpt-6.1-sol was not qualified separately.
turn/start.outputSchemaappeared on the wire.account/readreported type=chatgpt. The final answer was exactly one conformant JSON object. A follow-up turn that baited for markdown plus fenced JSON still returned one conformant object. The workspace was unchanged.turn/startrequests carriedoutputSchemaequal to the caller's schema (model gpt-6-luna, effort max, sandbox readOnly, serviceTier null). Both turns returned a single conformant JSON object, the workspace was unchanged, and the caller schema was not mutated. codex-acp's own title turn kept its own schema.400 invalid_json_schema: objects that do not list every property inrequired, and subschemas withouttype.Why
The built-in Codex ACP path could not use the provider-neutral
StructuredOutputConfig, so Codex roles returned prompt-only JSON. The workflow saw wrapper/prose format retries. Codex App Server supportsturn/start.outputSchema, but no released codex-acp forwards a caller schema.Summary
Built-in Codex ACP now accepts the provider-neutral
StructuredOutputConfig(mode="json_schema", schema=...). The SDK attaches the schema to every Codex App Serverturn/start.outputSchema, including later turns on the same conversation such as a format retry.@agentclientprotocol/codex-acpforwards a caller schema; I checked 2.1.0, 2.1.1 and 2.1.2-preview.1. App Server takesoutputSchemaonly onturn/start. So this adds a small repository-owned JSON-RPC proxy (acp_codex_output_schema.py), set via codex-acp's existingCODEX_PATHseam. It adds the schema to eachturn/startthat lacks one. This follows step 5 of the issue; codex-acp is not forked, vendored or patched.final_answeritem). When Codex structured output is set, the response is the last agent message, picked bymessage_id. Nothing is stripped, extracted or parsed.ACPAgentSettingsacceptsacp_server="codex". The Docker wrapper always uses the pinned Codex runtime.StructuredOutputConfig, persisted settings, REST shape, or version pins.Issue Number
Closes #35
How to Test
CLAUDE_CODE_OAUTH_TOKENunset, pytest on tests/sdk/settings, tests/sdk/agent, tests/agent_server and tests/sdk/test_settings.py gave 3220 passed. pyright reported 0 errors. pre-commit passed on all changed files.ACPAgent(acp_server="codex", acp_model="gpt-6-luna", acp_permission_policy="read_only", acp_config_options={"reasoning_effort": "max"}, acp_isolate_data_dir=True, structured_output=StructuredOutputConfig(mode="json_schema", schema=<strict schema>)), provideCODEX_AUTH_JSONfrom a ChatGPTauth.json, and setCODEX_PATHto codex 0.159.3. Run two turns and check that every mainturn/startcarriesoutputSchemaand that each final response is one conformant JSON object.Type
Notes
There is no codex-acp fork. The proxy depends only on codex-acp's
CODEX_PATH/$CODEX_PATH app-serverJSONL stdio and on App Serverturn/start.outputSchema.