Миграция на мультимодельный 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 SDK | Python поддерживает base_url; Node использует baseURL; Chat Completions имеет поля messages, model, stream, tools и usage. | Сохраните обертку клиента OpenAI для первого этапа миграции. |
| Anthropic / Claude | Anthropic публикует слой совместимости с OpenAI SDK, но заявляет, что он предназначен в основном для тестирования и сравнения, а не для долгосрочного использования в продакшене для большинства сценариев. Нативный Messages API использует /v1/messages, max_tokens, messages и параметр system верхнего уровня. | Используйте совместимость для быстрой оценки, но протестируйте нативные требования Claude, прежде чем полагаться на специфичные для провайдера функции. |
| Google Gemini | Google заявляет, что модели Gemini доступны через библиотеки OpenAI для Python, TypeScript/JavaScript и REST путем изменения ключа API, базового URL и модели. | Gemini — хороший кандидат для дымового теста в формате OpenAI, при этом логика и специфичное для модели поведение проверяются отдельно. |
| DeepSeek | DeepSeek заявляет, что формат его 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 | Поток завершений чата | Текущий парсер потока | Провайдер-кандидат с подтверждением необработанного потока | Переключить потоковый трафик обратно |
| Нативная функция Claude | Anthropic 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
Используйте этот порядок для первого среза продакшн-трафика:
- Выберите одну рабочую нагрузку с низким риском и существующим клиентом OpenAI SDK.
- Добавьте фабрику клиентов и переменные окружения, не меняя текущего провайдера.
- Проверьте работу текущей модели через новую фабрику.
- Проверьте работу одной целевой модели Claude, Gemini или DeepSeek с простым завершением (completion).
- Проверьте потоковую передачу и инструменты, только если эта рабочая нагрузка их использует.
- Проверьте использование, биллинг, обработку ошибок и откат.
- Направьте небольшой процент трафика на новый псевдоним модели.
- Проанализируйте сбои по провайдерам и семействам эндпоинтов, прежде чем добавлять следующую рабочую нагрузку.
Если первая рабочая нагрузка требует нативных функций провайдера, выберите другую рабочую нагрузку для первой миграции на мультимодельный 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.


