Документация API go2llm

Zed со своим API: openai_compatible в settings.json

Zed поддерживает произвольные OpenAI-совместимые эндпоинты через блок language_models.openai_compatible в settings.json. Достаточно прописать api_url: https://go2llm.tech/v1, перечислить модели в available_models и положить ключ gk_sk_… в переменную окружения — после этого агент Zed, inline-ассистент и генерация коммит-сообщений работают через go2llm.

Проверено живым запросом: нет. Инструкция составлена по документации Zed. Если что-то не сходится — напишите в @go2llm_support, поправим. Живым запросом у go2llm проверены только Claude Code и OpenCode. Zed относится к классу «клиент со своим base URL» — по документации Zed такой режим поддерживается штатно.

Источник документации: Zed — Use API Access, раздел OpenAI-Compatible Endpoints, Configuring Zed.

Дата публикации: 11 сентября 2026.

Что понадобится

  1. Установленный Zed.
  2. Ключ go2llm с префиксом gk_sk_. При регистрации начисляется $1 на баланс, минимальное пополнение — $1.
  3. Base URL: https://go2llm.tech/v1 для OpenAI-протокола либо https://go2llm.tech (без /v1) для Anthropic-протокола.
  4. Точные public ID моделей: curl https://go2llm.tech/v1/models — эндпоинт открыт без ключа, опубликованных моделей сейчас: 65.

Пошаговая настройка

Шаг 1. Откройте settings.json

Zed хранит пользовательские настройки здесь:

  • macOS: ~/.config/zed/settings.json
  • Linux: ~/.config/zed/settings.json (или $XDG_CONFIG_HOME/zed/settings.json)
  • Windows: %APPDATA%\Zed\settings.json

Открыть файл можно командой zed: open settings file из палитры команд. Синтаксис — JSON с поддержкой комментариев //.

Шаг 2. Добавьте провайдера openai_compatible

Вставьте в settings.json блок:

{
  "language_models": {
    "openai_compatible": {
      "go2llm": {
        "api_url": "https://go2llm.tech/v1",
        "available_models": [
          {
            "name": "claude-sonnet-5",
            "display_name": "go2llm Sonnet 5",
            "max_tokens": 200000,
            "max_output_tokens": 32000,
            "capabilities": {
              "tools": true,
              "images": false,
              "parallel_tool_calls": false,
              "prompt_cache_key": false,
              "chat_completions": true,
              "interleaved_reasoning": false,
              "max_tokens_parameter": true
            }
          },
          {
            "name": "gpt-5.6-sol",
            "display_name": "go2llm GPT-5.6 Sol",
            "max_tokens": 200000
          }
        ]
      }
    }
  }
}

Разбор ключей по документации Zed. go2llm — это provider ID, вы выбираете его сами. api_url — база OpenAI-совместимого API. В available_models каждый элемент обязан иметь name (точный public ID модели), опционально display_name и max_tokens (размер контекста).

Блок capabilities важен для go2llm по двум причинам. Во-первых, "images": false — текстовые эндпоинты go2llm бинарные вложения не принимают и отдают 400 unsupported_content_type. Во-вторых, "chat_completions": true — значение по умолчанию, и его нельзя переключать в false: у go2llm не опубликован эндпоинт /v1/responses, и Zed при chat_completions: false уйдёт именно туда и получит 404.

Поле "max_tokens_parameter": true заставляет Zed слать лимит вывода как max_tokens, а не max_completion_tokens. По умолчанию Zed ставит здесь false. Принимает ли go2llm max_completion_tokens наравне с max_tokens, мы отдельно не документировали — поэтому оставляйте true и шлите max_tokens: этот вариант используется во всех проверенных примерах. Если нужен именно max_completion_tokens, напишите в @go2llm_support, ответим и дополним страницу.

Шаг 3. Положите ключ в переменную окружения

Документация Zed прямо запрещает класть ключи в settings.json: «Do not put API keys in settings.json». Для openai_compatible имя переменной генерируется из provider ID — верхний snake case плюс _API_KEY. Для provider ID go2llm это:

export GO2LLM_API_KEY=gk_sk_ВАШ_КЛЮЧ

Переменную нужно экспортировать в окружении, из которого стартует Zed. Альтернатива — ввести ключ в UI: Settings → AI → LLM Providers (действие agent::OpenSettings); тогда Zed положит ключ в системный keychain. Непустая переменная окружения имеет приоритет над значением из keychain.

Шаг 4 (альтернатива). Нативный Anthropic-протокол

У go2llm есть собственный /v1/messages без прослойки-конвертера, а Zed отдельно поддерживает anthropic_compatible:

{
  "language_models": {
    "anthropic_compatible": {
      "go2llm-anthropic": {
        "api_url": "https://go2llm.tech",
        "available_models": [
          {
            "name": "claude-opus-5",
            "display_name": "go2llm Opus 5",
            "max_tokens": 200000,
            "max_output_tokens": 32000,
            "capabilities": {
              "tools": true,
              "images": false,
              "prompt_caching": true
            }
          }
        ]
      }
    }
  }
}

Обратите внимание: для Anthropic-протокола api_url указывается без /v1 — go2llm сам добавляет /v1/messages. Ключ для этого провайдера Zed ждёт в переменной GO2LLM_ANTHROPIC_API_KEY (provider ID go2llm-anthropic в верхнем snake case).

Про prompt_caching: true: prompt caching на go2llm учитывается и тарифицируется на обоих протоколах — запись кэша по цене in, чтение по цене cache из прайса. Но сам шлюз кэш не включает: он работает ровно от того, что клиент положил в тело запроса, то есть от cache_control, который расставляет Zed. Конкретно связку Zed + prompt_caching: true мы живым запросом не проверяли, поэтому сверяйте фактический расход по usage.cost_usd в ответе.

Шаг 5. Перезапустите Zed

Zed инициализирует провайдеров при старте и читает переменные окружения из окружения своего процесса, поэтому после export приложение нужно перезапустить.

Проверка, что заработало

Сначала проверьте шлюз напрямую:

curl https://go2llm.tech/v1/chat/completions \
  -H "Authorization: Bearer $GO2LLM_API_KEY" \
  -H "content-type: application/json" \
  -d '{"model":"claude-sonnet-5","max_tokens":120,"messages":[{"role":"user","content":"Ответь одним словом: работает"}]}'

Ожидаемый результат: HTTP 200, в choices[0].message.content — «работает», в usage — поле cost_usd с фактической стоимостью запроса в долларах.

Затем в Zed откройте панель агента, выберите в пикере модель «go2llm Sonnet 5» и отправьте «Ответь одним словом: работает». Если модель не появилась в пикере — Zed не распарсил блок available_models; проверьте JSON на запятые и на то, что провайдер лежит внутри language_models, а не на верхнем уровне.

Какую модель выбрать

Актуальные ставки по каждой модели — на странице цен и в GET /api/pricing.

МодельЗачем в Zed
claude-sonnet-5Агент и inline-ассистент, основная рабочая лошадь
claude-opus-5Разбор незнакомой кодовой базы
claude-haiku-4-5Коммит-сообщения, summary тредов
gpt-5.6-solАльтернативный стек, если Claude перегружен
gpt-5.6-lunaМелкие правки, где цена важнее качества
deepseek-v4-proМассовые операции на большом контексте

Полный прайс — go2llm.tech/pricing.

Если не работает

  • 401 no-key. Zed не нашёл ключ. Убедитесь, что имя переменной совпадает с provider ID: для go2llm это ровно GO2LLM_API_KEY, для my-gateway было бы MY_GATEWAY_API_KEY.
  • 404 на /v1/responses. В capabilities выставлен "chat_completions": false. У go2llm Responses API не опубликован — верните true.
  • 404 model_not_found. Значение name в available_models не совпадает с каталогом. Копируйте точный id из curl https://go2llm.tech/v1/models.
  • 402 insufficient_balance. Пополните баланс (минимум $1) либо уменьшите max_output_tokens. Шлюз резервирует оценочную стоимость до вызова, и баланс не уходит ниже нуля.
  • 429 rate_limit. На ключ действует лимит 20 RPM по умолчанию. Учитывайте заголовок Retry-After.
  • 400 unsupported_content_type. В тред попало изображение или PDF. Поставьте "images": false в capabilities.

Разбор кодов целиком — go2llm.tech/docs/errors.

FAQ

Можно ли добавить провайдера через UI, а не руками в JSON? Да. По документации Zed: Agent Settings (agent::OpenSettings) → раздел LLM Providers → Add Provider, дальше заполняются provider name, API URL, model ID и context window. Результат тот же самый блок в settings.json.

Нужны ли кастомные заголовки? Для go2llm — нет, авторизация идёт стандартным Authorization: Bearer. Но Zed умеет custom_headers для openai_compatible-провайдеров, если вам нужно помечать трафик для своей наблюдаемости. Заголовки, которыми управляет сам Zed (Authorization, Content-Type), перекрыть нельзя.

Работает ли это в удалённых проектах (SSH, dev containers)? Провайдеры инициализируются в локальном приложении Zed: ключ читается из локального keychain, переменные окружения — из окружения локального процесса Zed. Ставить GO2LLM_API_KEY на удалённой машине не нужно.

Что дальше

Другие редакторы и агенты — в хабе go2llm.tech/docs/coding-tools. Эндпоинты, лимиты и форматы ответа — go2llm.tech/docs.

Получить ключ и сделать первый запрос за 3 минуты →