From aceb9708258de13073320291a8839d2c296d3305 Mon Sep 17 00:00:00 2001 From: Roy Han Date: Tue, 24 Mar 2026 16:19:38 -0700 Subject: [PATCH] migrate steer off --- codex-rs/core/src/analytics_client.rs | 73 ------------ codex-rs/core/src/analytics_client_tests.rs | 30 ----- codex-rs/core/src/codex.rs | 18 --- codex-rs/core/tests/suite/items.rs | 121 -------------------- 4 files changed, 242 deletions(-) diff --git a/codex-rs/core/src/analytics_client.rs b/codex-rs/core/src/analytics_client.rs index cbf5839097..7d984c1a36 100644 --- a/codex-rs/core/src/analytics_client.rs +++ b/codex-rs/core/src/analytics_client.rs @@ -39,9 +39,6 @@ pub(crate) struct CodexTurnEvent { pub(crate) collaboration_mode: ModeKind, } -#[derive(Clone, Copy)] -pub(crate) struct CodexTurnSteerEvent; - pub(crate) fn build_track_events_context( model_slug: String, thread_id: String, @@ -106,9 +103,6 @@ impl AnalyticsEventsQueue { TrackEventsJob::TurnEvent(job) => { send_track_turn_event(&auth_manager, job).await; } - TrackEventsJob::TurnSteer(job) => { - send_track_turn_steer(&auth_manager, job).await; - } TrackEventsJob::PluginUsed(job) => { send_track_plugin_used(&auth_manager, job).await; } @@ -235,19 +229,6 @@ impl AnalyticsEventsClient { ); } - pub(crate) fn track_turn_steer( - &self, - tracking: TrackEventsContext, - turn_steer: CodexTurnSteerEvent, - ) { - track_turn_steer( - &self.queue, - Arc::clone(&self.config), - Some(tracking), - turn_steer, - ); - } - pub fn track_plugin_installed(&self, plugin: PluginTelemetryMetadata) { track_plugin_management( &self.queue, @@ -290,7 +271,6 @@ enum TrackEventsJob { AppMentioned(TrackAppMentionedJob), AppUsed(TrackAppUsedJob), TurnEvent(TrackTurnEventJob), - TurnSteer(TrackTurnSteerJob), PluginUsed(TrackPluginUsedJob), PluginInstalled(TrackPluginManagementJob), PluginUninstalled(TrackPluginManagementJob), @@ -322,12 +302,6 @@ struct TrackTurnEventJob { turn_event: CodexTurnEvent, } -struct TrackTurnSteerJob { - config: Arc, - tracking: TrackEventsContext, - turn_steer: CodexTurnSteerEvent, -} - struct TrackPluginUsedJob { config: Arc, tracking: TrackEventsContext, @@ -562,26 +536,6 @@ pub(crate) fn track_turn_event( queue.try_send(job); } -pub(crate) fn track_turn_steer( - queue: &AnalyticsEventsQueue, - config: Arc, - tracking: Option, - turn_steer: CodexTurnSteerEvent, -) { - if config.analytics_enabled == Some(false) { - return; - } - let Some(tracking) = tracking else { - return; - }; - let job = TrackEventsJob::TurnSteer(TrackTurnSteerJob { - config, - tracking, - turn_steer, - }); - queue.try_send(job); -} - pub(crate) fn track_plugin_used( queue: &AnalyticsEventsQueue, config: Arc, @@ -721,20 +675,6 @@ async fn send_track_turn_event(auth_manager: &AuthManager, job: TrackTurnEventJo send_track_events(auth_manager, config, events).await; } -async fn send_track_turn_steer(auth_manager: &AuthManager, job: TrackTurnSteerJob) { - let TrackTurnSteerJob { - config, - tracking, - turn_steer, - } = job; - let events = vec![TrackEventRequest::TurnEvent(CodexTurnEventRequest { - event_type: "codex_turn_event", - event_params: codex_turn_steer_event_params(&tracking, turn_steer), - })]; - - send_track_events(auth_manager, config, events).await; -} - async fn send_track_plugin_used(auth_manager: &AuthManager, job: TrackPluginUsedJob) { let TrackPluginUsedJob { config, @@ -817,19 +757,6 @@ fn codex_turn_event_params( } } -fn codex_turn_steer_event_params( - tracking: &TrackEventsContext, - _turn_steer: CodexTurnSteerEvent, -) -> CodexTurnEventParams { - CodexTurnEventParams { - thread_id: Some(tracking.thread_id.clone()), - turn_id: Some(tracking.turn_id.clone()), - product_client_id: Some(crate::default_client::originator().value), - model_slug: Some(tracking.model_slug.clone()), - ..Default::default() - } -} - fn sandbox_policy_mode(sandbox_policy: &SandboxPolicy) -> &'static str { match sandbox_policy { SandboxPolicy::DangerFullAccess => "full_access", diff --git a/codex-rs/core/src/analytics_client_tests.rs b/codex-rs/core/src/analytics_client_tests.rs index 6c5b38d00f..2b9a990c51 100644 --- a/codex-rs/core/src/analytics_client_tests.rs +++ b/codex-rs/core/src/analytics_client_tests.rs @@ -6,7 +6,6 @@ use super::CodexPluginEventRequest; use super::CodexPluginUsedEventRequest; use super::CodexTurnEvent; use super::CodexTurnEventRequest; -use super::CodexTurnSteerEvent; use super::InvocationType; use super::SubmissionType; use super::TrackEventRequest; @@ -15,7 +14,6 @@ use super::codex_app_metadata; use super::codex_plugin_metadata; use super::codex_plugin_used_metadata; use super::codex_turn_event_params; -use super::codex_turn_steer_event_params; use super::normalize_path_for_skill_id; use crate::plugins::AppConnectorId; use crate::plugins::PluginCapabilitySummary; @@ -240,34 +238,6 @@ fn turn_event_serializes_expected_shape() { ); } -#[test] -fn turn_steer_event_serializes_expected_shape() { - let tracking = TrackEventsContext { - model_slug: "gpt-5".to_string(), - thread_id: "thread-2".to_string(), - turn_id: "turn-2".to_string(), - }; - let event = TrackEventRequest::TurnEvent(CodexTurnEventRequest { - event_type: "codex_turn_event", - event_params: codex_turn_steer_event_params(&tracking, CodexTurnSteerEvent), - }); - - let payload = serde_json::to_value(&event).expect("serialize codex turn steer event"); - - assert_eq!( - payload, - json!({ - "event_type": "codex_turn_event", - "event_params": { - "thread_id": "thread-2", - "turn_id": "turn-2", - "product_client_id": crate::default_client::originator().value, - "model_slug": "gpt-5" - } - }) - ); -} - #[test] fn plugin_used_event_serializes_expected_shape() { let tracking = TrackEventsContext { diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index 79af40debd..4ee0df4bfb 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -15,7 +15,6 @@ use crate::agent::agent_status_from_event; use crate::analytics_client::AnalyticsEventsClient; use crate::analytics_client::AppInvocation; use crate::analytics_client::CodexTurnEvent; -use crate::analytics_client::CodexTurnSteerEvent; use crate::analytics_client::InvocationType; use crate::analytics_client::build_track_events_context; use crate::apps::render_apps_section; @@ -2749,16 +2748,6 @@ impl Session { )) } - async fn active_turn_tracking(&self) -> Option { - let active = self.active_turn.lock().await; - let (_, task) = active.as_ref()?.tasks.first()?; - Some(build_track_events_context( - task.turn_context.model_info.slug.clone(), - self.conversation_id.to_string(), - task.turn_context.sub_id.clone(), - )) - } - pub(crate) async fn record_execpolicy_amendment_message( &self, sub_id: &str, @@ -3934,13 +3923,6 @@ impl Session { let mut turn_state = active_turn.turn_state.lock().await; turn_state.push_pending_input(input.into()); - drop(turn_state); - drop(active); - if let Some(tracking) = self.active_turn_tracking().await { - self.services - .analytics_events_client - .track_turn_steer(tracking, CodexTurnSteerEvent); - } Ok(active_turn_id) } diff --git a/codex-rs/core/tests/suite/items.rs b/codex-rs/core/tests/suite/items.rs index a20f8b7442..0084f50189 100644 --- a/codex-rs/core/tests/suite/items.rs +++ b/codex-rs/core/tests/suite/items.rs @@ -333,127 +333,6 @@ async fn user_turn_tracks_turn_event_prompt_type_analytics() -> anyhow::Result<( Ok(()) } -#[tokio::test(flavor = "multi_thread", worker_threads = 2)] -async fn user_turn_tracks_turn_steer_analytics() -> anyhow::Result<()> { - skip_if_no_network!(Ok(())); - - let server = start_mock_server().await; - let temp = tempdir()?; - let unblock_path = temp.path().join("unblock-steering"); - let command = format!( - "while [ ! -f \"{}\" ]; do sleep 0.01; done; echo done", - unblock_path.display() - ); - let call_id = "shell-steering-call"; - - mount_sse_sequence( - &server, - vec![ - sse(vec![ - ev_response_created("resp-1"), - core_test_support::responses::ev_function_call( - call_id, - "shell", - &serde_json::to_string(&serde_json::json!({ - "command": ["/bin/sh", "-c", command], - }))?, - ), - ev_completed("resp-1"), - ]), - sse(vec![ - ev_assistant_message("msg-2", "done"), - ev_completed("resp-2"), - ]), - ], - ) - .await; - - let chatgpt_base_url = server.uri(); - let test = test_codex() - .with_auth(CodexAuth::create_dummy_chatgpt_auth_for_testing()) - .with_model("gpt-5") - .with_config(move |config| { - config.chatgpt_base_url = chatgpt_base_url; - }) - .build(&server) - .await?; - let codex = test.codex.clone(); - let turn_model = test.session_configured.model.clone(); - - codex - .submit(Op::UserTurn { - items: vec![UserInput::Text { - text: "start steering flow".into(), - text_elements: Vec::new(), - }], - final_output_json_schema: None, - cwd: test.cwd_path().to_path_buf(), - approval_policy: AskForApproval::Never, - approvals_reviewer: None, - sandbox_policy: SandboxPolicy::DangerFullAccess, - model: turn_model, - effort: None, - summary: None, - service_tier: None, - collaboration_mode: None, - personality: None, - submission_type: None, - }) - .await?; - - let turn_id = wait_for_event_match(&codex, |ev| match ev { - EventMsg::TurnStarted(event) => Some(event.turn_id.clone()), - _ => None, - }) - .await; - - wait_for_event_match(&codex, |ev| match ev { - EventMsg::ExecCommandBegin(event) if event.call_id == call_id => Some(()), - _ => None, - }) - .await; - - let steering_text = "steering metadata check"; - let steered_turn_id = codex - .steer_input( - vec![UserInput::Text { - text: steering_text.into(), - text_elements: Vec::new(), - }], - Some(turn_id.as_str()), - ) - .await - .expect("steer should succeed on active turn"); - assert_eq!(steered_turn_id, turn_id); - - std::fs::write(&unblock_path, "go")?; - - wait_for_event(&codex, |event| matches!(event, EventMsg::TurnComplete(_))).await; - - let event = wait_for_analytics_event(&server, "codex_turn_event", |event| { - event["event_params"].get("submission_type").is_none() - && event["event_params"].get("sandbox_policy").is_none() - }) - .await; - let event_params = &event["event_params"]; - - assert!(event_params.get("submission_type").is_none()); - assert!(event_params.get("sandbox_policy").is_none()); - assert!(event_params.get("reasoning_effort").is_none()); - assert!(event_params.get("reasoning_summary").is_none()); - assert!(event_params.get("service_tier").is_none()); - assert!(event_params.get("collaboration_mode").is_none()); - assert_eq!( - event_params["product_client_id"], - serde_json::json!(codex_core::default_client::originator().value) - ); - assert_eq!(event_params["model_slug"], "gpt-5"); - assert!(event_params["thread_id"].as_str().is_some()); - assert!(event_params["turn_id"].as_str().is_some()); - - Ok(()) -} - #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn assistant_message_item_is_emitted() -> anyhow::Result<()> { skip_if_no_network!(Ok(()));