{"record":{"id":"a9e3638549cebf25","repo":"sigoden/aichat","slug":"message-status-code","errorCode":null,"errorMessage":"{message} (status: {code})","messagePattern":"(.+?) \\(status: (.+?)\\)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/client/common.rs","lineNumber":515,"sourceCode":"    debug!(\"Invalid response, status: {status}, data: {data}\");\n    if let Some(error) = data[\"error\"].as_object() {\n        if let (Some(typ), Some(message)) = (\n            json_str_from_map(error, \"type\"),\n            json_str_from_map(error, \"message\"),\n        ) {\n            bail!(\"{message} (type: {typ})\");\n        } else if let (Some(typ), Some(message)) = (\n            json_str_from_map(error, \"code\"),\n            json_str_from_map(error, \"message\"),\n        ) {\n            bail!(\"{message} (code: {typ})\");\n        }\n    } else if let Some(error) = data[\"errors\"][0].as_object() {\n        if let (Some(code), Some(message)) = (\n            error.get(\"code\").and_then(|v| v.as_u64()),\n            json_str_from_map(error, \"message\"),\n        ) {\n            bail!(\"{message} (status: {code})\")\n        }\n    } else if let Some(error) = data[0][\"error\"].as_object() {\n        if let (Some(status), Some(message)) = (\n            json_str_from_map(error, \"status\"),\n            json_str_from_map(error, \"message\"),\n        ) {\n            bail!(\"{message} (status: {status})\")\n        }\n    } else if let (Some(detail), Some(status)) = (data[\"detail\"].as_str(), data[\"status\"].as_i64())\n    {\n        bail!(\"{detail} (status: {status})\");\n    } else if let Some(error) = data[\"error\"].as_str() {\n        bail!(\"{error}\");\n    } else if let Some(message) = data[\"message\"].as_str() {\n        bail!(\"{message}\");\n    }\n    bail!(\"Invalid response data: {data} (status: {status})\");\n}","sourceCodeStart":497,"sourceCodeEnd":533,"githubUrl":"https://github.com/sigoden/aichat/blob/82976d349ad97ac9aae0655ad631dace5e2a6385/src/client/common.rs#L497-L533","documentation":"Branch in catch_error for an alternate error envelope: the non-2xx body wraps errors in an array (data['errors'][0]) with a numeric 'code' and a 'message' — used by some proxies/gateways (e.g. Cohere-style). The numeric code is the machine-readable status classification; only reached when neither 'error' object shape matched.","triggerScenarios":"Thrown at src/client/common.rs:515 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Map the numeric code to HTTP-like semantics (4xx client vs 5xx server) to decide retry vs abort","Retry 5xx-class codes with exponential backoff","Surface the message verbatim to the user when no mapping is known, with the code for support/diagnostics"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"82976d349ad97ac9aae0655ad631dace5e2a6385","analyzedAt":"2026-09-09T18:33:06.139Z","contentChangedAt":"2026-09-09T18:33:06.139Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}