2- Use string service tiers in session protocol (#20971)

## Summary
- break service tier session/op/app-server protocol fields from the
closed enum to string tier ids
- send the service tier string directly through model requests, prewarm,
compaction, memories, and TUI/app-server turn starts
- regenerate app-server protocol JSON/TypeScript schemas, removing the
standalone ServiceTier TS enum

## Verification
- just fmt
- cargo check -p codex-core -p codex-app-server -p codex-tui
- just write-app-server-schema

---------

Co-authored-by: Codex <noreply@openai.com>
This commit is contained in:
Ahmed Ibrahim
2026-05-06 18:00:21 +03:00
committed by GitHub
Unverified
parent ebd9ec05b4
commit be1d3cff93
65 changed files with 403 additions and 570 deletions
+2 -3
View File
@@ -18,7 +18,6 @@ use codex_otel::TelemetryAuthMode;
use codex_protocol::SessionId;
use codex_protocol::ThreadId;
use codex_protocol::config_types::ReasoningSummary;
use codex_protocol::config_types::ServiceTier;
use codex_protocol::openai_models::ModelInfo;
use codex_protocol::openai_models::ReasoningEffort;
use codex_protocol::protocol::InitialHistory;
@@ -46,7 +45,7 @@ pub(crate) struct StageOneRequestContext {
pub(crate) session_telemetry: SessionTelemetry,
pub(crate) reasoning_effort: Option<ReasoningEffort>,
pub(crate) reasoning_summary: ReasoningSummary,
pub(crate) service_tier: Option<ServiceTier>,
pub(crate) service_tier: Option<String>,
pub(crate) turn_metadata_header: Option<String>,
}
@@ -194,7 +193,7 @@ impl MemoryStartupContext {
&context.session_telemetry,
context.reasoning_effort,
context.reasoning_summary,
context.service_tier,
context.service_tier.clone(),
context.turn_metadata_header.as_deref(),
&InferenceTraceContext::disabled(),
)
+12 -5
View File
@@ -253,14 +253,18 @@ async fn memories_startup_phase1_uses_live_thread_service_tier() -> anyhow::Resu
model: None,
effort: None,
summary: None,
service_tier: Some(Some(ServiceTier::Fast)),
service_tier: Some(Some(ServiceTier::Fast.request_value().to_string())),
collaboration_mode: None,
personality: None,
})
.await?;
let config_snapshot = wait_for_service_tier(&test, Some(ServiceTier::Fast)).await?;
assert_eq!(config_snapshot.service_tier, Some(ServiceTier::Fast));
let config_snapshot =
wait_for_service_tier(&test, Some(ServiceTier::Fast.request_value().to_string())).await?;
assert_eq!(
config_snapshot.service_tier,
Some(ServiceTier::Fast.request_value().to_string())
);
let context = crate::runtime::MemoryStartupContext::new(
Arc::clone(&test.thread_manager),
@@ -277,7 +281,10 @@ async fn memories_startup_phase1_uses_live_thread_service_tier() -> anyhow::Resu
ReasoningEffort::Low,
)
.await;
assert_eq!(request_context.service_tier, Some(ServiceTier::Fast));
assert_eq!(
request_context.service_tier,
Some(ServiceTier::Fast.request_value().to_string())
);
shutdown_test_codex(&test).await?;
Ok(())
@@ -394,7 +401,7 @@ async fn wait_for_request(mock: &ResponseMock, expected_count: usize) -> Vec<Res
async fn wait_for_service_tier(
test: &TestCodex,
expected_service_tier: Option<ServiceTier>,
expected_service_tier: Option<String>,
) -> anyhow::Result<codex_core::ThreadConfigSnapshot> {
let deadline = Instant::now() + Duration::from_secs(10);
loop {