add fast mode toggle (#13212)

- add a local Fast mode setting in codex-core (similar to how model id
is currently stored on disk locally)
- send `service_tier=priority` on requests when Fast is enabled
- add `/fast` in the TUI and persist it locally
- feature flag
This commit is contained in:
pash-openai
2026-03-02 20:29:33 -08:00
committed by GitHub
parent 56cc2c71f4
commit 2f5b01abd6
69 changed files with 929 additions and 127 deletions

View File

@@ -16,6 +16,7 @@ use codex_otel::metrics::MetricsConfig;
use codex_protocol::ThreadId;
use codex_protocol::account::PlanType;
use codex_protocol::config_types::ReasoningSummary;
use codex_protocol::config_types::ServiceTier;
use codex_protocol::models::BaseInstructions;
use codex_protocol::models::ContentItem;
use codex_protocol::models::ResponseItem;
@@ -140,6 +141,7 @@ async fn responses_websocket_request_prewarm_reuses_connection() {
harness.effort,
harness.summary,
None,
None,
)
.await
.expect("websocket prewarm failed");
@@ -220,6 +222,7 @@ async fn responses_websocket_preconnect_is_reused_even_with_header_changes() {
harness.effort,
harness.summary,
None,
None,
)
.await
.expect("websocket stream failed");
@@ -257,6 +260,7 @@ async fn responses_websocket_request_prewarm_is_reused_even_with_header_changes(
harness.effort,
harness.summary,
None,
None,
)
.await
.expect("websocket prewarm failed");
@@ -268,6 +272,7 @@ async fn responses_websocket_request_prewarm_is_reused_even_with_header_changes(
harness.effort,
harness.summary,
None,
None,
)
.await
.expect("websocket stream failed");
@@ -320,6 +325,7 @@ async fn responses_websocket_prewarm_uses_v2_when_model_prefers_websockets_and_f
harness.effort,
harness.summary,
None,
None,
)
.await
.expect("websocket prewarm failed");
@@ -693,6 +699,7 @@ async fn responses_websocket_emits_reasoning_included_event() {
harness.effort,
harness.summary,
None,
None,
)
.await
.expect("websocket stream failed");
@@ -764,6 +771,7 @@ async fn responses_websocket_emits_rate_limit_events() {
harness.effort,
harness.summary,
None,
None,
)
.await
.expect("websocket stream failed");
@@ -1054,6 +1062,7 @@ async fn responses_websocket_forwards_turn_metadata_on_create_and_append() {
&mut client_session,
&harness,
&prompt_one,
None,
Some(first_turn_metadata),
)
.await;
@@ -1061,6 +1070,7 @@ async fn responses_websocket_forwards_turn_metadata_on_create_and_append() {
&mut client_session,
&harness,
&prompt_two,
None,
Some(enriched_turn_metadata),
)
.await;
@@ -1324,6 +1334,7 @@ async fn responses_websocket_v2_after_error_uses_full_create_without_previous_re
harness.effort,
harness.summary,
None,
None,
)
.await
.expect("websocket stream failed");
@@ -1555,13 +1566,24 @@ async fn stream_until_complete(
harness: &WebsocketTestHarness,
prompt: &Prompt,
) {
stream_until_complete_with_turn_metadata(client_session, harness, prompt, None).await;
stream_until_complete_with_service_tier(client_session, harness, prompt, None).await;
}
async fn stream_until_complete_with_service_tier(
client_session: &mut ModelClientSession,
harness: &WebsocketTestHarness,
prompt: &Prompt,
service_tier: Option<ServiceTier>,
) {
stream_until_complete_with_turn_metadata(client_session, harness, prompt, service_tier, None)
.await;
}
async fn stream_until_complete_with_turn_metadata(
client_session: &mut ModelClientSession,
harness: &WebsocketTestHarness,
prompt: &Prompt,
service_tier: Option<ServiceTier>,
turn_metadata_header: Option<&str>,
) {
let mut stream = client_session
@@ -1571,6 +1593,7 @@ async fn stream_until_complete_with_turn_metadata(
&harness.otel_manager,
harness.effort,
harness.summary,
service_tier,
turn_metadata_header,
)
.await