meerkat_core/
realtime_transcript.rs1use serde::{Deserialize, Serialize};
8
9use crate::types::{StopReason, Usage};
10
11pub const SESSION_REALTIME_TRANSCRIPT_STATE_KEY: &str = "realtime_transcript_state";
13
14#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
16#[serde(rename_all = "snake_case")]
17pub enum RealtimeTranscriptRole {
18 User,
19 Assistant,
20}
21
22#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
24#[serde(tag = "type", rename_all = "snake_case")]
25pub enum RealtimeTranscriptEvent {
26 ItemObserved {
29 item_id: String,
30 previous_item_id: Option<String>,
31 role: RealtimeTranscriptRole,
32 response_id: Option<String>,
33 },
34 ItemSkipped {
37 item_id: String,
38 previous_item_id: Option<String>,
39 },
40 UserTranscriptFinal {
42 item_id: String,
43 previous_item_id: Option<String>,
44 content_index: u32,
45 text: String,
46 },
47 AssistantTextDelta {
49 response_id: String,
50 delta_id: String,
51 item_id: String,
52 previous_item_id: Option<String>,
53 content_index: u32,
54 delta: String,
55 },
56 AssistantTranscriptTruncated {
59 response_id: String,
60 item_id: String,
61 content_index: u32,
62 text: String,
63 },
64 AssistantTurnCompleted {
67 response_id: String,
68 stop_reason: StopReason,
69 usage: Usage,
70 },
71 AssistantTurnInterrupted { response_id: String },
73}
74
75#[derive(Debug, Clone, PartialEq)]
77pub enum RealtimeTranscriptMaterializedMessage {
78 User {
79 item_id: String,
80 text: String,
81 },
82 Assistant {
83 item_id: String,
84 response_id: String,
85 text: String,
86 stop_reason: StopReason,
87 usage: Usage,
88 },
89}
90
91#[derive(Debug, Clone, Default, PartialEq)]
93pub struct RealtimeTranscriptApplyOutcome {
94 pub materialized_messages: Vec<RealtimeTranscriptMaterializedMessage>,
95}
96
97impl RealtimeTranscriptApplyOutcome {
98 #[must_use]
99 pub fn is_inert(&self) -> bool {
100 self.materialized_messages.is_empty()
101 }
102}