mirror of
https://github.com/lobehub/lobe-chat.git
synced 2026-06-13 19:20:04 +00:00
d9d9f44cb2
* 🐛 fix(model-runtime): classify untyped Error throws via message patterns `refineErrorCode` only re-derived a specific code when the incoming errorType was `ProviderBizError`, so raw `Error` throws — which `formatErrorForState` wraps as `InternalServerError` (HTTP 500) — never reached `matchErrorPattern`. Persistence-layer (`Failed query: …`) and state-store drops therefore landed as bare, un-classified 500s instead of `DatabasePersistError` etc. Add the two un-typed fallback wrappers (`InternalServerError`, `AgentRuntimeError`) to `REFINABLE_CODES` so their message runs through the pattern registry before falling back. The existing `Failed query:` pattern already classifies these; this just lets it run again. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * 🐛 fix(model-runtime): classify Upstash readonly-upgrade & dropped-caller drops Add `READONLY Writes are temporarily rejected` and `ERR caller gone` to the StateStorePersistError pattern block — both are Redis/Upstash state-store failures that otherwise fall through to a bare 500. They describe the connection/server condition rather than a specific command, so there is no read-vs-write signal to split on. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * 🐛 fix(model-runtime): split caller-gone state-store reads into StateStoreReadError `ERR caller gone` is an Upstash reply when an in-flight blocking READ (XREAD on the agent event stream, BLPOP on a tool result) is aborted because the originating caller disconnected — a benign client abandonment tied to the request lifecycle, not a write/persist fault. Bucketing it under StateStorePersistError mislabelled it as a harness failure (attribution: harness, countAsFailure: true). Add a dedicated StateStoreReadError (E7007, attribution: system, severity: warning, countAsFailure: false) and route `ERR caller gone` to it. The write-side rejection `READONLY Writes are temporarily rejected` stays under StateStorePersistError. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * 🐛 fix(model-runtime): scope HTTP-status fallback to provider catch-alls Opening the un-typed wrappers (InternalServerError / AgentRuntimeError) to the full refine path also let them hit the leadingStatusFromMessage / codeFromHttpStatus fallback. A harness/DB/Redis throw like `Error('429 …')` or `Error('500 …')` with no registered pattern would then be recast as RateLimitExceeded / ProviderServiceUnavailable — provider retry/failure semantics on a harness error. Split the sets: PATTERN_REFINABLE_CODES (message matching) stays open to the wrappers; STATUS_REFINABLE_CODES (the coarse HTTP-status bucket) is limited to ProviderBizError, where a leading status is a real upstream signal. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>