use serde::{Deserialize, Serialize};
use crate::types::{StopReason, Usage};
pub const SESSION_REALTIME_TRANSCRIPT_STATE_KEY: &str = "realtime_transcript_state";
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum RealtimeTranscriptRole {
User,
Assistant,
}
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(
Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize, Default,
)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum TranscriptLane {
#[default]
Display,
Spoken,
}
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum RealtimeTranscriptEvent {
ItemObserved {
item_id: String,
previous_item_id: Option<String>,
role: RealtimeTranscriptRole,
response_id: Option<String>,
},
ItemSkipped {
item_id: String,
previous_item_id: Option<String>,
},
UserTranscriptFinal {
item_id: String,
previous_item_id: Option<String>,
content_index: u32,
text: String,
},
AssistantTextDelta {
response_id: String,
delta_id: String,
item_id: String,
previous_item_id: Option<String>,
content_index: u32,
delta: String,
},
AssistantTranscriptDelta {
response_id: String,
delta_id: String,
item_id: String,
previous_item_id: Option<String>,
content_index: u32,
delta: String,
},
AssistantTranscriptTruncated {
response_id: String,
item_id: String,
content_index: u32,
text: String,
},
AssistantTranscriptFinalText {
response_id: String,
item_id: String,
content_index: u32,
text: String,
},
AssistantTurnCompleted {
response_id: String,
stop_reason: StopReason,
usage: Usage,
},
AssistantTurnInterrupted { response_id: String },
}
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AppendRealtimeTranscript {
pub item_id: String,
pub text: String,
pub role: RealtimeTranscriptRole,
pub lane: TranscriptLane,
}
#[derive(Debug, Clone, PartialEq)]
pub enum RealtimeTranscriptMaterializedMessage {
User {
item_id: String,
text: String,
},
Assistant {
item_id: String,
response_id: String,
text: String,
stop_reason: StopReason,
usage: Usage,
lane: TranscriptLane,
},
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct RealtimeTranscriptApplyOutcome {
pub materialized_messages: Vec<RealtimeTranscriptMaterializedMessage>,
}
impl RealtimeTranscriptApplyOutcome {
#[must_use]
pub fn is_inert(&self) -> bool {
self.materialized_messages.is_empty()
}
}