feat: use Google Gemini as default vision backend, make provider configurable
- Plugin options: baseURL, apiKey, model, providerID, visionModels
- Default: Google Gemini OpenAI-compatible endpoint, gemini-2.5-flash
- Support {env:VAR} templates and GEMINI_API_KEY fallback
- Legacy fallback to ludmila-ai provider block for existing setups
- vision.md subagent now uses google/gemini-2.5-flash
This commit is contained in:
@@ -1,68 +1,98 @@
|
||||
# Opencode Vision Bridge Plugin
|
||||
|
||||
Этот плагин позволяет Opencode работать с изображениями, даже если активная модель не поддерживает мультимодальность. Он перехватывает изображения, отправляет их в указанную vision-модель для анализа, а затем заменяет изображение текстовым описанием в контексте диалога.
|
||||
Этот плагин позволяет Opencode работать с изображениями, даже если активная модель не поддерживает мультимодальность. Он перехватывает изображения, отправляет их в vision-модель для анализа, а затем заменяет изображение текстовым описанием в контексте диалога.
|
||||
|
||||
Распознавание выполняется через **Google Gemini API** (OpenAI-совместимый эндпоинт), модель по умолчанию — `gemini-2.5-flash`. Если активная модель сама умеет видеть изображения (помечена `"attachment": true` в конфиге), картинки передаются ей напрямую без распознавания.
|
||||
|
||||
## Требования
|
||||
|
||||
- Доступ к API-эндпоинту Ludmila AI (https://ai.totmin.ru/v1).
|
||||
- Ключ API Ludmila AI.
|
||||
- API-ключ Google Gemini. Получить бесплатно: [Google AI Studio](https://aistudio.google.com/apikey).
|
||||
- Сетевой доступ к `generativelanguage.googleapis.com`.
|
||||
|
||||
## Установка
|
||||
|
||||
### 1. Добавьте плагин в `~/.config/opencode/opencode.json`
|
||||
|
||||
В секцию `plugin` добавьте следующую запись:
|
||||
В секцию `plugin` добавьте запись (tuple-форма с опциями):
|
||||
|
||||
```json
|
||||
{
|
||||
"plugin": [
|
||||
// ... другие плагины
|
||||
"git+https://git.totmin.ru/en2zmax/vision-bridge.git"
|
||||
[
|
||||
"git+https://git.totmin.ru/en2zmax/vision-bridge.git",
|
||||
{
|
||||
"baseURL": "https://generativelanguage.googleapis.com/v1beta/openai",
|
||||
"apiKey": "{env:GEMINI_API_KEY}",
|
||||
"model": "gemini-2.5-flash"
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Настройте провайдер Ludmila AI
|
||||
`apiKey` можно указать явной строкой, шаблоном `{env:ИМЯ_ПЕРЕМЕННОЙ}` — либо не указывать вовсе, тогда плагин возьмёт его из `GEMINI_API_KEY`.
|
||||
|
||||
В секцию `provider` вашего `~/.config/opencode/opencode.json` добавьте или обновите блок `ludmila-ai`:
|
||||
### 2. Задайте API-ключ
|
||||
|
||||
```bash
|
||||
export GEMINI_API_KEY=ВАШ_КЛЮЧ
|
||||
```
|
||||
|
||||
Добавьте это в `~/.bashrc` / `~/.zshrc`, чтобы ключ был доступен при каждом запуске.
|
||||
|
||||
### 3. (Опционально) Зарегистрируйте провайдера Google
|
||||
|
||||
Нужно только если вы хотите использовать модель `gemini-2.5-flash` как основную или для vision-сабагента:
|
||||
|
||||
```json
|
||||
{
|
||||
"provider": {
|
||||
"ludmila-ai": {
|
||||
"npm": "@ai-sdk/openai-compatible",
|
||||
"name": "Ludmila AI",
|
||||
"google": {
|
||||
"npm": "@ai-sdk/google",
|
||||
"name": "Google",
|
||||
"options": {
|
||||
"baseURL": "https://ai.totmin.ru/v1",
|
||||
"apiKey": "<ЗАМЕНИТЕ_НА_ВАШ_API_КЛЮЧ>"
|
||||
"apiKey": "{env:GEMINI_API_KEY}"
|
||||
},
|
||||
"models": {
|
||||
"gemini/gemini-2.5-flash": {
|
||||
"attachment": true,
|
||||
"limit": {
|
||||
"context": 1048576,
|
||||
"output": 65536
|
||||
}
|
||||
}
|
||||
"gemini-2.5-flash": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
**ВАЖНО**: Замените `<ЗАМЕНИТЕ_НА_ВАШ_API_КЛЮЧ>` на ваш реальный API-ключ Ludmila AI.
|
||||
|
||||
### 3. Скопируйте файл субагента
|
||||
### 4. Скопируйте файл субагента
|
||||
|
||||
Субагенты не загружаются из npm-пакетов, поэтому скопируйте файл `vision.md` в соответствующий каталог:
|
||||
|
||||
```bash
|
||||
cp ~/totmin/opencode/plugins/vision-bridge/agents/vision.md ~/.config/opencode/agents/vision.md
|
||||
cp agents/vision.md ~/.config/opencode/agents/vision.md
|
||||
```
|
||||
|
||||
### 4. Перезапустите Opencode
|
||||
Субагент использует модель `google/gemini-2.5-flash`.
|
||||
|
||||
### 5. Перезапустите Opencode
|
||||
|
||||
Изменения в конфигурации применяются только после перезапуска Opencode.
|
||||
|
||||
## Подключение другого OpenAI-совместимого сервиса
|
||||
|
||||
Плагин универсален: подойдёт любой сервис с эндпоинтом `/chat/completions`. Достаточно поменять опции:
|
||||
|
||||
- **OpenAI**: `baseURL: "https://api.openai.com/v1"`, `model: "gpt-4o-mini"`, `apiKey: "{env:OPENAI_API_KEY}"`.
|
||||
- **Любой OpenAI-совместимый прокси** — аналогично.
|
||||
|
||||
## Опции плагина
|
||||
|
||||
| Опция | По умолчанию | Назначение |
|
||||
| --- | --- | --- |
|
||||
| `baseURL` | `https://generativelanguage.googleapis.com/v1beta/openai` | Эндпоинт `/chat/completions` |
|
||||
| `apiKey` | `process.env.GEMINI_API_KEY` | Ключ API (поддерживает `{env:VAR}`) |
|
||||
| `model` | `gemini-2.5-flash` | Модель распознавания |
|
||||
| `providerID` | `ludmila-ai` (legacy) | Читать настройки из блока `provider` конфига opencode |
|
||||
| `visionModels` | модели с `attachment: true` | ID моделей, которые видят изображения нативно |
|
||||
|
||||
## Пример конфигурации (`examples/opencode.json`)
|
||||
|
||||
```json
|
||||
@@ -70,31 +100,31 @@ cp ~/totmin/opencode/plugins/vision-bridge/agents/vision.md ~/.config/opencode/a
|
||||
"$schema": "https://opencode.ai/config.json",
|
||||
"plugin": [
|
||||
"opencode-browser",
|
||||
"git+ssh://git@git.totmin.ru:en2zmax/vision-bridge.git"
|
||||
[
|
||||
"git+https://git.totmin.ru/en2zmax/vision-bridge.git",
|
||||
{
|
||||
"baseURL": "https://generativelanguage.googleapis.com/v1beta/openai",
|
||||
"apiKey": "{env:GEMINI_API_KEY}",
|
||||
"model": "gemini-2.5-flash"
|
||||
}
|
||||
]
|
||||
],
|
||||
"provider": {
|
||||
"ludmila-ai": {
|
||||
"npm": "@ai-sdk/openai-compatible",
|
||||
"name": "Ludmila AI",
|
||||
"google": {
|
||||
"npm": "@ai-sdk/google",
|
||||
"name": "Google",
|
||||
"options": {
|
||||
"baseURL": "https://ai.totmin.ru/v1",
|
||||
"apiKey": "<ЗАМЕНИТЕ_НА_ВАШ_API_КЛЮЧ>"
|
||||
"apiKey": "{env:GEMINI_API_KEY}"
|
||||
},
|
||||
"models": {
|
||||
"gemini/gemini-2.5-flash": {
|
||||
"attachment": true,
|
||||
"limit": {
|
||||
"context": 1048576,
|
||||
"output": 65536
|
||||
}
|
||||
}
|
||||
"gemini-2.5-flash": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"agent": {
|
||||
"vision": {
|
||||
"mode": "subagent",
|
||||
"model": "ludmila-ai/gemini/gemini-2.5-flash",
|
||||
"model": "google/gemini-2.5-flash",
|
||||
"description": "Анализ изображений и скриншотов (OCR текста или разбор UI)",
|
||||
"permission": {
|
||||
"read": "allow",
|
||||
@@ -106,3 +136,4 @@ cp ~/totmin/opencode/plugins/vision-bridge/agents/vision.md ~/.config/opencode/a
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user