Что поменять в существующем клиенте
До запуска проверьте /v1/models своим ключом. Доступность ID в списке ещё не подтверждает поддержку Chat Completions: сопоставьте его с документацией модели. Если приложению нужен Responses, не меняйте только путь — потребуется другой метод SDK и обработчик ответа.
| Настройка | Значение для CLODEx | Зачем |
|---|---|---|
| base_url | https://clodex.xyz/v1 | SDK добавляет путь метода. Не указывайте полный /chat/completions в base_url. |
| api_key | CLODEX_API_KEY из окружения | Ключ CLODEx нельзя отправлять прежнему провайдеру. |
| model | CLODEX_MODEL: точный ID своего каталога | Не рассчитывайте на чужой alias или доступность модели из старого примера. |
| timeout / max_retries | 60 секунд / 0 в примере ниже | Одна диагностическая попытка, без незаметных повторных запросов. |
Минимальный запрос: Python + OpenAI SDK
Установите пакет командой python -m pip install openai в окружении своего приложения. Задайте CLODEX_API_KEY и CLODEX_MODEL вне исходного файла. Этот пример предназначен для модели с поддержкой Chat Completions и выполняет платную генерацию; чтение страницы ничего не запускает.
60 секунд — таймаут диагностической попытки, не обещанная скорость модели. max_retries=0 отключает автоматические повторы SDK. В примере нет temperature, tools или других необязательных параметров: сначала проверяется базовый контракт.
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["CLODEX_API_KEY"],
base_url="https://clodex.xyz/v1",
timeout=60.0,
max_retries=0,
)
response = client.chat.completions.create(
model=os.environ["CLODEX_MODEL"],
messages=[{"role": "user", "content": "Reply with one word: ready"}],
stream=False,
)
if not response.choices:
raise RuntimeError("Missing choices")
choice = response.choices[0]
if choice.finish_reason != "stop" or not choice.message.content.strip():
raise RuntimeError(f"Unexpected result: {choice.finish_reason}")
print(choice.message.content)
print(response.usage)
Что считать успешной проверкой
- Ответ содержит choices и непустой текст message.content, а finish_reason равен stop. Точное слово «ready» не гарантируется; проверяется структура, а не совпадение строки.
- Если finish_reason равен length, ответ оборван по лимиту. Если пришёл tool_calls, это запрос инструмента, а не готовый пользовательский ответ.
- Сверьте usage и фактический расход в кабинете. Не публикуйте полный запрос с секретами или данными пользователей в отчёте о тесте.
- Только после этого отдельно проверьте streaming и обработку ошибок, затем необходимые tools или формат JSON.
Граница совместимости: что не переносится автоматически
Совместимость не означает одинаковую поддержку всех функций OpenAI. Хранение ответов, встроенный поиск, загрузка файлов, batch, JSON Schema и параметры reasoning требуют отдельного подтверждения для конкретного маршрута и модели.
Для Chat Completions приложение разбирает choices; для Responses — output items и состояние ответа. SSE-поток нельзя обрабатывать как один обычный JSON. Обрыв соединения не следует показывать пользователю как завершённый ответ.
Если получили 400, проверьте тело ошибки и отправленные поля. При 401 проверяйте ключ и сервер. Для 429 разберите указанную причину ограничения. После таймаута не повторяйте запрос вслепую: предыдущая генерация могла выполниться и попасть в расход.
Документация и проверка примера
Адреса и настройки подключения сверены с документацией CLODEx. Примеры предназначены для указанного протокола; они не являются журналом выполненных запросов и не обещают одинаковые функции у всех моделей. Рабочий запрос на генерацию может списать средства.
Частые вопросы
Нужно переписать приложение целиком?
Не обязательно. Если оно использует поддерживаемый метод и параметры, может хватить настроек клиента. Всё равно проверьте разбор ответа, ошибки и функции, от которых зависит приложение.
Можно оставить ключ OpenAI?
Нет. Для CLODEx нужны адрес CLODEx и ключ CLODEx. Замена только ключа или только адреса создаёт неправильную конфигурацию.
Это официальный сервис OpenAI?
Нет. CLODEx — отдельный шлюз с совместимыми маршрутами. Использование OpenAI SDK не означает партнёрство или одинаковый набор функций.