Skip to main content
Glama
README.md
# opencode-eyes-nvidia 👁️

MCP server that provides image description capability using NVIDIA NIM hosted API
(`https://integrate.api.nvidia.com/v1`) with the **MiniMax-M3** multimodal model.

为不具备多模态能力的模型提供**"眼睛"**。将图片输入,即可获得详细的图片文字描述。

## 功能

| 工具 | 说明 |
|------|------|
| `describe_image` | 描述一张图片的内容,默认使用 MiniMax-M3 多模态大模型 |
| `list_vision_models` | 列出 NVIDIA NIM API 上可用的多模态(视觉)模型 |

## 多模态模型

默认模型为 `minimaxai/minimax-m3`(文本/图像/视频输入 → 文本输出,1M 上下文,支持推理)。
可通过 `NVIDIA_MODEL` 或 `describe_image` 的 `model` 参数切换:

| 模型 ID | 说明 |
|---------|------|
| `minimaxai/minimax-m3` | MiniMax-M3 多模态 MoE VLM(默认,支持图像/视频) |
| `meta/llama-3.2-11b-vision-instruct` | Meta Llama 3.2 11B Vision |
| `meta/llama-3.2-90b-vision-instruct` | Meta Llama 3.2 90B Vision |
| `nvidia/llama-3.1-nemotron-nano-vl-8b-v1` | NVIDIA Nemotron Nano VL 8B |
| `google/gemma-3-27b-it` | Google Gemma 3 27B IT |
| `nvidia/nemotron-nano-12b-v2-vl` | NVIDIA Nemotron Nano 12B v2 VL |
| `qwen/qwen3.5-397b-a17b` | Qwen 3.5 397B A17B VLM |

## 环境变量

| 变量 | 必填 | 默认值 | 说明 |
|------|------|--------|------|
| `NVIDIA_API_KEY` | 否* | — | 单个 NVIDIA API Key(在 https://build.nvidia.com 获取,`nvapi-...`) |
| `NVIDIA_API_KEYS` | 否* | — | 多个 Key,用逗号 / 分号 / 空格 / 换行分隔 |
| `NVIDIA_API_KEY_1` … `NVIDIA_API_KEY_N` | 否* | — | 编号 Key,`NVIDIA_API_KEY_1` 起依次读取 |
| `NVIDIA_BASE_URL` | 否 | `https://integrate.api.nvidia.com/v1` | API 基础地址 |
| `NVIDIA_MODEL` | 否 | `minimaxai/minimax-m3` | 默认使用的多模态模型 |
| `NVIDIA_TIMEOUT` | 否 | `120` | API 请求超时(秒) |
| `NVIDIA_MAX_DIMENSION` | 否 | `2048` | 发送前图片最长边缩放到该像素,0 表示不缩放 |
| `NVIDIA_JPEG_QUALITY` | 否 | `85` | 发送前 JPEG 压缩质量(0-100) |
| `NVIDIA_THINKING_MODE` | 否 | (空) | MiniMax-M3 推理模式:`enabled` / `disabled` / `adaptive` |
| `NVIDIA_ROTATION_MAX_RETRIES` | 否 | Key 数量 | 轮询总尝试次数(跨所有 Key) |
| `NVIDIA_ROTATION_BACKOFF` | 否 | `2` | 每次失败后等待的秒数(等待配额刷新) |

\* 至少需要配置一个 Key:`NVIDIA_API_KEY`、`NVIDIA_API_KEYS` 或 `NVIDIA_API_KEY_1..N` 任一即可,可同时配置(去重合并)。

## Key 轮询(多 Key 自动切换)

支持配置多个 API Key:请求按顺序使用,遇错自动切换到下一个 Key,**不会删除原 Key**,
只是把它排到队列末尾,等待其配额刷新后再用。全程自动重试,无需人工干预。

工作方式:

1. 启动时把所有 Key 合并进一个队列(去重,按 `NVIDIA_API_KEY` → `NVIDIA_API_KEYS` → `NVIDIA_API_KEY_1..N` 顺序)。
2. 请求默认使用队首 Key。
3. 遇到可重试错误(HTTP `401 / 403 / 404 / 408 / 429 / 5xx`,或连接超时)时:
   队首 Key 移到队尾,等待 `NVIDIA_ROTATION_BACKOFF` 秒后改用下一个 Key 重试。
4. 所有 Key 都被轮过之后(共 `NVIDIA_ROTATION_MAX_RETRIES` 次尝试)仍未成功,才抛出最后一个错误。
5. 队列状态在多次调用间保留——被限流的 Key 会排在后面,等下次轮到时配额往往已刷新。

示例:

```bash
# 方式一:逗号分隔多个 Key
set NVIDIA_API_KEYS=nvapi-key-1,nvapi-key-2,nvapi-key-3

# 方式二:编号 Key
set NVIDIA_API_KEY_1=nvapi-key-1
set NVIDIA_API_KEY_2=nvapi-key-2

# 方式三:单个 Key(向后兼容)
set NVIDIA_API_KEY=nvapi-key-1
```

在 OpenCode 配置中把环境变量传给 MCP 服务:

```json
{
  "mcp": {
    "opencode-eyes-nvidia": {
      "type": "local",
      "command": ["python", "-m", "opencode_eyes_nvidia"],
      "enabled": true,
      "timeout": 120000,
      "environment": {
        "NVIDIA_API_KEYS": "{env:NVIDIA_API_KEYS}"
      }
    }
  }
}
```

## 安装

```bash
pip install -r requirements.txt
```

或安装为包:

```bash
pip install .
```

## 运行

```bash
# 设置环境变量(Windows,至少一种)
set NVIDIA_API_KEY=nvapi-你的key
# 或 set NVIDIA_API_KEYS=nvapi-key-1,nvapi-key-2

# 启动服务
python -m opencode_eyes_nvidia
```

## 在 OpenCode 中配置

```json
{
  "mcp": {
    "opencode-eyes-nvidia": {
      "type": "local",
      "command": ["python", "-m", "opencode_eyes_nvidia"],
      "enabled": true,
      "timeout": 120000,
      "environment": {
        "NVIDIA_API_KEYS": "{env:NVIDIA_API_KEYS}",
        "NVIDIA_API_KEY": "{env:NVIDIA_API_KEY}"
      }
    }
  }
}
```

## 手动测试

不启动 opencode,直接通过 stdio 验证:

```powershell
$env:NVIDIA_API_KEY = "nvapi-xxx"
python -m opencode_eyes_nvidia
```

然后在另一终端发送 MCP JSON-RPC 消息,例如:

```json
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"0.0.0"}}}
{"jsonrpc":"2.0","id":2,"method":"tools/list"}
{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"describe_image","arguments":{"image_path":"C:/path/to/photo.jpg"}}}
```

## 与 opencode-eyes 的区别

- API 从 StepFun 换成 **NVIDIA NIM**(`https://integrate.api.nvidia.com/v1`)
- 默认模型从 `step-3.7-flash` 换成 **MiniMax-M3**(`minimaxai/minimax-m3`)
- 新增 `list_vision_models` 工具与多模型切换能力
- 支持 MiniMax-M3 的 `thinking_mode` 推理控制
- 支持**多 API Key 轮询**:遇错自动切换下一个 Key,原 Key 排到队尾等待配额刷新

## License

MIT

Maintenance

ActivityMaintained
ResponsivenessNo issues