Skip to main content

gproxy_protocol/protocol/openai/generate_content/
chat_stream.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use super::super::common::*;
6use super::chat_tail::{ChatChoiceLogprobs, CompletionUsage};
7
8#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
9pub struct ChatCompletionChunk {
10    pub id: String,
11    pub choices: Vec<ChatChunkChoice>,
12    pub created: u64,
13    pub model: OpenAiModelId,
14    pub object: ChatCompletionChunkObjectType,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub service_tier: Option<ServiceTier>,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub system_fingerprint: Option<String>,
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub usage: Option<CompletionUsage>,
21    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
22    pub extra: Extra,
23}
24
25#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
26pub struct ChatChunkChoice {
27    pub index: u32,
28    pub delta: ChatDelta,
29    pub finish_reason: Option<ChatFinishReason>,
30    #[serde(skip_serializing_if = "Option::is_none")]
31    pub logprobs: Option<ChatChoiceLogprobs>,
32    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
33    pub extra: Extra,
34}
35
36#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
37pub struct ChatDelta {
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub role: Option<ChatDeltaRole>,
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub content: Option<String>,
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub reasoning_content: Option<String>,
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub refusal: Option<String>,
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub tool_calls: Option<Vec<ChatToolCallDelta>>,
48    #[serde(skip_serializing_if = "Option::is_none")]
49    pub function_call: Option<FunctionCallDelta>,
50    #[serde(skip_serializing_if = "Option::is_none")]
51    pub obfuscation: Option<String>,
52    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
53    pub extra: Extra,
54}
55
56#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
57pub enum ChatDeltaRole {
58    #[serde(rename = "assistant")]
59    Assistant,
60}
61
62#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
63pub struct ChatToolCallDelta {
64    pub index: u32,
65    #[serde(skip_serializing_if = "Option::is_none")]
66    pub id: Option<String>,
67    #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
68    pub type_: Option<ChatToolCallType>,
69    #[serde(skip_serializing_if = "Option::is_none")]
70    pub function: Option<FunctionCallDelta>,
71    #[serde(skip_serializing_if = "Option::is_none")]
72    pub custom: Option<CustomToolCallDelta>,
73    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
74    pub extra: Extra,
75}
76
77#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
78pub struct FunctionCallDelta {
79    #[serde(skip_serializing_if = "Option::is_none")]
80    pub arguments: Option<String>,
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub name: Option<String>,
83    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
84    pub extra: Extra,
85}
86
87#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
88pub struct CustomToolCallDelta {
89    #[serde(skip_serializing_if = "Option::is_none")]
90    pub input: Option<String>,
91    #[serde(skip_serializing_if = "Option::is_none")]
92    pub name: Option<String>,
93    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
94    pub extra: Extra,
95}