# yapimore **Repository Path**: opencode-plugin/yapimore ## Basic Information - **Project Name**: yapimore - **Description**: Y-api - 支持多key轮询(免费账号免费模型 500次调用/天,通过轮询多个账号的apikey实现累加) - **Primary Language**: JavaScript - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-14 - **Last Updated**: 2026-10-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Y-API More OpenCode Provider Plugin **提供商 ID**: `yapimore` | **显示名称**: Y-API More | **Base URL**: `https://api.y-api.bestvirtualgoods.com/v1` OpenCode 插件,集成 Y-API(y-api.bestvirtualgoods.com)网关,支持 API Key 多密钥轮询以缓解速率限制。 ## 功能 - **多 Key 轮询** — 输入多个 API Key(逗号分隔),自动循环切换,减缓 `429` 速率限制 - **错误容错** — 单个 Key 连续错误 3 次自动跳过,全部不可用时重置计数 - **模型支持** — 内置 `deepseek-v4-flash`、`hy3`、`mimo-v2.5`(思考模式 / 多模态) - **思考模型适配** — 对声明 `interleaved` 的模型自动注入 `thinking`,并兜底回传 `reasoning_content`(规避 tools 请求 400) - **模型别名映射** — OpenCode 上送简写别名,插件改写为上游真实模型 id 后请求 - **请求头注入** — 自动设置 `User-Agent` 和 `Accept` 头 - **未授权兜底** — 未配置 Key 时直接返回 401 并提示授权,不触发无意义重试 - **调试日志** — `~/.yapimore/debug.log`,由环境变量控制开关 - **凭证存储** — API Key 持久化到 `~/.yapimore/auth.json` ## 安装 ### 前提 - Node.js 22+ - OpenCode ### 步骤 ```bash # 1. 进入项目 cd yapimore # 2. 安装依赖 npm install # 3. 构建 npm run build ``` ## 配置 ### 1. 配置 opencode.json ```json // opencode.json { "plugins": [ "/path/to/yapimore" ] } ``` ### 2. 添加凭据 在 OpenCode 中执行 `/connect` 命令,选择 **Y-API More**: ``` ┌ 获取 API Key:https://y-api.bestvirtualgoods.com/zh/app/keys │ │ 邀请链接(注册可额外获得额度): │ https://y-api.bestvirtualgoods.com/i/BWVGRPXS │ https://y-api.bestvirtualgoods.com/i/LRUEDKNV │ │ 输入 API Keys(多key用逗号分隔) │ ──────────────────────────────── │ sk-key1,sk-key2,sk-key3 └ enter ``` > 多个 Key 用逗号分隔,插件会自动轮询使用。未授权时模型请求会返回 > `未授权:请通过 /connect 命令点击 Y-API More 进行授权`。 ### 3. 选择模型 执行 `/models` 命令,选择可用模型: | Model ID | 上游模型 | 描述 | 上下文 | 输出 | 特性 | |----------|----------|------|--------|------|------| | `deepseek-v4-flash` | `deepseek/deepseek-v4-flash` | DeepSeek V4 Flash | 1.0M | 384K | 思考模式、工具调用 | | `hy3` | `tencent/hy3` | Tencent Hy3 | 262K | 128K | 思考模式、工具调用 | | `mimo-v2.5` | `xiaomi/mimo-v2.5` | Xiaomi MiMo V2.5 | 1.1M | 131K | 多模态(文本/图像/音频/视频) | > **模型别名映射**:OpenCode 上送的是表中 `Model ID` 列(别名),插件通过它匹配 > `constants.ts` 中的模型定义,再用「上游模型」列的真实 id 请求上游。 ## 多 Key 轮询机制 ``` 请求 → chat.headers → KeyManager.getNextKey() ↓ ┌──────────────┐ │ key1 ← 首次 │ │ key2 ← 下次 │ │ key3 ← 再下次 │ └──────────────┘ ↓ 写入 Authorization → 发起 API 请求 ``` - 循环轮询:`key1 → key2 → key3 → key1 → ...` - 错误追踪:每个 Key 连续失败 3 次后跳过 - 自动恢复:所有 Key 都被跳过时重置计数 - 成功自愈:请求成功后清零该 Key 的错误计数 ## 错误处理 自定义 `fetch` 统一将上游错误转换为 OpenCode 可解析的标准 JSON 错误流: | 场景 | 行为 | |------|------| | 401 / 403 | 立即报错(不重试),保留上游原始错误消息 | | 408 / 409 / 429 / 5xx | 触发 OpenCode 重试(自动轮换 Key) | | 网络异常 | 返回 502 标准错误流,不向 UI 抛异常 | | 未授权(无 Key) | 返回 401 并提示 `/connect` 授权,不发真实请求 | | 首 chunk 15s 超时 | 返回 429 触发 OpenCode 重试(防上游挂起) | ## 调试日志 通过环境变量开启调试日志: ```bash # 方式一:全局 DEBUG DEBUG=1 opencode # 方式二:仅 Y-API More OPENCODE_YAPIMORE_DEBUG=1 opencode ``` 日志位置:`%USERPROFILE%\.yapimore\debug.log` ## 项目结构 ``` yapimore/ ├── package.json ├── tsconfig.json ├── src/ │ ├── index.ts # 主入口:auth hook + config hook + chat.headers + 共享 fetch │ ├── constants.ts # 提供商配置、模型定义 │ ├── plugin/ │ │ ├── auth.ts # 凭证读写 ~/.yapimore/auth.json │ │ └── key-manager.ts # 多 Key 轮询算法 │ └── utils/ │ └── debug-logger.ts # 文件日志(无 console.error) └── dist/ # 构建产物 ``` ## 开发 ```bash # 构建 npm run build # 类型检查 npm run typecheck ``` ## 许可 Apache 2.0 ## 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%\.yapimore\blacklist.json` 复制方法(可选):将项目 `jsonc/blacklist.jsonc` 复制到 `%USERPROFILE%\.yapimore\` 并重命名为 `blacklist.json`。不复制也不影响运行——插件仅在内存中计数,不跨重启保留;快照读写失败仅记录 debug 警告,绝不中断主流程。 ## 配置文件 插件运行所需的配置文件位于本仓库 ./jsonc/ 目录下(provider.jsonc 与 models.jsonc)。使用前将这两个文件复制到用户目录 %USERPROFILE%\.yapimore/ 下(缺失时插件启动会 fail fast 报错)。复制后可按需编辑模型列表与提供商信息(支持注释),修改后重启插件生效。