Диагностика · opencode

opencode не подхватывает API-ключ — auth и плейсхолдеры {env}

opencode авторизует своего провайдера через options.apiKey — обычно плейсхолдер {env:...}. Почему переменная молча резолвится пустой и запросы падают с 401.

Что вы видите

opencode 401 unauthorized

Почему возникает

  • Плейсхолдер {env:NAME} называет переменную, не заданную в окружении, из которого запущен opencode, — он резолвится пустым, и провайдер не видит ключа.
  • Переменная экспортирована в одной оболочке, а opencode стартует из другой: десктопный лаунчер, другой терминал, панель мультиплексора.
  • Ключ вставлен в opencode.json буквально с окружающими пробелами, либо принадлежит другому эндпоинту, чем baseURL.

Что делать

  • Экспортируйте именно ту переменную, что названа в плейсхолдере, в той же оболочке, затем запустите opencode из неё.
  • Проверьте пару через curl: baseURL из конфигурации плюс ключ из переменной должны сработать вне opencode сначала.
  • Предпочитайте форму {env:...} вставке ключа в файл — она держит секрет вне dotfiles и системы контроля версий.

Ключ через окружение, а не в файле

export APITOKEN_API_KEY="sk-pool-•••"
opencode

# opencode.json references it as:
#   "apiKey": "{env:APITOKEN_API_KEY}"

Похожие запросы

  • opencode api key not working
  • opencode auth error custom provider

Вопросы и ответы

Почему opencode не отправляет API-ключ, хотя opencode.json его называет?+
Плейсхолдер {env:NAME} резолвится на старте из собственного окружения opencode. Если эта оболочка не экспортировала переменную, ключ пуст.
Безопасно ли вставить ключ прямо в opencode.json?+
Работает, но env-плейсхолдер — привычка получше: файлы конфигурации попадают в бэкапы и репозитории, и вставленный ключ едет вместе с ними.
Как понять, какая половина сломана — ключ или URL?+
curl-ните baseURL с ключом вручную. 401 означает пару ключ/эндпоинт; ошибки соединения — URL или сеть.

Пропустите сломанную настройку

apiToken.sale отдаёт стандартный Anthropic API — те же модели, те же SDK, один предоплаченный баланс. Направьте base URL вашего инструмента на него, и конфигурация с этой страницы заработает как написано.