gproxy_protocol/openai/generate_content/chat/
response.rs1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4use crate::openai::common::*;
5
6use super::{ChatAnnotation, ChatAudio, ChatChoiceLogprobs, ChatToolCall, CompletionUsage};
7
8#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
9#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
10pub struct ChatCompletionResponse {
11 pub id: String,
12 pub choices: Vec<ChatCompletionChoice>,
13 #[serde(default, skip_serializing_if = "Option::is_none")]
14 pub created: Option<u64>,
15 pub model: OpenAiModelId,
16 #[serde(default)]
17 pub object: ChatCompletionObjectType,
18 #[serde(skip_serializing_if = "Option::is_none")]
19 pub moderation: Option<ChatCompletionModeration>,
20 #[serde(skip_serializing_if = "Option::is_none")]
21 pub service_tier: Option<ServiceTier>,
22 #[serde(skip_serializing_if = "Option::is_none")]
23 pub system_fingerprint: Option<String>,
24 #[serde(skip_serializing_if = "Option::is_none")]
25 pub usage: Option<CompletionUsage>,
26 #[serde(default, flatten)]
27 pub rest: Rest,
28}
29
30#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
31#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
32pub struct ChatCompletionChoice {
33 pub finish_reason: ChatFinishReason,
34 pub index: u32,
35 #[serde(skip_serializing_if = "Option::is_none")]
36 pub logprobs: Option<ChatChoiceLogprobs>,
37 pub message: ChatMessage,
38 #[serde(default, flatten)]
39 pub rest: Rest,
40}
41
42#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
43#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
44pub struct ChatCompletionModeration {
45 pub input: ChatCompletionModerationOutcome,
46 pub output: ChatCompletionModerationOutcome,
47 #[serde(default, flatten)]
48 pub rest: Rest,
49}
50
51#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
52#[serde(untagged)]
53pub enum ChatCompletionModerationOutcome {
54 Results(ChatCompletionModerationResults),
55 Error(ModerationError),
56 Unknown(Value),
57}
58
59#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
60#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
61pub struct ChatCompletionModerationResults {
62 pub model: OpenAiModelId,
63 pub results: Vec<ModerationResult>,
64 #[serde(rename = "type")]
65 pub type_: ChatCompletionModerationResultsType,
66 #[serde(default, flatten)]
67 pub rest: Rest,
68}
69
70#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
71pub enum ChatCompletionModerationResultsType {
72 #[serde(rename = "moderation_results")]
73 ModerationResults,
74}
75
76#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
77#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
78pub struct ChatMessage {
79 pub role: ChatCompletionMessageRole,
80 #[serde(skip_serializing_if = "Option::is_none")]
81 pub content: Option<String>,
82 #[serde(skip_serializing_if = "Option::is_none")]
83 pub refusal: Option<String>,
84 #[serde(skip_serializing_if = "Option::is_none")]
85 pub annotations: Option<Vec<ChatAnnotation>>,
86 #[serde(skip_serializing_if = "Option::is_none")]
87 pub audio: Option<ChatAudio>,
88 #[serde(skip_serializing_if = "Option::is_none")]
89 pub function_call: Option<FunctionCall>,
90 #[serde(skip_serializing_if = "Option::is_none")]
91 pub reasoning_content: Option<String>,
92 #[serde(skip_serializing_if = "Option::is_none")]
93 pub tool_calls: Option<Vec<ChatToolCall>>,
94 #[serde(default, flatten)]
95 pub rest: Rest,
96}
97
98#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
99pub enum ChatCompletionMessageRole {
100 #[serde(rename = "assistant")]
101 Assistant,
102}