Поддерживаемые провайдеры

Anthropic

Конвертация Anthropic API в Meridian — структурные различия, обработка сообщений, thinking/reasoning и преобразование инструментов.

Обзор

Формат Anthropic существенно отличается от OpenAI. Meridian берёт на себя обширное преобразование:

  • Извлечение system-сообщений — изымаются из массива messages и помещаются в отдельное поле system.
  • Группировка tool-сообщений — несколько подряд идущих tool-сообщений объединяются в одно user-сообщение.
  • Преобразование thinking-блоков — параметры reasoning мапятся в структуру thinking Anthropic.
  • Переименование параметров — например, max_completion_tokensmax_tokens, stopstop_sequences.
  • Преобразование контента — изображения, файлы и другие типы контента приводятся к схеме Anthropic.

Поддерживаемые операции

ОперацияБез стримингаСтримингЭндпоинт
Chat Completions/v1/messages
Responses API/v1/messages
Text Completions/v1/complete
Embeddings
Speech (TTS)
Transcriptions (STT)
Image Generation
Files/v1/files
Batch/v1/messages/batches
List Models/v1/models

Не поддерживаемые операции (❌): Embeddings, Speech, Transcriptions и Image Generation не поддерживаются апстримом Anthropic. Запросы к ним возвращают UnsupportedOperationError.


Beta-заголовки

Meridian автоматически управляет beta-заголовками Anthropic — определяет необходимые заголовки по фичам в запросе и инжектит их. Заголовки валидируются для каждого провайдера, чтобы неподдерживаемые заголовки не уходили в апстрим.

Beta-заголовокAnthropicAzureVertexBedrockАвто-инъекция
computer-use-2025-01-24 / computer-use-2025-11-24✅ (по типу инструмента)
structured-outputs-2025-11-13✅ (strict / output_format)
advanced-tool-use-2025-11-20✅ (defer_loading / input_examples / allowed_callers)
mcp-client-2025-11-20✅ (по mcp_servers)
prompt-caching-scope-2026-01-05✅ (cache_control.scope)
compact-2026-01-12✅ (compaction edit)
context-management-2025-06-27✅ (clear edits)
files-api-2025-04-14✅ (по эндпоинту files)
interleaved-thinking-2025-05-14✅ (thinking enabled / adaptive)
skills-2025-10-02Passthrough
context-1m-2025-08-07Passthrough
fast-mode-2026-02-01✅ (speed=fast)
redact-thinking-2026-02-12Passthrough

Passthrough-заголовки не инжектятся автоматически, но валидируются и пробрасываются, если заданы вручную через заголовок запроса anthropic-beta. Неизвестные заголовки пробрасываются только в Anthropic; для других провайдеров (Vertex, Bedrock, Azure) неизвестные заголовки тихо отбрасываются — это защищает апстрим от ошибок.

Переопределение beta-заголовков. Поведение по умолчанию можно переопределить на уровне провайдера через вкладку Beta Headers в настройках провайдера или установив beta_header_overrides в network_config. Подробнее — в разделе Настройка провайдеров.


1. Chat Completions

Параметры запроса

Маппинг параметров

ПараметрПреобразование
max_completion_tokensПереименован в max_tokens
temperature, top_pПрямое проксирование
stopПереименован в stop_sequences
response_formatПреобразован в output_format
toolsРеструктуризация схемы (см. Преобразование инструментов)
tool_choiceМаппинг типов (см. Преобразование инструментов)
reasoningМаппинг в thinking (см. Reasoning / Thinking)
userОборачивается в metadata.user_id
top_kЧерез extra_params (специфика Anthropic)

Игнорируемые параметры

Следующие параметры тихо игнорируются: frequency_penalty, presence_penalty, logit_bias, logprobs, top_logprobs, seed, parallel_tool_calls, service_tier.

Дополнительные параметры

Используйте extra_params (SDK) или передавайте напрямую в теле запроса (Gateway) для полей, специфичных для Anthropic:

curl -X POST http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-3-5-sonnet",
    "messages": [{"role": "user", "content": "Hello"}],
    "top_k": 40
  }'

Anthropic также принимает на верхнем уровне объект "cache_control": {"type": "ephemeral"} в запросах к /anthropic/v1/messages — это включает автоматическое prompt caching. Meridian пробрасывает директиву без изменений.

Cache control

Cache-директивы можно добавлять в system-сообщения, user-сообщения и определения инструментов, чтобы включить prompt caching:

curl -X POST http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-3-5-sonnet",
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "type": "text",
            "text": "This is cached context",
            "cache_control": {"type": "ephemeral"}
          }
        ]
      }
    ],
    "system": [
      {
        "type": "text",
        "text": "You are a helpful assistant",
        "cache_control": {"type": "ephemeral"}
      }
    ]
  }'

Reasoning / Thinking

Маппинг параметров

  • reasoning.effortthinking.type (всегда "enabled").
  • reasoning.max_tokensthinking.budget_tokens (бюджет токенов на thinking).

Критичные ограничения

  • Минимальный бюджет: требуется не менее 1024 токенов; при меньшем значении запрос отклоняется с ошибкой.
  • Динамический бюджет: значение -1 автоматически приводится к 1024.

Пример

// Запрос
{"reasoning": {"effort": "high", "max_tokens": 2048}}

// Преобразование для Anthropic
{"thinking": {"type": "enabled", "budget_tokens": 2048}}

Преобразование сообщений

Критичные нюансы

  • Извлечение system-сообщений. System-сообщения изымаются из массива и помещаются в отдельное поле system. Несколько system-сообщений становятся отдельными text-блоками в массиве system.
  • Группировка tool-сообщений. Подряд идущие tool-сообщения объединяются в одно user-сообщение с блоками tool_result.

Преобразование изображений

  • Изображения по URL: {"type": "image_url", "image_url": {}}{"type": "image", "source": {"type": "url", ...}}.
  • Изображения в base64: data URL → {"type": "image", "source": {"type": "base64", "media_type": "image/png", ...}}.

Где допустим cache control

Cache-директивы поддерживаются в: блоках content для system, блоках content для user-сообщений, определениях инструментов (примеры — в разделе Cache control выше).

Преобразование инструментов

Определения инструментов реструктурируются: function.namename, function.parametersinput_schema, function.strict отбрасывается.

Маппинг tool_choice: "auto"auto | "none"none | "required"any | конкретный инструмент → {"type": "tool", "name": "X"}.

Преобразование ответа

Маппинг полей

  • stop_reasonfinish_reason: end_turn / stop_sequencestop, max_tokenslength, tool_usetool_calls.
  • input_tokens + cache_read_input_tokens + cache_creation_input_tokensprompt_tokens (все cache-счётчики суммируются в общий).
  • Разбивка по cache-токенам экспонируется в prompt_tokens_details:
    • cache_read_input_tokensprompt_tokens_details.cached_read_tokens;
    • cache_creation_input_tokensprompt_tokens_details.cached_write_tokens.
  • output_tokenscompletion_tokens.
  • Блоки thinkingreasoning_details с полями index, type, text, signature.
  • Аргументы tool-вызовов конвертируются из JSON-объекта в JSON-строку.

Стриминг

Последовательность событий: message_startcontent_block_startcontent_block_deltacontent_block_stopmessage_deltamessage_stop.

Типы delta-событий: text_delta → контент | input_json_delta → аргументы инструментов | thinking_delta → reasoning-текст | signature_delta → reasoning-подпись.


Нюансы реализации


2. Responses API

Responses API использует тот же эндпоинт /v1/messages, но конвертирует между форматом OpenAI Responses и форматом Anthropic Messages.

Параметры запроса

Маппинг параметров

ПараметрПреобразование
max_output_tokensПереименован в max_tokens
temperature, top_pПрямое проксирование
instructionsСтановится system-сообщением
toolsРеструктуризация схемы (см. Chat Completions)
tool_choiceМаппинг типов (см. Chat Completions)
reasoningМаппинг в thinking (см. Reasoning / Thinking)
userОборачивается в metadata.user_id
textПреобразован в output_format
includeЧерез extra_params (специфика Anthropic)
stopЧерез extra_params, переименован в stop_sequences
top_kЧерез extra_params (специфика Anthropic)
truncationАвтоматически выставляется в "auto" для computer-инструментов

Дополнительные параметры

curl -X POST http://localhost:8080/v1/responses \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-3-5-sonnet",
    "input": "Hello, how are you?",
    "top_k": 40
  }'

Cache control

Cache-директивы можно добавить к instructions (system) и к input-сообщениям, чтобы включить prompt caching:

curl -X POST http://localhost:8080/v1/responses \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-3-5-sonnet",
    "instructions": "You are a helpful assistant. This instruction is cached.",
    "instructions_cache_control": {"type": "ephemeral"},
    "input": [
      {
        "type": "text",
        "text": "Answer this question",
        "cache_control": {"type": "ephemeral"}
      }
    ]
  }'

Input и Instructions

  • Input — строка оборачивается как user-сообщение, массив конвертируется в сообщения.
  • Instructions — становится system-сообщением (та же логика извлечения, что и в Chat Completions).

Поддержка инструментов

Поддерживаемые типы: function, computer_use_preview, web_search, mcp.

Преобразования инструментов те же, что в Chat Completions, плюс: MCP-инструменты мапятся в mcp_servers (server_labelname, server_urlurl); computer-инструменты автоматически получают truncation: "auto".

Cache control поддерживается в instructions и input-блоках (примеры — в разделе Cache control выше).

Преобразование ответа

  • stop_reasonstatus: end_turn / stop_sequencecompleted, max_tokensincomplete.
  • Верхнеуровневые input_tokens и output_tokens — это совокупные счётчики, включающие cache-составляющие; они мапятся напрямую: input_tokensinput_tokens | output_tokensoutput_tokens.
  • Cache-счётчики экспонируются отдельно: cache_read_input_tokensinput_tokens_details.cached_read_tokens | cache_creation_input_tokensinput_tokens_details.cached_write_tokens.
  • Output-элементы: textmessage | tool_usefunction_call | thinkingreasoning.

Стриминг

Последовательность событий: message_startcontent_block_startcontent_block_deltacontent_block_stopmessage_deltamessage_stop.

Особенности обработки: аргументы computer-инструментов аккумулируются по чанкам (выдаются на content_block_stop); для текста и reasoning эмитятся синтетические события content_part.added; MCP-вызовы используют mcp_call_arguments_delta; идентификаторы элементов формируются как msg_{messageID}_item_{outputIndex}.


3. Text Completions (legacy)

Legacy-API на эндпоинте /v1/complete. Стриминг не поддерживается.

Запрос: prompt автоматически оборачивается в \n\nHuman: {prompt}\n\nAssistant: | max_tokensmax_tokens_to_sample | temperature, top_p пробрасываются напрямую | top_k, stop через extra_params (stopstop_sequences).

Ответ: completionchoices[0].text | stop_reasonfinish_reason.


4. Batch API

Форматы запроса: массив requests (CustomID + Params) или input_file_id.

Пагинация: курсорная — after_id, before_id, limit.

Эндпоинты:

  • POST /v1/messages/batches — создание;
  • GET /v1/messages/batches — листинг;
  • GET /v1/messages/batches/{batch_id} — получение по идентификатору;
  • POST /v1/messages/batches/{batch_id}/cancel — отмена.

Ответ: JSONL-формат с записями {custom_id, result: {type, message}}.

Маппинг статусов: in_progressInProgress, cancelingCancelling, endedEnded.

Замечание: временные метки RFC3339Nano конвертируются в Unix; поддерживается ретрай по нескольким ключам.


5. Files API

Требуется beta-заголовок: anthropic-beta: files-api-2025-04-14.

Загрузка: multipart/form-data с полями file (обязательное) и filename (опциональное).

Маппинг полей: id | filename | size_bytesbytes | created_at (Unix) | mime_typecontent_type.

Эндпоинты: POST /v1/files, GET /v1/files (курсорная пагинация), GET /v1/files/{file_id}, DELETE /v1/files/{file_id}, GET /v1/files/{file_id}/content.

Замечание: purpose файла всегда равен "batch", статус всегда "processed".


6. List Models

Запрос: GET /v1/models?limit={defaultPageSize} (без тела).

Маппинг полей: id (с префиксом anthropic/) | display_namename | created_at (Unix-метка).

Пагинация: токенная — NextPageToken, FirstID, LastID.

Поддержка нескольких ключей: результаты агрегируются по всем ключам и при необходимости фильтруются по allowed_models.

Содержание