From 986ff1cc7ced0081ec5014b700a376333d87f869 Mon Sep 17 00:00:00 2001 From: Brent Traut Date: Tue, 1 Sep 2026 22:34:55 +0000 Subject: [PATCH] Expose model settings in app-server thread metadata (#42151) ## What changed - Add nullable `model` and `reasoningEffort` fields to the shared app-server `Thread` object and generated schemas. - Report current settings for loaded threads and the latest persisted settings for unloaded threads across thread read, list, start, resume, rollback, metadata update, and notification paths. - Keep unavailable legacy or filesystem-only settings nullable, and allow metadata reads without loading a thread or dispatching queued work. ## Testing - Cover live-setting precedence, persisted settings after restart, null legacy values, and model metadata returned by thread lifecycle operations. GitOrigin-RevId: 22ebe8a8d1910a820d90a97730d812a00d8c1372 --- .../analytics/src/analytics_client_tests.rs | 2 + codex-rs/analytics/src/client_tests.rs | 2 + .../schema/json/ServerNotification.json | 18 ++++ .../codex_app_server_protocol.schemas.json | 18 ++++ .../codex_app_server_protocol.v2.schemas.json | 18 ++++ .../schema/json/v2/ThreadForkResponse.json | 18 ++++ .../schema/json/v2/ThreadListResponse.json | 18 ++++ .../json/v2/ThreadMetadataUpdateResponse.json | 18 ++++ .../schema/json/v2/ThreadReadResponse.json | 18 ++++ .../schema/json/v2/ThreadResumeResponse.json | 18 ++++ .../schema/json/v2/ThreadRevertResponse.json | 18 ++++ .../json/v2/ThreadRollbackResponse.json | 18 ++++ .../schema/json/v2/ThreadStartResponse.json | 18 ++++ .../json/v2/ThreadStartedNotification.json | 18 ++++ .../json/v2/ThreadUnarchiveResponse.json | 18 ++++ .../app-server-exports-experimental.json.zst | Bin 149971 -> 149741 bytes .../app-server-exports-stable.json.zst | Bin 145640 -> 145760 bytes .../schema/typescript/v2/Thread.ts | 9 ++ .../src/protocol/common.rs | 4 + .../src/protocol/v2/tests.rs | 2 + .../src/protocol/v2/thread_data.rs | 11 +++ codex-rs/app-server/README.md | 8 ++ .../app-server/src/bespoke_event_handling.rs | 8 +- codex-rs/app-server/src/request_processors.rs | 8 ++ .../request_processors/thread_enrichment.rs | 16 +-- .../request_processors/thread_processor.rs | 10 ++ .../thread_resume_redaction.rs | 2 + .../src/request_processors/thread_summary.rs | 2 + .../src/request_processors/turn_processor.rs | 2 + .../app-server/tests/suite/v2/thread_list.rs | 25 ++++- .../tests/suite/v2/thread_metadata_update.rs | 8 ++ .../app-server/tests/suite/v2/thread_queue.rs | 67 +++++++++++++ .../app-server/tests/suite/v2/thread_read.rs | 20 +++- .../tests/suite/v2/thread_rollback.rs | 30 ++++++ .../tests/suite/v2/thread_settings_update.rs | 93 +++++++++++++++--- .../app-server/tests/suite/v2/thread_start.rs | 11 ++- codex-rs/exec/src/lib_tests.rs | 4 + codex-rs/rollout/src/list.rs | 7 ++ codex-rs/rollout/src/recorder.rs | 6 ++ codex-rs/rollout/src/recorder_tests.rs | 4 + codex-rs/rollout/src/tests.rs | 22 +++++ codex-rs/thread-store/src/local/helpers.rs | 4 +- .../thread-store/src/local/read_thread.rs | 21 +++- codex-rs/tui/src/app/agents_overview_tests.rs | 2 + codex-rs/tui/src/app/loaded_threads.rs | 2 + codex-rs/tui/src/app/tests.rs | 6 ++ codex-rs/tui/src/app/tests/startup.rs | 2 + codex-rs/tui/src/app/thread_session_state.rs | 2 + codex-rs/tui/src/app_server_session.rs | 2 + codex-rs/tui/src/resume_picker.rs | 8 ++ 50 files changed, 633 insertions(+), 33 deletions(-) diff --git a/codex-rs/analytics/src/analytics_client_tests.rs b/codex-rs/analytics/src/analytics_client_tests.rs index 0f5661c54d..5288a722f0 100644 --- a/codex-rs/analytics/src/analytics_client_tests.rs +++ b/codex-rs/analytics/src/analytics_client_tests.rs @@ -254,6 +254,8 @@ fn sample_thread_with_metadata( project_id: None, history_mode: Default::default(), model_provider: "openai".to_string(), + model: None, + reasoning_effort: None, created_at: 1, updated_at: 2, recency_at: Some(2), diff --git a/codex-rs/analytics/src/client_tests.rs b/codex-rs/analytics/src/client_tests.rs index 6e4ee4d1ec..c5a7b193a5 100644 --- a/codex-rs/analytics/src/client_tests.rs +++ b/codex-rs/analytics/src/client_tests.rs @@ -600,6 +600,8 @@ fn sample_thread(thread_id: &str) -> Thread { project_id: None, history_mode: Default::default(), model_provider: "openai".to_string(), + model: None, + reasoning_effort: None, created_at: 1, updated_at: 2, recency_at: Some(2), diff --git a/codex-rs/app-server-protocol/schema/json/ServerNotification.json b/codex-rs/app-server-protocol/schema/json/ServerNotification.json index ed50dfc392..c7e7930699 100644 --- a/codex-rs/app-server-protocol/schema/json/ServerNotification.json +++ b/codex-rs/app-server-protocol/schema/json/ServerNotification.json @@ -4126,6 +4126,13 @@ "description": "Identifier for this thread. Codex-generated thread IDs are UUIDv7.", "type": "string" }, + "model": { + "description": "Current configured model when loaded, otherwise the latest persisted model. Null when unavailable. This is not per-turn execution telemetry.", + "type": [ + "string", + "null" + ] + }, "modelProvider": { "description": "Model provider used for this thread (for example, 'openai').", "type": "string" @@ -4162,6 +4169,17 @@ "null" ] }, + "reasoningEffort": { + "anyOf": [ + { + "$ref": "#/definitions/ReasoningEffort" + }, + { + "type": "null" + } + ], + "description": "Current configured reasoning effort when loaded, otherwise the latest persisted effort. Null when unset or unavailable. This is not per-turn execution telemetry." + }, "recencyAt": { "description": "Unix timestamp (in seconds) used for thread recency ordering.", "format": "int64", diff --git a/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.schemas.json b/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.schemas.json index bc3a3bc591..ec97c1f850 100644 --- a/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.schemas.json +++ b/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.schemas.json @@ -20186,6 +20186,13 @@ "description": "Identifier for this thread. Codex-generated thread IDs are UUIDv7.", "type": "string" }, + "model": { + "description": "Current configured model when loaded, otherwise the latest persisted model. Null when unavailable. This is not per-turn execution telemetry.", + "type": [ + "string", + "null" + ] + }, "modelProvider": { "description": "Model provider used for this thread (for example, 'openai').", "type": "string" @@ -20222,6 +20229,17 @@ "null" ] }, + "reasoningEffort": { + "anyOf": [ + { + "$ref": "#/definitions/v2/ReasoningEffort" + }, + { + "type": "null" + } + ], + "description": "Current configured reasoning effort when loaded, otherwise the latest persisted effort. Null when unset or unavailable. This is not per-turn execution telemetry." + }, "recencyAt": { "description": "Unix timestamp (in seconds) used for thread recency ordering.", "format": "int64", diff --git a/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.v2.schemas.json b/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.v2.schemas.json index 189ca84107..8e83826dbc 100644 --- a/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.v2.schemas.json +++ b/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.v2.schemas.json @@ -17900,6 +17900,13 @@ "description": "Identifier for this thread. Codex-generated thread IDs are UUIDv7.", "type": "string" }, + "model": { + "description": "Current configured model when loaded, otherwise the latest persisted model. Null when unavailable. This is not per-turn execution telemetry.", + "type": [ + "string", + "null" + ] + }, "modelProvider": { "description": "Model provider used for this thread (for example, 'openai').", "type": "string" @@ -17936,6 +17943,17 @@ "null" ] }, + "reasoningEffort": { + "anyOf": [ + { + "$ref": "#/definitions/ReasoningEffort" + }, + { + "type": "null" + } + ], + "description": "Current configured reasoning effort when loaded, otherwise the latest persisted effort. Null when unset or unavailable. This is not per-turn execution telemetry." + }, "recencyAt": { "description": "Unix timestamp (in seconds) used for thread recency ordering.", "format": "int64", diff --git a/codex-rs/app-server-protocol/schema/json/v2/ThreadForkResponse.json b/codex-rs/app-server-protocol/schema/json/v2/ThreadForkResponse.json index f8e52d28f1..8d2527a200 100644 --- a/codex-rs/app-server-protocol/schema/json/v2/ThreadForkResponse.json +++ b/codex-rs/app-server-protocol/schema/json/v2/ThreadForkResponse.json @@ -1313,6 +1313,13 @@ "description": "Identifier for this thread. Codex-generated thread IDs are UUIDv7.", "type": "string" }, + "model": { + "description": "Current configured model when loaded, otherwise the latest persisted model. Null when unavailable. This is not per-turn execution telemetry.", + "type": [ + "string", + "null" + ] + }, "modelProvider": { "description": "Model provider used for this thread (for example, 'openai').", "type": "string" @@ -1349,6 +1356,17 @@ "null" ] }, + "reasoningEffort": { + "anyOf": [ + { + "$ref": "#/definitions/ReasoningEffort" + }, + { + "type": "null" + } + ], + "description": "Current configured reasoning effort when loaded, otherwise the latest persisted effort. Null when unset or unavailable. This is not per-turn execution telemetry." + }, "recencyAt": { "description": "Unix timestamp (in seconds) used for thread recency ordering.", "format": "int64", diff --git a/codex-rs/app-server-protocol/schema/json/v2/ThreadListResponse.json b/codex-rs/app-server-protocol/schema/json/v2/ThreadListResponse.json index f1d70c77a1..52303c2077 100644 --- a/codex-rs/app-server-protocol/schema/json/v2/ThreadListResponse.json +++ b/codex-rs/app-server-protocol/schema/json/v2/ThreadListResponse.json @@ -1104,6 +1104,13 @@ "description": "Identifier for this thread. Codex-generated thread IDs are UUIDv7.", "type": "string" }, + "model": { + "description": "Current configured model when loaded, otherwise the latest persisted model. Null when unavailable. This is not per-turn execution telemetry.", + "type": [ + "string", + "null" + ] + }, "modelProvider": { "description": "Model provider used for this thread (for example, 'openai').", "type": "string" @@ -1140,6 +1147,17 @@ "null" ] }, + "reasoningEffort": { + "anyOf": [ + { + "$ref": "#/definitions/ReasoningEffort" + }, + { + "type": "null" + } + ], + "description": "Current configured reasoning effort when loaded, otherwise the latest persisted effort. Null when unset or unavailable. This is not per-turn execution telemetry." + }, "recencyAt": { "description": "Unix timestamp (in seconds) used for thread recency ordering.", "format": "int64", diff --git a/codex-rs/app-server-protocol/schema/json/v2/ThreadMetadataUpdateResponse.json b/codex-rs/app-server-protocol/schema/json/v2/ThreadMetadataUpdateResponse.json index 6de156b488..d9c006b309 100644 --- a/codex-rs/app-server-protocol/schema/json/v2/ThreadMetadataUpdateResponse.json +++ b/codex-rs/app-server-protocol/schema/json/v2/ThreadMetadataUpdateResponse.json @@ -1104,6 +1104,13 @@ "description": "Identifier for this thread. Codex-generated thread IDs are UUIDv7.", "type": "string" }, + "model": { + "description": "Current configured model when loaded, otherwise the latest persisted model. Null when unavailable. This is not per-turn execution telemetry.", + "type": [ + "string", + "null" + ] + }, "modelProvider": { "description": "Model provider used for this thread (for example, 'openai').", "type": "string" @@ -1140,6 +1147,17 @@ "null" ] }, + "reasoningEffort": { + "anyOf": [ + { + "$ref": "#/definitions/ReasoningEffort" + }, + { + "type": "null" + } + ], + "description": "Current configured reasoning effort when loaded, otherwise the latest persisted effort. Null when unset or unavailable. This is not per-turn execution telemetry." + }, "recencyAt": { "description": "Unix timestamp (in seconds) used for thread recency ordering.", "format": "int64", diff --git a/codex-rs/app-server-protocol/schema/json/v2/ThreadReadResponse.json b/codex-rs/app-server-protocol/schema/json/v2/ThreadReadResponse.json index ba130748ff..0ee3e3e714 100644 --- a/codex-rs/app-server-protocol/schema/json/v2/ThreadReadResponse.json +++ b/codex-rs/app-server-protocol/schema/json/v2/ThreadReadResponse.json @@ -1104,6 +1104,13 @@ "description": "Identifier for this thread. Codex-generated thread IDs are UUIDv7.", "type": "string" }, + "model": { + "description": "Current configured model when loaded, otherwise the latest persisted model. Null when unavailable. This is not per-turn execution telemetry.", + "type": [ + "string", + "null" + ] + }, "modelProvider": { "description": "Model provider used for this thread (for example, 'openai').", "type": "string" @@ -1140,6 +1147,17 @@ "null" ] }, + "reasoningEffort": { + "anyOf": [ + { + "$ref": "#/definitions/ReasoningEffort" + }, + { + "type": "null" + } + ], + "description": "Current configured reasoning effort when loaded, otherwise the latest persisted effort. Null when unset or unavailable. This is not per-turn execution telemetry." + }, "recencyAt": { "description": "Unix timestamp (in seconds) used for thread recency ordering.", "format": "int64", diff --git a/codex-rs/app-server-protocol/schema/json/v2/ThreadResumeResponse.json b/codex-rs/app-server-protocol/schema/json/v2/ThreadResumeResponse.json index 7016e7f077..68e73e7673 100644 --- a/codex-rs/app-server-protocol/schema/json/v2/ThreadResumeResponse.json +++ b/codex-rs/app-server-protocol/schema/json/v2/ThreadResumeResponse.json @@ -1313,6 +1313,13 @@ "description": "Identifier for this thread. Codex-generated thread IDs are UUIDv7.", "type": "string" }, + "model": { + "description": "Current configured model when loaded, otherwise the latest persisted model. Null when unavailable. This is not per-turn execution telemetry.", + "type": [ + "string", + "null" + ] + }, "modelProvider": { "description": "Model provider used for this thread (for example, 'openai').", "type": "string" @@ -1349,6 +1356,17 @@ "null" ] }, + "reasoningEffort": { + "anyOf": [ + { + "$ref": "#/definitions/ReasoningEffort" + }, + { + "type": "null" + } + ], + "description": "Current configured reasoning effort when loaded, otherwise the latest persisted effort. Null when unset or unavailable. This is not per-turn execution telemetry." + }, "recencyAt": { "description": "Unix timestamp (in seconds) used for thread recency ordering.", "format": "int64", diff --git a/codex-rs/app-server-protocol/schema/json/v2/ThreadRevertResponse.json b/codex-rs/app-server-protocol/schema/json/v2/ThreadRevertResponse.json index 65dfd421b7..ffb3659ea5 100644 --- a/codex-rs/app-server-protocol/schema/json/v2/ThreadRevertResponse.json +++ b/codex-rs/app-server-protocol/schema/json/v2/ThreadRevertResponse.json @@ -1104,6 +1104,13 @@ "description": "Identifier for this thread. Codex-generated thread IDs are UUIDv7.", "type": "string" }, + "model": { + "description": "Current configured model when loaded, otherwise the latest persisted model. Null when unavailable. This is not per-turn execution telemetry.", + "type": [ + "string", + "null" + ] + }, "modelProvider": { "description": "Model provider used for this thread (for example, 'openai').", "type": "string" @@ -1140,6 +1147,17 @@ "null" ] }, + "reasoningEffort": { + "anyOf": [ + { + "$ref": "#/definitions/ReasoningEffort" + }, + { + "type": "null" + } + ], + "description": "Current configured reasoning effort when loaded, otherwise the latest persisted effort. Null when unset or unavailable. This is not per-turn execution telemetry." + }, "recencyAt": { "description": "Unix timestamp (in seconds) used for thread recency ordering.", "format": "int64", diff --git a/codex-rs/app-server-protocol/schema/json/v2/ThreadRollbackResponse.json b/codex-rs/app-server-protocol/schema/json/v2/ThreadRollbackResponse.json index 210c784af9..2afaf9ec79 100644 --- a/codex-rs/app-server-protocol/schema/json/v2/ThreadRollbackResponse.json +++ b/codex-rs/app-server-protocol/schema/json/v2/ThreadRollbackResponse.json @@ -1104,6 +1104,13 @@ "description": "Identifier for this thread. Codex-generated thread IDs are UUIDv7.", "type": "string" }, + "model": { + "description": "Current configured model when loaded, otherwise the latest persisted model. Null when unavailable. This is not per-turn execution telemetry.", + "type": [ + "string", + "null" + ] + }, "modelProvider": { "description": "Model provider used for this thread (for example, 'openai').", "type": "string" @@ -1140,6 +1147,17 @@ "null" ] }, + "reasoningEffort": { + "anyOf": [ + { + "$ref": "#/definitions/ReasoningEffort" + }, + { + "type": "null" + } + ], + "description": "Current configured reasoning effort when loaded, otherwise the latest persisted effort. Null when unset or unavailable. This is not per-turn execution telemetry." + }, "recencyAt": { "description": "Unix timestamp (in seconds) used for thread recency ordering.", "format": "int64", diff --git a/codex-rs/app-server-protocol/schema/json/v2/ThreadStartResponse.json b/codex-rs/app-server-protocol/schema/json/v2/ThreadStartResponse.json index 6d82e1c5b6..26cc859c5d 100644 --- a/codex-rs/app-server-protocol/schema/json/v2/ThreadStartResponse.json +++ b/codex-rs/app-server-protocol/schema/json/v2/ThreadStartResponse.json @@ -1313,6 +1313,13 @@ "description": "Identifier for this thread. Codex-generated thread IDs are UUIDv7.", "type": "string" }, + "model": { + "description": "Current configured model when loaded, otherwise the latest persisted model. Null when unavailable. This is not per-turn execution telemetry.", + "type": [ + "string", + "null" + ] + }, "modelProvider": { "description": "Model provider used for this thread (for example, 'openai').", "type": "string" @@ -1349,6 +1356,17 @@ "null" ] }, + "reasoningEffort": { + "anyOf": [ + { + "$ref": "#/definitions/ReasoningEffort" + }, + { + "type": "null" + } + ], + "description": "Current configured reasoning effort when loaded, otherwise the latest persisted effort. Null when unset or unavailable. This is not per-turn execution telemetry." + }, "recencyAt": { "description": "Unix timestamp (in seconds) used for thread recency ordering.", "format": "int64", diff --git a/codex-rs/app-server-protocol/schema/json/v2/ThreadStartedNotification.json b/codex-rs/app-server-protocol/schema/json/v2/ThreadStartedNotification.json index 33dc4dec94..7f2ece07d0 100644 --- a/codex-rs/app-server-protocol/schema/json/v2/ThreadStartedNotification.json +++ b/codex-rs/app-server-protocol/schema/json/v2/ThreadStartedNotification.json @@ -1104,6 +1104,13 @@ "description": "Identifier for this thread. Codex-generated thread IDs are UUIDv7.", "type": "string" }, + "model": { + "description": "Current configured model when loaded, otherwise the latest persisted model. Null when unavailable. This is not per-turn execution telemetry.", + "type": [ + "string", + "null" + ] + }, "modelProvider": { "description": "Model provider used for this thread (for example, 'openai').", "type": "string" @@ -1140,6 +1147,17 @@ "null" ] }, + "reasoningEffort": { + "anyOf": [ + { + "$ref": "#/definitions/ReasoningEffort" + }, + { + "type": "null" + } + ], + "description": "Current configured reasoning effort when loaded, otherwise the latest persisted effort. Null when unset or unavailable. This is not per-turn execution telemetry." + }, "recencyAt": { "description": "Unix timestamp (in seconds) used for thread recency ordering.", "format": "int64", diff --git a/codex-rs/app-server-protocol/schema/json/v2/ThreadUnarchiveResponse.json b/codex-rs/app-server-protocol/schema/json/v2/ThreadUnarchiveResponse.json index ed4edd1194..66371aed4c 100644 --- a/codex-rs/app-server-protocol/schema/json/v2/ThreadUnarchiveResponse.json +++ b/codex-rs/app-server-protocol/schema/json/v2/ThreadUnarchiveResponse.json @@ -1104,6 +1104,13 @@ "description": "Identifier for this thread. Codex-generated thread IDs are UUIDv7.", "type": "string" }, + "model": { + "description": "Current configured model when loaded, otherwise the latest persisted model. Null when unavailable. This is not per-turn execution telemetry.", + "type": [ + "string", + "null" + ] + }, "modelProvider": { "description": "Model provider used for this thread (for example, 'openai').", "type": "string" @@ -1140,6 +1147,17 @@ "null" ] }, + "reasoningEffort": { + "anyOf": [ + { + "$ref": "#/definitions/ReasoningEffort" + }, + { + "type": "null" + } + ], + "description": "Current configured reasoning effort when loaded, otherwise the latest persisted effort. Null when unset or unavailable. This is not per-turn execution telemetry." + }, "recencyAt": { "description": "Unix timestamp (in seconds) used for thread recency ordering.", "format": "int64", diff --git a/codex-rs/app-server-protocol/schema/precomputed/app-server-exports-experimental.json.zst b/codex-rs/app-server-protocol/schema/precomputed/app-server-exports-experimental.json.zst index 5222e1fd8cdd2bad2765f20e3214f1d09e103710..3aa3191608f3e70e2f5a0badf649856ea953d7c2 100644 GIT binary patch delta 119357 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