event definitions

This commit is contained in:
Roy Han
2026-03-24 14:04:13 -07:00
parent 2865b096f6
commit 1d4cee82bf
4 changed files with 121 additions and 122 deletions
+76 -87
View File
@@ -46,6 +46,13 @@ pub(crate) enum TurnType {
PromptQueued,
}
#[derive(Clone, Copy, Debug, Serialize)]
#[serde(rename_all = "snake_case")]
pub(crate) enum TurnEventType {
Start,
Steer,
}
#[derive(Clone, Copy)]
pub(crate) struct UserMessageMetadata {
pub(crate) user_message_type: UserMessageType,
@@ -112,11 +119,11 @@ impl AnalyticsEventsQueue {
TrackEventsJob::AppUsed(job) => {
send_track_app_used(&auth_manager, job).await;
}
TrackEventsJob::TurnMetadata(job) => {
send_track_turn_metadata(&auth_manager, job).await;
TrackEventsJob::TurnStart(job) => {
send_track_turn_start(&auth_manager, job).await;
}
TrackEventsJob::InputMessageMetadata(job) => {
send_track_input_message_metadata(&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;
@@ -231,29 +238,25 @@ impl AnalyticsEventsClient {
);
}
pub(crate) fn track_turn_metadata(
&self,
tracking: TrackEventsContext,
turn_metadata: TurnMetadata,
) {
track_turn_metadata(
pub(crate) fn track_turn_start(&self, tracking: TrackEventsContext, turn_start: TurnMetadata) {
track_turn_start(
&self.queue,
Arc::clone(&self.config),
Some(tracking),
turn_metadata,
turn_start,
);
}
pub(crate) fn track_input_message_metadata(
pub(crate) fn track_turn_steer(
&self,
tracking: TrackEventsContext,
input_message_metadata: UserMessageMetadata,
turn_steer: UserMessageMetadata,
) {
track_input_message_metadata(
track_turn_steer(
&self.queue,
Arc::clone(&self.config),
Some(tracking),
input_message_metadata,
turn_steer,
);
}
@@ -298,8 +301,8 @@ enum TrackEventsJob {
SkillInvocations(TrackSkillInvocationsJob),
AppMentioned(TrackAppMentionedJob),
AppUsed(TrackAppUsedJob),
TurnMetadata(TrackTurnMetadataJob),
InputMessageMetadata(TrackInputMessageMetadataJob),
TurnStart(TrackTurnStartJob),
TurnSteer(TrackTurnSteerJob),
PluginUsed(TrackPluginUsedJob),
PluginInstalled(TrackPluginManagementJob),
PluginUninstalled(TrackPluginManagementJob),
@@ -325,16 +328,16 @@ struct TrackAppUsedJob {
app: AppInvocation,
}
struct TrackTurnMetadataJob {
struct TrackTurnStartJob {
config: Arc<Config>,
tracking: TrackEventsContext,
turn_metadata: TurnMetadata,
turn_start: TurnMetadata,
}
struct TrackInputMessageMetadataJob {
struct TrackTurnSteerJob {
config: Arc<Config>,
tracking: TrackEventsContext,
input_message_metadata: UserMessageMetadata,
turn_steer: UserMessageMetadata,
}
struct TrackPluginUsedJob {
@@ -371,8 +374,7 @@ enum TrackEventRequest {
SkillInvocation(SkillInvocationEventRequest),
AppMentioned(CodexAppMentionedEventRequest),
AppUsed(CodexAppUsedEventRequest),
TurnMetadata(CodexTurnMetadataEventRequest),
InputMessageMetadata(CodexInputMessageMetadataEventRequest),
TurnEvent(CodexTurnEventRequest),
PluginUsed(CodexPluginUsedEventRequest),
PluginInstalled(CodexPluginEventRequest),
PluginUninstalled(CodexPluginEventRequest),
@@ -422,12 +424,14 @@ struct CodexAppUsedEventRequest {
}
#[derive(Serialize)]
struct CodexTurnMetadata {
struct CodexTurnEvent {
thread_id: Option<String>,
turn_id: Option<String>,
product_client_id: Option<String>,
model_slug: Option<String>,
turn_event_type: TurnEventType,
turn_type: Option<TurnType>,
user_message_type: Option<UserMessageType>,
sandbox_policy: Option<&'static str>,
reasoning_effort: Option<String>,
reasoning_summary: Option<String>,
@@ -436,24 +440,9 @@ struct CodexTurnMetadata {
}
#[derive(Serialize)]
struct CodexTurnMetadataEventRequest {
struct CodexTurnEventRequest {
event_type: &'static str,
event_params: CodexTurnMetadata,
}
#[derive(Serialize)]
struct CodexInputMessageMetadata {
thread_id: Option<String>,
turn_id: Option<String>,
product_client_id: Option<String>,
model_slug: Option<String>,
user_message_type: Option<UserMessageType>,
}
#[derive(Serialize)]
struct CodexInputMessageMetadataEventRequest {
event_type: &'static str,
event_params: CodexInputMessageMetadata,
event_params: CodexTurnEvent,
}
#[derive(Serialize)]
@@ -557,11 +546,11 @@ pub(crate) fn track_app_used(
queue.try_send(job);
}
pub(crate) fn track_turn_metadata(
pub(crate) fn track_turn_start(
queue: &AnalyticsEventsQueue,
config: Arc<Config>,
tracking: Option<TrackEventsContext>,
turn_metadata: TurnMetadata,
turn_start: TurnMetadata,
) {
if config.analytics_enabled == Some(false) {
return;
@@ -569,19 +558,19 @@ pub(crate) fn track_turn_metadata(
let Some(tracking) = tracking else {
return;
};
let job = TrackEventsJob::TurnMetadata(TrackTurnMetadataJob {
let job = TrackEventsJob::TurnStart(TrackTurnStartJob {
config,
tracking,
turn_metadata,
turn_start,
});
queue.try_send(job);
}
pub(crate) fn track_input_message_metadata(
pub(crate) fn track_turn_steer(
queue: &AnalyticsEventsQueue,
config: Arc<Config>,
tracking: Option<TrackEventsContext>,
input_message_metadata: UserMessageMetadata,
turn_steer: UserMessageMetadata,
) {
if config.analytics_enabled == Some(false) {
return;
@@ -589,10 +578,10 @@ pub(crate) fn track_input_message_metadata(
let Some(tracking) = tracking else {
return;
};
let job = TrackEventsJob::InputMessageMetadata(TrackInputMessageMetadataJob {
let job = TrackEventsJob::TurnSteer(TrackTurnSteerJob {
config,
tracking,
input_message_metadata,
turn_steer,
});
queue.try_send(job);
}
@@ -722,37 +711,30 @@ async fn send_track_app_used(auth_manager: &AuthManager, job: TrackAppUsedJob) {
send_track_events(auth_manager, config, events).await;
}
async fn send_track_turn_metadata(auth_manager: &AuthManager, job: TrackTurnMetadataJob) {
let TrackTurnMetadataJob {
async fn send_track_turn_start(auth_manager: &AuthManager, job: TrackTurnStartJob) {
let TrackTurnStartJob {
config,
tracking,
turn_metadata,
turn_start,
} = job;
let events = vec![TrackEventRequest::TurnMetadata(
CodexTurnMetadataEventRequest {
event_type: "codex_turn_metadata",
event_params: codex_turn_metadata(&tracking, turn_metadata),
},
)];
let events = vec![TrackEventRequest::TurnEvent(CodexTurnEventRequest {
event_type: "codex_turn_event",
event_params: codex_turn_start_event(&tracking, turn_start),
})];
send_track_events(auth_manager, config, events).await;
}
async fn send_track_input_message_metadata(
auth_manager: &AuthManager,
job: TrackInputMessageMetadataJob,
) {
let TrackInputMessageMetadataJob {
async fn send_track_turn_steer(auth_manager: &AuthManager, job: TrackTurnSteerJob) {
let TrackTurnSteerJob {
config,
tracking,
input_message_metadata,
turn_steer,
} = job;
let events = vec![TrackEventRequest::InputMessageMetadata(
CodexInputMessageMetadataEventRequest {
event_type: "codex_input_message_metadata",
event_params: codex_input_message_metadata(&tracking, input_message_metadata),
},
)];
let events = vec![TrackEventRequest::TurnEvent(CodexTurnEventRequest {
event_type: "codex_turn_event",
event_params: codex_turn_steer_event(&tracking, turn_steer),
})];
send_track_events(auth_manager, config, events).await;
}
@@ -821,36 +803,43 @@ fn codex_app_metadata(tracking: &TrackEventsContext, app: AppInvocation) -> Code
}
}
fn codex_turn_metadata(
fn codex_turn_start_event(
tracking: &TrackEventsContext,
turn_metadata: TurnMetadata,
) -> CodexTurnMetadata {
CodexTurnMetadata {
turn_start: TurnMetadata,
) -> CodexTurnEvent {
CodexTurnEvent {
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()),
turn_type: turn_metadata.turn_type,
sandbox_policy: Some(sandbox_policy_mode(&turn_metadata.sandbox_policy)),
reasoning_effort: turn_metadata
.reasoning_effort
.map(|value| value.to_string()),
reasoning_summary: Some(turn_metadata.reasoning_summary.to_string()),
service_tier: turn_metadata.service_tier.map(|value| value.to_string()),
collaboration_mode: Some(collaboration_mode_mode(turn_metadata.collaboration_mode)),
turn_event_type: TurnEventType::Start,
turn_type: turn_start.turn_type,
user_message_type: None,
sandbox_policy: Some(sandbox_policy_mode(&turn_start.sandbox_policy)),
reasoning_effort: turn_start.reasoning_effort.map(|value| value.to_string()),
reasoning_summary: Some(turn_start.reasoning_summary.to_string()),
service_tier: turn_start.service_tier.map(|value| value.to_string()),
collaboration_mode: Some(collaboration_mode_mode(turn_start.collaboration_mode)),
}
}
fn codex_input_message_metadata(
fn codex_turn_steer_event(
tracking: &TrackEventsContext,
input_message_metadata: UserMessageMetadata,
) -> CodexInputMessageMetadata {
CodexInputMessageMetadata {
turn_steer: UserMessageMetadata,
) -> CodexTurnEvent {
CodexTurnEvent {
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()),
user_message_type: Some(input_message_metadata.user_message_type),
turn_event_type: TurnEventType::Steer,
turn_type: None,
user_message_type: Some(turn_steer.user_message_type),
sandbox_policy: None,
reasoning_effort: None,
reasoning_summary: None,
service_tier: None,
collaboration_mode: None,
}
}
+24 -15
View File
@@ -2,22 +2,22 @@ use super::AnalyticsEventsQueue;
use super::AppInvocation;
use super::CodexAppMentionedEventRequest;
use super::CodexAppUsedEventRequest;
use super::CodexInputMessageMetadataEventRequest;
use super::CodexPluginEventRequest;
use super::CodexPluginUsedEventRequest;
use super::CodexTurnMetadataEventRequest;
use super::CodexTurnEventRequest;
use super::InvocationType;
use super::TrackEventRequest;
use super::TrackEventsContext;
use super::TurnEventType;
use super::TurnMetadata;
use super::TurnType;
use super::UserMessageMetadata;
use super::UserMessageType;
use super::codex_app_metadata;
use super::codex_input_message_metadata;
use super::codex_plugin_metadata;
use super::codex_plugin_used_metadata;
use super::codex_turn_metadata;
use super::codex_turn_start_event;
use super::codex_turn_steer_event;
use super::normalize_path_for_skill_id;
use crate::plugins::AppConnectorId;
use crate::plugins::PluginCapabilitySummary;
@@ -199,15 +199,15 @@ fn app_used_dedupe_is_keyed_by_turn_and_connector() {
}
#[test]
fn turn_metadata_event_serializes_expected_shape() {
fn turn_start_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::TurnMetadata(CodexTurnMetadataEventRequest {
event_type: "codex_turn_metadata",
event_params: codex_turn_metadata(
let event = TrackEventRequest::TurnEvent(CodexTurnEventRequest {
event_type: "codex_turn_event",
event_params: codex_turn_start_event(
&tracking,
TurnMetadata {
turn_type: Some(TurnType::Prompt),
@@ -225,13 +225,15 @@ fn turn_metadata_event_serializes_expected_shape() {
assert_eq!(
payload,
json!({
"event_type": "codex_turn_metadata",
"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",
"turn_event_type": "start",
"turn_type": "prompt",
"user_message_type": null,
"sandbox_policy": "read_only",
"reasoning_effort": "high",
"reasoning_summary": "detailed",
@@ -243,15 +245,15 @@ fn turn_metadata_event_serializes_expected_shape() {
}
#[test]
fn input_message_metadata_event_serializes_expected_shape() {
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::InputMessageMetadata(CodexInputMessageMetadataEventRequest {
event_type: "codex_input_message_metadata",
event_params: codex_input_message_metadata(
let event = TrackEventRequest::TurnEvent(CodexTurnEventRequest {
event_type: "codex_turn_event",
event_params: codex_turn_steer_event(
&tracking,
UserMessageMetadata {
user_message_type: UserMessageType::PromptSteering,
@@ -264,13 +266,20 @@ fn input_message_metadata_event_serializes_expected_shape() {
assert_eq!(
payload,
json!({
"event_type": "codex_input_message_metadata",
"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",
"user_message_type": "prompt_steering"
"turn_event_type": "steer",
"turn_type": null,
"user_message_type": "prompt_steering",
"sandbox_policy": null,
"reasoning_effort": null,
"reasoning_summary": null,
"service_tier": null,
"collaboration_mode": null
}
})
);
+7 -9
View File
@@ -3938,14 +3938,12 @@ impl Session {
drop(turn_state);
drop(active);
if let Some(tracking) = self.active_turn_tracking().await {
self.services
.analytics_events_client
.track_input_message_metadata(
tracking,
UserMessageMetadata {
user_message_type: SubmittedUserMessageType::PromptSteering,
},
);
self.services.analytics_events_client.track_turn_steer(
tracking,
UserMessageMetadata {
user_message_type: SubmittedUserMessageType::PromptSteering,
},
);
}
Ok(active_turn_id)
}
@@ -5715,7 +5713,7 @@ pub(crate) async fn run_turn(
let user_message_type = turn_context
.user_message_type
.unwrap_or(SubmittedUserMessageType::Prompt);
sess.services.analytics_events_client.track_turn_metadata(
sess.services.analytics_events_client.track_turn_start(
tracking.clone(),
TurnMetadata {
turn_type: match user_message_type {