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