gproxy_protocol/openai/realtime/
response.rs1use serde::{Deserialize, Serialize};
2
3use crate::openai::common::{Metadata, ResponseToolChoice, Rest};
4use crate::openai::generate_content::responses::ResponseTool;
5
6use super::audio::RealtimeAudio;
7use super::items::RealtimeItem;
8use super::session::{RealtimeMaxTokens, RealtimeOutputModality};
9
10extensible_string!(RealtimeResponseStatus, KnownRealtimeResponseStatus {
11 InProgress => "in_progress", Completed => "completed", Cancelled => "cancelled",
12 Incomplete => "incomplete", Failed => "failed",
13});
14
15#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
16#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
17pub struct RealtimeResponse {
18 #[serde(skip_serializing_if = "Option::is_none")]
19 pub id: Option<String>,
20 #[serde(skip_serializing_if = "Option::is_none")]
21 pub status: Option<RealtimeResponseStatus>,
22 #[serde(skip_serializing_if = "Option::is_none")]
23 pub status_details: Option<RealtimeStatusDetails>,
24 #[serde(skip_serializing_if = "Option::is_none")]
25 pub output: Option<Vec<RealtimeItem>>,
26 #[serde(skip_serializing_if = "Option::is_none")]
27 pub output_modalities: Option<Vec<RealtimeOutputModality>>,
28 #[serde(skip_serializing_if = "Option::is_none")]
29 pub conversation_id: Option<String>,
30 #[serde(skip_serializing_if = "Option::is_none")]
31 pub usage: Option<RealtimeUsage>,
32 #[serde(skip_serializing_if = "Option::is_none")]
33 pub metadata: Option<Metadata>,
34 #[serde(default, flatten)]
35 pub rest: Rest,
36}
37
38#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
39#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
40pub struct RealtimeStatusDetails {
41 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
42 pub type_: Option<String>,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 pub reason: Option<String>,
45 #[serde(skip_serializing_if = "Option::is_none")]
46 pub error: Option<RealtimeError>,
47 #[serde(default, flatten)]
48 pub rest: Rest,
49}
50
51#[derive(
52 Debug, Clone, PartialEq, Serialize, Deserialize, Default, gproxy_protocol_macros::WireBuilder,
53)]
54#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
55pub struct RealtimeResponseOptions {
56 #[serde(skip_serializing_if = "Option::is_none")]
57 pub conversation: Option<String>,
58 #[serde(skip_serializing_if = "Option::is_none")]
59 pub input: Option<Vec<RealtimeItem>>,
60 #[serde(skip_serializing_if = "Option::is_none")]
61 pub instructions: Option<String>,
62 #[serde(skip_serializing_if = "Option::is_none")]
63 pub output_modalities: Option<Vec<RealtimeOutputModality>>,
64 #[serde(skip_serializing_if = "Option::is_none")]
65 pub audio: Option<RealtimeAudio>,
66 #[serde(skip_serializing_if = "Option::is_none")]
67 pub tools: Option<Vec<ResponseTool>>,
68 #[serde(skip_serializing_if = "Option::is_none")]
69 pub tool_choice: Option<ResponseToolChoice>,
70 #[serde(skip_serializing_if = "Option::is_none")]
71 pub max_output_tokens: Option<RealtimeMaxTokens>,
72 #[serde(skip_serializing_if = "Option::is_none")]
73 pub metadata: Option<Metadata>,
74 #[serde(default, flatten)]
75 pub rest: Rest,
76}
77
78#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
79#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
80pub struct RealtimeUsage {
81 #[serde(skip_serializing_if = "Option::is_none")]
82 pub total_tokens: Option<u64>,
83 #[serde(skip_serializing_if = "Option::is_none")]
84 pub input_tokens: Option<u64>,
85 #[serde(skip_serializing_if = "Option::is_none")]
86 pub output_tokens: Option<u64>,
87 #[serde(skip_serializing_if = "Option::is_none")]
88 pub input_token_details: Option<RealtimeInputTokenDetails>,
89 #[serde(skip_serializing_if = "Option::is_none")]
90 pub output_token_details: Option<RealtimeOutputTokenDetails>,
91 #[serde(default, flatten)]
92 pub rest: Rest,
93}
94
95#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
96#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
97pub struct RealtimeInputTokenDetails {
98 #[serde(skip_serializing_if = "Option::is_none")]
99 pub text_tokens: Option<u64>,
100 #[serde(skip_serializing_if = "Option::is_none")]
101 pub audio_tokens: Option<u64>,
102 #[serde(skip_serializing_if = "Option::is_none")]
103 pub image_tokens: Option<u64>,
104 #[serde(skip_serializing_if = "Option::is_none")]
105 pub cached_tokens: Option<u64>,
106 #[serde(skip_serializing_if = "Option::is_none")]
107 pub cached_tokens_details: Option<RealtimeCachedTokenDetails>,
108 #[serde(default, flatten)]
109 pub rest: Rest,
110}
111
112#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
113#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
114pub struct RealtimeCachedTokenDetails {
115 #[serde(skip_serializing_if = "Option::is_none")]
116 pub text_tokens: Option<u64>,
117 #[serde(skip_serializing_if = "Option::is_none")]
118 pub audio_tokens: Option<u64>,
119 #[serde(skip_serializing_if = "Option::is_none")]
120 pub image_tokens: Option<u64>,
121 #[serde(default, flatten)]
122 pub rest: Rest,
123}
124
125#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
126#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
127pub struct RealtimeOutputTokenDetails {
128 #[serde(skip_serializing_if = "Option::is_none")]
129 pub text_tokens: Option<u64>,
130 #[serde(skip_serializing_if = "Option::is_none")]
131 pub audio_tokens: Option<u64>,
132 #[serde(default, flatten)]
133 pub rest: Rest,
134}
135
136#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
137#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
138pub struct RealtimeError {
139 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
140 pub type_: Option<String>,
141 #[serde(skip_serializing_if = "Option::is_none")]
142 pub code: Option<String>,
143 #[serde(skip_serializing_if = "Option::is_none")]
144 pub message: Option<String>,
145 #[serde(skip_serializing_if = "Option::is_none")]
146 pub param: Option<String>,
147 #[serde(skip_serializing_if = "Option::is_none")]
148 pub event_id: Option<String>,
149 #[serde(default, flatten)]
150 pub rest: Rest,
151}
152
153#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
154#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
155pub struct RealtimeRateLimit {
156 #[serde(skip_serializing_if = "Option::is_none")]
157 pub name: Option<String>,
158 #[serde(skip_serializing_if = "Option::is_none")]
159 pub limit: Option<u64>,
160 #[serde(skip_serializing_if = "Option::is_none")]
161 pub remaining: Option<u64>,
162 #[serde(skip_serializing_if = "Option::is_none")]
163 pub reset_seconds: Option<f64>,
164 #[serde(default, flatten)]
165 pub rest: Rest,
166}