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 в объекте сообщения.
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": "Погода в Казани?"}]
}'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, это заметная часть контекста ещё до первого сообщения пользователя. Прежде чем гонять реальный агентный цикл, стоит замерить стоимость системного промпта с инструментами через бесплатный подсчёт:
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:
{"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.
Похожие статьи
- AI-агент и AI-ассистент: в чём разница и что выбрать для задачиМодель отвечает, ассистент помнит диалог, агент сам делает шаги с инструментами. Разбираем различия на примерах и помогаем решить, что нужно для вашей задачи.
- Roo Code Ollama: локальные модели в Cline и Aider, честный разборПодключаем Ollama к Roo Code, Cline, Aider и OpenCode по документации инструментов, разбираем ограничения и показываем, когда проще вернуться к облачному API.
- Агенты opencode: как настроить роли, модели и инструментыСвой агент в opencode — это роль, модель и список разрешений. Показываем конфиг и пример, где рутину делает дешёвая модель, а код правит сильная.
- Plan mode в Claude Code: сначала план, потом правки в кодеВ plan mode Claude Code читает код и предлагает план, но ничего не правит, пока вы не согласитесь. Как включить, использовать и во сколько это обходится.