Skip to main content

zai_rs/realtime/
mod.rs

1//! # Realtime API (WebSocket)
2//!
3//! Fully-functional realtime audio/video conversation over the GLM-Realtime
4//! WebSocket protocol (`wss://open.bigmodel.cn/api/paas/v4/realtime`).
5//!
6//! Verified against the official protocol:
7//! - <https://github.com/MetaGLM/glm-realtime-sdk/blob/main/GLM-Realtime-doc-for-llm.md>
8//! - <https://docs.bigmodel.cn/cn/asyncapi/realtime>
9//!
10//! ## Quick start
11//!
12//! ```rust,no_run
13//! use zai_rs::{
14//!     model::GLM4_voice,
15//!     realtime::{RealtimeClient, TurnDetectionType},
16//! };
17//!
18//! # async fn demo(key: String) -> zai_rs::ZaiResult<()> {
19//! let session = RealtimeClient::new(key)
20//!     .session(GLM4_voice {})
21//!     .turn_detection(TurnDetectionType::ServerVad)
22//!     .build()
23//!     .await?;
24//! session.send_text("你好").await?;
25//! session.create_response().await?;
26//! # Ok(())
27//! # }
28//! ```
29//!
30//! ## Auth modes
31//!
32//! - **Bearer** (default, server-side): `Authorization: Bearer {API_KEY}`.
33//! - **JWT** (client-side): `.with_jwt(ttl_seconds)` signs a short-lived token
34//!   from the API key's secret so the key never reaches the client.
35
36pub mod audio;
37pub mod client;
38pub mod events;
39pub mod jwt;
40pub mod protocol;
41pub mod session;
42pub mod transport;
43
44pub use audio::{InputAudioFormat, OutputAudioFormat};
45pub use client::{AuthMode, RealtimeClient};
46pub use events::{ClientEvent, ServerErrorBody, ServerEvent};
47pub use protocol::{
48    BetaFields, ChatMode, ItemContent, ItemType, RealtimeConversationItem, RealtimeResponse,
49    RealtimeTool, RealtimeUsage, SessionConfig, TokenDetails, TurnDetection, TurnDetectionType,
50};
51pub use session::{RealtimeSession, SessionBuilder};
52pub use transport::{RealtimeTransport, TungsteniteTransport, WsMessage};
53
54use crate::model::traits::ModelName;
55
56/// Marker trait for model ids usable in a realtime session.
57///
58/// Continues the crate's type-state + marker-trait philosophy: only valid
59/// realtime model ids satisfy this bound, so
60/// [`RealtimeClient::session`](client::RealtimeClient::session) is validated at
61/// compile time. Any type generated by [`define_model_type!`] that should be
62/// usable over realtime simply implements this marker.
63///
64/// [`define_model_type!`]: crate::define_model_type
65pub trait RealtimeModel: ModelName {}
66
67impl RealtimeModel for crate::model::GLM_realtime {}
68impl RealtimeModel for crate::model::GLM4_voice {}
69impl RealtimeModel for crate::model::GLM4_5_voice {}