outfox_openai/spec/audio/
form.rs1use crate::error::OpenAIError;
2use crate::spec::audio::{
3 CreateTranscriptionRequest, CreateTranslationRequest, CreateVoiceConsentRequest,
4 CreateVoiceRequest, TranscriptionChunkingStrategy,
5};
6use crate::traits::AsyncTryFrom;
7use crate::util::create_file_part;
8
9impl AsyncTryFrom<CreateTranscriptionRequest> for reqwest::multipart::Form {
10 type Error = OpenAIError;
11
12 async fn try_from(request: CreateTranscriptionRequest) -> Result<Self, Self::Error> {
13 let audio_part = create_file_part(request.file.source).await?;
14
15 let mut form = reqwest::multipart::Form::new()
16 .part("file", audio_part)
17 .text("model", request.model);
18
19 if let Some(language) = request.language {
20 form = form.text("language", language);
21 }
22
23 if let Some(prompt) = request.prompt {
24 form = form.text("prompt", prompt);
25 }
26
27 if let Some(response_format) = request.response_format {
28 form = form.text("response_format", response_format.to_string())
29 }
30
31 if let Some(temperature) = request.temperature {
32 form = form.text("temperature", temperature.to_string())
33 }
34
35 if let Some(include) = request.include {
36 for inc in include {
37 form = form.text("include[]", inc.to_string());
38 }
39 }
40
41 if let Some(timestamp_granularities) = request.timestamp_granularities {
42 for tg in timestamp_granularities {
43 form = form.text("timestamp_granularities[]", tg.to_string());
44 }
45 }
46
47 if let Some(stream) = request.stream {
48 form = form.text("stream", stream.to_string());
49 }
50
51 if let Some(chunking_strategy) = request.chunking_strategy {
52 match chunking_strategy {
53 TranscriptionChunkingStrategy::Auto => {
54 form = form.text("chunking_strategy", "auto");
55 }
56 TranscriptionChunkingStrategy::ServerVad(vad_config) => {
57 form = form.text(
58 "chunking_strategy",
59 serde_json::to_string(&vad_config).unwrap().to_string(),
60 );
61 }
62 }
63 }
64
65 if let Some(known_speaker_names) = request.known_speaker_names {
66 for kn in known_speaker_names {
67 form = form.text("known_speaker_names[]", kn.to_string());
68 }
69 }
70
71 if let Some(known_speaker_references) = request.known_speaker_references {
72 for kn in known_speaker_references {
73 form = form.text("known_speaker_references[]", kn.to_string());
74 }
75 }
76
77 Ok(form)
78 }
79}
80
81impl AsyncTryFrom<CreateTranslationRequest> for reqwest::multipart::Form {
82 type Error = OpenAIError;
83
84 async fn try_from(request: CreateTranslationRequest) -> Result<Self, Self::Error> {
85 let audio_part = create_file_part(request.file.source).await?;
86
87 let mut form = reqwest::multipart::Form::new()
88 .part("file", audio_part)
89 .text("model", request.model);
90
91 if let Some(prompt) = request.prompt {
92 form = form.text("prompt", prompt);
93 }
94
95 if let Some(response_format) = request.response_format {
96 form = form.text("response_format", response_format.to_string())
97 }
98
99 if let Some(temperature) = request.temperature {
100 form = form.text("temperature", temperature.to_string())
101 }
102 Ok(form)
103 }
104}
105
106impl AsyncTryFrom<CreateVoiceConsentRequest> for reqwest::multipart::Form {
107 type Error = OpenAIError;
108
109 async fn try_from(request: CreateVoiceConsentRequest) -> Result<Self, Self::Error> {
110 let recording_part = create_file_part(request.recording.source).await?;
111
112 let form = reqwest::multipart::Form::new()
113 .part("recording", recording_part)
114 .text("name", request.name)
115 .text("language", request.language);
116
117 Ok(form)
118 }
119}
120
121impl AsyncTryFrom<CreateVoiceRequest> for reqwest::multipart::Form {
122 type Error = OpenAIError;
123
124 async fn try_from(request: CreateVoiceRequest) -> Result<Self, Self::Error> {
125 let audio_sample_part = create_file_part(request.audio_sample.source).await?;
126
127 let form = reqwest::multipart::Form::new()
128 .part("audio_sample", audio_sample_part)
129 .text("name", request.name)
130 .text("consent", request.consent);
131
132 Ok(form)
133 }
134}