OpenAI-совместимый API: как подключить Claude, Gemini и DeepSeek через один base_url
OpenAI-совместимый API это формат запросов, повторяющий схему OpenAI: тот же путь chat/completions, те же поля и тот же конверт ответа. Благодаря этому один клиент вызывает Claude, Gemini, DeepSeek и десятки других моделей. Достаточно поменять base_url и ключ, код остаётся прежним.
Содержание
Что это значит
Когда говорят «OpenAI-совместимый», речь о формате общения, а не о компании. Сервер принимает запрос на путь /api/v1/chat/completions, ожидает поля model, messages, temperature и возвращает ответ в конверте с choices.
Такой формат стал де-факто стандартом. Клиенты, написанные под OpenAI, работают с любым сервером, который его поддерживает. Это даёт возможность менять провайдера без переписывания кода.
Что это даёт на практике
Первое: одна интеграция вместо нескольких. Вместо отдельного SDK для каждой линейки используется один клиент, а меняется только имя модели.
Второе: переключение становится дешёвым. Сравнить две модели на своих данных можно за минуты, потому что остальной код не трогается. Третье: библиотеки и фреймворки, написанные под OpenAI, работают без адаптеров.
from openai import OpenAI
client = OpenAI(
api_key=os.environ["LLM_MART_API_KEY"],
base_url="https://llmmart.ru/api/v1",
)
for model in ("deepseek/deepseek-v4.1-flash", "z-ai/glm-5.3"):
reply = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": "Объясни разницу между двумя подходами."}],
)
print(model, "→", reply.choices[0].message.content[:80])Чем отличается Anthropic-протокол
У Anthropic свой формат: путь /v1/messages, поле max_tokens обязательно, а содержимое сообщений устроено как массив блоков. Системная инструкция передаётся отдельным полем, а не сообщением с ролью.
Отсюда правило про базовый адрес: для OpenAI-клиентов нужен https://llmmart.ru/api/v1, для Anthropic SDK — https://llmmart.ru/api без версии, иначе получится /v1/v1/messages и 404. Подробности в документации Messages.
| Клиент | Базовый адрес | Путь |
|---|---|---|
| OpenAI SDK | https://llmmart.ru/api/v1 | /chat/completions |
| Anthropic SDK | https://llmmart.ru/api | /v1/messages |
| Responses API | https://llmmart.ru/api/v1 | /responses |
Что ломается при переносе
Первая ошибка: идентификаторы. Слаг из документации OpenRouter или вендора не сработает, нужно брать имя модели из каталога.
Вторая: лишняя версия в адресе. Третья: неподдерживаемые параметры. Четвёртая: ожидание одинакового поведения. Формат совпадает, но модели разные: у каждой свой контекст, свои цены и свои сильные стороны.
Адрес
Поставьте base_url https://llmmart.ru/api/v1 для OpenAI-клиентов.
Ключ
Выпустите ключ sk-… в кабинете и положите в переменную окружения.
Модель
Возьмите слаг из каталога и проверьте, что она включена.
Проверка
Отправьте тестовый запрос и убедитесь, что ответ пришёл от нужной модели.
Фреймворки вроде LangChain и LiteLLM настраиваются так же: адрес и ключ. Инструкции собраны в разделе интеграций, цены моделей лежат в каталоге.
Частые вопросы
Что такое OpenAI-совместимый API?
Это формат запросов и ответов, повторяющий схему OpenAI: путь /api/v1/chat/completions, поля model и messages, конверт с choices. Благодаря этому один клиент работает с разными моделями. В LLM Mart такой адрес открывает Claude, Gemini, DeepSeek и остальные модели каталога на одном ключе с оплатой в рублях.
Какие модели работают через один base_url?
Через OpenAI-совместимый адрес LLM Mart доступны все текстовые модели каталога: Anthropic, OpenAI, Google, DeepSeek, Qwen, GLM, Kimi, российские GigaChat и YandexGPT. Меняется только идентификатор модели в запросе, остальной код остаётся прежним. Список с ценами и фильтрами есть в каталоге.
Чем OpenAI-совместимый API отличается от Anthropic?
Формат запросов и путь различаются: у OpenAI это /chat/completions, у Anthropic /v1/messages с обязательным max_tokens и системной инструкцией отдельным полем. Поэтому базовые адреса тоже разные: для OpenAI-клиентов нужен /api/v1, для Anthropic SDK адрес без версии. Иначе получится /v1/v1/messages и ответ 404.
Почему не работает модель после переноса?
Чаще всего идентификатор скопирован из документации другого сервиса. Слаг вроде claude-3-5-sonnet из чужого примера не сработает: нужен точный из каталога LLM Mart, например anthropic/claude-sonnet-5.5. Вторая частая причина связана с лишней версией в базовом адресе, третья с неподдерживаемыми параметрами запроса.
Совместимость формата значит одинаковое поведение?
Нет. Формат запросов общий, но модели разные: у каждой свой контекст, цены, сильные и слабые стороны. Поля вроде веб-поиска или выбора площадки поддерживаются не всеми, и неизвестный параметр вернёт ошибку валидации. Поэтому после переноса стоит проверить результат на своих примерах через каталог LLM Mart.
Комментарии 0