{"_id":"@astrolimit/opencode-peak-guard","name":"@astrolimit/opencode-peak-guard","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@astrolimit/opencode-peak-guard","version":"0.1.0","description":"opencode 插件：模型高峰期自动降级——在配置的时间段内把拥堵模型的请求切换到备用模型","keywords":["opencode","opencode-plugin","peak","fallback","model-routing"],"license":"SFR","author":{"name":"astrolimit"},"repository":{"type":"git","url":"https://cnb.cool/os023/astrolimit/opencode-peak-guard.git"},"type":"module","main":"./dist/index.mjs","exports":{".":"./dist/index.mjs"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"dependencies":{"jsonc-parser":"^3.3.1"},"_id":"@astrolimit/opencode-peak-guard@0.1.0","gitHead":"5d063dd30ae7dc92e5184e4d4d51b61fa2c1bb4e","_nodeVersion":"22.23.1","_npmVersion":"10.9.8","dist":{"integrity":"sha512-QqcPJVNhD7uq79U8yb9mWoGr3m8ufY2Qm8yicVDAp4Y3R2VOk9PoeTkbD9yZ57fiQvBwXMKmXETyQ92rU5PaQQ==","shasum":"2d1a4a712e95d0427c6d07e9e1546667d41c7a3b","tarball":"https://registry.npmjs.org/@astrolimit/opencode-peak-guard/-/opencode-peak-guard-0.1.0.tgz","fileCount":4,"unpackedSize":21389,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBIdFKbgM2nI7KK0O85qFNJbJ00O/m6czyjs1OczhSMtAiEA+thNhhHnCm/vB7yO4P1U7YfPHiWyKorPz0Thz7g1yFg="}]},"_npmUser":{"name":"jack0410","email":"12345@cnceo.club"},"directories":{},"maintainers":[{"name":"jack0410","email":"12345@cnceo.club"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/opencode-peak-guard_0.1.0_1786948657094_0.16914782036927534"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-17T06:37:36.946Z","0.1.0":"2026-08-17T06:37:37.246Z","modified":"2026-08-17T06:37:37.445Z"},"maintainers":[{"name":"jack0410","email":"12345@cnceo.club"}],"description":"opencode 插件：模型高峰期自动降级——在配置的时间段内把拥堵模型的请求切换到备用模型","keywords":["opencode","opencode-plugin","peak","fallback","model-routing"],"repository":{"type":"git","url":"https://cnb.cool/os023/astrolimit/opencode-peak-guard.git"},"author":{"name":"astrolimit"},"license":"SFR","readme":"# @astrolimit/opencode-peak-guard\n\n[opencode](https://opencode.ai) 插件：**模型高峰期自动降级**。在配置的时间段内，把发往「拥堵模型」的请求自动切换到备用模型；高峰一过，自动恢复。\n\n## 工作原理\n\n- 插件通过 opencode 的 `chat.message` 钩子，在每条用户消息处理前判断**当前时刻（北京时间）**是否处于该模型配置的高峰窗口；\n- 命中则把该消息的模型改写为规则指定的 `fallback`，未命中则完全不动——**无状态、按请求实时切换、高峰结束自动恢复**；\n- 每次实际降级都会 **toast 提醒 + 写入结构化日志**（`client.app.log`，service 为 `peak-guard`）；\n- 降级目标未在 opencode 中配置时 **fail open**：保持原模型并警告，绝不中断工作。\n\n## 安装\n\n在 opencode 配置（全局 `~/.config/opencode/opencode.json` 或项目级 `opencode.json`）中加入：\n\n```json\n{\n  \"plugin\": [\"@astrolimit/opencode-peak-guard\"]\n}\n```\n\n## 配置\n\n配置文件为全局唯一的 `~/.config/opencode/peak-guard.jsonc`（遵循 `$XDG_CONFIG_HOME`；无 jsonc 时回退 `peak-guard.json`，两者并存以 jsonc 为准，文件在插件启动时确定）。支持 **JSONC 语法**——`//` 行注释、`/* */` 块注释、尾逗号均可。修改后**即时生效**，无需重启。\n\n```jsonc\n{\n  // key：高峰时要避开的模型，格式 \"providerID/modelID\"，支持 * 通配\n  \"deepseek/*\": {\n    // 高峰窗口，HHMM 整数，半开区间 [start, end)；支持多条；start > end 表示跨午夜\n    \"windows\": [\n      { \"start\": 900, \"end\": 1200 },\n      { \"start\": 1400, \"end\": 1800 }\n    ],\n    // 可选：仅工作日（按北京时间周一~周五）生效\n    \"weekdaysOnly\": true,\n    // 命中高峰时切换到的备用模型\n    \"fallback\": \"zhipuai-coding-plan/glm-5.2\"\n  },\n  \"zhipuai-coding-plan/glm-5.2\": {\n    \"windows\": [{ \"start\": 1400, \"end\": 1800 }],\n    \"weekdaysOnly\": true,\n    \"fallback\": \"deepseek/deepseek-v3\"\n  }\n}\n```\n\n规则要点：\n\n- **时区固定为北京时间**（UTC+8），与运行机器的时区无关；\n- 时间段为 **HHMM 整数**（`900` = 09:00，`1400` = 14:00），半开区间 `[start, end)`；\n- 多条规则同时命中时，**最具体（非通配字符最多）的模式优先**；\n- **不做链式解析**：fallback 即终点，即使它自己也处于高峰；\n- 配置错误（非法 JSON/JSONC、规则缺字段等）不会中断 opencode——坏规则被跳过并 toast/日志告警；\n- 作用于主会话与 task 子代理的请求；标题生成等小模型调用不受影响。\n\n## 许可证\n\n本项目基于 SFR 许可证（第二版）开源，详见 [LICENSE](./LICENSE) 与 <http://www.shared-future.ren/licenses/>。\n","readmeFilename":"readme.md","_rev":"1-7859c5ac70ac67f517176ea375a41698"}