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