Руководство по Конвертации Протоколов
RouteAPI, как унифицированный API-шлюз, автоматически обрабатывает конвертацию между различными форматами протоколов внутри системы. Когда вы вызываете модель Claude, используя протокол OpenAI, или вызываете модель Gemini, используя протокол Claude Messages, RouteAPI обрабатывает различия в структуре сообщений, маппинге параметров и формате ответов, поэтому вам не нужно беспокоиться о деталях базового протокола.
Обзор Механизма Конвертации
Section titled “Обзор Механизма Конвертации”RouteAPI как Адаптер Протоколов
Section titled “RouteAPI как Адаптер Протоколов”RouteAPI поддерживает три основные точки входа протокола:
- Протокол, совместимый с OpenAI:
/v1/chat/completions,/v1/responses - Протокол Claude Messages:
/v1/messages - Протокол Google Gemini:
/v1beta/models/{model}:generateContent
Когда запрос поступает, RouteAPI определяет тип протокола на основе пути, определяет целевой upstream на основе ID модели, а затем выполняет необходимые конвертации форматов между ними.
Когда Требуется Конвертация
Section titled “Когда Требуется Конвертация”| Сценарий | Конвертация? | Описание |
|---|---|---|
| Протокол OpenAI → Модели OpenAI | Нет | Прозрачная передача |
| Claude Messages → Модели Claude | Нет | Прозрачная передача |
| Протокол OpenAI → Модели Claude | Да | OpenAI → Claude Messages |
| Протокол OpenAI → Модели Gemini | Да | OpenAI → Gemini contents |
| Claude Messages → Модели OpenAI | Да | Claude Messages → OpenAI |
| Claude Messages → Модели Gemini | Да | Claude Messages → Gemini |
Прозрачность Конвертации
Section titled “Прозрачность Конвертации”Конвертация протокола прозрачна для клиентов. Вы отправляете запрос в формате OpenAI и получаете ответ в формате OpenAI, даже если внутри вызывается Claude или Gemini.
Однако конвертация имеет ограничения:
- Параметры, не поддерживаемые целевым протоколом, будут игнорироваться или использовать значения по умолчанию.
- Некоторые специфичные для протокола возможности (например, расширенное мышление Claude, кэширование промптов) могут не полностью выражаться после конвертации.
- Процесс конвертации вносит небольшую задержку (обычно менее 10 мс).
Лучшая Практика: Отдавайте приоритет использованию протокола, изначально поддерживаемого целевой моделью, для получения наиболее полной поддержки функций и лучшей производительности.
Конвертация Формата Сообщений
Section titled “Конвертация Формата Сообщений”OpenAI messages ↔ Claude messages
Section titled “OpenAI messages ↔ Claude messages”Различия в Обработке system prompt
Section titled “Различия в Обработке system prompt”OpenAI помещает system prompt как первое сообщение в массив messages:
{ "messages": [ { "role": "system", "content": "Вы строгий технический ассистент." }, { "role": "user", "content": "Объясните, что такое API-шлюз" } ]}Claude помещает system prompt в независимое поле верхнего уровня:
{ "system": "Вы строгий технический ассистент.", "messages": [ { "role": "user", "content": "Объясните, что такое API-шлюз" } ]}Правила Конвертации:
- OpenAI → Claude: Извлечь первое сообщение
role: "system"и переместить в полеsystem. - Claude → OpenAI: Преобразовать содержимое поля
systemв сообщениеrole: "system"и вставить в начало массиваmessages.
Маппинг ролей
Section titled “Маппинг ролей”| OpenAI | Claude | Gemini | Описание |
|---|---|---|---|
system | Поле верхнего уровня system | systemInstruction | Разное расположение системного промпта |
user | user | user | Сообщение пользователя, одинаково |
assistant | assistant | model | Ответ ассистента/модели, разные названия |
tool | tool_result внутри user | functionResponse внутри user | Разная принадлежность результата инструмента |
Соображения по Конвертации:
- Claude не принимает два последовательных сообщения с одной и той же ролью; конвертация требует слияния или вставки заполнителей.
- Роль
modelв Gemini отображается какassistantпри конвертации в OpenAI. role: "tool"в OpenAI объединяется в сообщенияuserкак в Claude, так и в Gemini.
OpenAI messages ↔ Gemini contents
Section titled “OpenAI messages ↔ Gemini contents”Структура сообщений Gemini называется contents, роль каждого сообщения называется role, а содержимое находится в массиве parts:
{ "contents": [ { "role": "user", "parts": [{ "text": "Объясните, что такое API-шлюз" }] } ]}Правила Конвертации:
- OpenAI
messages↔ Geminicontents - OpenAI
content↔ Geminiparts - OpenAI
assistant↔ Geminimodel - system prompt преобразуется в поле верхнего уровня
systemInstruction
Таблица Маппинга Параметров
Section titled “Таблица Маппинга Параметров”Параметры Сэмплирования
Section titled “Параметры Сэмплирования”| OpenAI | Claude | Gemini | Описание |
|---|---|---|---|
temperature | temperature | temperature | Claude макс 1, OpenAI макс 2, Gemini макс 2 |
top_p | top_p | topP | nucleus sampling, все поддерживают |
| Не поддерживается | top_k | topK | OpenAI не поддерживает, удаляется при конвертации |
max_tokens / max_completion_tokens | max_tokens (обязательно) | maxOutputTokens | Claude требует явного указания |
n | Не поддерживается | candidateCount | Claude не поддерживает генерацию нескольких кандидатов |
stop | stop_sequences | stopSequences | Разные названия полей, одинаковая семантика |
Конвертация Диапазона Температуры:
Когда temperature запроса OpenAI превышает 1 и целью является Claude, RouteAPI автоматически обрезает её до 1, чтобы избежать отклонения upstream.
Параметры Управления Выводом
Section titled “Параметры Управления Выводом”| OpenAI | Claude | Gemini | Описание |
|---|---|---|---|
response_format | Не поддерживается | responseMimeType | OpenAI поддерживает JSON mode и JSON Schema |
frequency_penalty | Не поддерживается | frequencyPenalty | Claude не поддерживает параметры штрафа |
presence_penalty | Не поддерживается | presencePenalty | Claude не поддерживает параметры штрафа |
stream | stream | stream | Все поддерживают, но форматы событий полностью разные |
stream_options.include_usage | Всегда возвращается | Автоматически возвращается при generateContentRequest.stream=true | Разные способы возврата статистики использования |
Поведение при Конвертации:
frequency_penaltyиpresence_penaltyигнорируются при передаче в Claude.response_format: { type: "json_object" }симулируется через вызовы инструментов при передаче в Claude, или добавляется промпт JSON-вывода в system.n > 1сбрасывается на 1 при передаче в Claude, поскольку Claude не поддерживает генерацию нескольких кандидатов.
Метаданные и Управление
Section titled “Метаданные и Управление”| OpenAI | Claude | Gemini | Описание |
|---|---|---|---|
user | metadata.user_id | Не поддерживается | Для обнаружения злоупотреблений |
seed | Не поддерживается | seed | Claude не поддерживает детерминированный сэмплинг |
logprobs / top_logprobs | Не поддерживается | Не поддерживается | Только модели OpenAI поддерживают |
| Не поддерживается | thinking | Не поддерживается | Специфичная для Claude конфигурация расширенного мышления |
Конвертация Вызова Инструментов
Section titled “Конвертация Вызова Инструментов”Различия в Формате Определения Инструментов
Section titled “Различия в Формате Определения Инструментов”Формат tools OpenAI
Section titled “Формат tools OpenAI”{ "tools": [ { "type": "function", "function": { "name": "get_weather", "description": "Запросить текущую погоду для указанного города", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "Название города" } }, "required": ["city"] } } } ]}Формат tools Claude
Section titled “Формат tools Claude”{ "tools": [ { "name": "get_weather", "description": "Запросить текущую погоду для указанного города", "input_schema": { "type": "object", "properties": { "city": { "type": "string", "description": "Название города" } }, "required": ["city"] } } ]}Формат tools Gemini
Section titled “Формат tools Gemini”{ "tools": [ { "functionDeclarations": [ { "name": "get_weather", "description": "Запросить текущую погоду для указанного города", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "Название города" } }, "required": ["city"] } } ] } ]}Правила Конвертации Определения Инструментов
Section titled “Правила Конвертации Определения Инструментов”| OpenAI | Claude | Gemini | Примечания по Конвертации |
|---|---|---|---|
tools[].type: "function" | Этого уровня нет | Этого уровня нет | Удалить обёртку type при конвертации |
tools[].function | Выровнено в tools[] | Помещено в functionDeclarations[] | Разная иерархическая структура |
function.parameters | input_schema | parameters | Разное название поля в Claude |
Маппинг tool_choice
Section titled “Маппинг tool_choice”| OpenAI | Claude | Gemini | Описание |
|---|---|---|---|
"auto" | { "type": "auto" } | "AUTO" | Модель решает автоматически |
"none" | { "type": "none" } | "NONE" | Запретить вызовы инструментов |
"required" | { "type": "any" } | "ANY" | Должен вызвать инструмент |
{ "type": "function", "function": { "name": "get_weather" } } | { "type": "tool", "name": "get_weather" } | { "functionCallingConfig": { "allowedFunctionNames": ["get_weather"] } } | Принудительно вызвать конкретный инструмент, структура сильно отличается |
Конвертация Формата Результата Инструмента
Section titled “Конвертация Формата Результата Инструмента”Результат Инструмента OpenAI
Section titled “Результат Инструмента OpenAI”{ "role": "tool", "tool_call_id": "call_abc123", "content": "Москва, ясно, 23°C"}Результат Инструмента Claude
Section titled “Результат Инструмента Claude”{ "role": "user", "content": [ { "type": "tool_result", "tool_use_id": "toolu_01A09q90qw90lq917835lq9", "content": "Москва, ясно, 23°C" } ]}Результат Инструмента Gemini
Section titled “Результат Инструмента Gemini”{ "role": "user", "parts": [ { "functionResponse": { "name": "get_weather", "response": { "result": "Москва, ясно, 23°C" } } } ]}Ключевые Моменты Конвертации:
role: "tool"OpenAI объединяется в сообщенияuserпри конвертации в Claude/Gemini.- Названия полей ID вызова инструмента различаются:
tool_call_idvstool_use_idvs идентификация по имени функции в Gemini. - Claude и Gemini требуют все результаты инструментов в одном сообщении
user; OpenAI допускает несколько отдельных сообщенийtool.
Конвертация Мультимодального Контента
Section titled “Конвертация Мультимодального Контента”Конвертация Формата URL Изображения
Section titled “Конвертация Формата URL Изображения”Формат OpenAI
Section titled “Формат OpenAI”{ "role": "user", "content": [ { "type": "image_url", "image_url": { "url": "https://example.com/image.jpg", "detail": "high" } }, { "type": "text", "text": "Опишите это изображение" } ]}Формат Claude
Section titled “Формат Claude”{ "role": "user", "content": [ { "type": "image", "source": { "type": "url", "url": "https://example.com/image.jpg" } }, { "type": "text", "text": "Опишите это изображение" } ]}Формат Gemini
Section titled “Формат Gemini”{ "role": "user", "parts": [ { "fileData": { "mimeType": "image/jpeg", "fileUri": "https://example.com/image.jpg" } }, { "text": "Опишите это изображение" } ]}Обработка Кодировки Base64
Section titled “Обработка Кодировки Base64”Формат base64 OpenAI
Section titled “Формат base64 OpenAI”{ "type": "image_url", "image_url": { "url": "data:image/jpeg;base64,/9j/4AAQSkZJRg..." }}Формат base64 Claude
Section titled “Формат base64 Claude”{ "type": "image", "source": { "type": "base64", "media_type": "image/jpeg", "data": "/9j/4AAQSkZJRg..." }}Формат base64 Gemini
Section titled “Формат base64 Gemini”{ "inlineData": { "mimeType": "image/jpeg", "data": "/9j/4AAQSkZJRg..." }}Правила Конвертации:
- URI
data:OpenAI анализируется,media_typeизвлекается из префикса URI, чистая часть base64 передаётся целевому протоколу. - Claude требует отдельное поле
media_type, не принимает URIdata:. - Gemini использует
inlineDataвместоfileDataдля представления контента base64. - Параметр
detailOpenAI (low/high) теряется при конвертации; у Claude и Gemini нет эквивалентной концепции.
Обработка Неподдерживаемых Параметров
Section titled “Обработка Неподдерживаемых Параметров”Какие Параметры Нельзя Конвертировать
Section titled “Какие Параметры Нельзя Конвертировать”| Параметр | Исходный Протокол | Нельзя Конвертировать В | Причина |
|---|---|---|---|
top_k | Claude, Gemini | OpenAI | OpenAI не поддерживает top-k сэмплинг |
n | OpenAI, Gemini | Claude | Claude не поддерживает генерацию нескольких кандидатов |
frequency_penalty / presence_penalty | OpenAI, Gemini | Claude | У Claude нет параметров штрафа |
logprobs | OpenAI | Claude, Gemini | Только модели OpenAI возвращают логарифмические вероятности |
thinking | Claude | OpenAI, Gemini | Специфичная для Claude конфигурация расширенного мышления |
cache_control | Claude | OpenAI, Gemini | Специфичное для Claude управление кэшированием промптов |
reasoning_effort | OpenAI | Claude, Gemini | Специфичный для серии o1 OpenAI параметр |
response_format (JSON Schema) | OpenAI | Claude, Gemini | Полные ограничения JSON Schema поддерживает только OpenAI |
Как Обрабатываются Несовместимые Параметры
Section titled “Как Обрабатываются Несовместимые Параметры”RouteAPI использует следующие стратегии:
- Тихое Игнорирование: Неподдерживаемые параметры удаляются при конвертации без влияния на успешность запроса (например,
detail,logprobs). - Автоматическая Корректировка: Значения вне диапазона обрезаются до допустимого диапазона (например,
temperature > 1обрезается до 1 при передаче в Claude). - Консервативное Понижение: Сложные функции симулируются простыми методами (например, JSON Schema OpenAI понижается до вызовов инструментов или ограничений промпта на Claude).
- Отклонение Запроса: Редко, если основные параметры не могут быть конвертированы и нет разумного значения по умолчанию, возвращается ошибка 400 (например, протокол Claude без
max_tokens).
Предупреждения и Сообщения об Ошибках
Section titled “Предупреждения и Сообщения об Ошибках”RouteAPI предоставляет информацию о конвертации в заголовках ответа и логах:
X-RouteAPI-Protocol-Conversion: openai-to-claudeX-RouteAPI-Dropped-Params: frequency_penalty,presence_penaltyЕсли конвертация не удалась или параметры конфликтуют, возвращается стандартный ответ об ошибке:
{ "error": { "message": "Parameter 'max_tokens' is required for Claude models", "type": "invalid_request_error", "param": "max_tokens", "code": "missing_required_parameter" }}Лучшие Практики
Section titled “Лучшие Практики”- Использовать Нативный Протокол: Используйте нативный протокол модели, когда это возможно, чтобы избежать потерь при конвертации.
- Избегать Зависимости от Специфичных для Протокола Функций: Не полагайтесь на возможности, специфичные для одного протокола, такие как
logprobs,thinking, если вы не уверены, что будете использовать только модели этого протокола. - Проверять Заголовки Ответа: Обращайте внимание на заголовок
X-RouteAPI-Dropped-Params, чтобы знать, какие параметры были проигнорированы. - Тестировать Кросс-Протокольную Совместимость: Проверяйте поведение одного и того же запроса в разных комбинациях протокол/модель в тестовых средах.
- Логировать ID Модели: Записывайте фактически вызванный ID модели и тип протокола в логи для упрощения поиска различий.
Стандартизация Формата Ответа
Section titled “Стандартизация Формата Ответа”Стандартизация Поля usage
Section titled “Стандартизация Поля usage”| Протокол | Поле входных токенов | Поле выходных токенов | Поле общих токенов |
|---|---|---|---|
| OpenAI | prompt_tokens | completion_tokens | total_tokens |
| Claude | input_tokens | output_tokens | Нет (вычислить самостоятельно) |
| Gemini | promptTokenCount | candidatesTokenCount | totalTokenCount |
Правила Конвертации:
- Claude → OpenAI:
input_tokens→prompt_tokens,output_tokens→completion_tokens, вычислитьtotal_tokens = input_tokens + output_tokens. - Gemini → OpenAI:
promptTokenCount→prompt_tokens,candidatesTokenCount→completion_tokens,totalTokenCount→total_tokens. - OpenAI → Claude:
prompt_tokens→input_tokens,completion_tokens→output_tokens, удалитьtotal_tokens.
Поля кэширования промптов Claude также сохраняются:
{ "usage": { "prompt_tokens": 120, "completion_tokens": 45, "total_tokens": 165, "cache_creation_input_tokens": 80, "cache_read_input_tokens": 40 }}Стандартизация finish_reason
Section titled “Стандартизация finish_reason”| OpenAI | Claude | Gemini | Значение |
|---|---|---|---|
stop | end_turn | STOP | Естественное завершение |
length | max_tokens | MAX_TOKENS | Достигнут лимит длины |
tool_calls | tool_use | STOP (с functionCall) | Запрос вызова инструмента |
content_filter | Нет эквивалента | SAFETY | Заблокировано фильтром контента |
stop | stop_sequence | STOP | Достигнута последовательность остановки |
Правила Конвертации:
- Claude
end_turn→ OpenAIstop - Claude
max_tokens→ OpenAIlength - Claude
tool_use→ OpenAItool_calls - Gemini
STOPотображается какstopилиtool_callsв зависимости от наличияfunctionCall - Gemini
SAFETY→ OpenAIcontent_filter
Унификация Ответа об Ошибке
Section titled “Унификация Ответа об Ошибке”Все ответы об ошибках протокола конвертируются в формат OpenAI (когда клиент использует протокол OpenAI):
{ "error": { "message": "Invalid API key", "type": "invalid_request_error", "param": null, "code": "invalid_api_key" }}Исходная ошибка Claude:
{ "type": "error", "error": { "type": "authentication_error", "message": "invalid x-api-key" }}После конвертации в формат OpenAI, type отображается как invalid_request_error, code устанавливается как invalid_api_key.
Примеры Конвертации
Section titled “Примеры Конвертации”Пример 1: Запрос OpenAI → Формат Claude
Section titled “Пример 1: Запрос OpenAI → Формат Claude”Исходный Запрос OpenAI:
{ "model": "claude-sonnet-4-5", "messages": [ { "role": "system", "content": "Вы строгий технический ассистент, отвечайте кратко." }, { "role": "user", "content": "Объясните, что такое API-шлюз" } ], "temperature": 0.7, "max_tokens": 150, "stream": false}Конвертированный Запрос Claude:
{ "model": "claude-sonnet-4-5", "system": "Вы строгий технический ассистент, отвечайте кратко.", "messages": [ { "role": "user", "content": "Объясните, что такое API-шлюз" } ], "temperature": 0.7, "max_tokens": 150, "stream": false}Ключевые Изменения:
- system сообщение извлечено из массива
messagesв поле верхнего уровняsystem. messagesтеперь содержит только сообщенияuserиassistant.
Пример 2: Вызов Инструмента Claude → Формат OpenAI
Section titled “Пример 2: Вызов Инструмента Claude → Формат OpenAI”Ответ с Вызовом Инструмента Claude:
{ "id": "msg_01XFDUDYJgAACzvnptvVoYEL", "type": "message", "role": "assistant", "model": "claude-sonnet-4-5", "content": [ { "type": "text", "text": "Позвольте мне проверить погоду в Москве." }, { "type": "tool_use", "id": "toolu_01A09q90qw90lq917835lq9", "name": "get_weather", "input": { "city": "Москва" } } ], "stop_reason": "tool_use", "usage": { "input_tokens": 120, "output_tokens": 45 }}Конвертировано в Формат OpenAI:
{ "id": "msg_01XFDUDYJgAACzvnptvVoYEL", "object": "chat.completion", "created": 1726567890, "model": "claude-sonnet-4-5", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "Позвольте мне проверить погоду в Москве.", "tool_calls": [ { "id": "toolu_01A09q90qw90lq917835lq9", "type": "function", "function": { "name": "get_weather", "arguments": "{\"city\":\"Москва\"}" } } ] }, "finish_reason": "tool_calls" } ], "usage": { "prompt_tokens": 120, "completion_tokens": 45, "total_tokens": 165 }}Ключевые Изменения:
- Массив
contentразделён: блокtextизвлечён как полеcontent, блокtool_useконвертирован в массивtool_calls. - Объект
tool_use.inputсериализован в JSON-строкуfunction.arguments. stop_reason: "tool_use"→finish_reason: "tool_calls".input_tokens→prompt_tokens,output_tokens→completion_tokens, добавленtotal_tokens.- Добавлены поля верхнего уровня формата OpenAI:
object,created, массивchoices.
Пример 3: Мультимодальный Gemini → Формат OpenAI
Section titled “Пример 3: Мультимодальный Gemini → Формат OpenAI”Ответ Gemini:
{ "candidates": [ { "content": { "parts": [ { "text": "Это изображение показывает современный пользовательский интерфейс с панелью навигации, областью контента и боковой панелью." } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 258, "candidatesTokenCount": 32, "totalTokenCount": 290 }}Конвертировано в Формат OpenAI:
{ "id": "chatcmpl-gemini-abc123", "object": "chat.completion", "created": 1726567890, "model": "gemini-2.0-flash-exp", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "Это изображение показывает современный пользовательский интерфейс с панелью навигации, областью контента и боковой панелью." }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 258, "completion_tokens": 32, "total_tokens": 290 }}Ключевые Изменения:
candidates[0].content.parts[0].text→choices[0].message.content.role: "model"→role: "assistant".finishReason: "STOP"→finish_reason: "stop"(конвертировано в нижний регистр).- Названия полей
usageMetadataотображены на структуруusageOpenAI.
Резюме Лучших Практик
Section titled “Резюме Лучших Практик”1. Выбор Подходящего Протокола
Section titled “1. Выбор Подходящего Протокола”Выбирайте протокол на основе типа клиента и модели:
| Тип Клиента | Целевая Модель | Рекомендуемый Протокол | Причина |
|---|---|---|---|
| SDK OpenAI | Модели OpenAI | OpenAI | Нативная поддержка, без конвертации |
| Claude Code | Модели Claude | Claude Messages | Нативная поддержка, без конвертации |
| LangChain / LiteLLM | Любая модель | OpenAI | Лучшая совместимость экосистемы |
| SDK Anthropic | Модели Claude | Claude Messages | Доступ к расширенному мышлению, кэшированию промптов |
| Пользовательский клиент | Любая модель | Зависит от потребностей | Предпочтительнее нативный протокол целевой модели |
2. Избегать Специфичных для Протокола Функций
Section titled “2. Избегать Специфичных для Протокола Функций”Если бизнесу требуется переключение между моделями, избегайте использования этих функций:
- Специфичные для OpenAI:
logprobs,seed, полные ограничения JSON Schema,reasoning_effort(серия o1) - Специфичные для Claude:
thinking,cache_control,mcp_servers - Специфичные для Gemini:
grounding,codeExecution
Универсальный набор функций (все поддерживают):
- Базовая беседа (
messages/contents) - Потоковый вывод (
stream) - Контроль температуры (
temperature, обратите внимание на различия диапазонов) - Вызов инструментов (
tools, обратите внимание на различия форматов) - Мультимодальный ввод (изображения, обратите внимание на различия форматов)
- Последовательности остановки (
stop/stop_sequences/stopSequences)
3. Тестирование Кросс-Протокольной Совместимости
Section titled “3. Тестирование Кросс-Протокольной Совместимости”Проверьте эти сценарии в тестовых средах:
- Один протокол, разные модели: Убедитесь, что протокол OpenAI правильно вызывает модели Claude и Gemini.
- Разные протоколы, одна модель: Проверьте согласованность результатов при вызове одной и той же модели Claude через протоколы Claude Messages и OpenAI.
- Круговой вызов инструмента: Проверьте, правильны ли определение инструмента, вызов и передача результатов через протоколы.
- Граничные параметры: Проверьте граничные случаи, такие как
temperature: 1.5(OpenAI валиден, Claude требует обрезки),n: 2(OpenAI поддерживает, Claude нет). - Обработка ошибок: Проверьте, правильно ли конвертируются ошибки upstream в формат протокола клиента.
4. Мониторинг и Логирование
Section titled “4. Мониторинг и Логирование”Записывайте следующую информацию для устранения проблем конвертации протоколов:
{ "request_id": "req_abc123", "client_protocol": "openai", "model_id": "claude-sonnet-4-5", "upstream_protocol": "claude", "conversion_required": true, "dropped_params": ["frequency_penalty", "logprobs"], "adjusted_params": {"temperature": {"original": 1.8, "adjusted": 1.0}}, "latency_ms": 856, "conversion_overhead_ms": 8}Ключевые метрики:
- Успешность конвертации: Процент ошибок 400, вызванных сбоями конвертации протоколов.
- Задержка конвертации: Дополнительная задержка, вносимая конвертацией протокола (обычно 5-15 мс).
- Частота удаления параметров: Какие параметры чаще всего удаляются, влияет ли это на бизнес.
- Частота ошибок кросс-протокола: Выше ли частота ошибок вызовов OpenAI → Claude, чем OpenAI → OpenAI.
5. Стратегия Постепенной Миграции
Section titled “5. Стратегия Постепенной Миграции”Если вы мигрируете с одного протокола на другой:
- Фаза 1: Тестирование с двойной записью: Результаты вызовов нового протокола используются только для сравнения, не влияют на бизнес.
- Фаза 2: Постепенное переключение: Небольшой трафик переключается на новый протокол, отслеживается частота ошибок и качество ответов.
- Фаза 3: Полное переключение: Переключить весь трафик после подтверждения отсутствия аномалий.
- Фаза 4: Очистка старого кода: Удалить код адаптации старого протокола.
Каждая фаза требует проверки:
- Функциональная корректность (вызов инструментов, мультимодальность, потоковый вывод)
- Качество ответов (различия в выводе для разных комбинаций протокол/модель)
- Метрики производительности (задержка, использование токенов, стоимость)
- Обработка ошибок (сетевые аномалии, ограничения скорости, сбои upstream)
Конвертация протоколов позволяет гибко выбирать клиенты и модели, но лучшей практикой остаётся приоритетное использование нативного протокола целевой модели. Если необходим кросс-протокольный вызов, тщательно проверьте в тестовых средах и отслеживайте ошибки и метрики производительности, связанные с конвертацией, в производственной среде.