AnythingLLM с Zukko: чат с документами на своём OpenAI-совместимом API
AnythingLLM подключает сторонние модели через провайдера Generic OpenAI. Разбираем поля, настройки, от которых зависит цена ответа, и типичные ошибки.
5 мин · · разработка · автоматизация
AnythingLLM — приложение для чата с документами: вы загружаете файлы в рабочее пространство, а модель отвечает с опорой на найденные фрагменты. Подключить в AnythingLLM свой OpenAI-совместимый API можно через провайдера Generic OpenAI, и Zukko подключается именно так: один ключ fetch_... даёт модели Claude, GPT и GLM. Ниже — настройка по исходному коду и примеру конфигурации AnythingLLM, параметры, от которых зависит цена ответа, и разбор ошибок.
Где настраивается модель
Системная модель задаётся в настройках: Settings → AI Providers → LLM (страница называется LLM Preference). Она используется во всех рабочих пространствах по умолчанию. В настройках конкретного рабочего пространства можно выбрать другого провайдера и модель (Workspace LLM Provider и Workspace Chat model) — если поле пустое, берётся системная модель.
Подключение своего OpenAI-совместимого API в AnythingLLM
- Откройте Settings → AI Providers → LLM.
- В списке LLM Provider выберите Generic OpenAI.
- Заполните поля (таблица ниже) и сохраните.
- Откройте рабочее пространство и задайте короткий вопрос, чтобы проверить подключение.
| Поле | Значение |
|---|---|
| Base URL | https://api.zukko.pro/v1 |
| API Key | fetch_ваш_ключ |
| Selected Model | id модели, например claude-sonnet-5 |
| Model context window | контекст модели или меньше (см. ниже) |
| Max Tokens | потолок длины ответа, например 1024–4096 |
Подсказка в поле Base URL показывает адрес без версии, но сервису нужен полный базовый адрес: для Zukko это https://api.zukko.pro/v1. Если AnythingLLM смог загрузить список моделей, Selected Model будет выпадающим списком, иначе — текстовым полем, куда id вписывается вручную.
Model context window
AnythingLLM учитывает это значение, когда решает, сколько истории и фрагментов документов поместить в запрос. Реальный контекст моделей Zukko — 1 000 000 токенов у claude-opus-5-5, claude-sonnet-5, gpt-5.6-sol, gpt-5.6-luna и 128 000 у glm-5.3, glm-5.3-flash. Указывать больше реального нет смысла — такой запрос модель не примет. А меньше — можно и даже полезно: так вы ограничиваете максимальный размер, а значит и стоимость одного запроса.
Настройка через переменные окружения
В Docker те же параметры задаются переменными (имена взяты из примера .env AnythingLLM):
LLM_PROVIDER='generic-openai'
GENERIC_OPEN_AI_BASE_PATH='https://api.zukko.pro/v1'
GENERIC_OPEN_AI_API_KEY='fetch_ваш_ключ'
GENERIC_OPEN_AI_MODEL_PREF='claude-sonnet-5'
GENERIC_OPEN_AI_MODEL_TOKEN_LIMIT=128000
GENERIC_OPEN_AI_MAX_TOKENS=2048Актуальный список id моделей — GET https://api.zukko.pro/v1/models (см. документацию по моделям) или страница «Модели» в кабинете.
Эмбеддинги: отдельная настройка
Чат-модель и модель эмбеддингов в AnythingLLM настраиваются отдельно. Эмбеддинги нужны, чтобы проиндексировать документы и находить нужные фрагменты. В Zukko сейчас только чат-модели, поэтому эмбеддер выбирайте отдельно: встроенный в AnythingLLM или другого провайдера. Zukko отвечает за генерацию ответов.
От чего зависит цена ответа
В настройках рабочего пространства есть три параметра, которые напрямую влияют на размер запроса:
- Chat History — сколько предыдущих сообщений попадает в кратковременную память (AnythingLLM рекомендует 20);
- Max Context Snippets — сколько фрагментов документов отправляется модели (рекомендация — 4);
- Chat mode — Chat отвечает с опорой и на документы, и на общие знания модели; Query отвечает только если в документах нашлось что-то подходящее; Agent сам использует инструменты, если модель и провайдер поддерживают вызов инструментов.
Пример расчёта одного вопроса: системный промпт 300 токенов, 4 фрагмента примерно по 500 токенов, история около 3 000 токенов, сам вопрос 100 токенов — итого 5 400 входных токенов и 500 на ответ, всего 5 900:
| Модель | Цена вход / выход за 1M | Стоимость вопроса | 1 000 вопросов |
|---|---|---|---|
claude-sonnet-5 | $0.3 / $0.3 | 5 900 × 0.3 / 1 000 000 = $0.00177 | $1.77 |
gpt-5.6-luna | $0.1 / $0.1 | 5 900 × 0.1 / 1 000 000 = $0.00059 | $0.59 |
glm-5.3-flash | $0.04 / $0.04 | 5 900 × 0.04 / 1 000 000 = $0.000236 | $0.236 |
claude-opus-5-5 и gpt-5.6-sol стоят столько же, сколько claude-sonnet-5, а glm-5.3 — столько же, сколько gpt-5.6-luna.
Если уменьшить Chat History так, что история займёт около 750 токенов вместо 3 000, вход сократится до 3 150 токенов, и вопрос на claude-sonnet-5 будет стоить (3 150 + 500) × 0.3 / 1 000 000 ≈ $0.0011.
Какая модель лучше отвечает по вашим документам, проверьте сами: создайте два рабочих пространства с одинаковыми документами и разными моделями, задайте в каждом 15–20 реальных вопросов и сравните ответы и расход в разделе «Использование» кабинета.
Частые ошибки
401
Ключ скопирован не полностью, с пробелом или удалён в кабинете. Ключ начинается с fetch_.
404 или пустой список моделей
В Base URL нет /v1 или добавлен лишний /chat/completions. Нужен ровно https://api.zukko.pro/v1.
413 или ошибка о слишком длинном запросе
Model context window указан больше, чем реальный контекст модели, или в запрос попадает слишком много фрагментов. Проверьте значение окна и уменьшите Max Context Snippets или Chat History.
Агент не вызывает инструменты
Режим Agent использует встроенный вызов инструментов, только если модель и провайдер его поддерживают. В примере .env AnythingLLM есть переменная PROVIDER_DISABLE_NATIVE_TOOL_CALLING для перехода на запасной механизм; подробности — в документации AnythingLLM.
400 на моделях Claude
Модели claude-sonnet-5 и claude-opus-5-5 могут отклонять запрос с ошибкой 400, если temperature отличается от 1 или top_p меньше 0.99. В настройках рабочего пространства есть поле LLM Temperature: для Claude оставьте его пустым — тогда AnythingLLM не передаёт temperature и используется значение провайдера по умолчанию.
402, 403, 429
402 — закончился баланс. 403 model_not_allowed_for_key — модели нет в списке разрешённых для ключа. 429 — слишком частые запросы, подождите и повторите.
Частые вопросы
Можно ли использовать разные модели в разных рабочих пространствах?
Да. Системная модель задаётся в LLM Preference, а в настройках рабочего пространства её можно заменить. Например, для справочника по регламентам — glm-5.3-flash, для аналитики по договорам — claude-sonnet-5.
Что будет, если закончится баланс?
API вернёт ошибку 402, и AnythingLLM не сможет получить ответ. Пополнить баланс можно в кабинете: СБП, карта РФ, криптовалюта, от $1.
Как ограничить расходы?
Задайте ключу дневной и месячный лимит в кабинете и уменьшите Chat History и Max Context Snippets. Как работают лимиты, описано в документации по лимитам ключей.
С чего начать?
Создайте ключ в кабинете Zukko, выберите в AnythingLLM провайдера Generic OpenAI и загрузите пару документов в новое рабочее пространство.
zukko
Платите в 25×
меньше
за Claude Code & ChatGPT
Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.
Похожие статьи
- Перевод субтитров нейросетью: SRT без сбитых таймкодовГлавный риск при переводе SRT нейросетью — сломанная структура файла. Показываем схему, где таймкоды не попадают к модели, и скрипт на Python с проверкой.
- Редактирование текстов нейросетью: корректура, стиль и сокращениеРазные виды редактуры требуют разных промптов. Показываем формулировки для корректуры, стиля и сокращения, как получать правки с объяснением и не терять авторский голос.
- Нейросеть для написания скриптов: Bash, PowerShell и PythonМодель быстро пишет скрипты для рутины, но запускать их вслепую нельзя. Показываем, как ставить задачу, требовать безопасный режим dry-run и проверять результат до запуска.
- Dify в Docker: установка, первичная настройка и подключение моделейСтавим Dify через Docker Compose, создаём администратора и подключаем модели Claude, GPT и DeepSeek по одному ключу. Отдельно — что делать, если контейнеры не стартуют.