# qnymore **Repository Path**: opencode-plugin/qnymore ## Basic Information - **Project Name**: qnymore - **Description**: qnymore-支持多key轮询 - **Primary Language**: TypeScript - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-27 - **Last Updated**: 2026-10-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # qnymore OpenCode 模型请求插件 —— QNY More 提供商(单提供商,多 API Key 轮询)。 ## 介绍 - 提供商 ID:`qnymore`,展示名称:QNY More - 端点:`https://api.qnaigc.com/v1`(OpenAI 兼容 Chat Completions,适配器 `@ai-sdk/openai-compatible`) - 授权方式:用户输入多个 API Key,逗号分隔,插件按请求轮询使用 - 凭证存储:`~/.qnymore/auth.json` - 调试日志:`~/.qnymore/debug.log`(环境变量 `DEBUG=1` 或 `OPENCODE_QNYMORE_DEBUG=1` 开启,需在启动 OpenCode 前设置) ## 模型列表 | key(OpenCode 模型 ID) | id(上游真实 ID) | 上下文 | 最大输出 | 说明 | |---|---|---|---|---| | `glm-5.3` | `z-ai/glm-5.3` | 1339296 | 134144 | 推理 | | `glm-5.3-flash` | `z-ai/glm-5.3-flash` | 1339296 | 131072 | 推理,多模态(文本/图像/视频) | | `deepseek-v4-pro` | `deepseek/deepseek-v4-pro-0813` | 1048576 | 393216 | 推理 | | `deepseek-v4-flash` | `deepseek/deepseek-v4-flash-20260731` | 1048576 | 393216 | 推理 | | `kimi-k3` | `moonshotai/kimi-k3` | 1048576 | 131072 | 推理,多模态(文本/图像/视频) | | `hy4-preview` | `tencent/hy4-preview` | 1048576 | 65536 | 推理 | | `kimi-k2.7-code` | `moonshotai/kimi-k2.7-code` | 268288 | 131072 | 多模态(文本/图像) | | `doubao-seed-2.0-code` | `doubao-seed-2.0-code` | 262144 | 131072 | 代码 | > 所有模型 `cost: { input: 0, output: 0 }`。key 不含 `provider/` 前缀;key 与 id 不同时(deepseek 系列)由 `transformRequestBody` 查表改写为真实 id 再请求上游。 ## 授权 OpenCode 中执行 `/connect`,选择 QNY More,输入 API Keys(多个用逗号分隔)。 - 创建 apiKey:https://portal.qiniu.com/ai-inference/api-key - 邀请链接注册额外获得额度: - https://s.qiniu.com/EZFZZn - https://s.qiniu.com/QbeQVb - https://s.qiniu.com/EZFZZn - https://s.qiniu.com/QbeQVb ## 软件架构 ``` src/ ├── index.ts # 插件入口(chat.headers 轮换 key + 自定义 fetch + config 注册) ├── constants.ts # 提供商常量与模型定义 ├── plugin/ │ ├── auth.ts # 凭证存储(~/.qnymore/auth.json) │ └── key-manager.ts # 多 Key 轮换管理器(错误计数、自愈) └── utils/ └── debug-logger.ts # 调试日志(TEXT 单行格式,掩码 key) ``` ## 安装与构建 ```bash npm install npm run build ``` 构建产物输出到 `dist/`。 ## 配置 opencode.json ```json // opencode.json { "plugins": [ "/path/to/qnymore" ] } ``` ## 使用说明 1. 在 OpenCode 中 `/connect` 授权 qnymore(填入 API Keys) 2. 在模型列表中选择 `qnymore` 下的模型使用 3. 排查问题时开启日志:启动前设置 `OPENCODE_QNYMORE_DEBUG=1`,查看 `~/.qnymore/debug.log` ## 错误处理约定 - 401/403:原样返回上游错误(OpenCode 立即报错,不重试) - 429:原样返回,由 OpenCode 自行重试 - 5xx / 网络异常:转为固定 429 错误流,交由 OpenCode 重试 - 其它错误(含 400):保留原状态码,立即报错不重试 - SSE 首 chunk 30 秒超时:返回 429 触发 OpenCode 重试 ## Key 黑名单(blacklist.json) KeyManager 会为每个 Key 维护错误计数,持久性错误(`401/403/400` 等)触发 `reportError`(计数 +1), 当 `errorCount >= 3` 时该 Key 被临时拉黑,轮询时自动跳过;请求成功一次即触发 `reportSuccess` 复位计数。 黑名单状态通过快照文件跨重启保留,重启后自动恢复各 Key 的错误计数。 快照文件格式(与插件写盘格式一致): ```json { "updatedAt": 1759800000000, "keys": [ { "key": "sk-xxx1", "errorCount": 3, "blocked": true }, { "key": "sk-xxx2", "errorCount": 0, "blocked": false } ] } ``` 目标路径:`%USERPROFILE%\.qnymore\blacklist.json` 复制方法(可选):将项目 `jsonc/blacklist.jsonc` 复制到 `%USERPROFILE%\.qnymore\` 并重命名为 `blacklist.json`。不复制也不影响运行——插件仅在内存中计数,不跨重启保留;快照读写失败仅记录 debug 警告,绝不中断主流程。 ## 配置文件 插件运行所需的配置文件位于本仓库 ./jsonc/ 目录下(provider.jsonc 与 models.jsonc)。使用前将这两个文件复制到用户目录 %USERPROFILE%\.qnymore/ 下(缺失时插件启动会 fail fast 报错)。复制后可按需编辑模型列表与提供商信息(支持注释),修改后重启插件生效。