From 930f955e363e713bcc1313fd948362a65ae7f08a Mon Sep 17 00:00:00 2001 From: Jiho Park Date: Fri, 26 Sep 2025 10:24:10 +0000 Subject: [PATCH] feat(error): enhance `OpenAIError::StreamError` payload --- async-openai/src/client.rs | 4 ++-- async-openai/src/error.rs | 12 +++++++++++- async-openai/src/types/assistant_stream.rs | 4 ++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/async-openai/src/client.rs b/async-openai/src/client.rs index fe2ed232..569e789d 100644 --- a/async-openai/src/client.rs +++ b/async-openai/src/client.rs @@ -485,7 +485,7 @@ where while let Some(ev) = event_source.next().await { match ev { Err(e) => { - if let Err(_e) = tx.send(Err(OpenAIError::StreamError(e.to_string()))) { + if let Err(_e) = tx.send(Err(OpenAIError::StreamError(e.into()))) { // rx dropped break; } @@ -530,7 +530,7 @@ where while let Some(ev) = event_source.next().await { match ev { Err(e) => { - if let Err(_e) = tx.send(Err(OpenAIError::StreamError(e.to_string()))) { + if let Err(_e) = tx.send(Err(OpenAIError::StreamError(e.into()))) { // rx dropped break; } diff --git a/async-openai/src/error.rs b/async-openai/src/error.rs index a1139c9f..5a17b52b 100644 --- a/async-openai/src/error.rs +++ b/async-openai/src/error.rs @@ -20,7 +20,7 @@ pub enum OpenAIError { FileReadError(String), /// Error on SSE streaming #[error("stream failed: {0}")] - StreamError(String), + StreamError(StreamError), /// Error from client side validation /// or when builder fails to build request before making API call #[error("invalid args: {0}")] @@ -61,6 +61,16 @@ impl std::fmt::Display for ApiError { } } +#[derive(Debug, thiserror::Error)] +pub enum StreamError { + /// Underlying error from reqwest_eventsource library when reading the stream + #[error("{0}")] + ReqwestEventSource(#[from] reqwest_eventsource::Error), + /// Error when a stream event does not match one of the expected values + #[error("Unrecognized event: {0:#?}")] + UnrecognizedEvent(eventsource_stream::Event), +} + /// Wrapper to deserialize the error object nested in "error" JSON key #[derive(Debug, Deserialize, Serialize)] pub struct WrappedError { diff --git a/async-openai/src/types/assistant_stream.rs b/async-openai/src/types/assistant_stream.rs index fca835cf..9dff7a4b 100644 --- a/async-openai/src/types/assistant_stream.rs +++ b/async-openai/src/types/assistant_stream.rs @@ -3,7 +3,7 @@ use std::pin::Pin; use futures::Stream; use serde::Deserialize; -use crate::error::{map_deserialization_error, ApiError, OpenAIError}; +use crate::error::{map_deserialization_error, ApiError, OpenAIError, StreamError}; use super::{ MessageDeltaObject, MessageObject, RunObject, RunStepDeltaObject, RunStepObject, ThreadObject, @@ -208,7 +208,7 @@ impl TryFrom for AssistantStreamEvent { "done" => Ok(AssistantStreamEvent::Done(value.data)), _ => Err(OpenAIError::StreamError( - "Unrecognized event: {value:?#}".into(), + StreamError::UnrecognizedEvent(value), )), } }