mirror of
https://github.com/katanemo/plano.git
synced 2026-07-05 15:52:12 +02:00
handle agent error better (#627)
This commit is contained in:
parent
09c0b999b2
commit
367f48bf1e
2 changed files with 66 additions and 1 deletions
|
|
@ -37,7 +37,38 @@ pub async fn agent_chat(
|
||||||
match handle_agent_chat(request, router_service, agents_list, listeners).await {
|
match handle_agent_chat(request, router_service, agents_list, listeners).await {
|
||||||
Ok(response) => Ok(response),
|
Ok(response) => Ok(response),
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
// Print detailed error information with full error chain
|
// Check if this is a client error from the pipeline that should be cascaded
|
||||||
|
if let AgentFilterChainError::Pipeline(PipelineError::ClientError {
|
||||||
|
agent,
|
||||||
|
status,
|
||||||
|
body,
|
||||||
|
}) = &err
|
||||||
|
{
|
||||||
|
warn!(
|
||||||
|
"Client error from agent '{}' (HTTP {}): {}",
|
||||||
|
agent, status, body
|
||||||
|
);
|
||||||
|
|
||||||
|
// Create error response with the original status code and body
|
||||||
|
let error_json = serde_json::json!({
|
||||||
|
"error": "ClientError",
|
||||||
|
"agent": agent,
|
||||||
|
"status": status,
|
||||||
|
"agent_response": body
|
||||||
|
});
|
||||||
|
|
||||||
|
let json_string = error_json.to_string();
|
||||||
|
let mut response = Response::new(ResponseHandler::create_full_body(json_string));
|
||||||
|
*response.status_mut() = hyper::StatusCode::from_u16(*status)
|
||||||
|
.unwrap_or(hyper::StatusCode::INTERNAL_SERVER_ERROR);
|
||||||
|
response.headers_mut().insert(
|
||||||
|
hyper::header::CONTENT_TYPE,
|
||||||
|
"application/json".parse().unwrap(),
|
||||||
|
);
|
||||||
|
return Ok(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print detailed error information with full error chain for other errors
|
||||||
let mut error_chain = Vec::new();
|
let mut error_chain = Vec::new();
|
||||||
let mut current_error: &dyn std::error::Error = &err;
|
let mut current_error: &dyn std::error::Error = &err;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,18 @@ pub enum PipelineError {
|
||||||
NoChoicesInResponse(String),
|
NoChoicesInResponse(String),
|
||||||
#[error("No content in response from agent '{0}'")]
|
#[error("No content in response from agent '{0}'")]
|
||||||
NoContentInResponse(String),
|
NoContentInResponse(String),
|
||||||
|
#[error("Client error from agent '{agent}' (HTTP {status}): {body}")]
|
||||||
|
ClientError {
|
||||||
|
agent: String,
|
||||||
|
status: u16,
|
||||||
|
body: String,
|
||||||
|
},
|
||||||
|
#[error("Server error from agent '{agent}' (HTTP {status}): {body}")]
|
||||||
|
ServerError {
|
||||||
|
agent: String,
|
||||||
|
status: u16,
|
||||||
|
body: String,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Service for processing agent pipelines
|
/// Service for processing agent pipelines
|
||||||
|
|
@ -122,8 +134,30 @@ impl PipelineProcessor {
|
||||||
.send()
|
.send()
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
|
let status = response.status();
|
||||||
let response_bytes = response.bytes().await?;
|
let response_bytes = response.bytes().await?;
|
||||||
|
|
||||||
|
// Check for HTTP errors and handle them appropriately
|
||||||
|
if !status.is_success() {
|
||||||
|
let error_body = String::from_utf8_lossy(&response_bytes).to_string();
|
||||||
|
|
||||||
|
if status.is_client_error() {
|
||||||
|
// 4xx errors - cascade back to developer
|
||||||
|
return Err(PipelineError::ClientError {
|
||||||
|
agent: agent.id.clone(),
|
||||||
|
status: status.as_u16(),
|
||||||
|
body: error_body,
|
||||||
|
});
|
||||||
|
} else if status.is_server_error() {
|
||||||
|
// 5xx errors - server/agent error
|
||||||
|
return Err(PipelineError::ServerError {
|
||||||
|
agent: agent.id.clone(),
|
||||||
|
status: status.as_u16(),
|
||||||
|
body: error_body,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Parse the response as JSON to extract the content
|
// Parse the response as JSON to extract the content
|
||||||
let response_json: serde_json::Value = serde_json::from_slice(&response_bytes)?;
|
let response_json: serde_json::Value = serde_json::from_slice(&response_bytes)?;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue