Сообщения (форма Anthropic)

POST/v1/messages

Тот же чат, но в форме Anthropic: другое тело запроса и ответа.

Запрос

modelstringbodyобязательно
логическое имя модели из GET /v1/models; префикс провайдера сворачивается
messagesarraybodyобязательно
диалог в форме Anthropic: content — строка или массив блоков text / tool_use / tool_result
max_tokensintegerbody
потолок вывода; не обязателен, но на нём считается худшая цена запроса
systemstring|arraybody
системный промпт — строка или массив text-блоков, склеивается в одно system-сообщение
toolsarraybody
инструменты в форме Anthropic: {name, description, input_schema}
tool_choiceobjectbody
{"type": "auto" | "any" | "tool", "name": …} — переводится в auto / required / конкретную функцию
streambooleanbody
true — ответ приходит событиями Anthropic (message_start … message_stop)

Ответы

Response

{
  "id": "chatcmpl-…",
  "type": "message",
  "role": "assistant",
  "model": "gpt-5.6-sol",
  "content": [{ "type": "text", "text": "Hello!" }],
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": { "input_tokens": 11, "output_tokens": 2, "cost_usd": "0.0000465" }
}

модерация остановила промпт до модели (type: content_policy_violation и категория)

тело не разбирается как JSON — конвертер в Anthropic-форму читает его сам

ключа нет в заголовке или он не наш

остатка не хватает на худшую цену этого запроса

model_not_found — модель выключена админом — из GET /v1/models она пропадает тоже

апстрим ответил лимитом; повтори с задержкой

апстрим недоступен (type: upstream_error)

таймаут ожидания апстрима: чтение 300 с, в стриме 60 с без байтов

Подробности

Нужен ключ в заголовке Authorization: Bearer или x-api-key.

Шлюз принимает Anthropic-форму, но НЕ проксирует её как есть: тело переписывается в chat/completions, а ответ апстрима собирается обратно в Anthropic-сообщение (id — от апстрима, model — та логическая модель, которую ты запросил). Так работает любая модель каталога, а не только Claude.

Из тела переносятся: model, system, messages, max_tokens, temperature, top_p, stream, metadata, stop_sequences (в stop), tools (name/description/input_schema → function) и tool_choice (auto → auto, any → required, tool → конкретная функция). Это единственная текстовая ручка, где остальные поля НЕ доезжают до апстрима: конвертер собирает новое тело по этому списку. tool_use-блоки ассистента и tool_result пользователя конвертируются в обе стороны, finish_reason превращается в stop_reason (stop → end_turn, length → max_tokens, tool_calls → tool_use, content_filter → stop_sequence). Шлюз не требует max_tokens: без него в тело апстриму поле не попадает вовсе, а худшую цену запроса шлюз считает по потолку вывода из каталога модели. Служебный блок телеметрии Anthropic в system (x-anthropic-billing-header: …) отбрасывается: его нонс стоит в начале промпта и рвёт префиксный кэш апстрима на каждом запросе.

Стоимость этого запроса приходит в самом ответе: заголовок x-teamtoken-cost-usd и поле usage.cost_usd в теле. Значение — строка с десятичной записью («0.0000465»), а не число: число после парсинга показывалось бы по правилам языка клиента (Python выдал бы 4.65e-05), строка доходит до кода ровно такой, как записана. Стоимость может и не прийти — тогда её нет ни в заголовке, ни в поле: в нестриминговом ответе так бывает, когда апстрим её не сообщил, в стриме — когда у модели нет тарифа в каталоге. Стрим здесь синтетический: апстрим отвечает целиком, а SSE собирается из готового сообщения — поэтому стоимость известна до первого байта, заголовок приходит и в стриме, а cost_usd лежит в message_start внутри message.usage (в message_delta шлюз кладёт только output_tokens). Идемпотентности на этой ручке нет: Anthropic-ответ шлюз не кэширует, поэтому байт-в-байт такой же повтор уезжает в модель ещё раз и оплачивается ещё раз. Рядом живёт POST /v1/messages/count_tokens — он отвечает {"input_tokens": N} и это ОЦЕНКА (символы/4 плюс накладные на сообщение и инструмент), а не работа токенайзера. Любая ошибка приходит одним конвертом (поле code — не у каждого статуса): { "error": { "message": "...", "type": "...", "code": "PROVIDER_CODE" } }.

Модерация, когда она включена, читает текст запроса и блокирует его только по реальному вердикту: недоступный или отвечающий ошибкой модератор запрос пропускает. Ответ всегда несёт то логическое имя модели, которое ты запросил. Если ответ не уложился в таймаут ожидания шлюза (по умолчанию чтение 300 с, в стриме 60 с без байтов), приходит 504; нестриминговую попытку шлюз при этом помечает, и если апстрим всё же досчитал и списал, реконсайлер возвращает сумму на баланс компенсирующим грантом. Из тел ошибок вычищены имена хостов апстрима, поэтому текст ошибки может отличаться от того, что прислал апстрим.

Своего маршрута у этого пути нет: все POST /v1/* принимает один обработчик шлюза, и список принимаемых путей у него закрытый — на любой другой /v1/* приходит 404.

Примеры кода
curl https://api.teamtoken.store/v1/messages \
  -H "x-api-key: sk-…" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.6-sol",
    "max_tokens": 512,
    "system": "Be brief",
    "messages": [{ "role": "user", "content": "Hello" }]
  }'
from anthropic import Anthropic

# base_url without /v1 — the SDK appends the path itself
client = Anthropic(api_key="sk-…", base_url="https://api.teamtoken.store")

msg = client.messages.create(
    model="gpt-5.6-sol",
    max_tokens=512,
    messages=[{"role": "user", "content": "Hello"}],
)
print(msg.content[0].text)
print("cost_usd:", msg.usage.model_extra["cost_usd"])
Запрос
https://api.teamtoken.store/v1

Панель отправляет запрос с этого домена; в своём коде используйте адрес выше.

Ключ никуда не сохраняется: он живёт в этой вкладке до перезагрузки страницы.

логическое имя модели из GET /v1/models; префикс провайдера сворачивается

диалог в форме Anthropic: content — строка или массив блоков text / tool_use / tool_result

потолок вывода; не обязателен, но на нём считается худшая цена запроса

системный промпт — строка или массив text-блоков, склеивается в одно system-сообщение

инструменты в форме Anthropic: {name, description, input_schema}

{"type": "auto" | "any" | "tool", "name": …} — переводится в auto / required / конкретную функцию

true — ответ приходит событиями Anthropic (message_start … message_stop)

Запрос уйдёт по-настоящему и будет стоить денег по тарифу модели.

Ответ

Нажмите «Отправить запрос» выше — и здесь появится ответ.