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

  1. Откройте Settings → AI Providers → LLM.
  2. В списке LLM Provider выберите Generic OpenAI.
  3. Заполните поля (таблица ниже) и сохраните.
  4. Откройте рабочее пространство и задайте короткий вопрос, чтобы проверить подключение.
ПолеЗначение
Base URLhttps://api.zukko.pro/v1
API Keyfetch_ваш_ключ
Selected Modelid модели, например 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):

bash
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.35 900 × 0.3 / 1 000 000 = $0.00177$1.77
gpt-5.6-luna$0.1 / $0.15 900 × 0.1 / 1 000 000 = $0.00059$0.59
glm-5.3-flash$0.04 / $0.045 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.

AnythingLLM: подключить свой OpenAI-совместимый API · Zukko