mirror of
https://github.com/tinyhumansai/openhuman.git
synced 2026-07-30 23:14:37 +00:00
fix(observability,database): silence expected provider/channel errors and add SQLite busy timeout for WhatsApp store (#2107)
Co-authored-by: Steven Enamakel <enamakel@tinyhumans.ai>
This commit is contained in:
co-authored by
Steven Enamakel
parent
74c91ba4d2
commit
a40272ef45
@@ -435,6 +435,25 @@ fn is_provider_user_state_message(lower: &str) -> bool {
|
||||
return true;
|
||||
}
|
||||
|
||||
// OPENHUMAN-TAURI-XX: custom_openai upstream rejected the request with
|
||||
// its own 400. Wire shape produced by
|
||||
// `inference/provider/compatible.rs::is_custom_openai_upstream_bad_request_http_400`:
|
||||
//
|
||||
// custom_openai API error (400 Bad Request): {"error":{
|
||||
// "message":"Bad request to upstream provider",
|
||||
// "type":"upstream_error","status":400}}
|
||||
//
|
||||
// Anchored to the `custom_openai api error (400` prefix so this can't
|
||||
// silence unrelated errors that happen to mention both
|
||||
// "bad request to upstream provider" and "upstream_error" elsewhere
|
||||
// (e.g. a future provider whose envelope reuses one of those strings).
|
||||
if lower.contains("custom_openai api error (400")
|
||||
&& lower.contains("bad request to upstream provider")
|
||||
&& lower.contains("upstream_error")
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// OPENHUMAN-TAURI-97: composio authorize with a blank required field —
|
||||
// SharePoint Subdomain, WhatsApp WABA ID, Tenant Name, etc.
|
||||
// Backend returns 500 with `"Missing required fields: …"` body.
|
||||
@@ -1574,6 +1593,56 @@ mod tests {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn classifies_custom_openai_upstream_bad_request_as_provider_user_state() {
|
||||
assert_eq!(
|
||||
expected_error_kind(
|
||||
"custom_openai API error (400 Bad Request): \
|
||||
{\"error\":{\"message\":\"Bad request to upstream provider\",\
|
||||
\"type\":\"upstream_error\",\"status\":400}}"
|
||||
),
|
||||
Some(ExpectedErrorKind::ProviderUserState)
|
||||
);
|
||||
|
||||
// Wrapped by higher-level callers (`agent.run_single`,
|
||||
// `rpc.invoke_method`) must still classify.
|
||||
assert_eq!(
|
||||
expected_error_kind(
|
||||
"agent.run_single failed: custom_openai API error (400 Bad Request): \
|
||||
{\"error\":{\"message\":\"Bad request to upstream provider\",\
|
||||
\"type\":\"upstream_error\",\"status\":400}}"
|
||||
),
|
||||
Some(ExpectedErrorKind::ProviderUserState)
|
||||
);
|
||||
}
|
||||
|
||||
/// Regression for CodeRabbit feedback on PR #2107: the matcher must
|
||||
/// not demote unrelated errors that happen to contain both
|
||||
/// "bad request to upstream provider" and "upstream_error" without
|
||||
/// the `custom_openai API error (400` anchor.
|
||||
#[test]
|
||||
fn does_not_silence_unrelated_error_with_only_inner_substrings() {
|
||||
// No `custom_openai API error (400` prefix → must NOT classify
|
||||
// as ProviderUserState, otherwise we'd silence actionable bugs.
|
||||
assert_eq!(
|
||||
expected_error_kind(
|
||||
"internal panic in router: bad request to upstream provider \
|
||||
(state=upstream_error)"
|
||||
),
|
||||
None,
|
||||
);
|
||||
|
||||
// A future hypothetical provider envelope reusing one substring
|
||||
// also must not classify.
|
||||
assert_eq!(
|
||||
expected_error_kind(
|
||||
"anthropic_api error: upstream_error encountered while \
|
||||
forwarding bad request to upstream provider"
|
||||
),
|
||||
None,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn classifies_missing_required_fields_as_provider_user_state() {
|
||||
// OPENHUMAN-TAURI-97: composio authorize with a blank required
|
||||
|
||||
Reference in New Issue
Block a user