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). Две базы, два протокола, перепутать их — самая частая ошибка при подключении.
Что понадобится
- Node.js 18+ или Python 3.10+.
- Ключ go2llm с префиксом
gk_sk_. При регистрации на баланс начисляется $1, минимальное пополнение — $1. - Base URL:
https://go2llm.tech(без/v1). - Точный 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.