# xjymore **Repository Path**: opencode-plugin/xjymore ## Basic Information - **Project Name**: xjymore - **Description**: xjymore-支持多key轮询 (星见雅) - **Primary Language**: TypeScript - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-24 - **Last Updated**: 2026-10-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # xjymore OpenCode 模型请求插件 —— XJY More 提供商(单提供商,多 API Key 轮询)。 ## 介绍 - 提供商 ID:`xjymore`,展示名称:XJY More - 端点:`https://new.xinjianya.top/v1`(OpenAI 兼容 Chat Completions,适配器 `@ai-sdk/openai-compatible`) - 授权方式:用户输入多个 API Key,逗号分隔,插件按请求轮询使用 - 凭证存储:`~/.xjymore/auth.json` - 调试日志:`~/.xjymore/debug.log`(环境变量 `DEBUG=1` 或 `OPENCODE_XJYMORE_DEBUG=1` 开启,需在启动 OpenCode 前设置) ## 模型列表 | key(OpenCode 模型 ID) | id(上游真实 ID) | 上下文 | 最大输出 | 说明 | |---|---|---|---|---| | `nemotron-3-nano-omni` | `nvidia/nemotron-3-nano-omni-30b-a3b-reasoning` | 262144 | 65536 | 全模态推理 | | `gpt-5.3` | `gpt-5.3` | 409600 | 131072 | 多模态(文本/图像) | | `gpt-5.4` | `gpt-5.4` | 1153434 | 131072 | 多模态(文本/图像/文件) | | `gpt-5.5` | `gpt-5.5` | 1153434 | 131072 | 多模态(文本/图像/文件) | > 其余模型(gemini-3.x / kimi-k3 / nemotron-3.5-lightning / codex-auto-review)实测长时间不响应,已在 constants.ts 中注释停用。 > 所有模型 `cost: { input: 0, output: 0 }`。key 不含 `provider/` 前缀;key 与 id 不同时(kimi-k3 / nemotron 系列)由 `transformRequestBody` 查表改写为真实 id 再请求上游。 ## 授权 OpenCode 中执行 `/connect`,选择 XJY More,输入 API Keys(多个用逗号分隔)。 - 创建 apiKey:https://new.xinjianya.top/console/token - 邀请链接注册额外获得额度: - https://new.xinjianya.top/register?aff=qtsN - https://new.xinjianya.top/register?aff=DECg - https://new.xinjianya.top/register?aff=zbkh ## 软件架构 ``` src/ ├── index.ts # 插件入口(chat.headers 轮换 key + 自定义 fetch + config 注册) ├── constants.ts # 提供商常量与模型定义 ├── plugin/ │ ├── auth.ts # 凭证存储(~/.xjymore/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/xjymore" ] } ``` ## 使用说明 1. 在 OpenCode 中 `/connect` 授权 xjymore(填入 API Keys) 2. 在模型列表中选择 `xjymore` 下的模型使用 3. 排查问题时开启日志:启动前设置 `OPENCODE_XJYMORE_DEBUG=1`,查看 `~/.xjymore/debug.log` ## 已知限制 **带 `tools` 的请求无流式输出(上游网关限制)**:实测(2026-09-24,gemini-3.6-flash 对照验证): | 请求参数 | 分块行为 | |---|---| | 纯流式 / 仅 `stream_options` | SSE 增量下发,间隔 ~100-200ms,正常流式 | | **带 `tools`**(无论有无 `stream_options`) | 网关内部缓冲整个生成过程,完成后 2-3 块一次性下发 | OpenCode 对话(agent 模式必带 tools)因此表现为「长时间等待(TTFB 11-17s)后内容一下子全部输出」。插件侧分块透传实测正常,非插件问题;属上游网关实现限制,已建议提供方修复(带 `tools` 时应保持 SSE 增量下发)。 ## 错误处理约定 - 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%\.xjymore\blacklist.json` 复制方法(可选):将项目 `jsonc/blacklist.jsonc` 复制到 `%USERPROFILE%\.xjymore\` 并重命名为 `blacklist.json`。不复制也不影响运行——插件仅在内存中计数,不跨重启保留;快照读写失败仅记录 debug 警告,绝不中断主流程。 ## 配置文件 插件运行所需的配置文件位于本仓库 ./jsonc/ 目录下(provider.jsonc 与 models.jsonc)。使用前将这两个文件复制到用户目录 %USERPROFILE%\.xjymore/ 下(缺失时插件启动会 fail fast 报错)。复制后可按需编辑模型列表与提供商信息(支持注释),修改后重启插件生效。