gproxy_protocol/protocol/openai/generate_content/
chat_stream.rs1use 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}