Блог

OpenCode не работает в России: «ECONNRESET: The socket connection was closed unexpectedly» — причина и что делать

Короткий ответ

С 29–30 октября 2026 года у многих пользователей OpenCode в России (Ростелеком в Иркутске, Перми и Ульяновске, а также Дом.ру) запросы падают с ошибкой ECONNRESET: The socket connection was closed unexpectedly или OpenCode просто молчит. Обновлений при этом не было, аккаунт тот же, подписка Go или Go Plus не помогает. Основная задача в трекере OpenCode — #60399, у неё метка reproduced; остальные сообщения закрыты как её дубликаты.

По замерам участников обсуждения, фильтрация трафика у провайдера молча обрывает TLS-рукопожатие с opencode.ai (а на части линий и с models.dev), если клиент передаёт постквантовый ключ. Из-за него рукопожатие весит около 1,5 КБ. OpenCode работает на среде Bun, а Bun с версии 1.4.1 передаёт такой ключ по умолчанию. Поэтому curl с того же компьютера до opencode.ai достукивается, а OpenCode — нет.

Что можно сделать:

  • Ждать исправления в OpenCode. На 1 ноября 2026 года его нет, следите за #60399.
  • Поставить OpenCode 1.19.3. Пользователи с затронутых линий пишут, что эта версия работает: это последний выпуск на старом Bun. Но это ветка v1, поэтому решение временное.
  • Подключить свой API-провайдер. Запросы к своему провайдеру идут на его адрес, а не на opencode.ai. Один из вариантов — TeamoRouter, он работает из России напрямую; настройка ниже.

Как выглядит ошибка

text
ECONNRESET: The socket connection was closed unexpectedly. For more information, pass `verbose: true` in the second argument to fetch()

AI_APICallError: Cannot connect to API: ECONNRESET: The socket connection was closed unexpectedly.

Та же проблема выглядит и так:

  • opencode run несколько минут ничего не выводит. В логе сервер запускается и загружает провайдеров и модели, а строк session и stream нет (#60399).
  • OpenCode Desktop показывает голый ECONNRESET, пока повторяет запрос (#60680).
  • Перестаёт открываться и сайт opencode.ai (#60573).

Как проверить, что дело в этом

Пока OpenCode не работает, выполните в терминале:

bash
curl -sS -o /dev/null -w "%{http_code}\n" https://opencode.ai/inference/v1/models

В Windows: curl.exe -sS -o NUL -w "%{http_code}" https://opencode.ai/inference/v1/models.

Если команда выводит 200, а OpenCode всё равно не работает, — это та самая фильтрация: curl отправляет короткое рукопожатие, и оно проходит. Если curl тоже не может подключиться, связь с opencode.ai пропала целиком, и причина другая.

Почему так происходит

Затронутые пользователи разобрали это в #60399:

  • Что обрывается. TLS-рукопожатие с постквантовым ключом X25519MLKEM768 весит около 1,5 КБ и не помещается в один сетевой пакет. На затронутых линиях такие рукопожатия с opencode.ai и models.dev остаются без ответа, а то же самое рукопожатие с github.com или registry.npmjs.org проходит. Без постквантовой части рукопожатие с opencode.ai проходит нормально. Значит, фильтр смотрит и на адрес, и на вид рукопожатия.
  • Почему всё сломалось за один день. Участники связали это со средой Bun внутри OpenCode. OpenCode 1.19.3 — последний выпуск на Bun 1.3.14, у которого рукопожатие около 500 байт. OpenCode 1.19.4 и все выпуски v2 работают на Bun 1.4.x с большим рукопожатием. На этих линиях фильтр начал срабатывать 29–30 октября; участники считают, что правило включили централизованно за одну ночь.
  • Дело не только в OpenCode. Chrome 124 и новее тоже передают постквантовый ключ и на тех же линиях тоже не открывают opencode.ai.
  • Повторы не помогают. В тесте одного из участников 8 попыток из 8 с обычным рукопожатием не прошли, а без постквантового ключа прошли все.

Бот поддержки OpenCode воспроизвёл зависание: если рукопожатие застряло, OpenCode молча ждёт, как будто модель просто долго отвечает, и не сообщает о сетевой ошибке. Стандартный тайм-аут ожидания заголовков — около пяти минут, после него OpenCode открывает новое соединение и снова ждёт.

Что делать

  1. Следить за #60399. Участники предложили настройку, отключающую постквантовый ключ, или повтор без него, если рукопожатие зависло; бот OpenCode отметил первое как улучшение, которое стоит рассмотреть разработчикам. На 1 ноября 2026 года исправления нет.
  2. Временно поставить OpenCode 1.19.3. В #60534 пользователь с затронутой линии установил 1.19.3, и OpenCode снова заработал, а другой участник подтвердил, что 1.19.3 отвечает и на бесплатных моделях. Это выпуск ветки v1, а OpenCode переводит всех на v2, поэтому перед этим загляните в #60399. Установка: npm install -g opencode-ai@1.19.3.
  3. Подключить свой API-провайдер. Запросы к провайдеру, которого вы добавили сами, OpenCode отправляет на адрес этого провайдера, а не на opencode.ai. API TeamoRouter по адресу api.teamorouter.com фильтрация не затронула: запросы OpenCode от наших русскоязычных пользователей после 30 октября продолжили приходить, и их стало больше, а не меньше.

Продолжаем работу через TeamoRouter

У нового аккаунта баланс $0 — пополните его до первого запроса. Пополнить можно от $5. Если запрос возвращает 402 (в формате OpenAI, которым пользуется OpenCode, — 400) с текстом «wallet balance is insufficient», значит, баланс пуст, а base URL и ключ настроены правильно. Пополните баланс и повторите запрос.

TeamoRouter даёт один ключ для GPT, Gemini, DeepSeek, Kimi, GLM и Claude; списание идёт по токенам с предоплаченного баланса, подписки нет. Пополнить баланс можно в рублях: в окне пополнения нажмите «Оплатить» и выберите СБП, Т-Банк, ЮMoney или SberPay. Минимум — $5. Можно оплатить и USDT, USDC или ETH: пошагово — в статье «Как оплатить Claude API в USDT».

  1. Создайте API-ключ в консоли TeamoRouter.
  2. Добавьте провайдера в ~/.config/opencode/opencode.json (для всех проектов) или в opencode.json в папке проекта:
json
{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "teamorouter": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "TeamoRouter",
      "options": {
        "baseURL": "https://api.teamorouter.com/v1",
        "apiKey": "{env:TEAMOROUTER_API_KEY}"
      },
      "models": {
        "gpt-6.1-sol": { "name": "GPT 6.1 Sol" },
        "deepseek-flash-1017": { "name": "DeepSeek V4.1 Flash 1017" },
        "kimi-k3.1-pro": { "name": "Kimi K3.1 Pro" },
        "glm-5.3": { "name": "GLM-5.3" }
      }
    }
  }
}

Это формат пользовательского провайдера из документации OpenCode 1; OpenCode 2 его тоже читает, как сказано в руководстве по переходу.

  1. Передайте OpenCode ключ:
bash
export TEAMOROUTER_API_KEY="ваш ключ TeamoRouter"

OpenCode 2 отправляет запросы из общего фонового сервера, поэтому передайте переменную ему: opencode service set env TEAMOROUTER_API_KEY "ваш ключ" (документация).

  1. Выполните /models и выберите модель TeamoRouter. Чтобы сделать её моделью по умолчанию, добавьте в конфиг "model": "teamorouter/gpt-6.1-sol".

В OpenCode Desktop того же провайдера можно добавить в Settings → Server → Providers → Custom provider — см. подключение OpenCode к TeamoRouter. Для моделей Claude лучше использовать Claude Code: этот провайдер работает по протоколу OpenAI и может не попадать в кэш промптов Claude.

Частые вопросы

Мой аккаунт OpenCode заблокировали? Нет. Соединение обрывается во время TLS-рукопожатия, до того как запрос доходит до OpenCode, так что аккаунт и подписка здесь ни при чём. Это же отмечают участники, которые проводили замеры в #60399 и #60534.

Поможет ли подписка Go или Go Plus? Нет. Модели Go тоже обслуживаются через opencode.ai, поэтому ошибка та же.

Почему curl работает, а OpenCode — нет? curl отправляет короткое рукопожатие без постквантового ключа, и фильтр его пропускает.

Поможет ли обновление OpenCode? Пока нет: все выпуски v2 работают на новой версии Bun. Следите в #60399 за выпуском, в котором появится способ отключить постквантовый ключ.

Что дальше

Готовы подключиться?Войдите в консоль, пополните баланс и создайте API-ключ.