Skip to content

Руководство по Конвертации Протоколов

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 “Конвертация Формата Сообщений”

Различия в Обработке 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.
OpenAIClaudeGeminiОписание
systemПоле верхнего уровня systemsystemInstructionРазное расположение системного промпта
useruseruserСообщение пользователя, одинаково
assistantassistantmodelОтвет ассистента/модели, разные названия
tooltool_result внутри userfunctionResponse внутри userРазная принадлежность результата инструмента

Соображения по Конвертации:

  • Claude не принимает два последовательных сообщения с одной и той же ролью; конвертация требует слияния или вставки заполнителей.
  • Роль model в Gemini отображается как assistant при конвертации в OpenAI.
  • role: "tool" в OpenAI объединяется в сообщения user как в Claude, так и в Gemini.

Структура сообщений Gemini называется contents, роль каждого сообщения называется role, а содержимое находится в массиве parts:

{
"contents": [
{
"role": "user",
"parts": [{ "text": "Объясните, что такое API-шлюз" }]
}
]
}

Правила Конвертации:

  • OpenAI messages ↔ Gemini contents
  • OpenAI content ↔ Gemini parts
  • OpenAI assistant ↔ Gemini model
  • system prompt преобразуется в поле верхнего уровня systemInstruction

Таблица Маппинга Параметров

Section titled “Таблица Маппинга Параметров”

Параметры Сэмплирования

Section titled “Параметры Сэмплирования”
OpenAIClaudeGeminiОписание
temperaturetemperaturetemperatureClaude макс 1, OpenAI макс 2, Gemini макс 2
top_ptop_ptopPnucleus sampling, все поддерживают
Не поддерживаетсяtop_ktopKOpenAI не поддерживает, удаляется при конвертации
max_tokens / max_completion_tokensmax_tokens (обязательно)maxOutputTokensClaude требует явного указания
nНе поддерживаетсяcandidateCountClaude не поддерживает генерацию нескольких кандидатов
stopstop_sequencesstopSequencesРазные названия полей, одинаковая семантика

Конвертация Диапазона Температуры:

Когда temperature запроса OpenAI превышает 1 и целью является Claude, RouteAPI автоматически обрезает её до 1, чтобы избежать отклонения upstream.

Параметры Управления Выводом

Section titled “Параметры Управления Выводом”
OpenAIClaudeGeminiОписание
response_formatНе поддерживаетсяresponseMimeTypeOpenAI поддерживает JSON mode и JSON Schema
frequency_penaltyНе поддерживаетсяfrequencyPenaltyClaude не поддерживает параметры штрафа
presence_penaltyНе поддерживаетсяpresencePenaltyClaude не поддерживает параметры штрафа
streamstreamstreamВсе поддерживают, но форматы событий полностью разные
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 “Метаданные и Управление”
OpenAIClaudeGeminiОписание
usermetadata.user_idНе поддерживаетсяДля обнаружения злоупотреблений
seedНе поддерживаетсяseedClaude не поддерживает детерминированный сэмплинг
logprobs / top_logprobsНе поддерживаетсяНе поддерживаетсяТолько модели OpenAI поддерживают
Не поддерживаетсяthinkingНе поддерживаетсяСпецифичная для Claude конфигурация расширенного мышления

Конвертация Вызова Инструментов

Section titled “Конвертация Вызова Инструментов”

Различия в Формате Определения Инструментов

Section titled “Различия в Формате Определения Инструментов”
{
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Запросить текущую погоду для указанного города",
"parameters": {
"type": "object",
"properties": {
"city": { "type": "string", "description": "Название города" }
},
"required": ["city"]
}
}
}
]
}
{
"tools": [
{
"name": "get_weather",
"description": "Запросить текущую погоду для указанного города",
"input_schema": {
"type": "object",
"properties": {
"city": { "type": "string", "description": "Название города" }
},
"required": ["city"]
}
}
]
}
{
"tools": [
{
"functionDeclarations": [
{
"name": "get_weather",
"description": "Запросить текущую погоду для указанного города",
"parameters": {
"type": "object",
"properties": {
"city": { "type": "string", "description": "Название города" }
},
"required": ["city"]
}
}
]
}
]
}

Правила Конвертации Определения Инструментов

Section titled “Правила Конвертации Определения Инструментов”
OpenAIClaudeGeminiПримечания по Конвертации
tools[].type: "function"Этого уровня нетЭтого уровня нетУдалить обёртку type при конвертации
tools[].functionВыровнено в tools[]Помещено в functionDeclarations[]Разная иерархическая структура
function.parametersinput_schemaparametersРазное название поля в Claude
OpenAIClaudeGeminiОписание
"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_id vs tool_use_id vs идентификация по имени функции в Gemini.
  • Claude и Gemini требуют все результаты инструментов в одном сообщении user; OpenAI допускает несколько отдельных сообщений tool.

Конвертация Мультимодального Контента

Section titled “Конвертация Мультимодального Контента”

Конвертация Формата URL Изображения

Section titled “Конвертация Формата URL Изображения”
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": "https://example.com/image.jpg",
"detail": "high"
}
},
{ "type": "text", "text": "Опишите это изображение" }
]
}
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "url",
"url": "https://example.com/image.jpg"
}
},
{ "type": "text", "text": "Опишите это изображение" }
]
}
{
"role": "user",
"parts": [
{
"fileData": {
"mimeType": "image/jpeg",
"fileUri": "https://example.com/image.jpg"
}
},
{ "text": "Опишите это изображение" }
]
}

Обработка Кодировки Base64

Section titled “Обработка Кодировки Base64”
{
"type": "image_url",
"image_url": {
"url": "data:image/jpeg;base64,/9j/4AAQSkZJRg..."
}
}
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": "/9j/4AAQSkZJRg..."
}
}
{
"inlineData": {
"mimeType": "image/jpeg",
"data": "/9j/4AAQSkZJRg..."
}
}

Правила Конвертации:

  • URI data: OpenAI анализируется, media_type извлекается из префикса URI, чистая часть base64 передаётся целевому протоколу.
  • Claude требует отдельное поле media_type, не принимает URI data:.
  • Gemini использует inlineData вместо fileData для представления контента base64.
  • Параметр detail OpenAI (low/high) теряется при конвертации; у Claude и Gemini нет эквивалентной концепции.

Обработка Неподдерживаемых Параметров

Section titled “Обработка Неподдерживаемых Параметров”

Какие Параметры Нельзя Конвертировать

Section titled “Какие Параметры Нельзя Конвертировать”
ПараметрИсходный ПротоколНельзя Конвертировать ВПричина
top_kClaude, GeminiOpenAIOpenAI не поддерживает top-k сэмплинг
nOpenAI, GeminiClaudeClaude не поддерживает генерацию нескольких кандидатов
frequency_penalty / presence_penaltyOpenAI, GeminiClaudeУ Claude нет параметров штрафа
logprobsOpenAIClaude, GeminiТолько модели OpenAI возвращают логарифмические вероятности
thinkingClaudeOpenAI, GeminiСпецифичная для Claude конфигурация расширенного мышления
cache_controlClaudeOpenAI, GeminiСпецифичное для Claude управление кэшированием промптов
reasoning_effortOpenAIClaude, GeminiСпецифичный для серии o1 OpenAI параметр
response_format (JSON Schema)OpenAIClaude, GeminiПолные ограничения JSON Schema поддерживает только OpenAI

Как Обрабатываются Несовместимые Параметры

Section titled “Как Обрабатываются Несовместимые Параметры”

RouteAPI использует следующие стратегии:

  1. Тихое Игнорирование: Неподдерживаемые параметры удаляются при конвертации без влияния на успешность запроса (например, detail, logprobs).
  2. Автоматическая Корректировка: Значения вне диапазона обрезаются до допустимого диапазона (например, temperature > 1 обрезается до 1 при передаче в Claude).
  3. Консервативное Понижение: Сложные функции симулируются простыми методами (например, JSON Schema OpenAI понижается до вызовов инструментов или ограничений промпта на Claude).
  4. Отклонение Запроса: Редко, если основные параметры не могут быть конвертированы и нет разумного значения по умолчанию, возвращается ошибка 400 (например, протокол Claude без max_tokens).

Предупреждения и Сообщения об Ошибках

Section titled “Предупреждения и Сообщения об Ошибках”

RouteAPI предоставляет информацию о конвертации в заголовках ответа и логах:

X-RouteAPI-Protocol-Conversion: openai-to-claude
X-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"
}
}
  1. Использовать Нативный Протокол: Используйте нативный протокол модели, когда это возможно, чтобы избежать потерь при конвертации.
  2. Избегать Зависимости от Специфичных для Протокола Функций: Не полагайтесь на возможности, специфичные для одного протокола, такие как logprobs, thinking, если вы не уверены, что будете использовать только модели этого протокола.
  3. Проверять Заголовки Ответа: Обращайте внимание на заголовок X-RouteAPI-Dropped-Params, чтобы знать, какие параметры были проигнорированы.
  4. Тестировать Кросс-Протокольную Совместимость: Проверяйте поведение одного и того же запроса в разных комбинациях протокол/модель в тестовых средах.
  5. Логировать ID Модели: Записывайте фактически вызванный ID модели и тип протокола в логи для упрощения поиска различий.

Стандартизация Формата Ответа

Section titled “Стандартизация Формата Ответа”

Стандартизация Поля usage

Section titled “Стандартизация Поля usage”
ПротоколПоле входных токеновПоле выходных токеновПоле общих токенов
OpenAIprompt_tokenscompletion_tokenstotal_tokens
Claudeinput_tokensoutput_tokensНет (вычислить самостоятельно)
GeminipromptTokenCountcandidatesTokenCounttotalTokenCount

Правила Конвертации:

  • 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”
OpenAIClaudeGeminiЗначение
stopend_turnSTOPЕстественное завершение
lengthmax_tokensMAX_TOKENSДостигнут лимит длины
tool_callstool_useSTOP (с functionCall)Запрос вызова инструмента
content_filterНет эквивалентаSAFETYЗаблокировано фильтром контента
stopstop_sequenceSTOPДостигнута последовательность остановки

Правила Конвертации:

  • Claude end_turn → OpenAI stop
  • Claude max_tokens → OpenAI length
  • Claude tool_use → OpenAI tool_calls
  • Gemini STOP отображается как stop или tool_calls в зависимости от наличия functionCall
  • Gemini SAFETY → OpenAI content_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.

Пример 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 отображены на структуру usage OpenAI.

1. Выбор Подходящего Протокола

Section titled “1. Выбор Подходящего Протокола”

Выбирайте протокол на основе типа клиента и модели:

Тип КлиентаЦелевая МодельРекомендуемый ПротоколПричина
SDK OpenAIМодели OpenAIOpenAIНативная поддержка, без конвертации
Claude CodeМодели ClaudeClaude MessagesНативная поддержка, без конвертации
LangChain / LiteLLMЛюбая модельOpenAIЛучшая совместимость экосистемы
SDK AnthropicМодели ClaudeClaude 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. Тестирование Кросс-Протокольной Совместимости”

Проверьте эти сценарии в тестовых средах:

  1. Один протокол, разные модели: Убедитесь, что протокол OpenAI правильно вызывает модели Claude и Gemini.
  2. Разные протоколы, одна модель: Проверьте согласованность результатов при вызове одной и той же модели Claude через протоколы Claude Messages и OpenAI.
  3. Круговой вызов инструмента: Проверьте, правильны ли определение инструмента, вызов и передача результатов через протоколы.
  4. Граничные параметры: Проверьте граничные случаи, такие как temperature: 1.5 (OpenAI валиден, Claude требует обрезки), n: 2 (OpenAI поддерживает, Claude нет).
  5. Обработка ошибок: Проверьте, правильно ли конвертируются ошибки 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. Фаза 1: Тестирование с двойной записью: Результаты вызовов нового протокола используются только для сравнения, не влияют на бизнес.
  2. Фаза 2: Постепенное переключение: Небольшой трафик переключается на новый протокол, отслеживается частота ошибок и качество ответов.
  3. Фаза 3: Полное переключение: Переключить весь трафик после подтверждения отсутствия аномалий.
  4. Фаза 4: Очистка старого кода: Удалить код адаптации старого протокола.

Каждая фаза требует проверки:

  • Функциональная корректность (вызов инструментов, мультимодальность, потоковый вывод)
  • Качество ответов (различия в выводе для разных комбинаций протокол/модель)
  • Метрики производительности (задержка, использование токенов, стоимость)
  • Обработка ошибок (сетевые аномалии, ограничения скорости, сбои upstream)

Конвертация протоколов позволяет гибко выбирать клиенты и модели, но лучшей практикой остаётся приоритетное использование нативного протокола целевой модели. Если необходим кросс-протокольный вызов, тщательно проверьте в тестовых средах и отслеживайте ошибки и метрики производительности, связанные с конвертацией, в производственной среде.