Claude или GPT для ИИ-агента с инструментами — что выбрать

У обеих линеек есть vision, extended thinking и контекст 1M — разница не в характеристиках, а в том, как агент вызывает инструменты и что происходит, когда шаг цикла падает.

4 мин · · Обновлено · модели · агенты

Через один ключ fetch_... доступны обе линейки текстовых моделей: claude-opus-5-5 и claude-sonnet-5, а также gpt-5.6-sol и gpt-5.6-luna — плюс glm-5.3 и glm-5.3-flash (актуальный список — GET https://api.zukko.pro/v1/models). У моделей Claude и GPT есть приём изображений и контекст 1,000,000 токенов (у GLM — 128K и без vision). Значит, выбор для агента с инструментами упирается не в характеристики модели, а в то, как устроен вызов инструментов в конкретном API и что делает ваш код, когда что-то идёт не так посреди цикла.

Два разных формата tool calling за одним ключом

Anthropic-совместимый путь — POST /v1/messages с заголовком anthropic-version: 2023-06-01 — описывает инструменты как список tools в теле запроса, а модель отвечает блоками tool_use. OpenAI-совместимый путь — это либо POST /v1/chat/completions, либо POST /v1/responses, который «принимает и строку, и массив сообщений, и tools» — там вызовы приходят как tool_calls в объекте сообщения.

bash
curl https://api.zukko.pro/v1/messages \
  -H "Authorization: Bearer fetch_ваш_ключ" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-opus-5-5",
    "max_tokens": 1024,
    "tools": [{"name": "get_weather", "input_schema": {"type": "object", "properties": {"city": {"type": "string"}}}}],
    "messages": [{"role": "user", "content": "Погода в Казани?"}]
  }'
bash
curl https://api.zukko.pro/v1/responses \
  -H "Authorization: Bearer fetch_ваш_ключ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.6-sol",
    "tools": [{"type": "function", "name": "get_weather", "parameters": {"type": "object", "properties": {"city": {"type": "string"}}}}],
    "input": "Погода в Казани?"
  }'

Обратите внимание: Anthropic-совместимые клиенты (в том числе Claude Code, Anthropic SDK) ходят на https://api.zukko.pro без /v1 — путь клиент добавляет сам. OpenAI-совместимые клиенты и прямые curl-запросы к /v1/responses идут с суффиксом /v1. Если пишете агента с нуля и переключаете модели между семействами, это первое место, где ловят 404.

Инструменты стоят токены до того, как модель ответила

Схема каждого инструмента (tools) попадает в промпт и считается как обычные входные токены, причём для обоих API одинаково. Если агент таскает за собой десяток инструментов с подробными JSON Schema, это заметная часть контекста ещё до первого сообщения пользователя. Прежде чем гонять реальный агентный цикл, стоит замерить стоимость системного промпта с инструментами через бесплатный подсчёт:

bash
curl https://api.zukko.pro/v1/messages/count_tokens \
  -H "Authorization: Bearer fetch_ваш_ключ" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{"model": "claude-sonnet-5", "tools": [...], "messages": [{"role":"user","content":"ping"}]}'

Это ничего не стоит и не идёт к модели — только считает. Для OpenAI-совместимого пути отдельного count_tokens нет, но можно прогнать ту же схему через claude-sonnet-5 — токенизация инструментов JSON Schema даёт сопоставимую оценку по объёму.

Что ломается в длинном цикле агента

Агент с инструментами обычно делает несколько раундов: вызов модели → выполнение инструмента → снова вызов модели с результатом. Если на каком-то раунде клиент падает по таймауту, повторный запрос с тем же Idempotency-Key (своим для каждого шага и одинаковым при повторах этого шага) за 24 часа вернёт тот же ответ без повторного списания — это спасает от задвоенных вызовов инструментов, когда сеть моргнула ровно в момент ответа.

Второе: каталог моделей меняется. Если старый id сняли с обслуживания с указанием замены, ответ не 404, а 400 model_retired:

bash
{"error": {"message": "Модель 'gpt-5.4' снята с обслуживания. Используйте 'gpt-5.6-sol'", "code": "model_retired"}}

А если модель просто выключена в каталоге (так сейчас отвечает, например, claude-opus-4.6), придёт 503 model_disabled — без замены в тексте. Агентный код стоит писать так, чтобы на model_retired он парсил поле message, доставал имя замены и перезапускал шаг с новой моделью, а на model_disabled переключался на заранее заданную резервную модель — иначе цикл агента просто останавливается на ровном месте в проде, пока кто-то не поправит конфиг руками.

Третье — если вы намеренно ограничили ключ, выданный агенту, списком дешёвых моделей на странице ключа в кабинете, а логика агента внезапно попробует эскалировать на claude-opus-5-5 или gpt-5.6-sol, придёт 403 model_not_allowed_for_key. Это не баг гейтвея, а сработавшая политика — обрабатывать нужно так же, как retired: откатываться на разрешённую модель или явно падать с понятной ошибкой, а не ретраить вслепую.

Практическая схема выбора

Если агент много читает изображения (скриншоты, диаграммы, сканы) — подойдёт любая модель Claude или GPT, vision есть у них всех (у GLM — нет). Если критична экономика длинного цикла с частыми промежуточными вызовами — имеет смысл маршрутизировать: сначала пробовать более дешёвую модель (gpt-5.6-luna или glm-5.3, $0.10 за 1M токенов), и только на сложных шагах или при явном провале валидации переключаться на claude-opus-5-5 или gpt-5.6-sol ($0.30) — какая модель справляется с вашими шагами, проверьте на своих задачах. Учтите и оговорку про длинный контекст: у вендоров чтение из кэша промптов стоит ~10% цены входа, а в Zukko кэшированные токены оплачиваются по обычной цене, так что для агентов с большим повторяющимся контекстом реальная разница с официальным прайсом меньше, чем «в лоб». Такой роутинг работает одинаково для обеих линеек, потому что оба API торчат из одного гейтвея с одним балансом — расход по каждому шагу виден в заголовке X-Zukko-Cost-Micros ответа (у нестриминговых запросов), и можно логировать его по каждому вызову инструмента отдельно, не дожидаясь общего отчёта в /v1/usage.

Если проект уже написан под Anthropic Messages API (например, вы начинали с Claude Code или Anthropic SDK) — держитесь /v1/messages и семейства Claude, менять формат ради GPT-моделей не обязательно: gpt-* тоже отвечают через /v1/chat/completions и /v1/responses, но переписывать парсинг tool_use на tool_calls ради эксперимента имеет смысл только если вам конкретно нужна модель другого семейства, а не абстрактное «а вдруг лучше».

zukko

Платите в 25×
меньше

за Claude Code & ChatGPT

Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.

Claude или GPT для агента с инструментами — что выбрать · Zukko