Skip to main content

gproxy_protocol/openai/generate_content/chat/
response.rs

1use 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}