Skip to main content

gproxy_protocol/protocol/openai/audio/
requests.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use super::super::common::{Extra, OpenAiModelId};
6use super::{
7    SpeechResponseFormat, SpeechStreamFormat, TimestampGranularity, TranscriptionInclude,
8    TranscriptionResponseFormat, TranslationResponseFormat,
9};
10use crate::protocol::openai::VoiceRef;
11
12#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
13#[non_exhaustive]
14pub struct SpeechRequest {
15    pub input: String,
16    pub model: OpenAiModelId,
17    pub voice: VoiceRef,
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub instructions: Option<String>,
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub response_format: Option<SpeechResponseFormat>,
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub speed: Option<f64>,
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub stream_format: Option<SpeechStreamFormat>,
26    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
27    pub extra: Extra,
28}
29
30#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
31#[non_exhaustive]
32pub struct TranscriptionRequest {
33    /// Multipart file content; after gproxy ingress normalization this is a
34    /// `data:<mime>;base64,...` URL.
35    pub file: String,
36    pub model: OpenAiModelId,
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub chunking_strategy: Option<AudioChunkingStrategy>,
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub include: Option<Vec<TranscriptionInclude>>,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub keywords: Option<Vec<String>>,
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub known_speaker_names: Option<Vec<String>>,
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub known_speaker_references: Option<Vec<String>>,
47    #[serde(skip_serializing_if = "Option::is_none")]
48    pub language: Option<String>,
49    #[serde(skip_serializing_if = "Option::is_none")]
50    pub languages: Option<Vec<String>>,
51    #[serde(skip_serializing_if = "Option::is_none")]
52    pub prompt: Option<String>,
53    #[serde(skip_serializing_if = "Option::is_none")]
54    pub response_format: Option<TranscriptionResponseFormat>,
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub stream: Option<bool>,
57    #[serde(skip_serializing_if = "Option::is_none")]
58    pub temperature: Option<f64>,
59    #[serde(skip_serializing_if = "Option::is_none")]
60    pub timestamp_granularities: Option<Vec<TimestampGranularity>>,
61    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
62    pub extra: Extra,
63}
64
65#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
66#[serde(untagged)]
67#[non_exhaustive]
68pub enum AudioChunkingStrategy {
69    Auto(AudioChunkingAuto),
70    ServerVad(ServerVadConfig),
71}
72
73#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
74#[non_exhaustive]
75pub enum AudioChunkingAuto {
76    #[serde(rename = "auto")]
77    Auto,
78}
79
80#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
81#[non_exhaustive]
82pub struct ServerVadConfig {
83    #[serde(rename = "type")]
84    pub type_: ServerVadType,
85    #[serde(skip_serializing_if = "Option::is_none")]
86    pub prefix_padding_ms: Option<u32>,
87    #[serde(skip_serializing_if = "Option::is_none")]
88    pub silence_duration_ms: Option<u32>,
89    #[serde(skip_serializing_if = "Option::is_none")]
90    pub threshold: Option<f64>,
91    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
92    pub extra: Extra,
93}
94
95#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
96#[non_exhaustive]
97pub enum ServerVadType {
98    #[serde(rename = "server_vad")]
99    ServerVad,
100}
101
102#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
103#[non_exhaustive]
104pub struct TranslationRequest {
105    pub file: String,
106    pub model: OpenAiModelId,
107    #[serde(skip_serializing_if = "Option::is_none")]
108    pub prompt: Option<String>,
109    #[serde(skip_serializing_if = "Option::is_none")]
110    pub response_format: Option<TranslationResponseFormat>,
111    #[serde(skip_serializing_if = "Option::is_none")]
112    pub temperature: Option<f64>,
113    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
114    pub extra: Extra,
115}