Skip to main content

gproxy_protocol/openai/realtime/
response.rs

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