OpenCode — открытый агент для программирования, который работает в терминале: читает файлы проекта, правит код, запускает команды и тесты, ищет по репозиторию и работает с git. Он не привязан к одному поставщику моделей, поэтому к нему можно подключить почти любой OpenAI-совместимый сервис.
FreeLLMAPI — открытый self-hosted роутер, который собирает бесплатные тарифы десятков AI-провайдеров за одним OpenAI-совместимым адресом /v1. Вместо тридцати ключей, тридцати лимитов и тридцати мест, где запрос может упасть, у вас один локальный шлюз и один unified-ключ. Роутер сам выбирает доступную модель, переключается на следующую при ошибке 429 или 5xx и следит, чтобы запросы не выходили за квоты бесплатных тарифов.
В этой заметке я опишу установку FreeLLMAPI, добавление провайдеров и подключение шлюза к OpenCode.
Что понадобится
Для работы нужны четыре вещи:
- Установленный OpenCode. Если агент ещё не стоит, порядок установки я разбирал в отдельной заметке про OpenCode и DeepSeek.
- Запущенный FreeLLMAPI. Проще всего поставить десктопное приложение или контейнер Docker.
- Node.js 20.18 или новее. Он нужен для CLI-генератора, который настраивает OpenCode. Сам OpenCode может быть установлен и без Node.
- Ключи хотя бы одного провайдера. Подойдут бесплатные тарифы Google AI Studio, Groq, Cerebras, Mistral, OpenRouter, NVIDIA, HuggingFace и других сервисов из каталога.
Установка FreeLLMAPI
У проекта есть несколько путей установки. Выбирайте тот, который удобнее для вашей системы.
Десктопное приложение
Самый простой вариант для Windows и macOS — готовый установщик со страницы релизов. В Windows это .exe, в macOS — .dmg для Apple Silicon или Intel. Приложение живёт в трее и поднимает роутер вместе с панелью управления локально.
Пароль для десктопной версии не нужен: панель входит сама через скрытую локальную учётку. Единственные учётные данные, которые вам понадобятся, — unified-ключ из всплывающего окна в трее или с заголовка страницы Keys.
Данные приложения лежат в одном каталоге:
- Windows — %APPDATA%\FreeLLMAPI\
- macOS — ~/Library/Application Support/FreeLLMAPI/
- Linux — ~/.config/FreeLLMAPI/
Docker
Если Docker уже установлен, сервер поднимается одной командой. Скрипт создаёт каталог ~/freellmapi, генерирует ключ шифрования, скачивает образ и запускает контейнер:
curl -fsSL https://freellmapi.co/install.sh | bash
Повторный запуск скрипта безопасен: файл .env и ключ шифрования сохраняются, а контейнер обновляется до свежей версии. В Windows этот способ работает в WSL или в любом bash-окружении.
После запуска панель открывается по адресу:
http://localhost:3001
Для серверной установки нужно создать учётную запись с email и паролем. Если пароль забыт, код сброса печатается в логе контейнера:
docker compose logs -f freellmapi
Docker Compose
Если хочется держать конфигурацию в git и управлять запуском вручную, подойдёт обычный Compose. В macOS и Linux:
git clone https://github.com/tashfeenahmed/freellmapi.git
cd freellmapi
ENCRYPTION_KEY="$(openssl rand -hex 32)"
printf "ENCRYPTION_KEY=%s\nPORT=3001\n" "$ENCRYPTION_KEY" > .env
docker compose up -d
В Windows PowerShell:
git clone https://github.com/tashfeenahmed/freellmapi.git
cd freellmapi
$Bytes = New-Object Byte[] 32
[Security.Cryptography.RandomNumberGenerator]::Create().GetBytes($Bytes)
$ENCRYPTION_KEY = -join ($Bytes | ForEach-Object { "{0:x2}" -f $_ })
"ENCRYPTION_KEY=$ENCRYPTION_KEY`nPORT=3001" | Out-File -Encoding utf8 .env
docker compose up -d
Ключ ENCRYPTION_KEY обязателен: им шифруются ключи провайдеров в базе SQLite. Менять его на лету нельзя — старые секреты перестанут расшифровываться. Для ротации в проекте есть отдельная команда rotate-encryption-key.
Запуск из исходников
Для разработки или отладки можно запустить проект через Node.js:
git clone https://github.com/tashfeenahmed/freellmapi.git
cd freellmapi
npm install
ENCRYPTION_KEY="$(node -e 'console.log(require("crypto").randomBytes(32).toString("hex"))')"
printf "ENCRYPTION_KEY=%s\nPORT=3001\n" "$ENCRYPTION_KEY" > .env
npm run dev
В этом режиме API и панель поднимаются на порту 3001, а Vite-интерфейс — на 5173.
Первый запуск и ключи провайдеров
Открываем панель, заходим на страницу Keys и добавляем ключи тех сервисов, которыми пользуемся. Для каждого провайдера в интерфейсе есть ссылка на регистрацию и подсказка, где взять ключ. Начать достаточно с одного-двух: например, Google AI Studio и Groq.
После добавления ключ проходит проверку здоровья. Если провайдер ответил ошибкой, ключ останется в списке, но будет помечен как нездоровый — его можно проверить повторно или удалить.
Дальше стоит зайти на страницу Models и посмотреть, какие модели доступны. Там же настраивается стратегия маршрутизации и порядок Fallback Chain — цепочки, по которой роутер идёт при ошибках и лимитах. Модель auto означает, что выбор делает сам роутер. Кроме неё доступны варианты вроде auto:fast, auto:smart и именованные профили под конкретные задачи.
Отдельно стоит проверить, что в цепочке есть модели с поддержкой инструментов. OpenCode активно использует tool calling, и модель без этой возможности не сможет нормально читать файлы и запускать команды.
Unified-ключ берётся там же, на странице Keys, либо в трее десктопного приложения. Он выглядит как строка с префиксом:
freellmapi-...
Именно этот ключ, а не ключи отдельных провайдеров, указывается в OpenCode.
Подключение к OpenCode
У FreeLLMAPI есть генератор конфигурации, который сам читает каталог моделей с запущенного шлюза, делает резервную копию существующего конфига и аккуратно добавляет в него провайдера.
Сначала выставим unified-ключ переменной окружения. Генератор читает её вместо отдельного флага, поэтому секрет не попадёт в историю команд.
В macOS и Linux:
export FREELLMAPI_API_KEY=freellmapi-YOUR_KEY
В Windows PowerShell:
$env:FREELLMAPI_API_KEY="freellmapi-YOUR_KEY"
Теперь смотрим, что именно будет записано:
npx freellmapi setup-opencode --url http://localhost:3001 --dry-run
Если diff устраивает, повторяем команду без флага:
npx freellmapi setup-opencode --url http://localhost:3001
Генератор пишет глобальный конфиг OpenCode:
~/.config/opencode/opencode.json
В нём появляется провайдер freellmapi с пакетом @ai-sdk/openai-compatible, базовым адресом http://localhost:3001/v1 и картой моделей из живого каталога. Моделью по умолчанию становится freellmapi/auto.
Сам ключ в файл не попадает: в конфиге стоит подстановка {env:FREELLMAPI_API_KEY}. Поэтому переменная должна оставаться выставленной и при запуске агента:
opencode
Такой способ удобен ещё и тем, что секрет не оседает в конфиге и не попадёт в git. Для CI и одноразовых запусков это правильнее, чем хранить ключ в файле.
Ручная настройка
Если не хочется запускать генератор, провайдера можно описать в opencode.json вручную. Минимальный вариант выглядит так:
{
"$schema": "https://opencode.ai/config.json",
"model": "freellmapi/auto",
"provider": {
"freellmapi": {
"npm": "@ai-sdk/openai-compatible",
"name": "FreeLLMAPI",
"options": {
"baseURL": "http://localhost:3001/v1",
"apiKey": "{env:FREELLMAPI_API_KEY}"
},
"models": {
"auto": {
"name": "FreeLLMAPI Auto Router",
"limit": { "context": 1048576, "output": 65536 }
}
}
}
}
}
Поле model на верхнем уровне важно: без него OpenCode может продолжить использовать прежнюю модель или не выбрать ничего на свежей установке. Лимиты контекста и вывода лучше брать из ответа шлюза, а не придумывать:
curl http://localhost:3001/v1/models
В список models можно добавить конкретные идентификаторы, если нужно переключаться на них вручную. Но для повседневной работы достаточно auto: роутер сам подберёт живую модель и переключится при лимите.
Как этим пользоваться
После запуска opencode список моделей открывается знакомой командой:
/models
В нём будет провайдер FreeLLMAPI и модель auto. Дальше работа идёт как обычно: описываем задачу, указываем файлы через @, переключаем режим планирования клавишей Tab, откатываем правки командой /undo. Для нового проекта полезно выполнить /init, чтобы агент создал AGENTS.md.
Пара практических приёмов:
- Маршрутизация. Для рутины оставляйте auto. Если нужна скорость, попробуйте auto:fast, если качество — auto:smart или конкретную сильную модель из каталога.
- Диагностика. Каждый ответ шлюза содержит заголовок X-Routed-Via с именем провайдера и модели, которые реально обслужили запрос. По нему видно, куда роутер отправил задачу.
- Аналитика. На странице Analytics в панели видны объём запросов, успешность, задержки p50/p95 и расход токенов по провайдерам.
- Непрерывность диалога. При переключении модели посреди разговора шлюз может добавить короткую заметку о передаче контекста. Включается переменной FREELLMAPI_CONTEXT_HANDOFF=on_model_switch.
Если OpenCode запущен в контейнере, а FreeLLMAPI — на хосте, адрес localhost будет указывать на сам контейнер. В этом случае в baseURL нужно использовать host.docker.internal или другой доступный из контейнера адрес.
На что обратить внимание
FreeLLMAPI — это не замена платным моделям и не сервис с SLA. Это способ собрать бесплатные тарифы в один аккуратный шлюз. Отсюда несколько ограничений:
- Качество плавает. Бесплатные тарифы заканчиваются, и поздно вечером, ближе к исчерпанию дневных квот, роутер может уходить на модели слабее. Квоты обычно сбрасываются в полночь по UTC.
- Задержки нестабильны. Разные провайдеры отвечают по-разному, а при переключении на резервную модель запрос может занять заметно больше времени.
- Флагманских моделей нет. В бесплатных тарифах доступны хорошие, но не топовые модели. Для сложной архитектуры это стоит учитывать.
- Шлюз должен быть запущен. Если приложение или контейнер остановлены, OpenCode не получит ответа. Автозапуск приложения в трее или рестарт политики контейнера решают эту проблему.
- Проект рассчитан на одного пользователя. Ключи провайдеров хранятся локально и шифруются, но общая панель на несколько человек — не сценарий этого инструмента. Unified-ключ и .env стоит беречь так же, как обычный секрет.
И ещё один нюанс: каталог моделей обновляется сам, но бесплатная установка получает снимок каталога с задержкой около тридцати дней. Платный тариф Premium ускоряет обновление, однако для знакомства с проектом он не нужен — сам роутер остаётся бесплатным и открытым.
Ссылки
https://github.com/tashfeenahmed/freellmapi
https://freellmapi.co/
https://freellmapi.co/models
https://github.com/tashfeenahmed/freellmapi/releases/latest
https://github.com/tashfeenahmed/freellmapi/blob/main/docs/en/install/01-install.md
https://github.com/tashfeenahmed/freellmapi/blob/main/docs/en/clients/01-agent-clients.md
https://github.com/tashfeenahmed/freellmapi/blob/main/cli/README.md
https://opencode.ai/
https://opencode.ai/docs/
https://opencode.ai/docs/providers/
Источники
https://github.com/tashfeenahmed/freellmapi
https://github.com/tashfeenahmed/freellmapi/blob/main/README.ru.md
https://github.com/tashfeenahmed/freellmapi/blob/main/docs/en/install/01-install.md
https://github.com/tashfeenahmed/freellmapi/blob/main/docs/en/clients/01-agent-clients.md
https://github.com/tashfeenahmed/freellmapi/blob/main/docs/en/clients/02-supported-agents.md
https://github.com/tashfeenahmed/freellmapi/blob/main/cli/README.md
https://opencode.ai/docs/providers/
Добавить комментарий