This commit is contained in:
Roy Han
2026-03-24 14:37:50 -07:00
parent 1ab00f1609
commit e7a4e25e83
4 changed files with 23 additions and 41 deletions

View File

@@ -10,7 +10,6 @@ use codex_protocol::config_types::ServiceTier;
use codex_protocol::openai_models::ReasoningEffort;
use codex_protocol::protocol::SandboxPolicy;
use codex_protocol::protocol::SkillScope;
use codex_protocol::protocol::UserMessageType;
use serde::Serialize;
use sha1::Digest;
use sha1::Sha1;
@@ -31,7 +30,7 @@ pub(crate) struct TrackEventsContext {
#[derive(Clone)]
pub(crate) struct CodexTurnEvent {
pub(crate) submission_origin: Option<SubmissionOrigin>,
pub(crate) submission_type: Option<SubmissionType>,
pub(crate) sandbox_policy: SandboxPolicy,
pub(crate) reasoning_effort: Option<ReasoningEffort>,
pub(crate) reasoning_summary: ReasoningSummary,
@@ -41,7 +40,7 @@ pub(crate) struct CodexTurnEvent {
#[derive(Clone, Copy, Debug, Serialize)]
#[serde(rename_all = "snake_case")]
pub(crate) enum SubmissionOrigin {
pub(crate) enum SubmissionType {
Prompt,
PromptQueued,
}
@@ -54,9 +53,7 @@ pub(crate) enum TurnEventType {
}
#[derive(Clone, Copy)]
pub(crate) struct CodexTurnSteerEvent {
pub(crate) user_message_type: UserMessageType,
}
pub(crate) struct CodexTurnSteerEvent;
pub(crate) fn build_track_events_context(
model_slug: String,
@@ -434,8 +431,7 @@ struct CodexTurnEventParams {
product_client_id: Option<String>,
model_slug: Option<String>,
turn_event_type: TurnEventType,
submission_origin: Option<SubmissionOrigin>,
user_message_type: Option<UserMessageType>,
submission_type: Option<SubmissionType>,
sandbox_policy: Option<&'static str>,
reasoning_effort: Option<String>,
reasoning_summary: Option<String>,
@@ -817,8 +813,7 @@ fn codex_turn_event_params(
product_client_id: Some(crate::default_client::originator().value),
model_slug: Some(tracking.model_slug.clone()),
turn_event_type: TurnEventType::Start,
submission_origin: turn_event.submission_origin,
user_message_type: None,
submission_type: turn_event.submission_type,
sandbox_policy: Some(sandbox_policy_mode(&turn_event.sandbox_policy)),
reasoning_effort: turn_event.reasoning_effort.map(|value| value.to_string()),
reasoning_summary: Some(turn_event.reasoning_summary.to_string()),
@@ -829,7 +824,7 @@ fn codex_turn_event_params(
fn codex_turn_steer_event_params(
tracking: &TrackEventsContext,
turn_steer: CodexTurnSteerEvent,
_turn_steer: CodexTurnSteerEvent,
) -> CodexTurnEventParams {
CodexTurnEventParams {
thread_id: Some(tracking.thread_id.clone()),
@@ -837,8 +832,7 @@ fn codex_turn_steer_event_params(
product_client_id: Some(crate::default_client::originator().value),
model_slug: Some(tracking.model_slug.clone()),
turn_event_type: TurnEventType::Steer,
submission_origin: None,
user_message_type: Some(turn_steer.user_message_type),
submission_type: None,
sandbox_policy: None,
reasoning_effort: None,
reasoning_summary: None,

View File

@@ -8,11 +8,10 @@ use super::CodexTurnEvent;
use super::CodexTurnEventRequest;
use super::CodexTurnSteerEvent;
use super::InvocationType;
use super::SubmissionOrigin;
use super::SubmissionType;
use super::TrackEventRequest;
use super::TrackEventsContext;
use super::TurnEventType;
use super::UserMessageType;
use super::codex_app_metadata;
use super::codex_plugin_metadata;
use super::codex_plugin_used_metadata;
@@ -210,7 +209,7 @@ fn turn_event_serializes_expected_shape() {
event_params: codex_turn_event_params(
&tracking,
CodexTurnEvent {
submission_origin: Some(SubmissionOrigin::Prompt),
submission_type: Some(SubmissionType::Prompt),
sandbox_policy: SandboxPolicy::new_read_only_policy(),
reasoning_effort: Some(ReasoningEffort::High),
reasoning_summary: ReasoningSummary::Detailed,
@@ -232,8 +231,7 @@ fn turn_event_serializes_expected_shape() {
"product_client_id": crate::default_client::originator().value,
"model_slug": "gpt-5",
"turn_event_type": "start",
"submission_origin": "prompt",
"user_message_type": null,
"submission_type": "prompt",
"sandbox_policy": "read_only",
"reasoning_effort": "high",
"reasoning_summary": "detailed",
@@ -253,12 +251,7 @@ fn turn_steer_event_serializes_expected_shape() {
};
let event = TrackEventRequest::TurnEvent(CodexTurnEventRequest {
event_type: "codex_turn_event",
event_params: codex_turn_steer_event_params(
&tracking,
CodexTurnSteerEvent {
user_message_type: UserMessageType::PromptSteering,
},
),
event_params: codex_turn_steer_event_params(&tracking, CodexTurnSteerEvent),
});
let payload = serde_json::to_value(&event).expect("serialize codex turn steer event");
@@ -273,8 +266,7 @@ fn turn_steer_event_serializes_expected_shape() {
"product_client_id": crate::default_client::originator().value,
"model_slug": "gpt-5",
"turn_event_type": "steer",
"submission_origin": null,
"user_message_type": "prompt_steering",
"submission_type": null,
"sandbox_policy": null,
"reasoning_effort": null,
"reasoning_summary": null,

View File

@@ -17,7 +17,7 @@ use crate::analytics_client::AppInvocation;
use crate::analytics_client::CodexTurnEvent;
use crate::analytics_client::CodexTurnSteerEvent;
use crate::analytics_client::InvocationType;
use crate::analytics_client::SubmissionOrigin;
use crate::analytics_client::SubmissionType;
use crate::analytics_client::build_track_events_context;
use crate::apps::render_apps_section;
use crate::auth_env_telemetry::collect_auth_env_telemetry;
@@ -3938,12 +3938,9 @@ impl Session {
drop(turn_state);
drop(active);
if let Some(tracking) = self.active_turn_tracking().await {
self.services.analytics_events_client.track_turn_steer(
tracking,
CodexTurnSteerEvent {
user_message_type: SubmittedUserMessageType::PromptSteering,
},
);
self.services
.analytics_events_client
.track_turn_steer(tracking, CodexTurnSteerEvent);
}
Ok(active_turn_id)
}
@@ -6029,9 +6026,9 @@ pub(crate) async fn run_turn(
sess.services.analytics_events_client.track_turn_event(
tracking,
CodexTurnEvent {
submission_origin: match user_message_type {
SubmittedUserMessageType::Prompt => Some(SubmissionOrigin::Prompt),
SubmittedUserMessageType::PromptQueued => Some(SubmissionOrigin::PromptQueued),
submission_type: match user_message_type {
SubmittedUserMessageType::Prompt => Some(SubmissionType::Prompt),
SubmittedUserMessageType::PromptQueued => Some(SubmissionType::PromptQueued),
SubmittedUserMessageType::PromptSteering => None,
},
sandbox_policy: turn_context.sandbox_policy.get().clone(),

View File

@@ -244,7 +244,7 @@ async fn user_turn_tracks_turn_event_analytics() -> anyhow::Result<()> {
let event_params = &event["event_params"];
assert_eq!(event_params["submission_origin"], "prompt");
assert_eq!(event_params["submission_type"], "prompt");
assert_eq!(event_params["sandbox_policy"], "read_only");
assert_eq!(
event_params["product_client_id"],
@@ -317,12 +317,12 @@ async fn user_turn_tracks_turn_event_prompt_type_analytics() -> anyhow::Result<(
let event = wait_for_analytics_event(&server, "codex_turn_event", |event| {
event["event_params"]["turn_event_type"] == "start"
&& event["event_params"]["submission_origin"] == "prompt"
&& event["event_params"]["submission_type"] == "prompt"
})
.await;
let event_params = &event["event_params"];
assert_eq!(event_params["submission_origin"], "prompt");
assert_eq!(event_params["submission_type"], "prompt");
assert_eq!(
event_params["product_client_id"],
serde_json::json!(codex_core::default_client::originator().value)
@@ -433,12 +433,11 @@ async fn user_turn_tracks_turn_steer_analytics() -> anyhow::Result<()> {
let event = wait_for_analytics_event(&server, "codex_turn_event", |event| {
event["event_params"]["turn_event_type"] == "steer"
&& event["event_params"]["user_message_type"] == "prompt_steering"
})
.await;
let event_params = &event["event_params"];
assert_eq!(event_params["user_message_type"], "prompt_steering");
assert!(event_params["submission_type"].is_null());
assert_eq!(
event_params["product_client_id"],
serde_json::json!(codex_core::default_client::originator().value)