fix[format/openai]: return error on empty msg. (#6511)
Signed-off-by: Yelsin Sepulveda <yelsinsepulveda@gmail.com> Signed-off-by: The-Best-Codes <bestcodes.official@gmail.com> Co-authored-by: The-Best-Codes <bestcodes.official@gmail.com>
This commit is contained in:
@@ -287,10 +287,15 @@ pub fn response_to_message(response: &Value) -> anyhow::Result<Message> {
|
|||||||
.and_then(|c| c.get(0))
|
.and_then(|c| c.get(0))
|
||||||
.and_then(|m| m.get("message"))
|
.and_then(|m| m.get("message"))
|
||||||
else {
|
else {
|
||||||
return Ok(Message::new(
|
if let Some(error) = response.get("error") {
|
||||||
Role::Assistant,
|
let error_message = error
|
||||||
chrono::Utc::now().timestamp(),
|
.get("message")
|
||||||
Vec::new(),
|
.and_then(|m| m.as_str())
|
||||||
|
.unwrap_or("Unknown error");
|
||||||
|
return Err(anyhow::anyhow!("API error: {}", error_message));
|
||||||
|
}
|
||||||
|
return Err(anyhow::anyhow!(
|
||||||
|
"No message in API response. This may indicate a quota limit or other restriction."
|
||||||
));
|
));
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1163,6 +1168,61 @@ mod tests {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_response_to_message_api_error() -> anyhow::Result<()> {
|
||||||
|
// Test that API responses with an "error" field return the error message
|
||||||
|
let response = json!({
|
||||||
|
"error": {
|
||||||
|
"message": "You have exceeded your quota",
|
||||||
|
"type": "insufficient_quota",
|
||||||
|
"code": "quota_exceeded"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let result = response_to_message(&response);
|
||||||
|
assert!(result.is_err());
|
||||||
|
let err = result.unwrap_err();
|
||||||
|
assert!(err.to_string().contains("API error:"));
|
||||||
|
assert!(err.to_string().contains("You have exceeded your quota"));
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_response_to_message_api_error_unknown() -> anyhow::Result<()> {
|
||||||
|
// Test that API responses with an "error" field but no message return "Unknown error"
|
||||||
|
let response = json!({
|
||||||
|
"error": {
|
||||||
|
"type": "some_error"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let result = response_to_message(&response);
|
||||||
|
assert!(result.is_err());
|
||||||
|
let err = result.unwrap_err();
|
||||||
|
assert!(err.to_string().contains("API error:"));
|
||||||
|
assert!(err.to_string().contains("Unknown error"));
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_response_to_message_no_choices() -> anyhow::Result<()> {
|
||||||
|
// Test that responses without "choices" return an error
|
||||||
|
let response = json!({
|
||||||
|
"id": "chatcmpl-123",
|
||||||
|
"object": "chat.completion",
|
||||||
|
"created": 1234567890
|
||||||
|
});
|
||||||
|
|
||||||
|
let result = response_to_message(&response);
|
||||||
|
assert!(result.is_err());
|
||||||
|
let err = result.unwrap_err();
|
||||||
|
assert!(err.to_string().contains("No message in API response"));
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_format_messages_tool_request_with_none_arguments() -> anyhow::Result<()> {
|
fn test_format_messages_tool_request_with_none_arguments() -> anyhow::Result<()> {
|
||||||
// Test that tool calls with None arguments are formatted as "{}" string
|
// Test that tool calls with None arguments are formatted as "{}" string
|
||||||
|
|||||||
Reference in New Issue
Block a user