OpenAI-совместимый API: как подключить другую LLM и проверить endpoint

В этой статье

OpenAI-совместимый API принимает запросы в знакомом формате OpenAI, но может обслуживать модели другого поставщика или локальные модели. Для подключения обычно нужны три значения: базовый адрес, имя модели и ключ нужного сервиса. Совпадение формата не означает одинаковые модели, качество ответов или поддержку всех методов.

Например, Ollama прямо заявляет совместимость с частями OpenAI API, а DeepSeek публикует настройки для обращения к своим моделям через совместимые клиенты. Документация Ollama, первый запрос DeepSeek. Сведения проверены 10 сентября 2026 года.

Базовый адрес и endpoint — разные поля

Базовый адрес задаёт сервер и общий префикс. Endpoint добавляет путь конкретной операции. Для локального Ollama:

Что настраиваете Значение
Базовый адрес клиента http://localhost:11434/v1
Путь текстового чата /chat/completions
Полный адрес POST-запроса http://localhost:11434/v1/chat/completions

Если приложение просит base URL, не вставляйте туда полный путь, когда клиент сам добавляет /chat/completions: получится повтор. Если поле просит полный endpoint, одного адреса сервера будет недостаточно. Сверьте смысл поля с документацией клиента. Пример базового адреса Ollama.

У DeepSeek в текущей инструкции указан базовый адрес https://api.deepseek.com и собственный API-ключ. Это отдельный сервис: ключ OpenAI не становится ключом DeepSeek только из-за совместимости протокола. Имена моделей тоже берутся у провайдера, например deepseek-v4-flash, а не подменяются названием GPT. Настройки DeepSeek.

Подготовьте локальный пример

Ниже используется уже установленный Ollama с локальной моделью и Python 3.10 или новее. Пример не требует сторонней Python-библиотеки; HTTP-запрос выполняет стандартный urllib.request.

  1. Запустите Ollama. Если используете сервер из командной строки, команда — ollama serve.
  2. Загрузите модель ollama pull llama3.2 либо выберите уже имеющуюся текстовую модель.
  3. Командой ollama ls проверьте её точное имя. Оно должно совпадать с полем model в запросе.

Команды запуска и списка описаны в CLI Ollama; модель llama3.2 приведена в инструкции совместимости. Подбор модели по объёму памяти компьютера — отдельная задача; этот пример не обещает, что выбранная модель поместится на любом устройстве.

Локальный API Ollama по localhost:11434 не требует авторизации. Для облачных моделей и доступа к облачному API условия другие; не переносите отсутствие ключа на внешний сервер. Аутентификация Ollama.

Минимальный клиент на Python

Сохраните код в client.py. По умолчанию он обращается только к локальному Ollama. Если выбрали другую установленную модель, измените значение llama3.2 или задайте переменную среды LLM_MODEL.

import json
import os
import urllib.error
import urllib.request

base_url = os.environ.get("LLM_BASE_URL", "http://localhost:11434/v1")
model = os.environ.get("LLM_MODEL", "llama3.2")
api_key = os.environ.get("LLM_API_KEY")
headers = {"Content-Type": "application/json"}
if api_key:
    headers["Authorization"] = "Bearer " + api_key

payload = {
    "model": model,
    "messages": [{"role": "user", "content": "Ответь одним словом: готово"}],
    "stream": False,
}
request = urllib.request.Request(
    base_url.rstrip("/") + "/chat/completions",
    data=json.dumps(payload, ensure_ascii=False).encode("utf-8"),
    headers=headers,
    method="POST",
)
try:
    with urllib.request.urlopen(request, timeout=180) as response:
        result = json.load(response)
except urllib.error.HTTPError as error:
    raise SystemExit(f"HTTP {error.code}: проверьте адрес, ключ и модель")
except urllib.error.URLError:
    raise SystemExit("Не удалось подключиться к серверу")

try:
    text = result["choices"][0]["message"]["content"]
except (KeyError, IndexError, TypeError):
    raise SystemExit("Ответ не соответствует ожидаемому Chat Completions")
if not isinstance(text, str) or not text.strip():
    raise SystemExit("Сервер не вернул непустой текст")
print(text)

Запустите из папки с файлом:

python -X utf8 client.py

Код отправляет один запрос без потоковой передачи и извлекает текст из choices[0].message.content. Эти поля соответствуют показанному Ollama формату Chat Completions. Для другого сервера задайте LLM_BASE_URL, LLM_MODEL и при необходимости LLM_API_KEY по его документации. Сначала убедитесь, что адрес принадлежит выбранному провайдеру: туда уйдут и сообщение, и ключ.

Как понять, что подключение работает

Проверяйте два разных результата:

  • Транспорт и формат: сервер принял запрос, вернул ожидаемую структуру и непустой текст.
  • Выполнение задачи: модель действительно ответила словом «готово», без лишнего текста.

Первый результат не доказывает второй. Например, ответ «Конечно, я готов помочь» может быть корректным ответом API и одновременно нарушать условие одного слова.

Этот клиент проверен на локальном HTTP-стенде с Python 3.13: корректный ответ вывел готово, HTTP 401 завершил программу с сообщением об ошибке, а JSON без choices был отклонён. Стенд также проверил путь запроса и передачу русского текста в UTF-8. Это проверка кода клиента; запуск модели Ollama и обращение к DeepSeek в неё не входили.

Если соединение не установлено, проверьте, запущен ли сервер и верен ли порт. При HTTP-ошибке сверяйте код с документацией конкретного провайдера. При несовпадении структуры убедитесь, что не отправили запрос на другой метод вместо /v1/chat/completions.

Что проверять перед переносом рабочего приложения

Начните с обычного текста, затем отдельно проверьте необходимые функции: потоковую выдачу, вызовы инструментов, изображения, формат JSON и продолжение разговора. У каждой проверки должны быть собственные входные данные и критерий принятия, а не только успешный HTTP-код.

Ollama добавила /v1/responses в версии 0.13.3, но документация описывает только вариант без серверного состояния — previous_response_id и conversation не поддерживаются. Клиент, зависящий от этих полей, нельзя считать перенесённым после смены адреса. Ограничения Responses в Ollama.

В карточке своей интеграции сохраните версию сервера, метод, имя модели и проверенные функции. Если завтра меняется модель или сервер, повторите именно эти проверки: надпись «OpenAI-compatible» сама по себе их не заменяет.

Проверить детали

Источники материала

Функции и условия сервисов меняются. Дата сверки указана в начале статьи. Как подготовлен материал

Есть следующая задача?Ещё по теме «Работа с API» →