// Chat Completions API response types use crate::protocols::openai::chat::types::{ChatMessage, ChatMessageDelta}; use crate::protocols::openai::common::{ChatLogProbs, Usage}; use serde::{Deserialize, Serialize}; // ============= Regular Response ============= #[derive(Debug, Clone, Deserialize, Serialize)] pub struct ChatCompletionResponse { pub id: String, pub object: String, // "chat.completion" pub created: u64, pub model: String, pub choices: Vec, #[serde(skip_serializing_if = "Option::is_none")] pub usage: Option, #[serde(skip_serializing_if = "Option::is_none")] pub system_fingerprint: Option, } #[derive(Debug, Clone, Deserialize, Serialize)] pub struct ChatChoice { pub index: u32, pub message: ChatMessage, #[serde(skip_serializing_if = "Option::is_none")] pub logprobs: Option, pub finish_reason: Option, // "stop", "length", "tool_calls", "content_filter", "function_call" /// Information about which stop condition was matched #[serde(skip_serializing_if = "Option::is_none")] pub matched_stop: Option, // Can be string or integer /// Hidden states from the model (SGLang extension) #[serde(skip_serializing_if = "Option::is_none")] pub hidden_states: Option>, } // ============= Streaming Response ============= #[derive(Debug, Clone, Deserialize, Serialize)] pub struct ChatCompletionStreamResponse { pub id: String, pub object: String, // "chat.completion.chunk" pub created: u64, pub model: String, #[serde(skip_serializing_if = "Option::is_none")] pub system_fingerprint: Option, pub choices: Vec, #[serde(skip_serializing_if = "Option::is_none")] pub usage: Option, } #[derive(Debug, Clone, Deserialize, Serialize)] pub struct ChatStreamChoice { pub index: u32, pub delta: ChatMessageDelta, #[serde(skip_serializing_if = "Option::is_none")] pub logprobs: Option, pub finish_reason: Option, }