Три необходимых значения
Каждый клиент, совместимый с OpenAI, запрашивает те же три вещи. Вот они для этого сервиса.
| Настройка | Значение |
|---|---|
| Базовый URL | https://api.getcodexapi.com/v1 |
| API-ключ | Ваш ключ со страницы API-ключ |
| Модель | uncensored |
Ключ передаётся как Authorization: Bearer YOUR_KEY. Два доступных эндпоинта: POST /v1/chat/completions и GET /v1/models. Это независимый сервис с одной моделью с открытыми весами, а не Codex от OpenAI, поэтому не вставляйте эндпоинт OpenAI или ключ OpenAI в те же настройки.
Проверьте соединение с помощью curl
Прежде чем редактировать конфигурацию приложения, убедитесь, что ключ и URL работают из терминала. Список моделей — самая дешёвая проверка, так как не требует промпта:
curl https://api.getcodexapi.com/v1/models \
-H "Authorization: Bearer YOUR_API_KEY"
Вы должны получить список JSON, включающий модель uncensored. Затем отправьте один реальный запрос на генерацию:
curl https://api.getcodexapi.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "uncensored",
"messages": [{"role": "user", "content": "Say hello in five words."}]
}'
Если оба вызова работают, проблема в последующих сбоях находится в конфигурации клиента, а не в сервисе. Заголовки ответа включают X-Request-Id, полезный для отслеживания конкретного вызова, и X-Balance-USD, показывающий оставшийся баланс.
Python с SDK OpenAI
Официальный пакет openai принимает базовый URL в конструкторе клиента. Ничего другого в вашем коде менять не нужно.
from openai import OpenAI
client = OpenAI(
base_url="https://api.getcodexapi.com/v1",
api_key="YOUR_API_KEY",
)
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": "You are a concise assistant."},
{"role": "user", "content": "Explain what a base URL is in two sentences."},
],
)
print(resp.choices[0].message.content)
Если вы предпочитаете не хранить конфигурацию в коде, SDK также считывает OPENAI_BASE_URL и OPENAI_API_KEY из окружения:
export OPENAI_BASE_URL="https://api.getcodexapi.com/v1"
export OPENAI_API_KEY="YOUR_API_KEY"
При установленных переменных OpenAI() без аргументов считывает их. Это удобно, так как многие сторонние инструменты, построенные на SDK, наследуют те же переменные без изменений в коде.
Node.js
JavaScript SDK использует то же имя опции, записанное как baseURL.
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.getcodexapi.com/v1",
apiKey: process.env.API_KEY,
});
const stream = await client.chat.completions.create({
model: "uncensored",
messages: [{ role: "user", content: "Write a haiku about version control." }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
Потоковая передача возвращается как server-sent events с stream: true, а использование ресурсов включено в конец. Имейте в виду, что потоковый запрос занимает один слот параллельных запросов до завершения потока, поэтому оставленный без закрытия поток продолжает учитываться в лимите.
Приложения с экраном настроек
Настольные инструменты и редакторы обычно называют это поле одним из трёх способов: «Base URL», «API Base» или «OpenAI-compatible endpoint». Все они требуют одну и ту же строку. Несколько замечаний, которые экономят время:
- Выберите тип провайдера OpenAI или «кастомный OpenAI-compatible», а не специфичный для поставщика.
- Введите имя модели вручную, если в приложении есть поле свободного ввода.
uncensored— точный идентификатор. - Если в приложении есть кнопка «тестовое соединение», она обычно вызывает список моделей, который поддерживает этот API.
- Некоторые приложения кэшируют список моделей от предыдущего провайдера. Удалите старую запись и добавьте новую, если выпадающий список выглядит неверно.
Пример работы в конкретном редакторе см. в руководстве по подключению Cursor или на странице API для кодирования для общего обзора. Полный справочник параметров доступен в документации API.
После успешного подключения сохраните точные значения в доступном месте: URL, имя модели и дату создания ключа. Команды часто теряют час позже из-за копии конфигурации, содержащей старое значение. Один общий пример файла в репозитории с заполнителем вместо реального ключа предотвращает это.
Распространённые ошибки и их исправление
URL превращается в /v1/v1
Некоторые клиенты автоматически добавляют /v1. Если запросы не работают и в журнале клиента показан путь с /v1/v1/chat/completions, удалите /v1 из базового URL, который вы ввели. Обратное также случается: клиент, который не добавляет его автоматически, требует его в настройках. Журнал пути запроса быстро разрешает этот вопрос.
Вы указали полный эндпоинт в базовом URL
Базовый URL заканчивается на /v1. Не вводите туда /chat/completions. SDK добавляет путь для каждого вызова.
Лишний слэш в конце или опечатка в хосте
Большинство SDK терпят лишний слэш, но некоторые старые инструменты собирают пути простым конкатенированием и получают двойной слэш. Удалите его, если видите странные ответы 404.
Неверный ключ или ключ другого сервиса
Ключ OpenAI здесь не сработает, а наш — там. Ошибки аутентификации почти всегда означают проблему копирования-вставки, например, пропущенный символ или пробел в конце.
Это работает в curl, но не в вашем приложении
Если curl успешен, а приложение выдает ошибку с тем же URL и ключом, разница в окружении. Проверьте, работает ли приложение за прокси или в контейнере без исходящего доступа, считывает ли оно старую переменную окружения, например, устаревший OPENAI_BASE_URL, оставшийся от другого проекта, и не переопределяет ли файл конфигурации значение, установленное в коде. Вывод финального URL, который вызовет клиент, непосредственно перед запросом, решает большинство таких случаев за минуту.
HTTP 429
Это означает достижение лимита. Код ошибки rate_limited — запросы в минуту, а concurrency — слишком много одновременных запросов. Полный ключ позволяет 8 одновременных запросов и 300 в минуту; пробный ключ — 2 и 60. При временной перегрузке вы также получаете 429 с заголовком Retry-After: 5, поэтому подождите пять секунд и попробуйте снова.
LangChain и хранение URL в одном месте
Фреймворки, построенные на клиенте OpenAI, принимают те же значения. В интеграции LangChain с OpenAI аргументы называются следующим образом:
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="uncensored",
base_url="https://api.getcodexapi.com/v1",
api_key="YOUR_API_KEY",
)
print(llm.invoke("Name three uses of a base URL.").content)
Какой бы фреймворк вы ни использовали, не разбрасывайте URL по коду. Поместите его в одну переменную окружения или один файл настроек и считывайте оттуда. Так при переключении между пробным и рабочим ключом или между машинами нужно изменить только одну строку. Это также позволяет не хранить ключи в репозитории: храните ключ в переменной окружения или в менеджере секретов, никогда в зафиксированном файле.
Если вы искали собственный эндпоинт OpenAI для продуктов Codex, то это не он. Их базовый URL и аутентификация описаны в документации OpenAI, поэтому следуйте их текущей документации. Адрес на этой странице принадлежит независимому сервису и принимает только ключи, выданные здесь.
Что можно отправлять после подключения
Эндпоинт поддерживает потоковую передачу, вызов функций (tools, tool_choice, с результатами в виде сообщений role: "tool") и JSON-режим через response_format: {"type": "json_object"}. Параметры temperature, top_p, stop, seed и штрафы передаются напрямую. Контекстное окно составляет 100 000 токенов для промпта и завершения, а максимальный размер тела запроса — 8 МБ.
Это только текст. Нет генерации изображений или аудио, нет эмбеддингов и нет дообучения, поэтому функция клиента, зависящая от этих возможностей, не будет работать с этим базовым URL. Использование оплачивается за токен: $0,15 за 1 млн входных токенов и $0,50 за 1 млн выходных токенов; на странице цен приведены рабочие примеры.
