Back to skills
extension
Category: Development & EngineeringNo API key required

mouhong

每日模型额度探活与移除。Triggered when user prompt is the first real request of the day, or contains '探活', '探查', '刷新模型', '额度', '模型不可用', '模型报错', 'health check', or when persona 自检指令命中「今天没探过活」。逐个探测所有已配置供应商的模型,把没额度的当日移除出 settings.yaml。

personAuthor: mouhong202608hubModelScope

每日模型额度探活与移除技能

定位:每日首次用户请求时自检,若今天没探过活,就逐个探活所有已配置供应商的模型,把没额度的当日从 ~/.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. 每日自检触发逻辑(每次会话首条真实请求时)

触发判断流程(接到本会话第一条用户真实请求时先跑这段,再处理请求本身):

  1. .agents/skills/model-health-check/LAST_RUN.date(相对工作区根)。
  2. 今天本地日期date +%Y-%m-%d)。
  3. 若标记 == 今天 → 今天已探过,跳过,直接处理用户请求。
  4. 若标记 != 今天 或文件不存在 → 今天首次,执行 §2 探活流程,结束后写回今天日期,再处理用户请求。

省 token 铁律:仅在「本会话第一条真实用户请求」时自检一次;后续请求不重复自检。标记文件保证全 harness 每天最多探一次。 空启动不探:纯启动无用户请求时不探(避免空耗 token),见技能触发配置。

2. 全量探活流程

Step 1 — 拿当前路由目录model_list,得各 provider 及其 models 清单。

Step 2 — 逐模型探活:对每个 provider/modelmodel_call 发最小请求:

prompt: "Reply with exactly: OK"
maxTokens: 10
  • 并行批量执行(每批 ~10 个 model_call),避免串行等待。

Step 3 — 失败分类(读 failure.codefailure.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 的 🔴/🟠)才移除。
  • 免费性仅供参考记录,不作为移除依据:
    • 智谱 glm2026glm-*-air 系列免费层;非 air 系列付费(但只要探活通也保留)。
    • 魔搭 modaapi-inference.modelscope.cn 免费层;insufficient_quota = 免费层耗尽(当日移除,次日刷新可加回)。
    • 硅基流 siliconflow:非 Pro/ 前缀走每日刷新免费额度;Pro/ 前缀付费加速通道(探活通则保留,余额耗尽才移除)。

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 借调模型遇到终止性配额失败时:

  1. 同一路由不重试超过 2 次(model-delegation 规则)。
  2. 换到下一个不同 provider 的可用模型重试(跨供应商降级)。
  3. 轮换至成功或全部耗尽(耗尽则如实报告并建议充值/续订)。

5. 输出规约

  • 探活完成后简短汇报:保留 / 移除各几个、默认模型是否变动。不堆全量明细(用户要可给)。
  • 标记文件路径、被移除项原因,简述即可。

6. 不在范围内

  • 当前会话自身模型中途配额耗尽的透明切换 = Cordis 插件工程,不在本技能职责内。
  • 主动发现并加载 settings 里没有的新免费模型 = 仅当用户明确要求「探查/加载免费模型」时按 §2 流程扩展(需先把候选模型写进 settings 再探活,因为 pi-ai 对未配置模型返回 UNKNOWN_MODEL)。