每日模型额度探活与移除技能
定位:每日首次用户请求时自检,若今天没探过活,就逐个探活所有已配置供应商的模型,把没额度的当日从
~/.dsh/settings.yaml移除。保证默认模型与 fallback 不命中坏模型。 触发范围:全局 persona 注入,所有项目会话生效(settings.yaml 本就是全局共享)。
0. 能力边界(执行前必读)
| 能力 | 是否支持 | 说明 |
|:---|:---|:---|
| 每日首次请求自动探活 | ✅ | persona 注入 + 本技能自检 LAST_RUN.date |
| 探活所有已配置供应商模型 | ✅ | model_list 拿路由 → 逐个 model_call 最小请求 |
| 没额度当日移除 | ✅ | 改 llm-pi-ai.providers.<p>.models;官方路由用 models: [] |
| 借调模型配额兜底切换 | ⚠️ 借调场景能 | model_call/子代理失败可跨供应商降级(model-delegation 规则) |
| 当前会话自身模型中途失效透明切换 | ❌ 不能 | 需 Cordis 插件,超出本技能范围 |
1. 每日自检触发逻辑(每次会话首条真实请求时)
触发判断流程(接到本会话第一条用户真实请求时先跑这段,再处理请求本身):
- 读
.agents/skills/model-health-check/LAST_RUN.date(相对工作区根)。 - 取今天本地日期(
date +%Y-%m-%d)。 - 若标记 == 今天 → 今天已探过,跳过,直接处理用户请求。
- 若标记 != 今天 或文件不存在 → 今天首次,执行 §2 探活流程,结束后写回今天日期,再处理用户请求。
省 token 铁律:仅在「本会话第一条真实用户请求」时自检一次;后续请求不重复自检。标记文件保证全 harness 每天最多探一次。 空启动不探:纯启动无用户请求时不探(避免空耗 token),见技能触发配置。
2. 全量探活流程
Step 1 — 拿当前路由目录:model_list,得各 provider 及其 models 清单。
Step 2 — 逐模型探活:对每个 provider/model 用 model_call 发最小请求:
prompt: "Reply with exactly: OK"
maxTokens: 10
- 并行批量执行(每批 ~10 个
model_call),避免串行等待。
Step 3 — 失败分类(读 failure.code 与 failure.message):
| 失败特征 | 判定 | 处理 |
|:---|:---|:---|
| ok: true | ✅ 可用 | 保留 |
| QUOTA / message 含「Insufficient Balance」「余额不足」「insufficient_quota」 | 🔴 永久/当日无额度 | 当日移除 |
| INVALID_REQUEST 含「InvalidSubscription」 | 🔴 账号订阅失效 | 移除该供应商整个 profile |
| RATE_LIMIT code:1113「余额不足或无可用资源包」 | 🔴 永久无额度(智谱特有) | 移除 |
| RATE_LIMIT「访问量过大/请稍后再试」(code 1305 等瞬时) | 🟡 瞬时繁忙 | 保留(非永久;标记但不删) |
| PI_AI_ERROR 404「UnsupportedModel」「no provider supported」「unavailable for free」 | 🟠 模型不可用 | 移除该模型 |
| UNKNOWN_MODEL「has no configured model」 | ⚙️ 配置问题 | 该模型不在 settings 列表,跳过(不报告为坏) |
| 纯 429 含「retry」但不含「余额/insufficient/balance」 | 🟡 瞬时 | 保留 |
关键区分:智谱 429
code:1113「余额不足或无可用资源包,请充值」= 🔴 永久无额度,要移除;魔搭code:1305「访问量过大,请你稍后再试」= 🟡 瞬时繁忙,要保留。看 message 内容,不只看 code。
Step 4 — 可用性判定(核心原则:探活能通就保留,不因免费/付费区分而移除):
- 探活
ok: true的模型一律保留,哪怕它是付费模型(如硅基流Pro/前缀)。用户要的是"能使用的模型",能用就留。 - 仅当探活返回终止性配额失败(§Step 3 的 🔴/🟠)才移除。
- 免费性仅供参考记录,不作为移除依据:
- 智谱 glm2026:
glm-*-air系列免费层;非 air 系列付费(但只要探活通也保留)。 - 魔搭 moda:
api-inference.modelscope.cn免费层;insufficient_quota= 免费层耗尽(当日移除,次日刷新可加回)。 - 硅基流 siliconflow:非
Pro/前缀走每日刷新免费额度;Pro/前缀付费加速通道(探活通则保留,余额耗尽才移除)。
- 智谱 glm2026:
Step 5 — 写回 ~/.dsh/settings.yaml:
- 工作区外文件,写入走沙箱提权:
danger-full-access+ 一句 justification,用户审批后热加载生效(无需重启)。 llm-pi-ai.providers.<p>.models:仅保留 ✅ 可用模型;整供应商全失效则删整个 profile。deepseek-official(组合内置不可物理删):用llm-deepseek: models: []隐藏。agent-default-model不擅自动:若用户设的默认模型本轮探活 ✅,保持;若 ❌ 失效,选一个 ✅ 可用的模型替换(优先 siliconflow 的 DS-V4-Pro,其次 moda 的 Qwen3.8-27B;免费/付费不限,能用即可)。
Step 6 — 落盘存活模型记录:把本轮探活 ✅ 可用的模型写入 .agents/skills/model-health-check/ALIVE_MODELS.md:
- markdown 表格:
| provider | model | 免费性 |,每行一个存活模型;顶部一行注明探活日期YYYY-MM-DD。 - 供
parallel-model-pool直接读取选池(避免它重复探活,省 token)。
Step 7 — 写回标记:执行完写 .agents/skills/model-health-check/LAST_RUN.date(内容仅今天日期 YYYY-MM-DD)。
3. 探活省 token 规约
- 每天全 harness 最多探一次(标记文件保证)。
- 探活用 maxTokens:10、prompt 极短,单次成本可忽略。
- 并行批量,总时长受限。
- 仅探 settings.yaml 当前配置的模型;不主动发现新模型(除非用户要求「探查/加载免费模型」)。
4. 借调模型配额兜底(非每日探活场景)
本 agent 用 model_call / spawn_model_subagent / team_add_member 借调模型遇到终止性配额失败时:
- 同一路由不重试超过 2 次(model-delegation 规则)。
- 换到下一个不同 provider 的可用模型重试(跨供应商降级)。
- 轮换至成功或全部耗尽(耗尽则如实报告并建议充值/续订)。
5. 输出规约
- 探活完成后简短汇报:保留 / 移除各几个、默认模型是否变动。不堆全量明细(用户要可给)。
- 标记文件路径、被移除项原因,简述即可。
6. 不在范围内
- 当前会话自身模型中途配额耗尽的透明切换 = Cordis 插件工程,不在本技能职责内。
- 主动发现并加载 settings 里没有的新免费模型 = 仅当用户明确要求「探查/加载免费模型」时按 §2 流程扩展(需先把候选模型写进 settings 再探活,因为 pi-ai 对未配置模型返回 UNKNOWN_MODEL)。
微信扫一扫