From 58422974d2379781bcaa1eaa69e38b2ff68887ae Mon Sep 17 00:00:00 2001 From: Armin Sander Date: Wed, 27 Nov 2024 20:15:57 +0100 Subject: [PATCH 1/4] InputAudioBufferCommited previous_item_id may be None / null --- src/realtime/server_event.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/realtime/server_event.rs b/src/realtime/server_event.rs index 9ab4f8b..9a47061 100644 --- a/src/realtime/server_event.rs +++ b/src/realtime/server_event.rs @@ -31,7 +31,7 @@ pub struct ConversationCreated { #[derive(Debug, Serialize, Deserialize, Clone)] pub struct InputAudioBufferCommited { pub event_id: String, - pub previous_item_id: String, + pub previous_item_id: Option, pub item_id: String, } From 7edd66961f944d144eee1ac113e5be92e16315e9 Mon Sep 17 00:00:00 2001 From: Armin Sander Date: Thu, 28 Nov 2024 19:26:19 +0100 Subject: [PATCH 2/4] Add CancelledReason to ResponseStatusDetails --- src/realtime/types.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/realtime/types.rs b/src/realtime/types.rs index a18db24..0cc70d9 100644 --- a/src/realtime/types.rs +++ b/src/realtime/types.rs @@ -218,6 +218,8 @@ pub enum ResponseStatus { #[derive(Debug, Serialize, Deserialize, Clone)] #[serde(tag = "type")] pub enum ResponseStatusDetail { + #[serde(rename = "cancelled")] + Cancelled { reason: CancelledReason }, #[serde(rename = "incomplete")] Incomplete { reason: IncompleteReason }, #[serde(rename = "failed")] @@ -230,6 +232,13 @@ pub struct FailedError { pub message: String, } +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "snake_case")] +pub enum CancelledReason { + TurnDetected, + ClientCancelled, +} + #[derive(Debug, Serialize, Deserialize, Clone)] #[serde(rename_all = "snake_case")] pub enum IncompleteReason { From 85d204faf988f1ff22fb4a61cc69683ed63b105d Mon Sep 17 00:00:00 2001 From: Dongri Jin Date: Sun, 15 Dec 2024 18:17:10 +0900 Subject: [PATCH 3/4] Add post_form_raw --- examples/audio_transcriptions.rs | 9 ++++++++- src/v1/api.rs | 31 +++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/examples/audio_transcriptions.rs b/examples/audio_transcriptions.rs index b2c7ced..49f5b88 100644 --- a/examples/audio_transcriptions.rs +++ b/examples/audio_transcriptions.rs @@ -12,7 +12,14 @@ async fn main() -> Result<(), Box> { WHISPER_1.to_string(), ); - let result = client.audio_transcription(req).await?; + let req_json = req.clone().response_format("json".to_string()); + + let result = client.audio_transcription(req_json).await?; + println!("{:?}", result); + + let req_raw = req.clone().response_format("text".to_string()); + + let result = client.audio_transcription_raw(req_raw).await?; println!("{:?}", result); Ok(()) diff --git a/src/v1/api.rs b/src/v1/api.rs index c1b5592..f669cca 100644 --- a/src/v1/api.rs +++ b/src/v1/api.rs @@ -211,6 +211,13 @@ impl OpenAIClient { self.handle_response(response).await } + async fn post_form_raw(&self, path: &str, form: Form) -> Result { + let request = self.build_request(Method::POST, path).await; + let request = request.multipart(form); + let response = request.send().await?; + Ok(response.bytes().await?) + } + async fn handle_response( &self, response: Response, @@ -303,10 +310,34 @@ impl OpenAIClient { &self, req: AudioTranscriptionRequest, ) -> Result { + // https://platform.openai.com/docs/api-reference/audio/createTranslation#audio-createtranslation-response_format + if let Some(response_format) = &req.response_format { + if response_format != "json" && response_format != "verbose_json" { + return Err(APIError::CustomError { + message: "response_format must be either 'json' or 'verbose_json' please use audio_transcription_raw".to_string(), + }); + } + } let form = Self::create_form(&req, "file")?; self.post_form("audio/transcriptions", form).await } + pub async fn audio_transcription_raw( + &self, + req: AudioTranscriptionRequest, + ) -> Result { + // https://platform.openai.com/docs/api-reference/audio/createTranslation#audio-createtranslation-response_format + if let Some(response_format) = &req.response_format { + if response_format != "text" && response_format != "srt" && response_format != "vtt" { + return Err(APIError::CustomError { + message: "response_format must be either 'text', 'srt' or 'vtt', please use audio_transcription".to_string(), + }); + } + } + let form = Self::create_form(&req, "file")?; + self.post_form_raw("audio/transcriptions", form).await + } + pub async fn audio_translation( &self, req: AudioTranslationRequest, From 8ca56303a1aa7db944b0eb25d98bf80c7db795af Mon Sep 17 00:00:00 2001 From: Dongri Jin Date: Sun, 15 Dec 2024 18:19:35 +0900 Subject: [PATCH 4/4] v5.2.4 --- Cargo.toml | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 6c72c69..9ae5a37 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "openai-api-rs" -version = "5.2.3" +version = "5.2.4" edition = "2021" authors = ["Dongri Jin "] license = "MIT" diff --git a/README.md b/README.md index b521cfd..f2f2d27 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Check out the [docs.rs](https://docs.rs/openai-api-rs/). Cargo.toml ```toml [dependencies] -openai-api-rs = "5.2.3" +openai-api-rs = "5.2.4" ``` ## Usage