Перейти к содержимому

Anthropic-совместимый API для Claude

Кроме OpenAI-совместимого /v1/chat/completions у GPTunneL есть эндпоинт в формате Anthropic Messages API. Это не обёртка с переводом форматов, а прокси: тело запроса и ответа совпадает с тем, что описано в документации Anthropic.

Практический смысл — код менять не нужно. Официальный SDK Anthropic, Claude Code и любой клиент, умеющий работать с Claude, начинают работать после подмены базового адреса и ключа.

Запрос к Claude

POST https://gptunnel.ru/v1/messages

Headers

ПараметрТипОписание
x-api-key*stringAPI ключ. Альтернатива — Authorization: Bearer YOUR_API_KEY
anthropic-versionstringВерсия API Anthropic, передаётся как есть
content-type*stringapplication/json

Тело запроса — то же, что у Anthropic: model, messages, system, tools, tool_choice, stream и остальные поля. Мы проверяем только те из них, к которым обращаемся сами, всё прочее уходит наверх без изменений. Немногочисленные исключения собраны ниже, в разделе «Что мы меняем в теле запроса».

Пример запроса

Окно терминала
curl --request POST \
--url https://gptunnel.ru/v1/messages \
--header 'x-api-key: YOUR_API_KEY' \
--header 'anthropic-version: 2023-06-01' \
--header 'content-type: application/json' \
--data '{
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"messages": [{ "role": "user", "content": "Привет!" }]
}'

Только модели Claude

Эндпоинт принимает исключительно модели Claude. Запрос с любой другой моделью вернёт 404 с типом ошибки not_found_error — для остальных моделей есть OpenAI-совместимый /v1/chat/completions.

Тот же 404 с тем же типом приходит и на несуществующий идентификатор модели: различается только текст error.message, программно эти два случая не разделяются.

Актуальные идентификаторы и цены — в списке моделей.

Что мы меняем в теле запроса

Тело уходит к Anthropic как есть — кроме нескольких полей, которые мы либо обязаны подставить сами, либо снимаем, чтобы запрос не вернулся с 400.

ЧтоПочему
metadata подставляется нашаAnthropic принимает внутри только user_id, и мы кладём туда собственный хэш вместо присланного значения
service_tier снимаетсяПлатный приоритетный тариф Anthropic через шлюз не выдаётся
context_management теряет стратегии clear_thinking_*, если рассуждения выключены — а когда других стратегий в edits не было, поле снимается целикомAnthropic отвечает 400: стратегия требует включённого или адаптивного thinking. При выключенных рассуждениях чистить всё равно нечего, а пустой edits Anthropic не принимает
На моделях Haiku снимаются thinking: {"type": "adaptive"} и output_configЭто возможности флагманских моделей, Haiku отвечает на них 400
Из anthropic-beta вырезаются значения code-execution-*Инструмент code_execution не поддерживается — см. раздел «Инструменты»
Из идентификатора модели снимается суффикс [1m]Его добавляет Claude Code для расширенного контекста

Плюс служебные поля маршрутизации (provider, route, models, transforms, preset, plugins) — они не из схемы Anthropic и наружу не открыты.

Больше ничего из тела не убирается: незнакомое поле уйдёт наверх как есть, и, если оно незнакомо Anthropic, вернётся 400. Отбор полей по белому списку работает только на OpenAI-совместимом /v1/chat/completions — сюда он не распространяется.

Потоковый ответ

Работает штатно: "stream": true в теле запроса, ответ приходит потоком server-sent events в том же формате событий, что у Anthropic. Никаких дополнительных заголовков не нужно.

Подсчёт токенов

POST https://gptunnel.ru/v1/messages/count_tokens

Возвращает оценку числа входных токенов для тела запроса.

Инструменты

Пользовательские инструменты (name + input_schema) передаются без изменений. Из типовых инструментов Anthropic проходят web_search, web_fetch, computer, bash и text_editor.

Не поддерживается только code_execution — запрос с ним вернёт 400. Причина в модели тарификации: код исполняется на стороне Anthropic и оплачивается по времени работы контейнера, а не по токенам. По той же причине из заголовка anthropic-beta вырезаются значения code-execution-*; остальные беты передаются как есть.

Структурированный вывод

Тоже passthrough: output_config со схемой уходит к Claude как есть. Схему мы не переписываем и additionalProperties за вас не проставляем — требования к ней те же, что в документации Anthropic.

Это самый прямой способ получить строгий JSON. На OpenAI-совместимом /v1/chat/completions тот же результат собирается из response_format, а его форма json_object нативного соответствия не имеет вовсе.

Исключение — модели Haiku: output_config для них снимается, потому что Anthropic отвечает на него 400.

Кэширование промпта

Тоже passthrough: брейкпоинты cache_control расставляет ваш клиент, счётчики cache_creation_input_tokens и cache_read_input_tokens приходят в usage ответа. Списание учитывает кэш — чтение из кэша дешевле обычного ввода, запись дороже.

Ошибки

Формат ошибок совпадает с Anthropic: HTTP-код плюс тело с объектом error, у которого есть type и message. Клиентские SDK разбирают их своими штатными средствами.

Если модель не входит в список разрешённых для API-ключа (список задаётся в настройках ключа в личном кабинете), запрос отклоняется с HTTP 403:

{
"type": "error",
"error": {
"type": "permission_error",
"message": "Model 'claude-opus-4-7' is not allowed for this API key."
}
}