Создайте один раз.
Используйте любую модель.
Codu AI — это OpenAI-совместимый шлюз. Один базовый URL даёт вашему приложению доступ к сотням реальных провайдерных моделей со встроенными квотами на ключи, USD-биллингом и аналитикой использования.
Готовая настройка для вашего приложения
Создайте API-ключ в панели, выберите приложение и модель. Конфиг не содержит вашего ключа. API keys →
Подключите OpenCode
Выберите OpenCode V2 в конструкторе выше: он создаёт конфигурацию с актуальной моделью из каталога. Примеры ниже описывают прежний формат, совместимый с V1.
1. API-ключ
Создайте ключ на странице API keys и привяжите его в OpenCode:
/connect → Other → id: coduЛибо храните ключ в переменной окружения:
export CODU_API_KEY="sk-ai-..."
# Windows PowerShell
$env:CODU_API_KEY = "sk-ai-..."2. Автоустановка
Скачайте скрипт под свою OS — он сам создаст конфиг (спросит ключ, сделает бэкап старого) и подтянет в него весь каталог моделей шлюза:
curl -fsSL https://codu.vu/install-codu-opencode.sh | bash -s -- sk-ai-...# Windows PowerShell
Invoke-WebRequest https://codu.vu/install-codu-opencode.ps1 -OutFile install-codu.ps1
.\install-codu.ps1 -ApiKey sk-ai-...3. Вручную
Глобальный конфиг лежит в ~/.config/opencode/opencode.json (Linux/macOS) или %USERPROFILE%\.config\opencode\opencode.json (Windows):
export CODU_API_KEY="sk-ai-..."
mkdir -p ~/.config/opencode && cat > ~/.config/opencode/opencode.json <<'EOF'
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"codu": {
"npm": "@ai-sdk/openai-compatible",
"name": "Codu",
"options": {
"baseURL": "https://codu.vu/v1",
"apiKey": "{env:CODU_API_KEY}"
},
"models": {
"openai/gpt-4o": { "name": "GPT-4o" },
"deepseek/deepseek-chat": { "name": "DeepSeek Chat" },
"cr/claude-opus-5": { "name": "Claude Opus 5" }
}
}
},
"model": "codu/cr/claude-opus-5"
}
EOF# Windows PowerShell
$env:CODU_API_KEY = "sk-ai-..."
New-Item -ItemType Directory -Force "$env:USERPROFILE\.config\opencode"
@'
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"codu": {
"npm": "@ai-sdk/openai-compatible",
"name": "Codu",
"options": {
"baseURL": "https://codu.vu/v1",
"apiKey": "{env:CODU_API_KEY}"
},
"models": {
"openai/gpt-4o": { "name": "GPT-4o" },
"deepseek/deepseek-chat": { "name": "DeepSeek Chat" },
"cr/claude-opus-5": { "name": "Claude Opus 5" }
}
}
},
"model": "codu/cr/claude-opus-5"
}
'@ | Set-Content "$env:USERPROFILE\.config\opencode\opencode.json" -Encoding utf8GET /v1/models — подходят любые id шлюза, включая cr/*. В baseURL указывайте только https://codu.vu/v1.4. Выбор модели
Команда /models покажет провайдера codu и настроенные модели.
Работайте с проектом через codu CLI
codu — интерактивный агент в терминале. Он сам читает файлы проекта, вносит изменения, запускает команды и анализирует результаты проверок. Обсуждайте решение и уточняйте задачу в одной сессии: контекст сохраняется между сообщениями и после перезапуска.
1. Установка и API-ключ
Установите Node.js 20 или новее. Создайте ключ в разделе API keys и подключите его:
npm i -g codu-ai
codu auth sk-ai-...
cd my-project
codu2. Первая задача
В открывшейся сессии напишите, например: «Разберись, как устроена авторизация, предложи план исправления ошибки и после согласования внеси правки». Затем можно попросить добавить тесты, проверить сборку или изменить решение, продолжая ту же переписку.
/models— каталог моделей с поиском; /model <id> — выбор по идентификатору.Ctrl+P— настройки модели, Effort для доступных вариантов рассуждения и лимита шагов./new,/sessions,Tab— создание, восстановление и переключение сессий.- Следующую задачу можно отправить во время работы агента: она попадёт в очередь. Длинный контекст автоматически сжимается с сохранением цели и незавершённых действий.
3. Разрешения и конфигурация
Чтение и простые команды просмотра разрешены по умолчанию; изменения и остальные команды требуют подтверждения. Esc или Ctrl+C останавливают агента, но не отменяют уже выполненные действия. Флаг --yes пропускает запросы подтверждения.
Настройки и ключ хранятся в ~/.codu/config.json. codu config показывает конфигурацию со скрытым ключом. Доступны CODU_API_KEY, CODU_MODEL, CODU_BASE_URL и CODU_CONFIG; флаги имеют приоритет над окружением, а окружение — над файлом.
codu models
codu config
codu run "Найди причину падающего теста и исправь её" --max-steps 20codu run выполняет одну задачу и выходит. Дополнительные флаги: --model <id>, --cwd <path>, --base-url <url>, --verbose; --max-steps 0 отключает лимит.
Настройка Claude Code
Claude Code работает с файлами и командами локального проекта. Для подключения через шлюз ему нужен Anthropic-совместимый /v1/messages, включая потоковые ответы и вызовы инструментов. Одного OpenAI-совместимого /chat/completions недостаточно.
1. Установка
# macOS / Linux / WSL
curl -fsSL https://claude.ai/install.sh | bash
# Windows PowerShell
irm https://claude.ai/install.ps1 | iex2. Адрес шлюза и ключ
Codu принимает Authorization: Bearer, поэтому используйте ANTHROPIC_AUTH_TOKEN. В ANTHROPIC_BASE_URL укажите адрес без /v1: клиент добавляет /v1/messages самостоятельно. Выберите точный ID модели Claude из каталога Codu.
export ANTHROPIC_BASE_URL="https://codu.vu"
export ANTHROPIC_AUTH_TOKEN="sk-ai-..."
export ANTHROPIC_MODEL="ID_МОДЕЛИ_CLAUDE"
# Windows PowerShell
$env:ANTHROPIC_BASE_URL = "https://codu.vu"
$env:ANTHROPIC_AUTH_TOKEN = "sk-ai-..."
$env:ANTHROPIC_MODEL = "ID_МОДЕЛИ_CLAUDE"3. Проверка подключения
curl "$ANTHROPIC_BASE_URL/v1/messages" \
-H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d "{\"model\":\"$ANTHROPIC_MODEL\",\"max_tokens\":32,\"messages\":[{\"role\":\"user\",\"content\":\"Hello\"}]}"Ожидается ответ Messages API с массивом content, а не OpenAI choices или HTML. Если формат верный, запустите Claude Code из того же терминала:
cd my-project
claude
/statusВ /status проверьте адрес шлюза и источник токена. /model выбирает модель, /resume открывает предыдущую сессию, /compact сжимает контекст. При 401 проверьте ключ и Bearer-аутентификацию; при 404 или неверном формате ответа нужна совместимость Messages API на стороне шлюза.
Переменные действуют в текущем терминале. Для постоянных настроек используйте env в личном ~/.claude/settings.json (Windows: %USERPROFILE%\.claude\settings.json), сохранив остальные настройки файла. Не помещайте ключ в общий конфиг проекта.
Выполните первый запрос
Замените плейсхолдеры своими значениями. Базовый URL для продакшн-трафика — https://codu.vu — больше никакой настройки не требуется.
curl "https://codu.vu/v1/chat/completions" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek/deepseek-chat",
"messages": [
{ "role": "user", "content": "Hello from Codu" }
]
}'API_KEY. Полный ключ показывается только один раз.API keys
Аутентифицируйте каждый запрос ключом workspace в стандартном Bearer-заголовке. Ключи хранятся в виде хэша; новый ключ генерируется как безопасное случайное значение.
Authorization: Bearer sk-ai-xxxxxxxxxxxxxxxxУправление ключами
Вы можете создавать любое количество ключей в панели, давать каждому имя и необязательный USD-лимит. Квота общая для всех запросов с этим ключом — когда она исчерпана, шлюз возвращает 402 quota_exceeded.
Подключите Codex
Codex работает с Codu через Responses API и может читать и изменять файлы рабочего пространства через локальные инструменты VS Code.
Конфигурация
Ключ можно указать через auth.json в той же папке конфигурации Codex:
{
"OPENAI_API_KEY": "sk-ai-..."
}model_provider = "codu"
model = "gpt-5.6-luna"
[model_providers.codu]
name = "codu"
base_url = "https://codu.vu/v1"
wire_api = "responses"
requires_openai_auth = trueAPI-ключ
Создайте ключ на странице API keys и передайте его Codex через переменную окружения. Не добавляйте ключ в TOML или исходный код.
export OPENAI_API_KEY="sk-ai-..."
# Windows PowerShell
$env:OPENAI_API_KEY = "sk-ai-..."Возможности
- Нативные Responses API и потоковые ответы.
- Чтение, поиск и редактирование файлов через локальные инструменты Codex.
- Запуск команд в рабочем пространстве VS Code.
- Изображения и файловые вложения.
Каталог доступных моделей
Запросите каталог, чтобы получить список реальных провайдерных моделей, доступных через шлюз.
curl "https://codu.vu/v1/models" \
-H "Authorization: Bearer $API_KEY"Используйте точный id из ответа как model в запросах. Актуальные тарифы доступны в каталоге панели.
Цены и бесплатные модели
Вход и выход тарифицируются отдельно за миллион токенов; у некоторых моделей применяется цена за запрос. Модели без настроенного тарифа скрыты. Бесплатные модели обозначены явно — free/* и yjs/*, их стоимость $0.
Чат-запросы
Отправьте список сообщений с ролями system, user или assistant. Ответ следует формату OpenAI choices с использованием токенов в usage.
const response = await fetch("https://codu.vu/v1/chat/completions", {
method: "POST",
headers: {
"Authorization": `Bearer ${API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "deepseek/deepseek-chat",
messages: [
{ role: "system", content: "Be concise." },
{ role: "user", content: "Explain embeddings." }
],
max_tokens: 2048
})
});OpenAI SDK
Используйте официальные SDK — просто укажите им базовый URL шлюза.
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://codu.vu/v1",
apiKey: process.env.API_KEY
});
const completion = await client.chat.completions.create({
model: "deepseek/deepseek-chat",
messages: [{ role: "user", content: "Hello" }]
});
console.log(completion.choices[0].message.content);Потоковая передача токенов
Установите stream: true, чтобы получать Server-Sent Events. Каждая строка data: несёт дельту; добавляйте choices[0].delta.content по мере поступления. Поток завершается строкой data: [DONE].
const body = {
model: "deepseek/deepseek-chat",
stream: true,
messages: [{ role: "user", content: "Write a haiku." }]
};
data: {"choices":[{"delta":{"content":"A"}}]}
data: {"choices":[{"delta":{"content":" gentle"}}]}
data: {"choices":[{"delta":{"content":" rain"}}]}
data: [DONE]Использование токенов сообщается в поле usage финального события, а также записывается в аналитику панели.
Баланс и квоты
Баланс в USD общий для сайта, API и Telegram-бота. В начале платного запроса сумма резервируется, после завершения рассчитывается списание. Если модель не сообщила токены или запрос прерван, используется оценка обработанного объёма. Остановка не отменяет оплату уже обработанной части.
- 402 insufficient_balance — недостаточно доступного баланса.
- 402 quota_exceeded — исчерпан лимит API-ключа.
- Бесплатные модели явно обозначены free/* и yjs/*. Отсутствие тарифа не означает бесплатный доступ.
- Пополнение через СБП или криптовалюту. Комиссия, сумма к оплате и зачисление показаны перед оплатой.
Обработка ошибок
Ошибки используют OpenAI-совместимую форму { "error": { "message": string, "code"?: string } }. Неожиданные сбои моделей возвращаются как общий 502; детали логируются только на стороне шлюза.
| Статус | Значение |
|---|---|
| 401 | Требуется аутентификация — API ключ отсутствует или неверен. |
| 402 · insufficient_balance | Баланс workspace ниже расчётной стоимости запроса. |
| 402 · quota_exceeded | USD-квота API ключа израсходована. |
| 404 | Модель или endpoint не найден (возвращается модельным шлюзом). |
| 429 · rate_limited | Слишком много запросов за короткое время — сбавьте темп и повторите. |
| 502 | Модельный шлюз недоступен или упал во время запроса. |