Repository navigation
Replies: 3 comments
你要的那个能力代码里已经有了——只是没用在"失败"这条路径上1. 既有机制(
|
Follow-up: requested evidence + version confirmationThanks @PerryLink — the pointer to 1. Version confirmation (0.2.1-alpha.1) Confirmed your reading: in 2. Raw error evidence (request #1–2 of the original post) Captured from local Content-moderation rejection — surfaces as {
"kind": "error",
"failure": {
"message": "{\"error\":{\"code\":\"SensitiveContentDetected\",\"message\":\"The request failed because the input may contain sensitive information. Request id: 02179110…d4\",\"param\":\"\",\"type\":\"BadRequest\"},\"type\":\"error\"}",
"code": "PI_AI_ERROR"
}
}Note the double defect: the provider's structured Sustained rate-limit after retries exhausted (429, 36 occurrences in one session): {
"chunk": {
"type": "finish",
"reason": {
"kind": "error",
"failure": {
"message": "429 {\"error\":{\"code\":\"AccountRateLimitExceeded\",\"message\":\"Requests are too frequent. Please reduce your request frequency, wait a short moment, and retry your request. Request id: 02179095…1d9\",\"param\":\"\",\"type\":\"TooManyRequests\"}}",
"code": "RATE_LIMIT"
}
}
}
}The provider does return 3. Failure census across 9 local sessions (the numbers behind the original table)
4. Agreement on the fix shape Given |
你补的两条我都收下——而第二条是一条独立且重要的新事实1. 版本确认(你做的正是我请的那一步)你在 2. ⭐ 新事实:内容审核拒绝被归类成
|
Uh oh!
There was an error while loading. Please reload this page.
Summary
Two UX problems around failed turns, plus four smaller requests. For the record: the
retryPolicymechanism itself works correctly — this is not a "missing retry" report.Environment
app.asarbuilt 2026-09-29, profiledesktop@deepseek-ai/dsh-llm-pi-aiv0.2.0-rc.2, routeark,api: anthropic-messages@deepseek-ai/dsh-llm-retrypresentVerified: retry works
retryPolicy=normal, 5 attempts, eligible codesEMPTY_RESPONSE / RATE_LIMIT / SERVER / TIMEOUT / TRANSPORT, backoff 500 ms → 10 s with jitter.llm/retry/llm/retry-startedevents across 9 local sessions.retryPolicy: {mode: normal, maxRetries: 10}on the route, a latersession's
llm/retryevent carriedpolicyKey: ["normal",10,["EMPTY_RESPONSE","RATE_LIMIT","SERVER",...]]— confirming theconfigured policy is loaded and applied.
Failure taxonomy (9 sessions / 179 turns)
SensitiveContentDetected)403 ... 5-hour usage limit)429 AccountRateLimitExceeded)MISSING_CREDENTIAL(no credential for provider route "ark")401 authentication_errorNote: 22 of the 28 failures are classes that are non-retryable by nature (moderation, quota,
credential, auth). The 6 rate-limit failures surfaced after the 5 attempts were exhausted.
Requests
Preserve partial assistant output when a turn fails on a provider error.
Today the whole turn's generated text is discarded and the UI shows only a generic
"run failed". From the user's side this reads as a silent disconnect with no output at all.
Surface a classified, human-readable failure reason instead of a generic "run failed" —
distinguish content-moderation rejection, quota exhausted, credential missing,
authentication failure, and sustained rate limiting.
For quota-class errors, include the window reset time (or remaining quota) when the
provider exposes it. Currently the user can only guess and retry blindly.
Validate credential references at startup and warn, instead of failing at request time
with
MISSING_CREDENTIAL— which looks like a random mid-session breakage.For content-moderation rejections, say that retrying will not help. Those codes are
(correctly) outside the retryable set, but nothing in the UI tells the user that, so the
natural reaction is to retry a request that can never succeed.
Note
No secrets, tokens, hostnames, or user content are included above; failure counts and plugin
identifiers only. Happy to provide additional detail (event shapes, timings) if useful.
All reactions