From a09a7c41d8abbaec6543664bff04a81058192958 Mon Sep 17 00:00:00 2001 From: jacobzhou-oai Date: Wed, 8 Jul 2026 16:04:30 -0700 Subject: [PATCH] [codex-apps] Omit internal fields from file payloads (#31330) ## Summary Codex Apps file parameters are exposed to the model as local paths, uploaded at execution time, and rewritten into provided-file payloads before the MCP tool call. The rewrite currently forwards two internal upload fields, `uri` and `file_size_bytes`, even though they are not part of the documented app file-reference shape. Strict app schemas can reject those extra fields before execution. ## Changes - Stop copying `uri` and `file_size_bytes` into app-facing MCP arguments. - Keep the internal `UploadedOpenAiFile` result unchanged. - Preserve the existing `download_url`, `file_id`, `mime_type`, and `file_name` behavior for scalar and array file inputs. - Verify the MCP invocation and post-tool hook receive exactly the documented four-field payload against an `additionalProperties: false` schema. This intentionally does not add schema inspection or change how `openai/fileParams` names are discovered. ## Validation - `just test -p codex-core mcp_openai_file` (6 passed) - `just test -p codex-core codex_apps_file_params_` (2 passed) - `just fix -p codex-core` - `just fmt` - `git diff --check` --- codex-rs/core/src/mcp_openai_file.rs | 10 ---------- codex-rs/core/tests/common/apps_test_server.rs | 8 ++++++-- codex-rs/core/tests/suite/openai_file_mcp.rs | 11 +++-------- 3 files changed, 9 insertions(+), 20 deletions(-) diff --git a/codex-rs/core/src/mcp_openai_file.rs b/codex-rs/core/src/mcp_openai_file.rs index 5044568cd6..34c6a72f24 100644 --- a/codex-rs/core/src/mcp_openai_file.rs +++ b/codex-rs/core/src/mcp_openai_file.rs @@ -173,8 +173,6 @@ async fn build_uploaded_argument_value( "file_id": uploaded.file_id, "mime_type": uploaded.mime_type, "file_name": uploaded.file_name, - "uri": uploaded.uri, - "file_size_bytes": uploaded.file_size_bytes, })) } @@ -300,8 +298,6 @@ mod tests { "file_id": "file_123", "mime_type": "text/csv", "file_name": "file_report.csv", - "uri": "sediment://file_123", - "file_size_bytes": 5, }) ); } @@ -404,8 +400,6 @@ mod tests { "file_id": "file_123", "mime_type": "text/csv", "file_name": "file_report.csv", - "uri": "sediment://file_123", - "file_size_bytes": 5, })) ); } @@ -519,16 +513,12 @@ mod tests { "file_id": "file_1", "mime_type": "text/csv", "file_name": "one.csv", - "uri": "sediment://file_1", - "file_size_bytes": 3, }, { "download_url": format!("{}/download/file_2", server.uri()), "file_id": "file_2", "mime_type": "text/csv", "file_name": "two.csv", - "uri": "sediment://file_2", - "file_size_bytes": 3, } ])) ); diff --git a/codex-rs/core/tests/common/apps_test_server.rs b/codex-rs/core/tests/common/apps_test_server.rs index 3daaada6c5..fa370f1790 100644 --- a/codex-rs/core/tests/common/apps_test_server.rs +++ b/codex-rs/core/tests/common/apps_test_server.rs @@ -553,9 +553,13 @@ impl Respond for CodexAppsJsonRpcResponder { "type": "object", "description": "Document file payload.", "properties": { - "file_id": { "type": "string" } + "download_url": { "type": "string" }, + "file_id": { "type": "string" }, + "mime_type": { "type": "string" }, + "file_name": { "type": "string" } }, - "required": ["file_id"] + "required": ["download_url", "file_id"], + "additionalProperties": false } }, "required": ["file"], diff --git a/codex-rs/core/tests/suite/openai_file_mcp.rs b/codex-rs/core/tests/suite/openai_file_mcp.rs index c6d7a1d437..330c85bea2 100644 --- a/codex-rs/core/tests/suite/openai_file_mcp.rs +++ b/codex-rs/core/tests/suite/openai_file_mcp.rs @@ -91,14 +91,12 @@ fn read_post_tool_use_hook_inputs(home: &Path) -> Result> { .collect() } -fn uploaded_file(server: &MockServer, file_size_bytes: u64) -> Value { +fn uploaded_file(server: &MockServer) -> Value { json!({ "download_url": format!("{}/download/file_123", server.uri()), "file_id": "file_123", "mime_type": "text/plain", "file_name": "report.txt", - "uri": "sediment://file_123", - "file_size_bytes": file_size_bytes, }) } @@ -230,7 +228,7 @@ async fn codex_apps_file_params_upload_environment_files_before_mcp_tool_call() assert_eq!( apps_tool_call.pointer("/params/arguments/file"), - Some(&uploaded_file(&server, STREAMED_FILE_SIZE as u64)) + Some(&uploaded_file(&server)) ); assert_eq!( apps_tool_call.pointer("/params/_meta/_codex_apps"), @@ -267,10 +265,7 @@ async fn codex_apps_file_params_pass_uploaded_file_to_post_tool_use_hook() -> Re let hook_inputs = read_post_tool_use_hook_inputs(test.codex_home_path())?; assert_eq!(hook_inputs.len(), 1); - assert_eq!( - hook_inputs[0]["tool_input"]["file"], - uploaded_file(&server, /*file_size_bytes*/ 11) - ); + assert_eq!(hook_inputs[0]["tool_input"]["file"], uploaded_file(&server)); server.verify().await; Ok(())