genmux API теперь доступен всем. Читать документацию →
genmux API

Блог

OpenCode с DeepSeek V4 через один ключ genmux

5 мин чтенияАвтор genmux API Team


OpenCode — терминальный агент для программирования, который умеет работать с любым OpenAI-совместимым бэкендом. А genmux с версии 0.4.0 отдаёт то, без чего агент не живёт: вызов функций. POST /v1/chat/completions принимает tools, возвращает tool_calls и стримит delta.tool_calls ровно так, как это делает OpenAI, — поэтому OpenCode читает файлы, правит их и гоняет тесты через DeepSeek V4 так же, как через любую западную модель. Ниже — настройка, выбор модели и честная оценка стоимости сессии.

Блок конфигурации

Положите это в opencode.json в корне проекта (или в ~/.config/opencode/opencode.json, чтобы работало во всех проектах):

json
{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "genmux": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "genmux",
      "options": { "baseURL": "https://api.genmux.tech/v1", "apiKey": "{env:GENMUX_API_KEY}" },
      "models": {
        "deepseek-v4-flash": { "name": "DeepSeek V4 Flash" },
        "deepseek-v4-pro": { "name": "DeepSeek V4 Pro" },
        "qwen3-max": { "name": "Qwen3-Max" }
      }
    }
  }
}

Экспортируйте ключ и запускайте:

bash
export GENMUX_API_KEY=nb_live_...
opencode --model genmux/deepseek-v4-flash
# or one-shot, for scripts and CI:
opencode run --model genmux/deepseek-v4-flash "add a --json flag to cmd/report and update the README"

{env:GENMUX_API_KEY} держит ключ вне файла — это важно, если opencode.json лежит в репозитории. Карта models — это просто то, что появится в переключателе моделей OpenCode; любой из семи id с поддержкой инструментов работает как genmux/<id>, стоит его туда добавить.

Flash или Pro

Обе модели V4 принимают инструменты, у обеих контекст 1M токенов, обе умеют думать (reasoning_effort включает и выключает thinking). Разница — в цене и глубине:

МодельДля чегоЦена за 1М токенов (вход / выход)
deepseek-v4-flashПовседневные циклы агента: чтение кода, мелкие правки, тесты, сообщения коммитов$0.198 / $0.594
deepseek-v4-proТяжёлые рефакторинги, изменения через несколько файлов, разборы «почему падает тест»$0.594 / $1.782

Рабочая схема: Flash по умолчанию, а когда агент начинает ходить по кругу — /model и переключение на Pro. В нашем тесте агентских задач Flash набрал 19/20, Pro — 20/20 (подробности в посте про эмуляцию вызова функций), так что дефолт — это не компромисс по надёжности, а компромисс по тому, насколько далеко модель думает, прежде чем действовать. qwen3-max в блоке выше потому, что у него есть зрение — пригодится, когда задача начинается со скриншота.

Как вызовы инструментов выглядят со стороны OpenCode

У OpenCode около двадцати инструментов — read, write, edit, bash, glob, grep, list, webfetch, список задач и ещё несколько — и каждый из них уходит JSON-схемой в массиве tools в каждом запросе. genmux вписывает эти определения в системный промпт, стримит ответ модели обратно и превращает её блок вызова в нормальный чанк delta.tool_calls с finish_reason: "tool_calls". OpenCode разницы не видит: получает вызов, выполняет его локально, добавляет сообщение role: tool с результатом и спрашивает дальше.

Один ход на проводе, сокращённо:

→ POST /v1/chat/completions  {"model":"deepseek-v4-flash","stream":true,"tools":[…20 tools…],"messages":[…]}
← data: {"choices":[{"delta":{"tool_calls":[{"index":0,"id":"call_7f…","type":"function","function":{"name":"read","arguments":"{\"filePath\":\"cmd/report/main.go\"}"}}]}}]}
← data: {"choices":[{"delta":{},"finish_reason":"tool_calls"}],"usage":{"prompt_tokens":6814,"completion_tokens":31,"total_tokens":6845,"cost":0.109,"cost_source":"estimated"}}
← data: [DONE]
→ POST … messages now end with {"role":"tool","tool_call_id":"call_7f…","content":"package main\n…"}

Два свойства стоит знать. Модели обычно выдают один вызов за ход, а не пачку параллельных; OpenCode крутит цикл, так что правка пяти файлов — это пять коротких обменов, а не один длинный. А текст, который модель пишет перед вызовом («Сначала прочитаю файл»), стримится как обычный контент, поэтому TUI продолжает комментировать, пока вызов собирается.

Сколько стоит сессия

Определения инструментов не бесплатны: они рендерятся текстом и считаются как токены промпта в каждом запросе — примерно 40 токенов на инструмент плюс его схема, около 1,5K токенов на запрос для набора OpenCode. Но главный расход — история диалога: каждый запрос заново отправляет всё, что уже прочитано.

Возьмём реалистичную сессию: 40 запросов, промпты растут с 3K до 25K токенов по мере чтения файлов (в среднем 12K), ответы в среднем по 400 токенов. Итого 480K токенов на входе и 16K на выходе:

МодельВход (480K)Выход (16K)СессияИз них инструменты (60K)
deepseek-v4-flash$0.095$0.010≈ $0.105$0.012
deepseek-v4-pro$0.285$0.029≈ $0.314$0.036
qwen3-max$0.518$0.086≈ $0.605$0.065

В юнитах это 8,4 юнита≈ $0.10Flash, 40 запросов против 25,1 юнита≈ $0.31Pro, 40 запросов по тарифу пакета Scale ($0.0125 за юнит). Накладные расходы на инструменты на Flash — около цента; доминирует история, поэтому /compact (или новая сессия на каждую задачу) экономит больше, чем любая обрезка набора инструментов.

Если что-то идёт не так

400 tools_unsupported — id модели один из трёх без поддержки инструментов (qwen3-6-flash, doubao-seed-2-lite, doubao-seed-2-mini). Вызов функций эмулируется и включён только там, где евал прошёл: две модели V4, deepseek-v3, qwen3-7-max, qwen3-max, doubao-seed-2-pro и doubao-seed-2-code. В GET /v1/models флаг виден как params_schema.tools.

Модель ответила текстом вместо вызова инструмента. tool_choice: required и именованная функция — это инструкция, которую модель может проигнорировать; маленькие модели иногда так делают. OpenCode использует auto, так что на практике это лишнее «давай, продолжай» от вас, а не сломанный цикл. Pro за 20 задач не проигнорировал ни разу.

Жалобы на max_tokens. OpenCode отправляет max_tokens от 32K и выше для любой модели. genmux не отклоняет запрос, а обрезает значение до max_output_tokens модели, так что настраивать нечего. Бюджет ответа по умолчанию у моделей с инструментами — 8192 токена, этого хватает на переписывание целого файла.

Вызов пришёл текстом. Если в ответе сырой блок <function_call> вместо карточки инструмента, парсер не смог его разобрать — напишите нам с id модели и ответом; мы считаем malformed по каждой модели и расширяем парсер, когда модель «уплывает».

С чего начать

Ключ из личного кабинета, блок выше — и opencode --model genmux/deepseek-v4-flash это вся миграция. Оплата сегодня — USDT, карты и СБП подключаются. Aider, Cline, Roo Code и Continue настраиваются так же — Aider разобран в отдельном посте, а краткая версия для каждого клиента — на странице про агентов для программирования. Полный справочник параметров tools, tool_choice и response_format — в документации.

Об авторе

Автор genmux API Team — genmux API.

Подробнее о нас