Skip to content

dimkurilo/vision-bridge-opencode

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Vision Bridge для OpenCode

Дайте любому текстовому агенту OpenCode способность видеть картинки — без перехода на vision-модель.

Ваш агент работает на DeepSeek, GLM, Qwen или другой модели, которая не умеет работать с изображениями? Этот мост добавляет зрение в два приёма: входящие картинки автоматически описываются текстом (плагин), а когда нужно точное прочтение — агент сам вызывает vision-модель через MCP-сервер. Сама модель остаётся текстовой, зрение приходит снаружи.


Быстрый старт

Для агента: выполните шаги 1–7 по порядку. Каждая команда исполняема буквально.

Шаг 1. Установите плагин opencode-eyesight

Плагин автоматически заменяет входящие изображения на текстовое описание. Инструкция по установке — в репозитории плагина: https://github.com/nicholasgriffintn/opencode-eyesight

Шаг 2. Скопируйте файлы моста

mkdir -p ~/.config/opencode/bin

cp bin/vision-mcp.py            ~/.config/opencode/bin/
cp bin/run-mcp-with-secrets.sh  ~/.config/opencode/bin/
cp PROMPT.md                    ~/.config/opencode/vision-describe-prompt.md

chmod +x ~/.config/opencode/bin/run-mcp-with-secrets.sh

Шаг 3. Выберите провайдер vision-модели

OpenRouter + Alibaba neuraldeep
Цена платно, дешевле всех из 6 провайдеров бесплатно
Доступ из России возможны блокировки (см. ниже) работает без ограничений
Модель qwen3-vl-30b-a3b-instruct qwen3.6-35b-a3b

Гражданам России

В октябре 2025 года Евросоюз принял 19-й пакет санкций, который запретил предоставление ИИ-услуг (включая доступ к языковым моделям через API) лицам и компаниям из России. С мая–июня 2026 года OpenRouter начал рассылать российским пользователям уведомления о невозможности пополнить счёт и грядущей блокировке аккаунтов — сначала перестали проходить платежи, затем последовали технические ограничения.

Если вы в России — рекомендуем neuraldeep: бесплатный тариф включает vision-модель, регистрации ничего не стоит, блокировок нет.

Шаг 4. Создайте файл секретов

cat > ~/.config/opencode/.env.secrets << 'EOF'
# ── ВАРИАНТ A: OpenRouter ──
OPENROUTER_API_KEY=sk-or-v1-ваш-ключ

# ── ВАРИАНТ B: neuraldeep (раскомментируйте и подставьте свой ключ) ──
# VISION_API_KEY=ваш-neuraldeep-ключ
# VISION_MODEL=qwen3.6-35b-a3b
# VISION_BASE_URL=https://api.neuraldeep.ru/v1/chat/completions
# VISION_PROVIDER_ORDER=
EOF

chmod 600 ~/.config/opencode/.env.secrets

Для OpenRouter достаточно указать OPENROUTER_API_KEY — MCP подхватит его автоматически. Для neuraldeep — раскомментируйте четыре строки VISION_* и впишите свой ключ. Получить бесплатный ключ neuraldeep можно по ссылке: зарегистрироваться на neuraldeep →

Шаг 5. Добавьте блоки в opencode.json

Возьмите один файл из config/ и добавьте его содержимое в ваш ~/.config/opencode/opencode.json:

  • OpenRouterconfig/opencode.openrouter.json
  • neuraldeepconfig/opencode.neuraldeep.json

Замените {{HOME}} на путь к вашему домашнему каталогу (например /Users/anton или /home/maria). Если в opencode.json уже есть ключи "plugin" или "mcp" — добавьте записи внутрь существующих, не заменяйте их целиком.

Шаг 6. Добавьте инструкцию в системный промпт агента

Откройте файл из папки injections/, соответствующий вашей модели, и скопируйте блок в системный промпт:

Модель Файл Куда вставить
Любая текстовая (Claude, GPT, Qwen, Llama…) injections/generic.md В любое стабильное место
GLM 5.x injections/glm.md Основной блок — в начало, якорь — в конец
DeepSeek V4 Pro injections/deepseek-pro.md Краткий блок — в начало, якорь — в конец
DeepSeek V4 Flash injections/deepseek-flash.md Только якорь — в самый конец

Блок самодостаточен — структура вашего агента не имеет значения, просто вставьте текст в системный промпт.

Шаг 7. Перезапустите opencode и проверьте

# MCP компилируется?
python3 -m py_compile ~/.config/opencode/bin/vision-mcp.py && echo "OK"

# Проверьте describe_image на любой картинке:
uv run --with mcp --with httpx python3 -c "
import asyncio, importlib.util, os
spec = importlib.util.spec_from_file_location('vmp', os.path.expanduser('~/.config/opencode/bin/vision-mcp.py'))
m = importlib.util.module_from_spec(spec); spec.loader.exec_module(m)
r = asyncio.run(m.describe_image('/путь/к/картинке.png', 'опиши кратко'))
print(r)
"

Если вернулся осмысленный текст — всё работает. Дополнительные сценарии проверки — в smoke-test/PROTOCOL.md.


Как это работает

Мост состоит из двух слоёв, которые дополняют друг друга:

                          ┌─────────────────────────────────┐
  Картинка → контекст ──→ │  СЛОЙ 1: АВТО (плагин)          │ → "[Image: текстовое описание]"
                          │  opencode-eyesight              │   общий обзор, низкая достоверность
                          └─────────────────────────────────┘
                                                                        │
                          ┌─────────────────────────────────┐            │
  Агент: "точный текст?" →│  СЛОЙ 2: РУЧНОЙ (MCP)           │ ←──────────┘
                          │  describe_image(path, prompt)   │ → точный ответ, высокая достоверность
                          └─────────────────────────────────┘

Почему два слоя

Плагин (слой 1) даёт общее описание на входе — этого часто достаточно, чтобы понять суть картинки. Но текстовая модель не может задать изображению уточняющий вопрос: «прочитай текст дословно», «какая кнопка сейчас активна», «сравни первый и третий кадр». Для таких задач нужен слой 2 — MCP-сервер describe_image. Агент вызывает его сам, когда автоописания не хватило, и получает точный ответ на конкретный вопрос.

Без второго слоя агент слепо доверяет общему описанию и додумывает детали, которых там не было.

Дисциплина работы с изображениями

Правило простое — всегда указывайте источник информации:

  • Автоматическое описание (от плагина) — это общий обзор. Низкая достоверность: годится для понимания «что на картинке», но не для точных деталей.
  • describe_image (вызов агентом) — точный ответ на конкретный вопрос. Высокая достоверность.
  • Формулируйте ссылки на источник так: «по данным describe_image: …» или «по автоописанию: …». Не пишите «я вижу…» — модель не видит изображения, она работает с текстом.
  • Сначала используйте автоматическое описание. Обращайтесь к describe_image только тогда, когда нужна точность — каждый вызов расходует токены и время.

Структура репозитория

vision-bridge-opencode/
├── README.md                       # этот файл
├── PROMPT.md                       # шаблон для автоматического описания (слой 1)
├── bin/
│   ├── vision-mcp.py               # MCP-сервер describe_image (слой 2)
│   └── run-mcp-with-secrets.sh     # обёртка: подгружает секреты, запускает MCP
├── config/
│   ├── opencode.openrouter.json    # настройки: OpenRouter + Alibaba
│   └── opencode.neuraldeep.json    # настройки: neuraldeep (бесплатно, РФ)
├── injections/                     # блоки для системного промпта агента
│   ├── generic.md                  # любая текстовая модель
│   ├── glm.md                      # GLM 5.x (разреженное внимание — раннее позиционирование)
│   ├── deepseek-pro.md             # DeepSeek V4 Pro (эффект недавности)
│   └── deepseek-flash.md           # DeepSeek V4 Flash (только якорь)
└── smoke-test/
    └── PROTOCOL.md                 # сценарии проверки

Частые проблемы

Симптом Причина Решение
describe_image ERROR: API key not set ключ не задан проверьте ~/.config/opencode/.env.secrets (шаг 4)
describe_image ERROR: vision API returned 401 неверный ключ перепроверьте ключ провайдера
MCP не появляется в списке инструментов неверный формат конфигурации ключ "mcp" (НЕ mcpServers), тип "local" (НЕ stdio), command — массив
Плагин не описывает картинки модель не подключена проверьте "model" в plugin: openrouter/qwen/... или neuraldeep/qwen3.6-...
vision API returned 404 неверная модель или адрес сверьте VISION_MODEL и VISION_BASE_URL с провайдером
Запросы идут через дорогой провайдер маршрутизация не применена убедитесь, что provider.openrouter.models...options.provider.order задан (шаг 5)

Провайдеры vision-модели

OpenRouter + Alibaba

Шесть провайдеров обслуживают модель qwen3-vl-30b-a3b-instruct; Alibaba — самый дешёвый ($0.13/$0.52 за миллион токенов) и быстрый. Настройка order: ["alibaba"], allow_fallbacks: false жёстко закрепляет провайдер — цена всегда предсказуема. Если нужна отказоустойчивость (переключение на другой провайдер при сбое Alibaba) — поставьте allow_fallbacks: true.

neuraldeep

Бесплатный тариф включает модель qwen3.6-35b-a3b с поддержкой изображений. Один провайдер — маршрутизация не нужна. Регистрация: создать аккаунт neuraldeep →. Ограничение: одна картинка на запрос.


Лицензия

  • bin/vision-mcp.py, injections/, конфигурации — MIT.
  • Плагин opencode-eyesight — сторонний проект со своей лицензией (см. репозиторий плагина).
  • Это не форк плагина, а рецепт интеграции поверх него.

About

Дайте любому текстовому агенту OpenCode способность видеть картинки — без перехода на vision-модель.

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors