Краткий ответ
DeepSeek Harness (dsh) — это не только Web UI по адресу http://127.0.0.1:3080. Он поддерживает и headless-агента для кода: без браузера, только DEEPSEEK_API_KEY в переменных окружения или в .env — и агент в фоне сам читает файлы, выполняет команды и правит код.
Это подходит для автоисправлений в CI, задач по расписанию и скриптовых массовых рефакторингов — для всего, где за процессом никто не следит, а агент должен довести работу до конца.
Что нужно для headless-режима
Headless-режиму нужен только работающий бэкенд с моделью. Минимальная конфигурация:
export DEEPSEEK_API_KEY="sk-teamo-your-key"
export DEEPSEEK_BASE_URL="https://api.teamorouter.com/v1"
Ключ можно положить и в файл .env в корне репозитория (добавьте его в .gitignore):
DEEPSEEK_API_KEY=sk-teamo-your-key
DEEPSEEK_BASE_URL в .env писать нельзя: dsh 0.2.x тогда отказывается запускаться — эту переменную может задать только окружение, из которого запускается dsh, поэтому её нужно экспортировать (export). Мы проверили это на dsh 0.2.1-rc.3 2 ноября 2026 года: с ключом в .env в корне репозитория и экспортированной DEEPSEEK_BASE_URL запросы дошли до шлюза TeamoRouter.
После настройки headless-агент вызывает инструменты точно так же, как агент в Web UI, — только без визуального интерфейса, а результат возвращает через stdout или файл отчёта.
С этими двумя переменными dsh 0.2.x работает через встроенного провайдера DeepSeek: модель по умолчанию — deepseek-flash, а DEEPSEEK_DEFAULT_MODEL не действует. Чтобы headless-агент по умолчанию работал на deepseek-v4-pro или на других моделях TeamoRouter (в том числе на бесплатной V4 Flash — deepseek-v4-flash-free), добавьте TeamoRouter как провайдера — см. статью «Подключаем DeepSeek Harness к TeamoRouter».
Разовый запуск: задача, которая выполняется и завершается
Самый распространённый вариант headless-режима — разовый запуск: вы даёте задачу, агент отрабатывает её до конца (или до лимита бюджета) и завершается:
dsh headless "Fix the N+1 query in src/services/reporting.py and make the related tests pass"
Агент читает файлы → разбирается → правит → запускает тесты → исправляет по результатам — и так до готовности. Такая модель «выполнить до конца» идеально ложится на шаги CI: поручите ему детерминированные задачи вроде «исправить ошибки линтера» или «добавить тесты» — и это будет быстрее, чем делать их вручную.
Сервер автоматизации ACP: постоянные headless-сессии
Более продвинутый путь — сервер автоматизации ACP: он отдаёт новые агентные сессии по JSON-RPC через stdio и тоже требует DEEPSEEK_API_KEY. Это подходит для повторяющихся, скриптовых вызовов агента, когда не хочется каждый раз порождать новый процесс.
Как выбрать между двумя вариантами:
| Форма | Для чего подходит | Особенность |
|---|---|---|
| Разовый запуск | CI, задачи по расписанию | Выполнение до конца, простота |
| Сервер ACP | Долгоживущая интеграция, скриптовые вызовы | Постоянная работа, переиспользование сессий |
Типичные проблемы
Headless-агент не запускается или сообщает, что нет API-ключа?
Убедитесь, что DEEPSEEK_API_KEY экспортирован в той же оболочке, либо что .env лежит в корне репозитория и загружается. Сначала проверьте командой echo $DEEPSEEK_API_KEY.
Как понять, что headless-задача завершилась?
Следите за кодом возврата и stdout. Разовые запуски завершаются по окончании работы; сессии ACP выдают явное событие завершения сессии.
Может ли фоновый запуск выйти из-под контроля?
Да — если границы задачи размыты. В headless-режиме нет интерфейса, чтобы прервать агента на лету, поэтому: задавайте чёткие границы задачи, ограничивайте рабочий каталог и по возможности ставьте лимит бюджета. Не позволяйте агенту свободно бродить по большому репозиторию.
Использует ли headless-режим те же инструменты, что и Web UI?
Да. Инструменты берутся из тех же плагинов и пресетов; разница только в визуальном интерфейсе. Результат в headless-режиме возвращается через stdout или отчёт.
Можно ли запускать его по расписанию?
Да. Оберните headless-команду в cron / launchd / CI с настроенным .env — и получите постоянную автоматизацию вроде «автоисправление линтера каждую ночь» или «еженедельный рефакторинг».
Чтобы развернуть фонового агента для кода, получите ключ в TeamoRouter, настройте переменные окружения и встройте headless-команду dsh в свои скрипты или CI.