gproxy_protocol/openai/create_chat_completions/
stream.rs1use 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#[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}