feat(TASK-044): surface the streaming response.incomplete event with its reason
This commit is contained in:
1 file changed
+28
@@ -943,6 +943,12 @@ fn openai_responses_handle_event(data: &Value, handler: &mut SseHandler) -> Resu
|
|||||||
Some(message) => bail!("Response failed: {message}"),
|
Some(message) => bail!("Response failed: {message}"),
|
||||||
None => bail!("Response failed: {data}"),
|
None => bail!("Response failed: {data}"),
|
||||||
},
|
},
|
||||||
|
Some("response.incomplete") => {
|
||||||
|
match data["response"]["incomplete_details"]["reason"].as_str() {
|
||||||
|
Some(reason) => bail!("The response was cut off: {reason}"),
|
||||||
|
None => bail!("The response was cut off: {data}"),
|
||||||
|
}
|
||||||
|
}
|
||||||
Some("error") => match data["message"].as_str() {
|
Some("error") => match data["message"].as_str() {
|
||||||
Some(message) => bail!("Stream error: {message}"),
|
Some(message) => bail!("Stream error: {message}"),
|
||||||
None => bail!("Stream error: {data}"),
|
None => bail!("Stream error: {data}"),
|
||||||
@@ -1378,6 +1384,28 @@ mod tests {
|
|||||||
assert!(err.contains("Rate limit reached"), "unexpected error: {err}");
|
assert!(err.contains("Rate limit reached"), "unexpected error: {err}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn responses_stream_incomplete_event_bails_with_reason() {
|
||||||
|
let (sender, _receiver) = tokio::sync::mpsc::unbounded_channel();
|
||||||
|
let abort_signal = crate::utils::create_abort_signal();
|
||||||
|
let mut handler = SseHandler::new(sender, abort_signal);
|
||||||
|
let event = json!({
|
||||||
|
"type": "response.incomplete",
|
||||||
|
"response": {
|
||||||
|
"incomplete_details": { "reason": "max_output_tokens" }
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let err = openai_responses_handle_event(&event, &mut handler)
|
||||||
|
.unwrap_err()
|
||||||
|
.to_string();
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
err.contains("The response was cut off: max_output_tokens"),
|
||||||
|
"unexpected error: {err}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
fn openai_config(name: &str, auth: Option<&str>, oauth: Option<OAuthConfig>) -> OpenAIConfig {
|
fn openai_config(name: &str, auth: Option<&str>, oauth: Option<OAuthConfig>) -> OpenAIConfig {
|
||||||
OpenAIConfig {
|
OpenAIConfig {
|
||||||
name: Some(name.into()),
|
name: Some(name.into()),
|
||||||
|
|||||||
Reference in new issue
Block a user