Загрузка...

DeepSeek Harness: настройка через RouterAI и генерация картинок (dsh-image-gen)

DeepSeek Harness (dsh) — открытый агент-харнес от DeepSeek с веб-интерфейсом: чат, рабочие пространства с файлами, инструменты (shell, файлы, веб-поиск) и плагины. Из коробки он ждёт ключ DeepSeek, но умеет работать с любым OpenAI-совместимым шлюзом.

RouterAI предоставляет совместимые с OpenAI эндпоинты POST /api/v1/responses и POST /api/v1/chat/completions, поэтому dsh подключается штатным способом — через «Custom model API» в настройках. Один ключ RouterAI даёт доступ ко всем моделям каталога: DeepSeek, Qwen, Kimi, GLM, Claude, GPT и другим.

После настройки по этому гайду в чате dsh будет работать DeepSeek V4.1 Flash через RouterAI, а плагин dsh-image-gen будет рисовать картинки моделью GPT Image 2.5 через тот же шлюз и тот же ключ.

Главное окно DeepSeek Harness: слева список сессий, в центре поле ввода, в строке инструментов выбраны OpenAI Compatible для картинок и DeepSeek V4.1 Flash для чата
Главное окно dsh после настройки. В строке ввода две «таблетки»: OpenAI Compatible — провайдер картинок из плагина, DeepSeek: DeepSeek V4.1 Flash — модель чата из RouterAI.

Требования

  • Node.js 22 или новее
  • API-ключ из личного кабинета — один и тот же для чата и картинок
  • Браузер на той же машине, где запущен dsh (или проброс порта через SSH)

Запуск dsh и вход

Самый короткий путь — одна команда, которая поднимает веб-интерфейс на локальном порту 3080:

npx @deepseek-ai/dsh web

В консоли появится строка вида dsh web: http://127.0.0.1:3080/?token=…. Токен обязателен: без него сервер отвечает 401. Откройте ссылку целиком — браузер получит cookie, и дальше токен в адресе не нужен.

dsh можно запускать и в Docker: образ на node:24 с глобально установленным пакетом @deepseek-ai/dsh, состояние (~/.dsh) в томе. Ссылку с токеном в этом случае выдаёт docker compose logs. Для настройки разницы нет: дальше всё делается в браузере.

⚠ dsh принимает запросы к настройкам и хранилищу ключей только с loopback-адреса. Если открыть интерфейс по IP машины, чат работать будет, а сохранить ключ или провайдера не получится. Открывайте по 127.0.0.1 или пробрасывайте порт через SSH.

Ключ RouterAI

Создайте ключ в личном кабинете: «Создать новый ключ». Ключ показывается один раз — сохраните его. Мастер-ключ не нужен, он только для управления ключами.

Базовый адрес API, который понадобится в обеих формах ниже:

https://routerai.ru/api/v1

RouterAI как провайдер моделей

Откройте Settings (внизу левой панели) → вкладка Models. Здесь уже есть карточка DeepSeek с красной точкой — ключа нет, её трогать не нужно. Нажмите Add model provider.

Вкладка Models в настройках: карточка DeepSeek без ключа, карточка routerai с пометкой Custom и зелёной точкой, кнопка Add model provider
Settings → Models. Так вкладка выглядит после настройки: routerai с зелёной точкой означает, что ключ сохранён.

В открывшейся карточке переключитесь с «Third-party model provider» на Custom model API. Первый режим предлагает каталог известных провайдеров (anthropic, openai, moonshotai и другие) и сам знает их адреса, но RouterAI в этом списке нет, поэтому нужен режим с ручным адресом.

Форма Custom model API: поля Provider ID, Display name, Base URL, выпадающий список API protocol, поле API key, пустой список моделей и кнопка Fetch available models
Пустая форма Custom model API. Заполняется один раз, потом провайдер редактируется кнопкой Edit.

Поля формы

Поле Значение
Provider ID routerai. Постоянный идентификатор: он попадает в сессии, ссылки на ключ и настройку модели по умолчанию. Переименовать нельзя — только создать нового провайдера.
Display name Любое, например routerai. Показывается в списках.
Base URL https://routerai.ru/api/v1
API protocol OpenAI Responses. На нём проверена работа DeepSeek V4.1 Flash. Если какая-то модель через Responses отказывает, переключите на OpenAI Chat Completions — RouterAI поддерживает оба протокола.
API key Ключ RouterAI. Он уходит в хранилище dsh и обратно в форму не возвращается — поле потом показывает «Configured».

Шаги

  1. Нажмите Fetch available models. dsh запросит у RouterAI список моделей (стандартный GET /models) и откроет окно с поиском и галочками.
  2. Отметьте нужные модели и нажмите Add selected. Можно отметить всё, но тогда в каталог попадёт весь список RouterAI — больше пятисот моделей, включая генераторы картинок и видео, которые в чате бесполезны. Удобнее выбрать 5–10 моделей, которыми будете пользоваться.
  3. Нажмите Create provider. Карточка появится во вкладке Models с зелёной точкой.
Карточка провайдера routerai в режиме редактирования: поле API key с надписью Configured, раскрытые Customized settings с Base URL https://routerai.ru/api/v1, протоколом OpenAI Responses и списком моделей
Готовый провайдер после Edit → Customized settings. Ключ скрыт, адрес и протокол можно менять, список моделей редактируется построчно.

То же самое в конфиге

Форма пишет в файл профиля ~/.dsh/profiles/web/cordis.patch.yml. Его можно править руками (кнопка Open configuration file в заголовке настроек) — сервер перечитает файл на следующем запросе. Ключ в файл не попадает: там только ссылка на переменную, сам ключ лежит в ~/.dsh/.credentials.yaml. Фрагмент с двумя моделями:

- id: llm-pi-ai
  name: "@deepseek-ai/dsh-llm-pi-ai"
  config:
    providers:
      routerai:
        apiKeyEnv: ROUTERAI_API_KEY
        api: openai-responses
        baseURL: https://routerai.ru/api/v1
        models:
          - id: deepseek/deepseek-v4.1-flash
            name: "DeepSeek: DeepSeek V4.1 Flash"
            contextWindow: 1048576
          - id: moonshotai/kimi-k2.7-code
            name: "MoonshotAI: Kimi K2.7 Code"
            contextWindow: 262144

Если шлюз отвергает запросы при верном ключе и адресе, документация dsh советует добавить на провайдера блок compat с supportsDeveloperRole: false и maxTokensField: max_tokens. С RouterAI это не понадобилось.

Выбор модели по умолчанию

Вернитесь в чат и нажмите на название модели справа в строке ввода. Откроется меню, в нём пункт Model со списком и поиском. Модели сгруппированы по провайдерам: пустая группа DeepSeek и группа routerai с тем, что вы добавили. Выбранная модель становится моделью по умолчанию для новых сессий; у уже начатой сессии модель остаётся своя.

Список моделей с поиском deepseek: группа DeepSeek и группа routerai, в которой отмечена DeepSeek V4.1 Flash
Список моделей в чате с фильтром «deepseek». Галочка у DeepSeek: DeepSeek V4.1 Flash из группы routerai.

В примере выбрана DeepSeek V4.1 Flash: миллион токенов контекста, принимает текст и картинки, одна из самых дешёвых моделей в каталоге. Цены на момент написания:

Модель Роль Вход, ₽ за 1 млн токенов Выход, ₽ за 1 млн токенов
deepseek/deepseek-v4.1-flash чат и агент 9,81 19,63
openai/gpt-image-2.5-sunburst картинки 545,14 по токенам картинки

У генераторов картинок выход считается в токенах изображения: картинка 1:1 в 1K при качестве high стоит около 1 800 токенов, при max — около 7 000 (см. генерацию изображений). Актуальные цены — в каталоге моделей.

Плагин dsh-image-gen

dsh-image-gen добавляет в dsh генерацию и редактирование картинок прямо в чате, холст, пакетную «студию» и галерею. Среди провайдеров плагина есть «OpenAI-compatible (relay)» с произвольным адресом — через него плагин ходит в RouterAI по OpenAI Images API.

Установка

Плагин ставится в профиль web командой dsh, которая передаёт аргументы в pnpm:

dsh plugin --profile web add dsh-image-gen@0.9.0
# в Docker:
docker compose exec dsh dsh plugin --profile web add dsh-image-gen@0.9.0
⚠ Указывайте версию явно. pnpm 11 по умолчанию не ставит релизы моложе нескольких дней, поэтому dsh-image-gen@latest может молча откатиться на предыдущую версию. С явной версией pnpm добавляет исключение и ставит то, что просили.

После установки перезапустите dsh. В левой панели нажмите Plugins: в разделе Installed появится dsh-image-gen с включённым тумблером.

Страница Plugins: восемь официальных плагинов и раздел Installed с одним плагином dsh-image-gen, тумблер включён
Страница Plugins. Официальные плагины поставляются с dsh, установленный dsh-image-gen показан ниже.

Настройка провайдера картинок

Нажмите на dsh-image-gen. Откроется страница плагина с блоком Image Generation. Сначала выберите Default provider: OpenAI-compatible (relay) — этого провайдера агент будет использовать по умолчанию.

Страница плагина dsh-image-gen: переключатель Default provider с выбранным OpenAI-compatible (relay), ниже список провайдеров со статусами Key missing и Key set
Страница плагина. Выбран OpenAI-compatible (relay), у него статус Key set, у остальных провайдеров ключей нет.

Раскройте строку OpenAI-compatible (relay) и заполните форму:

Поле Значение
API Key Тот же ключ RouterAI. Сохраняется в хранилище dsh под именем DSH_IMAGE_GEN_OPENAI_COMPAT_KEY и обратно не показывается.
Endpoint / Base URL https://routerai.ru/api/v1
Model openai/gpt-image-2.5-sunburst. Кнопка Fetch models покажет только модели с выходом «image» — можно выбрать из списка. Подойдут и другие генераторы из каталога RouterAI, например Seedream или Flux.
Edit request format Standard multipart (official OpenAI). Это формат для редактирования картинок; для генерации с нуля он не важен.
Default generation quality Пусто — качество выберет модель. GPT Image 2.5 через RouterAI понимает auto, low, medium, high, xhigh, max; в списке доступных качеств в примере оставлены первые четыре.
Custom resolution table, extra fields Пусто. Нужны только для нестандартных шлюзов.
Раскрытая строка OpenAI-compatible (relay): поле API Key с подсказкой Leave empty to keep configured key, Base URL https://routerai.ru/api/v1, Model openai/gpt-image-2.5-sunburst, кнопка Fetch models, формат Standard multipart, список качеств auto, low, medium, high
Заполненная форма провайдера. Ключ уже сохранён, поэтому поле пустое с подсказкой «Leave empty to keep configured key».

Внизу формы две кнопки: Test connection проверяет ключ и адрес, Save сохраняет. Ниже на странице ещё два блока, которые стоит включить:

  • Save to workspace с папкой dsh-image-gen: каждая сгенерированная картинка пишется файлом в рабочее пространство сессии, а не только в чат.
  • Show the image provider pill in the chat input bar: добавляет в строку ввода «таблетку» для быстрой смены провайдера картинок, по умолчанию она выключена.
Нижняя часть страницы плагина: остальные провайдеры без ключей, блок Workspace с включённым Save to workspace и папкой dsh-image-gen, блок Interface с включённой таблеткой провайдера, компонент dsh-image-gen в статусе Running
Низ страницы плагина: сохранение в рабочее пространство, таблетка в строке ввода и статус компонента Running.

Так выглядит эта таблетка в чате. Галочка стоит у OpenAI Compatible, рядом модель и статус ключа; у остальных провайдеров ключей нет.

Выпадающий список Image model в строке ввода: Gemini, OpenAI, OpenAI Compatible с галочкой и статусом Key configured, Seedream, DashScope, Grok, Zhipu GLM
Список Image model из таблетки в строке ввода.

Результат

Дальше просто пишете в чат, что нарисовать. Агент на DeepSeek V4.1 Flash сам вызывает инструмент плагина, получает картинку от RouterAI, показывает её в ответе и кладёт файл в папку dsh-image-gen рабочего пространства. Потом можно попросить изменить результат — плагин передаст исходник на редактирование.

Сессия чата: сгенерированная картинка киберпанк-коровы на неоновой улице, под ней ответ агента со ссылкой на файл image-2702ca00.jpg и описанием кадра
Сессия «Cinematic cyberpunk cow on neon street»: картинка 16:9 и ответ агента со ссылкой на сохранённый файл. Внизу статистика: 1 ход, 3 шага, 30 тысяч токенов.

Сам файл результата в полном размере — ниже. Запрос был текстовым: «cinematic cyberpunk cow on a neon street, 16:9».

Киберпанк-корова на мокрой неоновой улице, формат 16:9
«Cinematic cyberpunk cow on neon street», 16:9, 2048×1152.

Где что лежит

Путь Что там
~/.dsh/profiles/web/cordis.patch.yml Все настройки профиля web: провайдеры и модели, конфиг плагина, модель по умолчанию. Это то, что пишут формы в интерфейсе.
~/.dsh/.credentials.yaml Ключи. Ключ RouterAI для чата лежит под именем ROUTERAI_API_KEY, ключ плагина — под DSH_IMAGE_GEN_OPENAI_COMPAT_KEY.
~/.dsh/profiles/web/node_modules Установленные плагины. Обновление — та же команда dsh plugin --profile web add с новой версией и перезапуск.
<workspace>/dsh-image-gen/ Сгенерированные картинки, если включено «Save to workspace».
~/.dsh/sessions Логи сессий. Переменная DSH_HOME переносит весь каталог в другое место (в Docker так и сделано).

Проверить, что плагин подхвачен, можно командой dsh --profile web --dump-config: в выводе должна быть запись dsh-image-gen с вашим провайдером.

Решение проблем

Не сохраняется ключ или провайдер (403)

Интерфейс открыт не с loopback-адреса. Откройте dsh по http://127.0.0.1:3080 или пробросьте порт через SSH: ssh -L 3080:127.0.0.1:3080 host.

Ошибка аутентификации (401)

  • Убедитесь, что ключ взят из личного кабинета и активен.
  • В dsh ключ хранится отдельно для чата (провайдер routerai) и для плагина (OpenAI-compatible) — проверьте оба места.

Fetch available models ничего не находит

Проверьте Base URL: он должен заканчиваться на /api/v1 без завершающего слеша. Модели всегда можно добавить вручную по идентификатору из каталога, например deepseek/deepseek-v4.1-flash.

После установки плагина нет раздела Image Generation

Перезапустите dsh целиком и проверьте dsh --profile web --dump-config. Если записи dsh-image-gen нет, повторите установку с явной версией.

402 Payment Required

Недостаточно средств на балансе. Пополните баланс в разделе Биллинг.

Что дальше