zai-rs 0.5.0

一个 Rust SDK, 用于调用 智谱AI API
Documentation
//! # Realtime API (WebSocket)
//!
//! Fully-functional realtime audio/video conversation over the GLM-Realtime
//! WebSocket protocol (`wss://open.bigmodel.cn/api/paas/v4/realtime`).
//!
//! Verified against the official protocol:
//! - <https://github.com/MetaGLM/glm-realtime-sdk/blob/main/GLM-Realtime-doc-for-llm.md>
//! - <https://docs.bigmodel.cn/cn/asyncapi/realtime>
//!
//! ## Quick start
//!
//! ```text
//! use zai_rs::{
//!     model::GLM4_voice,
//!     realtime::{RealtimeClient, TurnDetectionType},
//! };
//!
//! # async fn demo(key: String) -> zai_rs::ZaiResult<()> {
//! let session = RealtimeClient::new(key)
//!     .session(GLM4_voice {})
//!     .turn_detection(TurnDetectionType::ServerVad)
//!     .build()
//!     .await?;
//! session.send_text("你好").await?;
//! session.create_response().await?;
//! # Ok(())
//! # }
//! ```
//!
//! ## Auth modes
//!
//! - **Bearer** (default, server-side): `Authorization: Bearer {API_KEY}`.
//! - **JWT** (client-side): `.with_jwt(ttl_seconds)` signs a short-lived token
//!   from the API key's secret so the key never reaches the client.

pub mod audio;
pub mod client;
pub mod events;
pub mod jwt;
pub mod protocol;
pub mod session;
pub mod transport;

pub use audio::{InputAudioFormat, OutputAudioFormat};
pub use client::{AuthMode, RealtimeClient};
pub use events::{ClientEvent, ServerErrorBody, ServerEvent};
pub use protocol::{
    BetaFields, ChatMode, ItemContent, ItemType, RealtimeConversationItem, RealtimeResponse,
    RealtimeTool, RealtimeUsage, SessionConfig, TokenDetails, TurnDetection, TurnDetectionType,
};
pub use session::{RealtimeSession, SessionBuilder};
pub use transport::{RealtimeTransport, TungsteniteTransport, WsMessage};

use crate::model::traits::ModelName;

/// Marker trait for model ids usable in a realtime session.
///
/// Continues the crate's type-state + marker-trait philosophy: only valid
/// realtime model ids satisfy this bound, so
/// [`RealtimeClient::session`](client::RealtimeClient::session) is validated at
/// compile time. Any type generated by [`define_model_type!`] that should be
/// usable over realtime simply implements this marker.
///
/// [`define_model_type!`]: crate::define_model_type
pub trait RealtimeModel: ModelName {}

impl RealtimeModel for crate::model::GLM_realtime {}
impl RealtimeModel for crate::model::GLM4_voice {}
impl RealtimeModel for crate::model::GLM4_5_voice {}