Base URL and SDK Migration7 июля 2026 г.Flatkey

Миграция на мультимодельный SDK: как сохранить клиенты OpenAI для Claude, Gemini и DeepSeek

Спланируйте миграцию на мультимодельный SDK, сохранив клиенты OpenAI, при тестировании Claude, Gemini, DeepSeek, инструментов, стриминга, биллинга и отката.

Миграция на мультимодельный SDK: как сохранить клиенты OpenAI для Claude, Gemini и DeepSeek

Миграция на мультимодельный SDK не должна начинаться с замены каждой клиентской библиотеки в вашем приложении. Если ваш продакшн-код уже использует OpenAI Python или Node SDK для завершения чатов, более безопасным первым шагом будет сохранение стабильности клиентской части, перенос выбора провайдера в конфигурацию и проверка поведения Claude, Gemini и DeepSeek через совместимый маршрут, прежде чем расширять трафик.

Flatkey создан для команд, которым нужен один ключ, совместимый с OpenAI уровень маршрутизации, доступ к моделям разных провайдеров, а также просмотр использования и биллинга в одном месте. Это делает его полезным для миграции на мультимодельный SDK, но не отменяет необходимости тестировать семейства эндпоинтов, псевдонимы моделей, потоковую передачу, вызовы инструментов и записи об использовании. Рассматривайте каждый пример кода здесь как шаблон, пока не проверите его с вашим собственным ключом Flatkey и текущим каталогом моделей.

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

Матрица принятия решений при миграции на мультимодельный SDK

Используйте эту матрицу, прежде чем вносить изменения в код. Она разделяет то, что может оставаться стабильным, от того, что должно стать настраиваемым.

УровеньОставить стабильнымСделать настраиваемымДоказательство для сохранения
Клиент SDKСуществующий импорт OpenAI SDK и путь вызова завершения чатаКлюч API, базовый URL, таймаут, политика повторных попытокВерсия SDK и отредактированная конфигурация запуска
Форма запросаmessages, model, stream, базовые tools, где поддерживаетсяСпецифичные для провайдера дополнения и неподдерживаемые параметрыМинимальный запрос и сырой ответ
Выбор моделиПсевдонимы на уровне приложения, такие как support_chat или analysis_fastПсевдоним модели шлюза и семейство эндпоинтовСкриншот или экспорт каталога моделей
ОперацииСуществующие логи, идентификаторы запросов и обработка ошибокМетаданные провайдера, маршрута, использования, квоты и откатаПодтверждение с дашборда/из отчетов
РелизТекущий путь развертывания приложенияПеременные окружения для процентного развертывания и откатаОтветственный за откат и предыдущая конфигурация

В этом заключается основная дисциплина миграции на мультимодельный SDK: не смешивайте замену библиотек, миграцию промптов, оценку провайдера, проверку биллинга и развертывание в продакшн в один деплой.

Что официальная документация говорит о совместимости

SDK от OpenAI уже поддерживают необходимый вам паттерн. В текущем README для OpenAI Python описан клиент OpenAI и опция base_url, а в README для Node — стандартный клиент OpenAI и завершения чатов. В справочнике по API OpenAI говорится, что Chat Completions создает ответ модели для диалога, поддерживает потоковую передачу и возвращает объект завершения чата или фрагменты потока.

Если вы разделяете развертывание по среде выполнения, используйте этот чек-лист вместе с руководством по пользовательскому базовому URL для OpenAI Python SDK и руководством по базовому URL для OpenAI Node SDK. Если первое решение касается маршрутизации провайдера, а не настройки клиента, используйте руководство по маршрутизации API Claude и GPT, прежде чем выбирать тестовую нагрузку.

Совместимость у провайдеров различается:

ПровайдерОфициальный сигнал совместимостиПоследствия для миграции
OpenAI SDKPython поддерживает base_url; Node использует baseURL; Chat Completions имеет поля messages, model, stream, tools и usage.Сохраните обертку клиента OpenAI для первого этапа миграции.
Anthropic / ClaudeAnthropic публикует слой совместимости с OpenAI SDK, но заявляет, что он предназначен в основном для тестирования и сравнения, а не для долгосрочного использования в продакшене для большинства сценариев. Нативный Messages API использует /v1/messages, max_tokens, messages и параметр system верхнего уровня.Используйте совместимость для быстрой оценки, но протестируйте нативные требования Claude, прежде чем полагаться на специфичные для провайдера функции.
Google GeminiGoogle заявляет, что модели Gemini доступны через библиотеки OpenAI для Python, TypeScript/JavaScript и REST путем изменения ключа API, базового URL и модели.Gemini — хороший кандидат для дымового теста в формате OpenAI, при этом логика и специфичное для модели поведение проверяются отдельно.
DeepSeekDeepSeek заявляет, что формат его API совместим с OpenAI и Anthropic; в его документации для первого вызова перечислены базовые URL для OpenAI и Anthropic, а также примеры в формате OpenAI.DeepSeek может соответствовать пути клиента OpenAI, но устаревшие имена моделей и настройки мышления требуют явных проверок.
FlatkeyПубличная страница моделей Flatkey отображает типы эндпоинтов, такие как openai, anthropic и gemini; на главной странице показан маршрут завершения чатов, совместимый с OpenAI.Выбирайте модели по семейству эндпоинтов, а не только по имени провайдера.

Важно понимать, что «совместимость с OpenAI» обычно означает, что клиент может отправлять запросы в формате OpenAI. Это не означает, что каждый параметр, схема инструментов, управление логикой, медиаввод или поле использования ведут себя одинаково у разных провайдеров.

Шаг 1: Зафиксируйте границу клиента

Начните миграцию на мультимодельный SDK, поместив клиент OpenAI за одну локальную фабрику. Фабрика должна быть единственным местом, которое знает ключ, базовый URL, тайм-аут и псевдоним модели.

import os
from openai import OpenAI


def make_llm_client() -> OpenAI:
    return OpenAI(
        api_key=os.environ["FLATKEY_API_KEY"],
        base_url=os.getenv("FLATKEY_BASE_URL", "https://router.flatkey.ai/v1"),
        timeout=float(os.getenv("LLM_TIMEOUT_SECONDS", "60")),
        max_retries=int(os.getenv("LLM_MAX_RETRIES", "2")),
    )


client = make_llm_client()

completion = client.chat.completions.create(
    model=os.environ["FLATKEY_MODEL"],
    messages=[
        {"role": "system", "content": "Вы отвечаете короткими заметками по реализации."},
        {"role": "user", "content": "Ответьте в точности: migration probe ok"},
    ],
)

print(completion.choices[0].message.content)

Для Node:

import OpenAI from "openai";

export function makeLlmClient() {
  return new OpenAI({
    apiKey: process.env.FLATKEY_API_KEY,
    baseURL: process.env.FLATKEY_BASE_URL ?? "https://router.flatkey.ai/v1",
    timeout: Number(process.env.LLM_TIMEOUT_MS ?? 60000),
    maxRetries: Number(process.env.LLM_MAX_RETRIES ?? 2),
  });
}

const client = makeLlmClient();

const completion = await client.chat.completions.create({
  model: process.env.FLATKEY_MODEL,
  messages: [
    { role: "system", content: "Вы отвечаете короткими заметками по реализации." },
    { role: "user", content: "Ответьте в точности: migration probe ok" },
  ],
});

console.log(completion.choices[0].message.content);

Приложение должно вызывать make_llm_client() или makeLlmClient(), а не создавать клиенты в контроллерах, рабочих процессах и скриптах. Именно эта единственная граница позволяет сделать миграцию на мультимодельный SDK обратимой.

Шаг 2: Создайте карту моделей и конечных точек

Не направляйте каждую рабочую нагрузку на одно новое имя модели. Начните с карты, в которой указаны рабочая нагрузка, семейство конечных точек, текущий провайдер, целевой провайдер и значение для отката.

Рабочая нагрузкаСемейство конечных точекТекущий путьЦелевой путьОткат
Чат поддержкиЗавершения чата в стиле OpenAIТекущая модель OpenAIПсевдоним чата Flatkey для GPT, Claude, Gemini или DeepSeekПредыдущие ключ, базовый URL и модель
Внутренний анализЗавершения чата в стиле OpenAIТекущая модель OpenAIПсевдоним модели Flatkey, выбранный для логики и стоимостиПредыдущий псевдоним модели
Рабочий процесс с инструментамиЗавершения чата с инструментамиТекущая модель, совместимая с инструментамиМодель-кандидат с проверенным поведением инструментовОтключить маршрут провайдера
Потоковый UIПоток завершений чатаТекущий парсер потокаПровайдер-кандидат с подтверждением необработанного потокаПереключить потоковый трафик обратно
Нативная функция ClaudeAnthropic Messages APIНативный клиент ClaudeСохранить нативный клиент, если совместимость нарушает требуемую функциюНе мигрировать этот путь

Страница моделей Flatkey здесь полезна, так как она показывает типы конечных точек. Если модель указана в семействе нативных конечных точек, не предполагайте, что она доступна через путь чата OpenAI, пока это не подтвердят каталог вашего аккаунта и дымовые тесты.

Шаг 3: Проведите дымовой тест для четырех провайдеров

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

ТестЗапросУсловие прохожденияСбой для анализа
GPT или текущая модель OpenAIСуществующий запрос в формате OpenAI через FlatkeyОтвет получен, использование видно, логи ссылаются на ожидаемый псевдонимНеверный ключ, неверный базовый URL, дублирующийся /v1, отсутствующая модель
ClaudeТот же запрос в формате OpenAI через выбранный псевдоним FlatkeyПолучен простой ответ; в запросе нет неподдерживаемых функцийСопоставление системных сообщений, схема инструментов, нативные функции только для Claude
GeminiТот же запрос в формате OpenAI через выбранный псевдоним FlatkeyПолучен простой ответ; стандартные настройки логики приемлемыПсевдоним модели, настройки логики, мультимодальные допущения
DeepSeekТот же запрос в формате OpenAI через выбранный псевдоним FlatkeyПолучен простой ответ; псевдоним, чувствительный к устареванию, актуаленПереименование модели, настройки мышления, парсер потока

Сохраняйте необработанное тело запроса, отредактированные заголовки, тело ответа, HTTP-статус, псевдоним модели, идентификатор запроса (если он возвращается) и запись об использовании на панели управления. Если какому-либо провайдеру требуется другой параметр, перенесите этот параметр в профиль провайдера, а не разбрасывайте ветви if provider == по всему приложению.

Шаг 4: Тестируйте потоковую передачу и вызовы инструментов отдельно

Обычное завершение доказывает работоспособность только самого низкорискового пути. Потоковая передача и вызовы инструментов — это отдельные контракты.

Для потоковой передачи сохраняйте:

Что проверятьПочему это важно
Заголовки ответаПодтверждает, возвращает ли маршрут данные в формате event-stream.
Первое событиеВыявляет проблемы с буферизацией или парсером прокси.
Последнее событиеПодтверждает обработку конца потока и поведение использования.
Вывод парсера UIДоказывает, что ваш фронтенд не полагался на формат чанка одного конкретного провайдера.

Для инструментов сначала протестируйте крошечную схему:

{
  "type": "function",
  "function": {
    "name": "lookup_order_status",
    "description": "Return a test order status.",
    "parameters": {
      "type": "object",
      "properties": {
        "order_id": { "type": "string" }
      },
      "required": ["order_id"]
    }
  }
}

Не используйте вашу самую большую продакшн-схему инструментов в качестве первого доказательства. Например, в документации по совместимости от Anthropic упоминаются ограничения совместимости с OpenAI и рекомендуется использовать нативный API Claude для полного набора функций Claude. Именно такие детали должен выявлять чек-лист по миграции на мультимодельный SDK перед развертыванием.

Шаг 5: Сохраняйте профили провайдеров компактными

Профили провайдеров должны описывать различия, а не содержать бизнес-логику.

{
  "support_chat": {
    "base_url_env": "FLATKEY_BASE_URL",
    "model_env": "FLATKEY_SUPPORT_CHAT_MODEL",
    "endpoint_family": "openai_chat_completions",
    "stream": true,
    "tools": "basic",
    "fallback_alias": "support_chat_previous"
  },
  "analysis_fast": {
    "base_url_env": "FLATKEY_BASE_URL",
    "model_env": "FLATKEY_ANALYSIS_FAST_MODEL",
    "endpoint_family": "openai_chat_completions",
    "stream": false,
    "tools": "none",
    "fallback_alias": "analysis_fast_previous"
  }
}

Держите нативные функции провайдеров вне общего пути клиента OpenAI, если у вас нет тестов для каждого целевого провайдера. Если требуются цитаты Claude, специфичное для Gemini поведение при работе с медиа, элементы управления мышлением DeepSeek или нативный пакетный эндпоинт провайдера, создайте именованный нативный адаптер и сохраните OpenAI-совместимый путь для тех рабочих нагрузок, которые действительно ему соответствуют.

Шаг 6: Проверьте биллинг и откат

Миграция, которая возвращает текст, но теряет данные для биллинга, не завершена. Прежде чем увеличивать трафик, сохраните:

Операционная проверкаУсловие прохождения
Видимость использованияЗапрос появляется в данных об использовании или логах Flatkey с ожидаемым контекстом маршрута/модели.
Проверка затратЗаписи о ценах или использовании достаточно видны для сверки финансовым или операционным отделом.
Поведение квотНизкая тестовая квота или порог бюджета ведут себя ожидаемо с не-продакшн ключом.
Таксономия ошибокОшибки 401, 403, 404, 429, 5xx и ошибки провайдера сопоставлены с четкими действиями для ответственных.
ОткатОдно изменение в окружении возвращает трафик на предыдущий ключ/базовый URL/модель.

Именно здесь важны единый биллинг и обзор использования от Flatkey. Цель — не просто получить доступ к большему количеству моделей. Цель миграции на мультимодельный SDK — это доступ, который продуктовый, операционный и финансовый отделы могут инспектировать после переключения трафика.

Процесс переключения для миграции на мультимодельный SDK

Используйте этот порядок для первого среза продакшн-трафика:

  1. Выберите одну рабочую нагрузку с низким риском и существующим клиентом OpenAI SDK.
  2. Добавьте фабрику клиентов и переменные окружения, не меняя текущего провайдера.
  3. Проверьте работу текущей модели через новую фабрику.
  4. Проверьте работу одной целевой модели Claude, Gemini или DeepSeek с простым завершением (completion).
  5. Проверьте потоковую передачу и инструменты, только если эта рабочая нагрузка их использует.
  6. Проверьте использование, биллинг, обработку ошибок и откат.
  7. Направьте небольшой процент трафика на новый псевдоним модели.
  8. Проанализируйте сбои по провайдерам и семействам эндпоинтов, прежде чем добавлять следующую рабочую нагрузку.

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

Часто задаваемые вопросы

Могу ли я использовать один клиент OpenAI SDK для Claude, Gemini и DeepSeek?

Часто можно сохранить клиент OpenAI SDK для OpenAI-совместимых маршрутов, но вам все равно понадобятся тесты для конкретных провайдеров. Google и DeepSeek документируют OpenAI-совместимый доступ. Anthropic документирует слой совместимости с OpenAI SDK, но утверждает, что он предназначен в основном для тестирования и сравнения, а не для долгосрочного использования в продакшене для большинства сценариев.

Следует ли мигрировать трафик Responses API таким же образом?

Только если целевой шлюз и целевая модель явно поддерживают используемое вами семейство эндпоинтов. Chat Completions и Responses — это не один и тот же контракт. Начните с семейства эндпоинтов, которое уже использует ваше приложение, а затем создайте отдельный план тестирования для Responses.

Какая самая частая ошибка при миграции на мультимодельный SDK?

Самая частая ошибка — считать, что вся миграция заключается в смене базового URL. Настоящая миграция на мультимодельный SDK также включает проверку имен моделей, семейств эндпоинтов, потоковой передачи, инструментов, использования, квот, обработки ошибок и отката.

Когда следует сохранить нативный SDK провайдера?

Сохраняйте нативный SDK провайдера, когда ваша рабочая нагрузка зависит от специфичных для провайдера функций, которые не покрываются слоем совместимости. Нативные функции Claude, специфичные для Gemini пути работы с медиа или специфичные для DeepSeek элементы управления логическим выводом могут оправдать создание отдельного адаптера.

Итоговый чек-лист

Прежде чем считать миграцию завершенной, убедитесь, что вы:

ЭлементУсловие завершения
Фабрика клиентовВсе пути приложения используют одну оболочку OpenAI SDK или именованный нативный адаптер.
Разделение конфигурацииКлюч API, базовый URL, псевдоним модели, тайм-аут, повторные попытки и владелец маршрута управляются через переменные окружения.
Подтверждение провайдераКандидаты GPT, Claude, Gemini и DeepSeek были протестированы с сохранением необработанных данных.
Подтверждение функциональностиСтриминг и инструменты были протестированы отдельно от обычного чата.
Подтверждение операционной готовностиИспользование, биллинг, квоты, логи и ошибки видны соответствующим владельцам.
Подтверждение возможности откатаОдно задокументированное изменение возвращает рабочую нагрузку на предыдущий маршрут.

Миграция на мультимодельный SDK работает лучше всего, когда она проходит без сюрпризов: одна небольшая рабочая нагрузка, одна граница клиента, одна карта моделей и подтверждение для каждого добавляемого провайдера. Когда вы будете готовы запустить эти тесты через единый маршрут, получите ключ Flatkey и начните с низкорискового пути чата, совместимого с OpenAI.