DeepSeek Harness: настройка API Key, Base URL и моделей
Подключите DeepSeek Harness к BetterToken: задайте API Key и Base URL в профиле headless, выберите протокол и проверьте чтение файлов.
Подключите DeepSeek Harness (dsh) к BetterToken через собственный провайдер в профиле headless. В тестах на macOS @deepseek-ai/dsh@0.2.1-rc.2 выполнил текстовые запросы и вызовы инструментов для чтения файлов во всех 3 попытках для каждой комбинации: Chat Completions с моделью GPT, Responses с моделью GPT, Anthropic Messages с моделью Claude и Anthropic Messages с моделью GPT.
Ключевые параметры
| Поле | Значение |
|---|---|
| API Key | API Key BetterToken из переменной окружения, имя которой задано в apiKeyEnv |
| Base URL | https://bettertoken.ai/v1 — Chat Completions / Responses |
| Base URL для Anthropic Messages | https://bettertoken.ai, без /v1 |
| Model | YOUR_MODEL_ID |
| Файл конфигурации | $DSH_HOME/profiles/headless/cordis.patch.yml (DSH_HOME по умолчанию равен ~/.dsh) |
Подготовка
- Node.js 24.9 или новее, согласно официальной инструкции по переходу на rc.2
- API Key BetterToken: зарегистрироваться и получить
- Model ID из каталога моделей
Установка
Запустите проверенную здесь версию без глобальной установки:
npx @deepseek-ai/dsh@0.2.1-rc.2 --helpВо время тестирования npm-тег latest указывал на 0.2.1-rc.2. Это релиз-кандидат. Другие теги, в том числе next, не проверялись.
Ручная настройка
Задайте API Key в переменной окружения, заменив YOUR_API_KEY:
export BETTERTOKEN_API_KEY="YOUR_API_KEY"Создайте ~/.dsh/profiles/headless/cordis.patch.yml. Файл содержит список патчей Cordis. Замените оба значения YOUR_MODEL_ID одним и тем же точным Model ID:
Chat Completions
- id: llm-pi-ai config: providers: bettertoken: api: openai-completions baseURL: https://bettertoken.ai/v1 apiKeyEnv: BETTERTOKEN_API_KEY retryPolicy: mode: normal maxRetries: 2 models: - id: YOUR_MODEL_ID- id: agent-default-model config: provider: bettertoken model: YOUR_MODEL_IDResponses
- id: llm-pi-ai config: providers: bettertoken: api: openai-responses baseURL: https://bettertoken.ai/v1 apiKeyEnv: BETTERTOKEN_API_KEY retryPolicy: mode: normal maxRetries: 2 models: - id: YOUR_MODEL_ID- id: agent-default-model config: provider: bettertoken model: YOUR_MODEL_IDAnthropic Messages
- id: llm-pi-ai config: providers: bettertoken: api: anthropic-messages baseURL: https://bettertoken.ai apiKeyEnv: BETTERTOKEN_API_KEY retryPolicy: mode: normal maxRetries: 2 models: - id: YOUR_MODEL_ID- id: agent-default-model config: provider: bettertoken model: YOUR_MODEL_IDapiKeyEnv содержит имя переменной окружения, а не сам API Key и не выражение ${...}. Для собственного провайдера нужны api, baseURL и хотя бы одна запись в models; в каждой записи обязателен только id модели. Если llm-pi-ai уже настроен, скопируйте провайдеры, которые хотите сохранить, в тот же config: новая запись заменяет существующую.
Для собственных провайдеров поле api принимает только openai-completions, openai-responses и anthropic-messages. В качестве Anthropic Base URL укажите корень сайта: клиент сам добавляет /v1/messages.
Чтобы проверить синтаксис без запроса к модели, выполните npx @deepseek-ai/dsh@0.2.1-rc.2 --profile headless --dump-config.
Проверка подключения
Выполните в том же терминале:
npx @deepseek-ai/dsh@0.2.1-rc.2 --profile headless --json "Reply with only: OK"--json выводит по одному событию JSON на строку. Убедитесь, что код завершения равен 0, поле turn_end.reason указывает на нормальное завершение, а text последнего события final равен OK. При сбое тоже может появиться пустое событие final, поэтому одного его наличия недостаточно.
Для проверки доступа к файлам создайте sample.txt в пустом каталоге. Из этого каталога выполните ту же команду с запросом Read sample.txt using a tool. Reply with only its exact contents.. Убедитесь, что вывод содержит tool_call, tool_result с текстом файла и совпадающий с ним текст final.
Смена модели
Замените оба значения YOUR_MODEL_ID другим точным Model ID. Если новая модель использует другой протокол, например Claude через Anthropic Messages, измените вместе api и baseURL. Чтобы получить список моделей шлюза, выберите Fetch available models для собственного провайдера в веб-интерфейсе DeepSeek Harness. В тестах один и тот же сервис обнаружения возвращал список моделей BetterToken для всех трёх протоколов.
Частые ошибки
| Симптом | Что проверить |
|---|---|
MISSING_CREDENTIAL, код завершения 1, запроса нет в панели управления | Процесс не получил переменную с именем из apiKeyEnv. Экспортируйте её в терминале, из которого запускаете dsh, и проверьте написание. Эта проверка выполняется локально. |
Профиль headless не использует Key, сохранённый в веб-интерфейсе | Профиль headless читает учётные данные только из окружения запуска, затем из .env в текущем каталоге, затем из .env в DSH_HOME, в этом порядке. |
404, путь запроса заканчивается на /v1/v1/messages | В конце Anthropic baseURL указан /v1. Используйте https://bettertoken.ai. |
| Модель не найдена | Снова скопируйте Model ID из каталога моделей и укажите его в обоих местах. |
| Много повторных попыток после сбоя | Без retryPolicy адаптер по умолчанию делает 5 повторных попыток. Явно задайте maxRetries, как в примерах. |
| Ошибка версии Node.js | Используйте Node.js 24.9 или новее. |
См. также
- Сравнение поддерживаемых инструментов
- Ошибки API и лимиты запросов
- Официальная документация по провайдерам
Технические детали
Для трёх значений api в тестах использовались пути /v1/chat/completions, /v1/responses и /v1/messages. dsh также автоматически запрашивает название сессии через настроенные провайдер и модель, поэтому одна задача может вызывать несколько запросов. Лимиты вывода по умолчанию добавлял клиент, например 32768 токенов для основного запроса; в конфигурации они не задавались.
Поля input и contextWindow в записи модели — это объявления для клиента. Они не запрашивают и не подтверждают лимиты шлюза. Ввод изображений не проверялся. Тесты проводились только на macOS.

