skills-experimental/api-retry-strategy/SKILL.md
API call retry strategy with exponential backoff, 429/529 handling, OAuth token refresh, and model fallback. Use when: - API calls fail with rate limit (429) or overload (529) - OAuth token expired (401) or revoked (403) - Network connection reset (ECONNRESET/EPIPE) - Need to implement resilient API calls Keywords: retry, rate limit, 429, 529, backoff, API error, token refresh, fallback
npx skillsauth add bianhaifeng789-hue/openclaw-config api-retry-strategyInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
基于 Claude Code services/api/withRetry.ts 的 API 重试策略,处理各类错误场景。
const DEFAULT_MAX_RETRIES = 10
const BASE_DELAY_MS = 500
const MAX_529_RETRIES = 3 // 连续 529 超过 3 次 → 触发 fallback
const PERSISTENT_MAX_BACKOFF_MS = 5 * 60 * 1000 // 最大退避 5 分钟
1. 读取 Retry-After header
2. 如果 retryAfterMs < 短重试阈值:等待后重试(保持 fast mode)
3. 如果 retryAfterMs 较长:进入 cooldown,切换到标准速度模型
4. 最多重试 DEFAULT_MAX_RETRIES 次
1. 连续 529 计数
2. 如果 consecutive529 >= MAX_529_RETRIES:触发 FallbackTriggeredError
3. 指数退避:BASE_DELAY_MS * 2^attempt(有上限)
4. 前台查询(用户等待)才重试,后台查询(摘要/建议)直接失败
1. 强制刷新 OAuth token
2. 重新获取 client
3. 重试请求
1. 清除 token 缓存
2. 重新认证
3. 重试
1. 禁用 keep-alive(避免复用坏连接)
2. 重新创建 client
3. 重试
async function withRetry(operation, options = {}) {
const {
maxRetries = 10,
baseDelayMs = 500,
signal,
onRetry
} = options
let lastError
let consecutive529 = 0
for (let attempt = 1; attempt <= maxRetries + 1; attempt++) {
if (signal?.aborted) throw new Error('Aborted')
try {
return await operation(attempt)
} catch (error) {
lastError = error
// 不重试的错误
if (isUserAbort(error) || isAuthError(error) || isPromptError(error)) {
throw error
}
// 429 Rate Limit
if (error.status === 429) {
const retryAfter = getRetryAfterMs(error) ?? baseDelayMs * Math.pow(2, attempt)
await sleep(Math.min(retryAfter, 5 * 60 * 1000), signal)
continue
}
// 529 Overload
if (is529Error(error)) {
consecutive529++
if (consecutive529 >= 3) throw new FallbackTriggeredError(error)
await sleep(baseDelayMs * Math.pow(2, attempt), signal)
continue
}
// 最后一次尝试
if (attempt > maxRetries) throw error
// 其他错误:指数退避
await sleep(baseDelayMs * Math.pow(2, attempt - 1), signal)
}
}
throw lastError
}
前台(用户等待)→ 重试 429/529:
- 主对话
- compact
- hook agent
后台(用户不等待)→ 直接失败:
- 摘要生成
- prompt suggestion
- tool use summary
- 分类器
| 特性 | Claude Code | OpenClaw 适配 | |------|-------------|---------------| | Fast Mode | 有(切换到更快模型) | 无 | | 持久重试 | CLAUDE_CODE_UNATTENDED_RETRY | 不实现 | | 心跳保活 | 30s 发送 keep-alive 消息 | 不实现 | | 模型 fallback | FallbackTriggeredError → 切换模型 | 飞书通知用户 |
business
IAA 日报飞书输出能力。 支持把固定 CSV 模板一键转换成: - 中文运营结论 - 飞书卡片 JSON - 飞书发送载荷 Use when: - 需要把 IAA 日报直接发到飞书 - 需要从 CSV 一键生成运营日报
data-ai
IAA日报分析模型 功能: - 渠道日报自动分析 - 小时级+日级ROI联动判断 - 按地区输出加量/降量/停投建议 - 按产品类型输出阈值 - 自动识别利润区/观察区/止损区 Use when: - 分析每天投放数据 - 生成运营日报结论 - 判断是否加量/降量/停投 - 对比美加澳/日韩表现 Keywords: - 日报模型, 投放日报, 加量, 降量, 停投, ROI日报, 分地区分析
data-ai
IAA固定日报分析模板 功能: - 固定字段模板(可直接贴每天数据) - 自动输出总盘结论 - 自动输出美加澳/日韩结论 - 自动给出加量/降量/停投建议 - 适配文件修复/清理两类产品 Use when: - 需要固定日报格式 - 每天复盘渠道表现 - 给运营团队出统一结论 Keywords: - 固定模板, 日报模板, ROI模板, IAA日报, 运营模板
development
# HyperlinkPool Pattern Skill HyperlinkPool Pattern - HyperlinkPool class + strings array + stringMap + Index 0 no hyperlink + intern(hyperlink) + get(id) + undefined handling + 5-minute reset + OSC8 hyperlink interning。 ## 功能概述 从Claude Code的ink/screen.ts提取的HyperlinkPool模式,用于OpenClaw的OSC8超链接池管理。 ## 核心机制 ### HyperlinkPool Class ```typescript export class HyperlinkPool { private strings: string[] = [''] // Index 0 = no hyperlink private stringMap = new Map<string, number>() // strings