OpenCode
Open-source агентный CLI через AITUNNEL: тот же OpenCode, ключ в рублях, VPN не нужен.
OpenCode построен на AI SDK и говорит на OpenAI Chat Completions — отдельный прокси не ставится. AITUNNEL подключается как custom provider: один ключ, модели из каталога.
Зачем через AITUNNEL
- Из России без VPN. Запросы идут на
api.aitunnel.ru. Зарубежный аккаунт не нужен. - Оплата в рублях, бюджет на ключе, расход в панели.
- Любая модель из каталога. Claude, GPT, Gemini, Kimi, Qwen, DeepSeek — id как на странице моделей. Слаг со слешем уходит в OpenRouter.
- Запасные модели и провайдер. Если апстрим не ответил — fallback и выбор провайдера.
Быстрый старт
Установка
Инструкция OpenCode. Через npm нужен Node.js 18+.
curl -fsSL https://opencode.ai/install | bashПроверкаopencode --versionКлюч AITUNNEL
Создайте ключ в панели ключей — он начинается с
sk-aitunnel-.Через
/connect(рекомендуется). Запуститеopencode, в TUI введите:TUI/connect- Прокрутите список и выберите Other
- Id провайдера —
aitunnel - Вставьте ключ AITUNNEL
OpenCode сохранит его в
~/.local/share/opencode/auth.json.Прямо в конфиге. Пропустите
/connectи укажитеoptions.apiKey— лучше через{env:…}или{file:…}.Файл opencode.json
Глобально —
~/.config/opencode/opencode.json. Илиopencode.jsonв корне проекта.opencode.json{ "$schema": "https://opencode.ai/config.json", "provider": { "aitunnel": { "npm": "@ai-sdk/openai-compatible", "name": "AITUNNEL", "options": { "baseURL": "https://api.aitunnel.ru/v1" }, "models": { "claude-sonnet-4.6": { "name": "Claude Sonnet 4.6", "limit": { "context": 1000000, "output": 128000 } }, "gpt-5.6-sol": { "name": "GPT-5.6 Sol", "limit": { "context": 1050000, "output": 128000 } }, "gemini-3.7-flash": { "name": "Gemini 3.7 Flash", "limit": { "context": 1048576, "output": 65535 } } } } }, "model": "aitunnel/claude-sonnet-4.6", "small_model": "aitunnel/gemini-3.7-flash" }Поле Смысл provider.aitunnelId провайдера — тот же, что в /connectnpm@ai-sdk/openai-compatibleдля/v1/chat/completions. Для/v1/responses—@ai-sdk/openaioptions.baseURLhttps://api.aitunnel.ru/v1(с/v1, без слеша в конце)modelsКлюч — id из каталога, name— подпись в UIlimit.context/limit.outputОкно контекста и ответа: OpenCode считает по ним остаток modelМодель по умолчанию: providerID/modelIDsmall_modelДешёвая модель для заголовков сессии и суммаризации Запуск
Терминалcd /path/to/your/project opencodeВ TUI —
/models, выберите модель AITUNNEL. Запросы появятся в панели.
Ключ отдельно от конфига
Если не используете /connect, не кладите sk-aitunnel-… в JSON.
Переменная окружения
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"aitunnel": {
"npm": "@ai-sdk/openai-compatible",
"name": "AITUNNEL",
"options": {
"baseURL": "https://api.aitunnel.ru/v1",
"apiKey": "{env:AITUNNEL_API_KEY}"
},
"models": {
"claude-sonnet-4.6": { "name": "Claude Sonnet 4.6" }
}
}
},
"model": "aitunnel/claude-sonnet-4.6"
}# ~/.zshrc, ~/.bashrc или ~/.config/fish/config.fish
export AITUNNEL_API_KEY="sk-aitunnel-xxx"Файл с ключом
{
"provider": {
"aitunnel": {
"options": {
"apiKey": "{file:~/.secrets/aitunnel-key}"
}
}
}
}~/.secrets/aitunnel-key — одна строка, без перевода строки.
Приоритет конфигов
OpenCode сливает слои (поздние перекрывают ранние):
- Удалённый
.well-known/opencodeу провайдера - Глобальный
~/.config/opencode/opencode.json OPENCODE_CONFIG=/path/to/config.jsonopencode.jsonв корне проекта- Каталоги
.opencode/— агенты, команды, плагины OPENCODE_CONFIG_CONTENT
Держите провайдер AITUNNEL в глобальном файле, а в проекте переопределяйте только model.
small_model
OpenCode гоняет small_model на заголовки сессии и суммаризацию. Ставьте туда быструю дешёвую модель:
{
"model": "aitunnel/gpt-5.6-sol",
"small_model": "aitunnel/gemini-3.7-flash"
}Это особенно заметно, если основная — Opus или GPT Pro.
AGENTS.md
OpenCode читает AGENTS.md в корне проекта как системные инструкции — аналог CLAUDE.md. Есть и глобальный ~/.config/opencode/AGENTS.md.
# AITUNNEL API CF
## Стек
- Cloudflare Workers + Hono
- TypeScript, деплой через Wrangler
## Правила
- Все обращения к провайдерам идут через единый failover-слой
- Писать тесты для новых route handlers
- Не коммитить секреты и `.dev.vars`Рекомендуемые модели
Id — как в каталоге, без префикса провайдера.
claude-sonnet-4.6— баланс качества и tool callinggpt-5.6-sol— флагман OpenAI для кода и агентовgpt-5.6-sol— заточена под кодkimi-k2.7-code— дешевле Claude/GPT, сильна в tool useqwen3-coder-next— open-source, хорошая агентностьgemini-3.7-flash— быстрая и дешёвая, удобна какsmall_model
Команды
В TUI: /help, /connect, /models, /agents, /share.
В терминале: opencode auth list, opencode run "промпт", opencode serve, opencode web, opencode --help.
Headless для CI:
export AITUNNEL_API_KEY="sk-aitunnel-xxx"
opencode run "Напиши unit-тесты для src/utils.ts и положи их в src/utils.test.ts"Читает глобальный opencode.json, один прогон, результат в stdout.
Устранение неполадок
- Провайдер не в
/models. Id вprovider.<ID>совпадает с/connect(aitunnel).opencode auth listпоказывает сохранённый ключ. Если ключ вoptions.apiKey,/connectне нужен. После правкиopencode.jsonперезапустите OpenCode. - 401 / 403. Ключ живой в панели ключей, баланс положительный,
baseURL—https://api.aitunnel.ru/v1. Устаревшийauth.json—opencode auth list, затем снова/connect. - Model not found / 404. Id как в каталоге:
claude-sonnet-4.6, неanthropic/claude-sonnet-4.6. Слаг со слешем уходит в OpenRouter.nameв конфиге на запрос не влияет. - Ошибка AI SDK. По умолчанию
/v1/chat/completions→"npm": "@ai-sdk/openai-compatible". Для/v1/responses—@ai-sdk/openai. Можно переопределитьnpmна конкретной модели:provider.<id>.models.<model>.npm. - Лимит контекста. Поднимите
limit.context. Для больших репозиториев — модели с окном ≥ 128k (claude-sonnet-4.6— 1M).small_modelтоже ест контекст на суммаризацию. - Приватность. AITUNNEL не логирует исходный код промптов. Не коммитьте
opencode.jsonс ключом —{env:AITUNNEL_API_KEY}или{file:~/.secrets/…}. Ключ из/connectлежит в~/.local/share/opencode/auth.json. В CI — только переменные окружения runner'а.