Skip to main content

gproxy_protocol/openai/create_chat_completions/
stream.rs

1use serde::{Deserialize, Serialize};
2
3use crate::openai::create_chat_completions::types::{
4    ChatCompletionAnnotation, ChatCompletionDeltaRole, ChatCompletionFinishReason,
5    ChatCompletionFunctionCall, ChatCompletionLogprobs, ChatCompletionReasoningDetail,
6    ChatCompletionServiceTier, CompletionUsage,
7};
8
9/// Streamed chat completion chunk.
10///
11/// Each SSE `data:` line (except `[DONE]`) deserializes to this type.
12#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
13pub struct ChatCompletionChunk {
14    pub id: String,
15    pub choices: Vec<ChatCompletionChunkChoice>,
16    pub created: u64,
17    pub model: String,
18    pub object: ChatCompletionChunkObject,
19    #[serde(default, skip_serializing_if = "Option::is_none")]
20    pub service_tier: Option<ChatCompletionServiceTier>,
21    #[serde(default, skip_serializing_if = "Option::is_none")]
22    pub system_fingerprint: Option<String>,
23    #[serde(default, skip_serializing_if = "Option::is_none")]
24    pub usage: Option<CompletionUsage>,
25}
26
27#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
28pub enum ChatCompletionChunkObject {
29    #[serde(rename = "chat.completion.chunk")]
30    ChatCompletionChunk,
31}
32
33#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
34pub struct ChatCompletionChunkChoice {
35    pub delta: ChatCompletionChunkDelta,
36    #[serde(default, skip_serializing_if = "Option::is_none")]
37    pub finish_reason: Option<ChatCompletionFinishReason>,
38    pub index: u32,
39    #[serde(default, skip_serializing_if = "Option::is_none")]
40    pub logprobs: Option<ChatCompletionLogprobs>,
41}
42
43#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
44pub struct ChatCompletionChunkDelta {
45    #[serde(default, skip_serializing_if = "Option::is_none")]
46    pub content: Option<String>,
47    #[serde(default, skip_serializing_if = "Option::is_none")]
48    pub reasoning_content: Option<String>,
49    #[serde(default, skip_serializing_if = "Option::is_none")]
50    pub reasoning_details: Option<Vec<ChatCompletionReasoningDetail>>,
51    #[serde(default, skip_serializing_if = "Option::is_none")]
52    pub function_call: Option<ChatCompletionFunctionCallDelta>,
53    #[serde(default, skip_serializing_if = "Option::is_none")]
54    pub refusal: Option<String>,
55    #[serde(default, skip_serializing_if = "Option::is_none")]
56    pub role: Option<ChatCompletionDeltaRole>,
57    #[serde(default, skip_serializing_if = "Option::is_none")]
58    pub annotations: Option<Vec<ChatCompletionAnnotation>>,
59    #[serde(default, skip_serializing_if = "Option::is_none")]
60    pub tool_calls: Option<Vec<ChatCompletionChunkDeltaToolCall>>,
61    #[serde(default, skip_serializing_if = "Option::is_none")]
62    pub obfuscation: Option<String>,
63}
64
65#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
66pub struct ChatCompletionFunctionCallDelta {
67    #[serde(default, skip_serializing_if = "Option::is_none")]
68    pub arguments: Option<String>,
69    #[serde(default, skip_serializing_if = "Option::is_none")]
70    pub name: Option<String>,
71}
72
73impl From<ChatCompletionFunctionCall> for ChatCompletionFunctionCallDelta {
74    fn from(value: ChatCompletionFunctionCall) -> Self {
75        Self {
76            arguments: Some(value.arguments),
77            name: Some(value.name),
78        }
79    }
80}
81
82#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
83pub struct ChatCompletionChunkDeltaToolCall {
84    pub index: u32,
85    #[serde(default, skip_serializing_if = "Option::is_none")]
86    pub id: Option<String>,
87    #[serde(default, skip_serializing_if = "Option::is_none")]
88    pub function: Option<ChatCompletionFunctionCallDelta>,
89    #[serde(rename = "type", default, skip_serializing_if = "Option::is_none")]
90    pub type_: Option<ChatCompletionChunkDeltaToolCallType>,
91}
92
93#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
94pub enum ChatCompletionChunkDeltaToolCallType {
95    #[serde(rename = "function")]
96    Function,
97}