Запустите RAG-мозг Quivr на кастомном OpenAI-совместимом эндпоинте.

Updated 2026-07-29

LLMEndpointConfig в quivr-core принимает поле llm_base_url. Оставьте supplier как openai, установите llm_base_url в https://api.apisrouter.com/v1, передайте один ключ — и каждый brain.ask() будет генерировать ответ через шлюз с любым id модели из каталога.

Короткий ответ: llm_base_url в LLMEndpointConfig.

Актуальный Quivr — это quivr-core, Python-библиотека RAG, и её проводка LLM явная. LLMEndpointConfig несёт supplier (по умолчанию openai), model, llm_base_url и llm_api_key; LLMEndpoint.from_config() строит реальный клиент из этих полей, и для supplier openai этот клиент — ChatOpenAI из LangChain, построенный с вашим base URL. Установите llm_base_url в https://api.apisrouter.com/v1, установите model в любой id из каталога и передайте эндпоинт своему Brain. Ключ может приходить из поля конфига или из окружения: когда llm_api_key не задан, quivr-core резолвит его из переменной окружения, названной по имени supplier, что для supplier openai — это OPENAI_API_KEY. Оба пути — апстримное поведение, читаемое в quivr_core/rag/entities/config.py и quivr_core/llm/llm_endpoint.py.

from quivr_core.llm import LLMEndpoint
from quivr_core.rag.entities.config import (
    DefaultModelSuppliers, LLMEndpointConfig)

llm = LLMEndpoint.from_config(LLMEndpointConfig(
    supplier=DefaultModelSuppliers.OPENAI,
    model="claude-sonnet-4-6",          # any catalog id
    llm_base_url="https://api.apisrouter.com/v1",
    llm_api_key=os.environ["APISROUTER_API_KEY"],
))

Что такое Quivr сейчас и где сидит слот LLM.

Quivr (QuivrHQ на GitHub, около 39K звёзд) начинался как полноценное приложение second-brain и переориентировался в quivr-core: концептуально выверенную RAG-библиотеку, которую вы встраиваете в свой собственный продукт. Вы скармливаете ей файлы, она их парсит и разбивает на чанки, эмбеддит чанки в векторное хранилище (FAISS по умолчанию, поддерживается PGVector) и отвечает на вопросы по ним через настраиваемый workflow retrieval. Объект Brain — это единица: Brain.from_files() принимает документы, brain.ask() извлекает и генерирует. Генерация — единственный шаг, которому нужна чат-модель. Workflow retrieval собирает контекст из ваших документов, а переданный вами LLMEndpoint пишет обоснованный ответ. Этот эндпоинт строится один раз из LLMEndpointConfig, так что решение о base URL принимается в момент конструирования и применяется к каждому ask() на этом brain. Поскольку ChatOpenAI пересылает поле model как простую строку через /v1/chat/completions, id может быть Claude, DeepSeek, GPT или Gemini, когда эндпоинт за llm_base_url их обслуживает. Одна честная заметка о статусе проекта: репозиторий тихий с середины 2025 года, так что относитесь к quivr-core как к стабильной библиотеке, а не к быстро развивающейся. Поверхность конфига, описанная здесь, совпадает с последней веткой main, и тихая история означает, что она вряд ли изменится под вами; это также означает, что старые туториалы, описывающие упразднённое полностековое приложение (файлы .env бэкенда, хостируемый фронтенд), больше не совпадают с кодом.

Полная настройка: brain с LLM, маршрутизированной через шлюз.

Полный паттерн передаёт настроенный LLMEndpoint в Brain.from_files. Всё остальное про brain (парсинг, разбиение на чанки, хранилище FAISS, workflow retrieval) независимо от эндпоинта LLM и сохраняет свои умолчания. Помните про эмбеддер. Если вы его не передаёте, quivr-core строит OpenAIEmbeddings из LangChain с собственными умолчаниями, которые аутентифицируются через OPENAI_API_KEY и нацелены на стандартный эндпоинт OpenAI. Это отдельный клиент от чат-LLM: маршрутизация генерации через шлюз его не двигает. Передайте своего собственного эмбеддера (локальную обёртку sentence-transformers либо любой настроенный вами инстанс LangChain Embeddings), если не хотите, чтобы половина с эмбеддингом зависела от аккаунта OpenAI.

import os
from quivr_core import Brain
from quivr_core.llm import LLMEndpoint
from quivr_core.rag.entities.config import (
    DefaultModelSuppliers, LLMEndpointConfig)

llm = LLMEndpoint.from_config(LLMEndpointConfig(
    supplier=DefaultModelSuppliers.OPENAI,
    model="claude-sonnet-4-6",
    llm_base_url="https://api.apisrouter.com/v1",
    llm_api_key=os.environ["APISROUTER_API_KEY"],
    max_output_tokens=2048,
    temperature=0.3,
))

brain = Brain.from_files(
    name="team-docs",
    file_paths=["handbook.pdf", "runbook.md"],
    llm=llm,
    # embedder=...  # separate component; see note above
)

print(brain.ask("What is the on-call escalation policy?").answer)

Выбор модели генерации для ответов RAG.

Сравнение кандидатов — это изменение на этапе конструирования: постройте два LLMEndpoint против одного и того же base URL, два brain над одними и теми же файлами, и сравните ответы на фиксированном наборе вопросов. Лог использования по ключу оценивает прогон каждого кандидата, так что качество на токен измеряется, а не обсуждается.

  • Генерация RAG требовательна к входным данным: извлечённые чанки доминируют в промпте. Цена за входной токен задаёт стоимость ответа, поэтому быстрый id часто урезает счёт вдвое, не трогая качество retrieval.
  • claude-sonnet-4-6 — надёжное умолчание для обоснованных ответов, уважающих извлечённый контекст и чисто отказывающихся, когда документы не содержат ответа.
  • Высоконагруженные встроенные продукты (заявленный сценарий использования Quivr) хорошо работают на claude-haiku-4-5-20251001, deepseek-v4-flash или gemini-3.5-flash для повседневного микса вопросов.
  • max_context_tokens в том же конфиге управляет тем, сколько извлечённого контекста упаковывает пайплайн; повышение этого значения естественно сочетается с id с длинным контекстом и пропорционально повышает расходы на вход.
  • Неизвестные префиксы моделей откатываются на общий токенизатор для бюджетирования, что косметично; сам запрос несёт ваш id неизменным на эндпоинт.

Оплата по факту · дешевле официальных цен

Selected models are priced below official list prices. Exact input, output, cache, and per-request prices are shown for each model.

МодельОфициальная ценаНаша цена
Claude Sonnet 4.6$3.00 / $15.00 per M$2.40 / $12.00 per M
Claude Haiku 4.5 20251001$1.00 / $5.00 per M$0.80 / $4.00 per M
GPT-5.4 mini$0.75 / $4.50 per M$0.60 / $3.60 per M
DeepSeek V4 Flash$0.14 / $0.28 per M$0.10 / $0.30 per M
Gemini 3.5 Flash$1.50 / $9.00 per M$1.20 / $7.20 per M

Исправления к распространённым мифам о Quivr.

Гуляющие гайды описывают поверхности, которых у Quivr больше нет, так что стоит проговорить, что реально делает текущий код. quivr-core работает на LangChain, а не на LiteLLM. Перечисление supplier выбирает класс чата LangChain, и openai мапится на ChatOpenAI с вашим llm_base_url. Если туториал говорит вам настроить прокси LiteLLM или параметр api_base внутри Quivr, он описывает более старую архитектуру; текущее поле — это llm_base_url в LLMEndpointConfig. Полностековое приложение упразднено. Инструкции про .env бэкенда, настройку Supabase или селектор модели внутри приложения относятся к приложению до переориентации, которое больше не поставляется репозиторием. Настройка теперь происходит в вашем коде Python (либо в вашем собственном приложении вокруг библиотеки). Переменная окружения для ключа выводится из supplier. Для supplier openai это OPENAI_API_KEY, даже когда эндпоинт — не OpenAI. Если вы предпочитаете не перегружать это имя, передайте llm_api_key явно в конфиге, который имеет приоритет и держит окружение чистым. Эмбеддер отделён. Маршрутизация генерации не двигает эмбеддинги; эмбеддер по умолчанию — это OpenAIEmbeddings с собственными credentials. Решайте эти две половины независимо, и переэмбеддинг существующего хранилища нужен, только если вы меняете саму модель эмбеддинга.

Кто направляет quivr-core через шлюз.

  • Продуктовые команды, встраивающие RAG в свои приложения, которым нужно, чтобы модель генерации была значением конфига, а не обязательством перед вендором, запечённым в стек.
  • Разработчики, запускающие много brain'ов на разных уровнях качества: один ключ, один эндпоинт, id модели на каждый brain.
  • Команды, которым нужны обоснованные ответы качества Claude за конфигом в форме OpenAI, без добавления второго SDK или аккаунта у провайдера.
  • Разработчики, бенчмаркающие модели генерации на фиксированном корпусе, где каждый кандидат — это одна правка LLMEndpointConfig.
  • Разработчики без доступа к биллингу конкретного вендора. Доступ на основе пополнения без требования карты убирает зависимость от регистрации у каждого провайдера.

Проверьте эндпоинт и отладьте первый ask().

Убедитесь, что шлюз листит вашу модель, прежде чем что-либо принимать; поле model должно точно совпадать с обслуживаемым id. Сбои первого запуска предсказуемы. Предупреждение, что API-ключ для supplier openai не задан, означает, что ни llm_api_key, ни OPENAI_API_KEY не были видны в момент конструирования конфига; предупреждение случается при конструировании, сбой — на первом ask(). 401 означает, что резолвленный ключ не принадлежит эндпоинту в llm_base_url. Ошибка model-not-found — это опечатка id против /v1/models. А ошибка аутентификации, связанная с эмбеддингом, во время Brain.from_files — это отдельный эмбеддер по умолчанию, запрашивающий собственные credentials OpenAI, что никакая настройка llm_base_url не исправит; передайте эмбеддера, которого вы контролируете. Как только ответы начинают идти, консоль APIsRouter показывает модель на запрос, счётчики токенов и расходы. Для библиотеки, упаковывающей извлечённые чанки в каждый промпт, число токенов на ответ на вашем реальном корпусе — та цифра, которая должна вести ваш выбор модели.

curl -s https://api.apisrouter.com/v1/models \
  -H "Authorization: Bearer $APISROUTER_API_KEY" | head -50

Частые вопросы

Поддерживает ли Quivr кастомный OpenAI-совместимый base URL?

Да. LLMEndpointConfig в quivr-core имеет поле llm_base_url, и для supplier openai библиотека строит ChatOpenAI из LangChain против этого URL. Установите его в эндпоинт шлюза и передайте любой id модели из каталога.

Основан ли Quivr на LiteLLM?

Не в текущей кодовой базе. quivr-core выбирает классы чата LangChain по supplier; supplier openai использует ChatOpenAI с вашим llm_base_url. Гайды, описывающие api_base LiteLLM внутри Quivr, относятся к более старой архитектуре.

Может ли brain.ask() отвечать моделями Claude или DeepSeek?

Да. Поле model пересылается как простая строка через /v1/chat/completions, так что claude-sonnet-4-6, deepseek-v4-flash или любой другой id, который обслуживает эндпоинт, работает под supplier openai.

Какая переменная окружения хранит ключ?

Когда llm_api_key не задан в конфиге, quivr-core выводит переменную из имени supplier: OPENAI_API_KEY для supplier openai. Явный llm_api_key в LLMEndpointConfig имеет приоритет и избегает перегрузки этого имени.

Двигает ли llm_base_url также эмбеддинги?

Нет. Эмбеддер по умолчанию — это отдельный клиент OpenAIEmbeddings со своими собственными credentials и эндпоинтом. Маршрутизируйте генерацию через шлюз и передайте своего собственного эмбеддера, если хотите увести от OpenAI и половину с эмбеддингом.

Всё ещё поддерживается ли проект Quivr?

Репозиторий тихий с середины 2025 года, так что относитесь к нему как к стабильной библиотеке, а не активной. Задокументированная здесь поверхность llm_base_url совпадает с последней веткой main, а заменённое ей полностековое приложение до переориентации упразднено.