OpenAI compatible API: что это, зачем base_url и как проверить подключение
Что на самом деле означает «OpenAI-совместимый API», почему клиенту достаточно сменить base_url и ключ, чем от него отличается формат Anthropic и как за пять минут проверить подключение.
6 мин · · разработка · API-ключи
В описаниях сервисов и настройках программ всё чаще встречается фраза «openai compatible api». Она важна всем, кто хочет подключить к приложению или IDE не только модели OpenAI: если сервис совместим, клиенту достаточно сменить адрес и ключ. Ниже — что именно означает совместимость, где её границы, чем отличается формат Anthropic и как проверить подключение к Zukko одной командой curl.
Что значит OpenAI compatible API
OpenAI-совместимый API — это сервер, который принимает запросы и отвечает в том же формате, что и API OpenAI. Совпадает «контракт»: пути, поля JSON, способ авторизации и формат потоковой передачи. Клиенту неважно, кто стоит за адресом: он отправляет тот же JSON и получает ответ привычной структуры.
Минимальный набор, который подразумевают под совместимостью:
- Путь
POST /v1/chat/completionsдля чат-запросов иGET /v1/modelsдля списка моделей. - Авторизация заголовком
Authorization: Bearer <ключ>. - Запрос с полями
modelиmessages, где у сообщений естьrole(system,user,assistant) иcontent. - Ответ с массивом
choices, текстом вchoices[0].message.contentи счётчиками токенов вusage(prompt_tokens,completion_tokens). - Стриминг при
"stream": true— строкиdata: {...}в формате Server-Sent Events и завершающаяdata: [DONE].
Чего совместимость не гарантирует:
- Все эндпоинты. У OpenAI их много (эмбеддинги, аудио, файлы и другие). Совместимый сервис может реализовать только часть. В Zukko OpenAI-формат — это
POST /v1/chat/completions,GET /v1/modelsиPOST /v1/responses. - Все параметры для каждой модели. Поля вроде
toolsилиresponse_formatпередаются, но поддержка зависит от конкретной модели. Проверяйте на своих запросах. - Одинаковые имена моделей. Названия задаёт сервис. Актуальный список и цены —
GET https://api.zukko.pro/v1/modelsили страница «Модели» в кабинете.
Что такое base_url и почему в нём /v1
base_url — это начало адреса, к которому SDK приклеивает путь конкретного метода. Официальный Python SDK OpenAI для чат-запроса добавляет к base_url путь /chat/completions. Поэтому для OpenAI-формата в base_url уже должен быть /v1:
base_url = https://api.zukko.pro/v1
запрос → https://api.zukko.pro/v1/chat/completions
Две частые ошибки:
- Забыли
/v1. Запрос уходит наhttps://api.zukko.pro/chat/completions, такого пути нет — ответ 404. - Добавили
/v1дважды. Если вписать полный путьhttps://api.zukko.pro/v1/chat/completionsв поле base URL, клиент допишет ещё один хвост, и снова будет 404.
У клиентов Anthropic логика другая: официальный Anthropic SDK и Claude Code сами добавляют /v1/messages, поэтому им нужен адрес без /v1. Подробный разбор — в статье base URL с /v1 или без.
Какие клиенты подключаются через base_url
Почти всё, что умеет работать с OpenAI, умеет работать и с совместимым сервисом:
- Официальные SDK. Python:
OpenAI(base_url="https://api.zukko.pro/v1", api_key="fetch_..."); также SDK читает переменныеOPENAI_BASE_URLиOPENAI_API_KEY. Node.js:new OpenAI({ baseURL: "https://api.zukko.pro/v1", apiKey: ... }). - Фреймворки, например LangChain: в клиенте OpenAI задаётся тот же base URL.
- IDE и агенты: Cursor, Cline, Kilo Code, Codex — указываете base URL
https://api.zukko.pro/v1и ключ. - Веб-интерфейсы для чата: LibreChat, Open WebUI и похожие.
Поле в настройках называется по-разному: Base URL, API Base, Endpoint, OpenAI API URL. Если не уверены, какое именно, сверьтесь с документацией самого инструмента. Смысл везде один: адрес до /v1 включительно и ключ.
Чем отличается Anthropic-формат
Второй распространённый стандарт — Messages API от Anthropic, родной формат моделей Claude. Его используют Claude Code, официальный Anthropic SDK и Roo Code. Главные отличия:
| OpenAI-формат | Anthropic-формат | |
|---|---|---|
| Эндпоинт | POST /v1/chat/completions | POST /v1/messages |
| Base URL для SDK | https://api.zukko.pro/v1 | https://api.zukko.pro |
| Ключ | Authorization: Bearer | Anthropic SDK шлёт x-api-key; Zukko принимает оба заголовка |
| Версия | не нужна | заголовок anthropic-version: 2023-06-01 (SDK ставит сам) |
| Системный промпт | сообщение с role: "system" | обычно отдельное поле system |
max_tokens | необязательный | обязательный |
| Текст ответа | choices[0].message.content | content[0].text (массив блоков) |
| Токены | usage.prompt_tokens, completion_tokens | usage.input_tokens, output_tokens |
| Стриминг | data:-чанки и [DONE] | события message_start, content_block_delta, message_stop и др. |
В Zukko любую модель можно вызвать в любом из двух форматов: шлюз конвертирует запрос. Разница появляется в цене при кэше. Для Claude скидку за чтение кэша даёт только Anthropic-формат: там шлюз видит, сколько входа пришло из кэша. В OpenAI-формате весь вход Claude идёт по цене входа. Пример по ценам на 7 октября 2026: у claude-sonnet-5 вход стоит $0.4 за 1M токенов, чтение кэша — $0.05. У GPT-моделей кэш виден в обоих форматах через prompt_tokens_details.cached_tokens. Как выбрать формат под задачу — в документации Anthropic или OpenAI формат.
Адреса Zukko
- OpenAI-формат: base URL
https://api.zukko.pro/v1→POST /v1/chat/completions,GET /v1/models,POST /v1/responses. - Anthropic-формат:
POST https://api.zukko.pro/v1/messagesиPOST /v1/messages/count_tokens. - Клиенты, которые сами добавляют
/v1(Claude Code, Anthropic SDK, Roo Code):https://api.zukko.pro. - OpenCode (провайдер anthropic через AI SDK):
https://api.zukko.pro/v1. - Claude Code:
ANTHROPIC_BASE_URL=https://api.zukko.proиANTHROPIC_AUTH_TOKEN=fetch_..., плюс модели из каталога вANTHROPIC_MODELиANTHROPIC_DEFAULT_HAIKU_MODEL: фоновые запросы идут на слот Haiku (по умолчаниюclaude-haiku-*), которого нет в каталоге, и без этой переменной получат 404model_not_found.
Как проверить подключение через curl
Три команды покажут, что адрес, ключ и баланс в порядке.
1. Список моделей. Эндпоинт публичный, ключ не нужен:
curl https://api.zukko.pro/v1/models2. Запрос в OpenAI-формате:
curl https://api.zukko.pro/v1/chat/completions \
-H "Authorization: Bearer fetch_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{"model": "gpt-6.1-sol", "messages": [{"role": "user", "content": "Ответь одним словом: работает?"}]}'3. Тот же вопрос в Anthropic-формате:
curl https://api.zukko.pro/v1/messages \
-H "Authorization: Bearer fetch_ваш_ключ" \
-H "Content-Type: application/json" \
-H "anthropic-version: 2023-06-01" \
-d '{"model": "claude-sonnet-5", "max_tokens": 64, "messages": [{"role": "user", "content": "Ответь одним словом: работает?"}]}'Что означают ответы:
- 200 и текст — всё подключено.
- 401 — ключ неверный, с опечаткой или отозван.
- 402 — не хватает баланса.
- 403
model_not_allowed_for_key— модели нет в списке разрешённых для этого ключа. - 404
model_not_found— неизвестное имя модели; сверьтесь сGET /v1/models. - 404 с кодом
not_found— такого пути нет: проверьте/v1в адресе.
Если curl работает, а программа нет, проблема почти всегда в поле base URL или в имени модели в настройках клиента.
Минимальный пример на Python
from openai import OpenAI
client = OpenAI(base_url="https://api.zukko.pro/v1", api_key="fetch_ваш_ключ")
resp = client.chat.completions.create(
model="claude-sonnet-5",
messages=[{"role": "user", "content": "Привет! Ответь одной фразой."}],
)
print(resp.choices[0].message.content)
print(resp.usage.prompt_tokens, resp.usage.completion_tokens)Чтобы сменить модель, меняете только model, например на gpt-6.1-sol или deepseek-v4.1-flash. Полный справочник полей — в документации chat/completions, а пошаговое подключение к своему сервису — в статье как подключить нейросеть к своему приложению.
Если ключа ещё нет, создайте его на странице API-ключей и подставьте в любой из примеров выше.
Частые вопросы
OpenAI compatible API — это только для моделей OpenAI?
Нет. Совместимость касается формата запросов, а не моделей. Через OpenAI-формат Zukko можно вызвать Claude, GPT, Gemini, DeepSeek, Qwen и GLM — меняется только значение model.
Почему клиент пишет 404, хотя ключ правильный?
Чаще всего из-за /v1: для OpenAI-клиентов он должен быть в base URL, для Claude Code и Anthropic SDK — нет. Второй вариант — неизвестное имя модели, тогда в ответе будет код model_not_found; в Claude Code так проявляется незаданный ANTHROPIC_DEFAULT_HAIKU_MODEL.
Какой формат выбрать для Claude?
Если важен кэш (агенты, длинные диалоги, большой системный промпт) — Anthropic-формат: только в нём шлюз учитывает чтение кэша Claude по сниженной цене. Для простых разовых запросов подойдёт любой.
Все ли параметры OpenAI поддерживаются?
Основные (model, messages, max_tokens, stream) — да. Поддержка tools, response_format и других зависит от модели; проверьте на своём запросе, прежде чем строить на них логику. Отдельный случай — temperature: по документации Zukko новые модели Claude могут отклонять нестандартные значения, поэтому для них её лучше не передавать.
zukko
Платите в 25×
меньше
за Claude Code & ChatGPT
Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.
Похожие статьи
- Свой прокси к нейросети на Node.js: не показывать API-ключ во фронтендеНебольшой сервер на Express между вашим фронтендом и API нейросети: ключ остаётся на сервере, а модели, длина запроса и частота ограничены.
- DeepSeek API на Python: запросы, стриминг, JSON и обработка ошибокГотовый код для DeepSeek V4.1 Flash и V4 Pro на OpenAI SDK: запрос, стриминг, разбор JSON и аккуратная обработка ошибок.
- Gemini API на Python: запросы через OpenAI SDK и OpenAI-форматРабочий пример Gemini API на Python без отдельной библиотеки: меняем base_url в OpenAI SDK, добавляем стриминг и JSON и сравниваем с google-genai.
- Anthropic SDK для Python: base_url, ключ и первый запрос через шлюзОфициальный пакет anthropic для Python нужно только направить на другой адрес. Разбираем base_url, ключ, стриминг, подсчёт токенов, кэш и ошибки.