希望将供应商错误的重试次数与匹配规则开放为可配置项,并支持任务级自动续跑
- Dominant language
- TypeScript
- Stars
- 2.7k
- Forks
- 395
- Avg merge
- 21h 48m
- Merged PRs (30d)
- 776
Description
**提交人**: yugui
**客户端版本**: 0.1.30
---
## 使用场景
我通过第三方中转站(API 代理)接入模型供应商,中转站稳定性明显低于官方端点,长任务经常在中途被一次瞬时错误打断,需要手动发「继续」接回。
Cindy 目前已经内置了一层重试,但是硬编码的固定行为:
- 本机日志出现过 `Transient provider error, retrying (1/3)…`,对应的原始错误是 `502 {"error":{"type":"proxy_error","message":"upstream unreachable: Error: read ECONNRESET"}}`,自动重试后成功,全程无感 —— 这部分体验很好。
- 但在 `CindyGlobal` 配置目录下(`analytics-settings.json` / `auto-update-settings.json` / `git-safety-settings.json` / `lsp-mode-settings.json` / `codex-home/config.toml` 等)全量搜索 `retry|retries|reconnect|backoff|auto-continue`,没有任何一处是重试相关配置。重试上限 3 次和「哪些错误算瞬时错误」都无法调整。
问题在于:中转站的错误形态和官方端点差别很大,固定规则覆盖不到。同一天日志里各类 `sdkError` 的分布:
| sdkError | 次数 | 是否触发重试 |
|---|---|---|
| `502 proxy_error` | 1 | 是(`retrying (1/3)`) |
| `unknown` | 6 | 无重试记录 |
| `rate_limit` | 2 | 无重试记录 |
| `server_error` | 1 | 无重试记录 |
全天只有 1 条重试日志。其中 `unknown` 出现 6 次,且都以 `SDK error surfaced to user` 直接抛给了用户 —— 中转站返回的非标准错误体没能被归类为可重试的瞬时错误,只能手动重发。(以上为单机单日日志观察,不排除存在我没看到的判定逻辑。)
## 诉求
把现有这层硬编码重试开放为可配置,并补上任务级续跑能力。具体希望能设置:
1. **重试次数上限** —— 现在固定 3 次,中转站不稳时希望能调大。
2. **自定义错误匹配规则** —— 按错误文本或状态码配置匹配规则,命中即视为可重试。这是最核心的一项:能自己把 `unknown` 里那些实际可恢复的错误捞出来,不必等官方逐个适配各家中转站的错误格式。
3. **重试间隔 / 退避策略** —— 遇到 `rate_limit` 这类需要冷却的错误,立即重试无意义,希望能配置退避。
4. **按供应商分别配置** —— 官方端点和中转站稳定性不同,期望的重试策略也不同,不希望共用一套参数。
另外希望区分并同时支持两个层面(目前只有前者):
- **请求级自动重连**:单次请求因瞬时故障失败,原地重试同一请求。已实现,只是不可配。
- **任务级自动续跑**:长任务被非瞬时错误(rate limit 冷却、认证失效等)打断后,按配置的次数自动接着做完,而不是把错误抛给用户等手动「继续」。
## 建议方案
- 新增设置面板(或配置文件,如 `retry-settings.json`),暴露上述四项:`maxRetries`、`retryableErrorPatterns`(正则或子串列表)、`backoff`(间隔与策略)、以及按 provider 覆盖。
- 保留当前内置默认值作为兜底,不填就是现在的行为,避免影响现有用户。
- 用户自定义规则与内置判定取并集:内置认为可重试的照旧,用户规则额外扩展而非替换。
- 每次重试/续跑在 UI 给出轻量提示(如「第 2/5 次重试」),让用户知道没卡死,也便于判断是否该手动介入。
- 为避免无限循环,续跑次数应有硬上限,且用户手动打断后立即停止。
---
**OS**: win32 x64 (10.0.19045)
**界面语言**: zh-CN
Contributor guide
Research direction
No repository files or tests are named. Start by locating the code that emits `Transient provider error, retrying (1/3)…` and `SDK error surfaced to user`, then trace provider error classification and task continuation; inspect the listed CindyGlobal settings as configuration context. Done means retry limits, matching rules, backoff, provider overrides, task-level continuation, and UI progress are configurable with bounded execution.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- backend
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100