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 через тот же шлюз и тот же ключ.

Требования
- 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.

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

Поля формы
| Поле | Значение |
|---|---|
| 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». |
Шаги
- Нажмите Fetch available models. dsh запросит у RouterAI список моделей (стандартный
GET /models) и откроет окно с поиском и галочками. - Отметьте нужные модели и нажмите Add selected. Можно отметить всё, но тогда в каталог попадёт весь список RouterAI — больше пятисот моделей, включая генераторы картинок и видео, которые в чате бесполезны. Удобнее выбрать 5–10 моделей, которыми будете пользоваться.
- Нажмите Create provider. Карточка появится во вкладке Models с зелёной точкой.

То же самое в конфиге
Форма пишет в файл профиля ~/.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 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 с включённым тумблером.

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

Раскройте строку 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 | Пусто. Нужны только для нестандартных шлюзов. |

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

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

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

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

Где что лежит
| Путь | Что там |
|---|---|
~/.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
Недостаточно средств на балансе. Пополните баланс в разделе Биллинг.
Что дальше
- Каталог моделей — выберите модели под задачу, в том числе генераторы картинок с выходом «image»
- Генерация изображений — параметры и цены моделей картинок
- Codex и Claude Code — другие агенты через RouterAI
- deepseek-ai/deepseek-harness — исходники и документация dsh