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

Claude Agent SDK через go2llm: агент на своём base URL

Claude Agent SDK — это харнесс Claude Code, собранный в библиотеку для Python и TypeScript: агентный цикл, встроенные инструменты, права и сессии. Он говорит Anthropic-протоколом и читает base URL из окружения, поэтому переключается на go2llm двумя переменными — без правок кода агента.

Проверено живым запросом: Claude Code — да, Claude Agent SDK — нет. SDK использует те же переменные окружения и тот же протокол, что проверенный Claude Code, но отдельного прогона агентного цикла через go2llm мы не делали и не утверждаем, что все инструменты харнесса доступны через шлюз. Если соберёте на нём агента — напишите в @go2llm_support, поставим фактический статус вместо пометки.

Источники: Claude Agent SDK — overview, Quickstart.

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

Главное, на чём спотыкаются

Base URL для Anthropic-протокола — https://go2llm.tech, БЕЗ /v1. Суффикс дописывает сам SDK: он ходит в /v1/messages. Адрес https://go2llm.tech/v1 превратится в https://go2llm.tech/v1/v1/messages и вернёт 404 endpoint_not_found.

Адрес с /v1 нужен другому — OpenAI-совместимым клиентам (https://go2llm.tech/v1). Две базы, два протокола, перепутать их — самая частая ошибка при подключении.

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

  1. Node.js 18+ или Python 3.10+.
  2. Ключ go2llm с префиксом gk_sk_. При регистрации на баланс начисляется $1, минимальное пополнение — $1.
  3. Base URL: https://go2llm.tech (без /v1).
  4. Точный public ID модели: curl https://go2llm.tech/v1/models — эндпоинт открыт без ключа. Нужна модель с messages в поле endpoints.

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

Шаг 1. Установите SDK

npm install @anthropic-ai/claude-agent-sdk
pip install claude-agent-sdk

Шаг 2. Задайте переменные окружения

export ANTHROPIC_BASE_URL=https://go2llm.tech
export ANTHROPIC_AUTH_TOKEN=gk_sk_ВАШ_КЛЮЧ
export ANTHROPIC_MODEL=claude-sonnet-5

ANTHROPIC_AUTH_TOKEN, а не ANTHROPIC_API_KEY — это не стилистика, разбор ниже.

SDK читает окружение процесса и .env сам не подхватывает: если ключ лежит в файле, загрузите его (например, dotenv) до вызова.

Шаг 3. Напишите агента

TypeScript:

import { query } from "@anthropic-ai/claude-agent-sdk";

for await (const message of query({
  prompt: "Найди в utils.py ошибки, из-за которых он падает, и почини их.",
  options: {
    allowedTools: ["Read", "Edit", "Glob"],
    permissionMode: "acceptEdits",
  },
})) {
  if (message.type === "assistant" && message.message?.content) {
    for (const block of message.message.content) {
      if ("text" in block) console.log(block.text);
    }
  } else if (message.type === "result") {
    console.log(`Готово: ${message.subtype}`);
  }
}

Python:

import asyncio

from claude_agent_sdk import AssistantMessage, ClaudeAgentOptions, ResultMessage, query


async def main() -> None:
    async for message in query(
        prompt="Найди в utils.py ошибки, из-за которых он падает, и почини их.",
        options=ClaudeAgentOptions(
            allowed_tools=["Read", "Edit", "Glob"],
            permission_mode="acceptEdits",
        ),
    ):
        if isinstance(message, AssistantMessage):
            for block in message.content:
                if hasattr(block, "text"):
                    print(block.text)
        elif isinstance(message, ResultMessage):
            print(f"Готово: {message.subtype}")


asyncio.run(main())

Модель здесь берётся из ANTHROPIC_MODEL. Любой ID, который харнесс запросит у шлюза, должен быть в опубликованном каталоге: модели, которой нет в /v1/models, шлюз ответит 404 model_not_found с перечислением доступных.

ANTHROPIC_AUTH_TOKEN против ANTHROPIC_API_KEY

Обе переменные передают ключ, но по-разному и с разным приоритетом.

  • ANTHROPIC_AUTH_TOKEN уходит заголовком Authorization: Bearer и всегда обращается к тому адресу, который стоит в ANTHROPIC_BASE_URL. Это рабочий вариант для go2llm.
  • ANTHROPIC_API_KEY уходит заголовком x-api-key и участвует в разрешении учётных данных раньше: если на машине уже есть вход в Claude Code под личным аккаунтом или экспортирован старый ключ Anthropic, запрос уйдёт с чужим ключом и вернётся 401 missing or unknown api key.

Отдельный случай — заданы обе переменные сразу. Тогда клиент отправляет оба заголовка, а шлюз читает x-api-key первым, и выигрывает ANTHROPIC_API_KEY. Симптом обманчивый: gk_sk_ лежит в окружении, выглядит правильным, а шлюз отвечает 401 — потому что читает не его. Лечение — unset ANTHROPIC_API_KEY перед запуском агента. Пустая строка не считается снятием: снимайте переменную, а не обнуляйте.

Управление контекстом: count_tokens больше не роняет цикл

POST /v1/messages/count_tokens шлюз теперь обслуживает, поэтому client.messages.count_tokens() из Anthropic SDK возвращает число, а не исключение — агентный цикл, считающий контекст перед ходом, не падает.

import os

from anthropic import Anthropic

client = Anthropic(base_url="https://go2llm.tech", api_key=os.environ["GO2LLM_API_KEY"])

counted = client.messages.count_tokens(
    model="claude-sonnet-5",
    messages=[{"role": "user", "content": "Посчитай токены этого запроса"}],
)
print(counted.input_tokens)

Но это оценка по байтам, а не вендорский токенайзер, и шлюз говорит об этом в самом ответе:

{
  "input_tokens": 1234,
  "go2llm": {
    "exact": false,
    "method": "byte_estimate",
    "typical_error_pct": null,
    "calibrated": false,
    "note": "local byte estimate, not the vendor tokenizer; accuracy not measured yet, so no error figure is published"
  }
}

typical_error_pct: null — не забывчивость, а отсутствие измерения: пока оценку не с чем сопоставить, публиковать правдоподобную цифру хуже, чем не публиковать никакой. Практический вывод: на этом числе нельзя строить жёсткие бюджеты — «осталось ровно N токенов до предела» посчитан не тем счётчиком, которым считает модель. Для «пора сжимать контекст» оценки хватает, для «вписаться впритык в окно» — нет.

Вызов бесплатный: ключ обязателен, но ни резерва, ни списания нет. Отдельный лимит — 60 запросов в минуту на ключ, не связанный с боевыми 20 RPM.

Бюджет перед длинным прогоном: GET /v1/me

Агент, который узнаёт о пустом балансе через 402 посреди задачи, теряет весь прогон. Ключ может прочитать свой остаток сам:

curl https://go2llm.tech/v1/me -H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN"
{
  "object": "api_key",
  "key": {
    "name": "agent",
    "masked": "gk_sk_abcd…wxyz",
    "quota_usd": 50,
    "spent_usd": 12.34,
    "rpm_limit": 20,
    "allowed_models": ["*"],
    "expires_at": null
  },
  "balance": { "spendable_usd": 87.66, "reserved_usd": 0.12, "currency": "USD" },
  "limits": { "account_max_concurrency": 2 }
}

Что здесь важно агенту:

  • balance.spendable_usd — сколько он может потратить прямо сейчас. Проверка перед прогоном стоит один бесплатный запрос.
  • balance.reserved_usd — уже зарезервированное под запросы в полёте. Это объясняет ситуацию «баланс есть, а денег не хватило».
  • key.rpm_limit и limits.account_max_concurrency — под какие лимиты подстраивать параллельность.

Эскалации доступа тут нет: держатель gk_sk_ и так тратит баланс, читать остаток — строго меньше. Поэтому в ответе нет ни email, ни других ключей аккаунта, ни платёжных данных. Ключ без аккаунта отдаёт balance: null — он ограничен только квотой. Лимит тот же: 60 запросов в минуту на ключ.

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

Сначала шлюз напрямую — так вы отделите проблему SDK от проблемы ключа:

curl https://go2llm.tech/v1/messages \
  -H "x-api-key: gk_sk_ВАШ_КЛЮЧ" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model":"claude-sonnet-5","max_tokens":120,"messages":[{"role":"user","content":"Ответь одним словом: работает"}]}'

HTTP 200 и слово «работает» в ответе означают, что ключ и адрес верны. Дальше запускайте агента и сверяйте списание в кабинете с usage.cost_usd из ответа.

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

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

МодельЗачем в агенте
claude-sonnet-5Основной цикл: чтение, правки, инструменты
claude-opus-5Разбор незнакомого репозитория, длинные прогоны
claude-haiku-4-5Подзадачи, суммаризация, коммит-сообщения
claude-fable-5-1Самая тяжёлая модель каталога, когда цена не главное
claude-opus-4-8Одна из самых дешёвых моделей семейства Opus в каталоге: $0.503 за 1M входа

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

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

  • 401 missing or unknown api key. Скорее всего задана ANTHROPIC_API_KEY — шлюз читает x-api-key раньше Authorization. Снимите переменную и оставьте только ANTHROPIC_AUTH_TOKEN.
  • 404 endpoint_not_found. В ANTHROPIC_BASE_URL попал суффикс /v1. Для Anthropic-протокола адрес указывается без него. В теле ошибки шлюз перечисляет все опубликованные маршруты.
  • 404 model_not_found. Харнесс запросил модель, которой нет в каталоге. Сверьте ANTHROPIC_MODEL с curl https://go2llm.tech/v1/models; текст ошибки называет доступные ID.
  • 400 model_protocol_mismatch. У модели нет messages в endpoints. Возьмите ту, у которой есть.
  • 402 insufficient_balance. Прочитайте GET /v1/me до прогона, а не после. Шлюз резервирует оценочную стоимость заранее, баланс не уходит ниже нуля.
  • 429 api key RPM exceeded. 20 RPM на ключ, суммарно по всем моделям и endpoint'ам; параллельных запросов на аккаунт по умолчанию 2. Агентный цикл с подзадачами упирается в это быстрее человека — снижайте параллельность или заводите отдельный ключ.
  • 400 unsupported_content_type. Агент приложил к запросу изображение или PDF: текстовые endpoint'ы go2llm бинарные вложения не принимают. Скриншоты в цикл не передать.
  • 502 upstream_unavailable. Повторите безопасный текстовый запрос с задержкой; Retry-After на этом коде шлюз не ставит, стратегию повторов агент строит сам.

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

FAQ

Работают ли встроенные WebSearch и WebFetch? Про серверные инструменты web_search и web_fetch мы ничего не утверждаем. Это инструменты, исполняемые на стороне поставщика, и через шлюз мы их не проверяли. Файловые инструменты и Bash исполняет сам харнесс на вашей машине — к шлюзу они отношения не имеют.

Чем это отличается от Claude Code? Ничем на уровне подключения: те же переменные, тот же протокол, тот же /v1/messages. Claude Code — терминальная программа, Agent SDK — та же машинерия как библиотека. Настройка Claude Code разобрана на странице Claude Code API.

Можно ли считать расход агента по count_tokens? Нет. Фактическая стоимость приходит в usage.cost_usd каждого ответа, в том числе в финальном usage-блоке стрима, — считайте по нему. count_tokens отвечает на вопрос «влезет ли», а не «сколько списали».

Настроите за меня? Нет — интеграции за клиента мы не настраиваем. Вопросы по шлюзу: support@go2llm.tech, @go2llm_support.

Что дальше

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

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