AgentAPI

Messages (формат Anthropic)

POST https://api.agentapi.ru/v1/ai/messages

Эндпоинт принимает запросы в формате Anthropic Messages API и отдаёт настоящие Anthropic-ответы, включая корректный SSE с событиями message_start, content_block_delta и message_stop. Внутри запрос транслируется в вызов провайдера и обратно.

Про путь. Обратите внимание: эндпоинт — /v1/ai/messages, а не /v1/messages. Клиенты, которые жёстко дописывают /v1/messages к базовому URL, требуют отдельной настройки — см. Claude Code.

Параметры

ПараметрТипОписание
messagesarrayОбязательный. Сообщения с ролями user / assistant
modelstringСлаг модели, например anthropic/claude-3.5-sonnet
max_tokensnumberЛимит генерации
systemstringСистемная инструкция (отдельным полем, не сообщением)
temperaturenumber0–1
top_pnumberNucleus sampling
top_knumberОграничение выборки по top-k
stop_sequencesstring[]Принимается, но не применяется, см. Ограничения
streambooleanВключить SSE
toolsarrayИнструменты в формате Anthropic: {name, description, input_schema}
tool_choiceobjectУправление выбором инструмента
thinkingobject{"type": "enabled", "budget_tokens": 2048}
metadataobjectПроизвольные метаданные

Обратите внимание: здесь параметры именно в snake_case (max_tokens, top_p) — как в оригинальном Anthropic API.

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

curl https://api.agentapi.ru/v1/ai/messages \
  -H "x-api-key: agentapi-ВАШ_КЛЮЧ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-3.5-sonnet",
    "max_tokens": 300,
    "system": "Отвечай кратко и по делу.",
    "messages": [
      {"role": "user", "content": "Чем отличается mutex от semaphore?"}
    ]
  }'

Ответ

{
  "id": "msg_7c1f9e2a-4b83-4d51-9f26-1a8e5d3c7b40",
  "type": "message",
  "role": "assistant",
  "model": "anthropic/claude-3.5-sonnet",
  "content": [
    {
      "type": "text",
      "text": "Mutex допускает владение только одним потоком и требует освобождения тем же потоком. Semaphore — это счётчик, разрешающий одновременный доступ N потокам."
    }
  ],
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": {
    "input_tokens": 21,
    "output_tokens": 58
  }
}
ПолеОписание
idФормат msg_<uuid>
typeВсегда message
content[]Блоки: text, thinking, tool_use
stop_reasonend_turn, max_tokens, tool_use, stop_sequence
usageinput_tokens / output_tokens — терминология Anthropic

Стриминг

С "stream": true приходит SSE с именованными событиями (в отличие от Chat Completions, где события безымянные):

event: message_start
data: {"type":"message_start","message":{"id":"msg_7c1f9e2a","type":"message","role":"assistant","model":"anthropic/claude-3.5-sonnet","content":[],"stop_reason":null,"usage":{"input_tokens":21,"output_tokens":0}}}

event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Mutex"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" допускает"}}

event: content_block_stop
data: {"type":"content_block_stop","index":0}

event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"output_tokens":58}}

event: message_stop
data: {"type":"message_stop"}

Типы дельт:

delta.typeКогда
text_deltaОбычный текст
thinking_deltaБлок размышлений при включённом thinking
input_json_deltaАргументы инструмента приходят по частям

Ошибка посреди потока:

event: error
data: {"type":"error","error":{"type":"api_error","message":"..."}}

Инструменты

Формат Anthropic — input_schema вместо parameters:

{
  "model": "anthropic/claude-3.5-sonnet",
  "max_tokens": 512,
  "messages": [{"role": "user", "content": "Погода в Иркутске?"}],
  "tools": [
    {
      "name": "get_weather",
      "description": "Текущая погода в городе",
      "input_schema": {
        "type": "object",
        "properties": {"city": {"type": "string"}},
        "required": ["city"]
      }
    }
  ]
}

Ответ содержит блок tool_use:

{
  "id": "msg_2d5a8f31-9c74-4e60-b1a3-6f9d2c8e5b17",
  "type": "message",
  "role": "assistant",
  "content": [
    {
      "type": "tool_use",
      "id": "toolu_01A9F2",
      "name": "get_weather",
      "input": {"city": "Иркутск"}
    }
  ],
  "stop_reason": "tool_use",
  "usage": {"input_tokens": 64, "output_tokens": 22}
}

Режим размышлений

{
  "model": "anthropic/claude-3.5-sonnet",
  "max_tokens": 2048,
  "thinking": {"type": "enabled", "budget_tokens": 1024},
  "messages": [{"role": "user", "content": "Реши: 17 × 23 без калькулятора"}]
}

В ответе появится блок {"type": "thinking", "thinking": "…"} перед текстовым блоком.

Коды ошибок

КодПричина
400Невалидные параметры или нулевой баланс
401Проблема с ключом
429Rate limit
502Ошибка провайдера