Anthropic-совместимый API для Claude
Кроме OpenAI-совместимого /v1/chat/completions у GPTunneL есть эндпоинт в
формате Anthropic Messages API. Это не обёртка с переводом форматов, а
прокси: тело запроса и ответа совпадает с тем, что описано в документации
Anthropic.
Практический смысл — код менять не нужно. Официальный SDK Anthropic, Claude Code и любой клиент, умеющий работать с Claude, начинают работать после подмены базового адреса и ключа.
Запрос к Claude
https://gptunnel.ru/v1/messages Headers
| Параметр | Тип | Описание |
|---|---|---|
x-api-key* | string | API ключ. Альтернатива — Authorization: Bearer YOUR_API_KEY |
anthropic-version | string | Версия API Anthropic, передаётся как есть |
content-type* | string | application/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": "Привет!" }] }'import Anthropic from '@anthropic-ai/sdk'
const client = new Anthropic({ apiKey: 'YOUR_API_KEY', baseURL: 'https://gptunnel.ru',})
const message = await client.messages.create({ model: 'claude-sonnet-4-5', max_tokens: 1024, messages: [{ role: 'user', content: 'Привет!' }],})
console.log(message.content)from anthropic import Anthropic
client = Anthropic(api_key="YOUR_API_KEY", base_url="https://gptunnel.ru")
message = client.messages.create( model="claude-sonnet-4-5", max_tokens=1024, messages=[{"role": "user", "content": "Привет!"}],)
print(message.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. Никаких
дополнительных заголовков не нужно.
Подсчёт токенов
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." }}