Skip to main content

gproxy_protocol/protocol/openai/realtime/
response.rs

1use 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/// Per-response overrides for `response.create`.
56#[derive(
57    Debug, Clone, PartialEq, Serialize, Deserialize, Default, gproxy_protocol_macros::WireBuilder,
58)]
59#[non_exhaustive]
60pub struct RealtimeResponseOptions {
61    /// `"auto"` (default) or `"none"` for an out-of-band response.
62    #[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}