mirror of
https://github.com/openai/codex.git
synced 2026-10-20 17:38:45 +00:00
## Why Clients need a bounded view of realtime conversations that preserves the order of speech, agent work, and turn lifecycle events without loading the full thread history. ## What changed - Persist realtime session boundaries, transcript segments, and promoted agent items in paginated thread rollouts. - Add the experimental `thread/timeline/list` API to page ordinary items, realtime items, and turn boundaries in canonical rollout order. Include `activeRealtimeSessionAtPageStart` so each page can be rendered independently. - Emit typed `thread/realtime/item/started`, `thread/realtime/item/transcript/delta`, and `thread/realtime/item/completed` notifications around durable realtime items. - Keep the existing `thread/items/list` response and legacy thread history behavior unchanged. ## Testing - Cover mixed timeline pagination, realtime-session state at page boundaries, rollout replay, subagent history prefixes, transcript streaming, steering, and promoted agent artifacts. GitOrigin-RevId: faa2c420192d63e060e8fb32446e3c797422656e
60 lines
1.7 KiB
Rust
60 lines
1.7 KiB
Rust
use schemars::JsonSchema;
|
|
use serde::Deserialize;
|
|
use serde::Serialize;
|
|
use ts_rs::TS;
|
|
|
|
/// A realtime thread item persisted in the canonical rollout.
|
|
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize, JsonSchema, TS)]
|
|
pub struct RealtimeItem {
|
|
pub id: String,
|
|
pub realtime_session_id: String,
|
|
#[serde(flatten)]
|
|
pub content: RealtimeItemContent,
|
|
}
|
|
|
|
/// The minimum facts needed to interleave realtime speech and agent work.
|
|
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize, JsonSchema, TS)]
|
|
#[serde(tag = "type", rename_all = "snake_case")]
|
|
#[ts(tag = "type", rename_all = "snake_case")]
|
|
pub enum RealtimeItemContent {
|
|
RealtimeSessionStarted,
|
|
TranscriptSegment {
|
|
role: RealtimeTranscriptRole,
|
|
text: String,
|
|
},
|
|
BemItemPromoted {
|
|
turn_id: String,
|
|
item_id: String,
|
|
presentation: BemItemPresentation,
|
|
},
|
|
RealtimeSessionClosed {
|
|
outcome: RealtimeSessionOutcome,
|
|
},
|
|
}
|
|
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize, JsonSchema, TS)]
|
|
#[serde(rename_all = "snake_case")]
|
|
#[ts(rename_all = "snake_case")]
|
|
pub enum RealtimeSessionOutcome {
|
|
Ended,
|
|
Failed,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize, JsonSchema, TS)]
|
|
#[serde(rename_all = "snake_case")]
|
|
#[ts(rename_all = "snake_case")]
|
|
pub enum RealtimeTranscriptRole {
|
|
User,
|
|
Assistant,
|
|
}
|
|
|
|
/// How an existing agent item is presented in the realtime conversation.
|
|
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize, JsonSchema, TS)]
|
|
#[serde(tag = "type", rename_all = "snake_case")]
|
|
#[ts(tag = "type", rename_all = "snake_case")]
|
|
pub enum BemItemPresentation {
|
|
WholeItem,
|
|
InlineMarkdown,
|
|
InlineVisualization { index: u32 },
|
|
}
|