Uruchom mózg RAG Quivr na niestandardowym endpoincie kompatybilnym z OpenAI.
Updated 2026-07-29
LLMEndpointConfig w quivr-core przyjmuje pole llm_base_url. Zostaw supplier jako openai, ustaw llm_base_url na https://api.apisrouter.com/v1, przekaż jeden klucz, a każde brain.ask() generuje swoją odpowiedź przez bramkę z dowolnym identyfikatorem modelu z katalogu.
Szybka odpowiedź: llm_base_url w LLMEndpointConfig.
Obecny Quivr to quivr-core, biblioteka RAG w Pythonie, a jej okablowanie LLM jest jawne. LLMEndpointConfig niesie supplier (domyślnie openai), model, llm_base_url i llm_api_key; LLMEndpoint.from_config() buduje faktycznego klienta z tych pól, a dla suppliera openai tym klientem jest ChatOpenAI z LangChain, zbudowany z Twoim base URL. Ustaw llm_base_url na https://api.apisrouter.com/v1, ustaw model na dowolny identyfikator z katalogu i podaj endpoint swojemu Brain. Klucz może pochodzić z pola konfiguracji albo ze środowiska: gdy llm_api_key nie jest ustawiony, quivr-core rozwiązuje go ze zmiennej środowiskowej nazwanej według suppliera, co dla suppliera openai to OPENAI_API_KEY. Obie ścieżki to zachowanie upstreamowe, czytelne w quivr_core/rag/entities/config.py i 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"],
))Czym jest teraz Quivr i gdzie siedzi slot LLM.
Quivr (QuivrHQ na GitHubie, około 39 tys. gwiazdek) zaczął jako pełna aplikacja drugiego mózgu i przeszedł pivot do quivr-core: opiniotwórcza biblioteka RAG, którą osadzasz we własnym produkcie. Podajesz jej pliki, ona je parsuje i dzieli na fragmenty, embeduje fragmenty do magazynu wektorów (domyślnie FAISS, wspierany PGVector) i odpowiada na pytania na ich temat przez konfigurowalny workflow retrievalu. Obiekt Brain to jednostka: Brain.from_files() wykonuje ingest, brain.ask() pobiera i generuje. Generowanie to jedyny krok, który potrzebuje modelu czatu. Workflow retrievalu składa kontekst z Twoich dokumentów, a przekazany przez Ciebie LLMEndpoint pisze uziemioną odpowiedź. Ten endpoint jest budowany raz z LLMEndpointConfig, więc decyzja o base URL zapada w momencie konstrukcji i stosuje się do każdego ask() na tym brainie. Ponieważ ChatOpenAI przekazuje pole model jako zwykły string przez /v1/chat/completions, identyfikator może być Claude, DeepSeek, GPT albo Gemini, gdy endpoint za llm_base_url je obsługuje. Jedna uczciwa uwaga o statusie projektu: repozytorium jest ciche od połowy 2025, więc traktuj quivr-core jako stabilną bibliotekę, a nie szybko rozwijającą się. Opisana tu powierzchnia konfiguracji zgadza się z najnowszym branchem main, a cicha historia oznacza, że mało prawdopodobne, żeby się pod Tobą przesunęła; oznacza to też, że stare tutoriale opisujące wycofaną aplikację full-stack (backendowe pliki .env, hostowany frontend) już nie zgadzają się z kodem.
Pełna konfiguracja: brain z LLM kierowanym przez bramkę.
Kompletny wzorzec przekazuje skonfigurowany LLMEndpoint do Brain.from_files. Wszystko inne w brainie (parsowanie, dzielenie na fragmenty, magazyn FAISS, workflow retrievalu) jest niezależne od endpointu LLM i zachowuje swoje domyślne wartości. Uważaj na embedder. Jeśli żadnego nie przekażesz, quivr-core buduje OpenAIEmbeddings z LangChain z własnymi domyślnymi wartościami, które uwierzytelniają się OPENAI_API_KEY i celują w fabryczny endpoint OpenAI. To osobny klient od LLM czatu: kierowanie generowania przez bramkę go nie przenosi. Przekaż własny embedder (lokalny wrapper sentence-transformers albo dowolną instancję Embeddings z LangChain, którą skonfigurujesz), jeśli nie chcesz, żeby połowa dotycząca embeddingu zależała od konta 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)Dobór modelu generowania dla odpowiedzi RAG.
Porównywanie kandydatów to zmiana w czasie konstrukcji: zbuduj dwa LLMEndpoint względem tego samego base URL, dwa brainy na tych samych plikach i porównaj odpowiedzi na stałym zestawie pytań. Log użycia per klucz wycenia uruchomienie każdego kandydata, więc jakość-na-token jest mierzona, a nie argumentowana.
- Generowanie RAG jest input-heavy: pobrane fragmenty dominują prompt. Cena per token wejściowy ustala koszt odpowiedzi, dlatego szybki identyfikator często obniża rachunek o połowę, nie dotykając jakości retrievalu.
- claude-sonnet-4-6 to niezawodny domyślny wybór dla uziemionych odpowiedzi, które respektują pobrany kontekst i czysto odmawiają, gdy dokumenty nie zawierają odpowiedzi.
- Wysokowolumenowe produkty osadzone (deklarowany przypadek użycia Quivr) dobrze działają na claude-haiku-4-5-20251001, deepseek-v4-flash albo gemini-3.5-flash dla codziennego miksu pytań.
- max_context_tokens w tej samej konfiguracji rządzi tym, ile pobranego kontekstu upycha pipeline; podniesienie go naturalnie łączy się z identyfikatorami o długim kontekście i podnosi proporcjonalnie wydatek na wejście.
- Nieznane prefiksy modeli spadają z powrotem na generyczny tokenizer do budżetowania, co jest kosmetyczne; samo żądanie niesie Twój identyfikator niezmieniony do endpointu.
Płatność za użycie · poniżej cen oficjalnych
Selected models are priced below official list prices. Exact input, output, cache, and per-request prices are shown for each model.
| Model | Cena oficjalna | Nasza cena |
|---|---|---|
| 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 |
Poprawki do popularnych mitów o Quivr.
Krążące przewodniki opisują powierzchnie, których Quivr już nie ma, więc warto stwierdzić, co obecny kod faktycznie robi. quivr-core jest oparty na LangChain, nie na LiteLLM. Enum suppliera wybiera klasę czatu LangChain, a openai mapuje się na ChatOpenAI z Twoim llm_base_url. Jeśli tutorial mówi Ci, żeby skonfigurować proxy LiteLLM albo ustawienie api_base wewnątrz Quivr, opisuje starszą architekturę; obecne pole to llm_base_url na LLMEndpointConfig. Aplikacja full-stack jest wycofana. Instrukcje o backendowym .env, konfiguracji Supabase albo pickerze modeli w aplikacji odnoszą się do aplikacji sprzed pivotu, która już nie jest tym, co dostarcza repozytorium. Konfiguracja odbywa się teraz w Twoim kodzie Pythona (albo we własnej aplikacji wokół biblioteki). Zmienna środowiskowa klucza jest wyprowadzana z suppliera. Dla suppliera openai to OPENAI_API_KEY, nawet gdy endpoint nie jest OpenAI. Jeśli wolisz nie przeciążać tej nazwy, przekaż llm_api_key jawnie w konfiguracji, co ma pierwszeństwo i utrzymuje środowisko czystym. Embedder jest osobny. Routing generowania nie przenosi embeddingów; domyślny embedder to OpenAIEmbeddings z własnymi poświadczeniami. Zdecyduj o obu połowach niezależnie, a ponowne embedowanie istniejącego magazynu jest potrzebne tylko wtedy, gdy zmieniasz sam model embeddingu.
Kto kieruje quivr-core przez bramkę.
- Zespoły produktowe osadzające RAG w swoich aplikacjach, które chcą, żeby model generowania był wartością konfiguracji, a nie zobowiązaniem wobec dostawcy wypieczonym w stosie.
- Deweloperzy prowadzący wiele brainów na różnych poziomach jakości: jeden klucz, jeden endpoint, identyfikator modelu per brain.
- Zespoły, które chcą uziemionych odpowiedzi jakości Claude za konfiguracją w kształcie OpenAI, bez dodawania drugiego SDK albo konta u dostawcy.
- Twórcy benchmarkujący modele generowania na stałym korpusie, gdzie każdy kandydat to jedna zmiana LLMEndpointConfig.
- Deweloperzy bez dostępu do rozliczeń danego dostawcy. Dostęp oparty na doładowaniu, bez wymogu karty, usuwa zależność od rejestracji u każdego dostawcy z osobna.
Zweryfikuj endpoint i debuguj pierwsze ask().
Potwierdź, że bramka listuje Twój model, zanim cokolwiek zaingestujesz; pole model musi dokładnie zgadzać się z obsługiwanym identyfikatorem. Awarie pierwszego uruchomienia są przewidywalne. Ostrzeżenie, że klucz API dla suppliera openai nie jest ustawiony, oznacza, że ani llm_api_key, ani OPENAI_API_KEY nie było widoczne, gdy konfiguracja była konstruowana; ostrzeżenie pojawia się przy konstrukcji, awaria przy pierwszym ask(). 401 oznacza, że rozwiązany klucz nie należy do endpointu w llm_base_url. Błąd model-not-found to literówka identyfikatora względem /v1/models. A błąd uwierzytelniania związany z embeddingiem podczas Brain.from_files to osobny domyślny embedder proszący o własne poświadczenia OpenAI, czego żadne ustawienie llm_base_url nie naprawi; przekaż embedder, który kontrolujesz. Gdy odpowiedzi już płyną, konsola APIsRouter pokazuje model per żądanie, liczbę tokenów i wydatki. Dla biblioteki, która upycha pobrane fragmenty w każdy prompt, liczba tokenów per odpowiedź na Twoim prawdziwym korpusie to liczba, która powinna napędzać Twój wybór modelu.
curl -s https://api.apisrouter.com/v1/models \
-H "Authorization: Bearer $APISROUTER_API_KEY" | head -50Częste pytania
Czy Quivr obsługuje niestandardowy base URL kompatybilny z OpenAI?
Tak. LLMEndpointConfig w quivr-core ma pole llm_base_url, a dla suppliera openai biblioteka buduje ChatOpenAI z LangChain względem tego URL. Ustaw go na endpoint bramki i przekaż dowolny identyfikator modelu z katalogu.
Czy Quivr jest oparty na LiteLLM?
Nie w obecnej bazie kodu. quivr-core wybiera klasy czatu LangChain według suppliera; supplier openai używa ChatOpenAI z Twoim llm_base_url. Przewodniki opisujące api_base LiteLLM wewnątrz Quivr odnoszą się do starszej architektury.
Czy brain.ask() może odpowiadać modelami Claude albo DeepSeek?
Tak. Pole model jest przekazywane jako zwykły string przez /v1/chat/completions, więc claude-sonnet-4-6, deepseek-v4-flash albo dowolny inny identyfikator obsługiwany przez endpoint działa pod supplierem openai.
Która zmienna środowiskowa trzyma klucz?
Gdy llm_api_key nie jest ustawiony w konfiguracji, quivr-core wyprowadza zmienną z nazwy suppliera: OPENAI_API_KEY dla suppliera openai. Jawny llm_api_key w LLMEndpointConfig ma pierwszeństwo i unika przeciążania tej nazwy.
Czy llm_base_url przenosi też embeddingi?
Nie. Domyślny embedder to osobny klient OpenAIEmbeddings z własnymi poświadczeniami i endpointem. Kieruj generowanie przez bramkę i przekaż własny embedder, jeśli chcesz też zdjąć połowę embeddingu z OpenAI.
Czy projekt Quivr jest nadal utrzymywany?
Repozytorium jest ciche od połowy 2025, więc traktuj je jako stabilną bibliotekę, a nie aktywną. Udokumentowana tu powierzchnia llm_base_url zgadza się z najnowszym branchem main, a aplikacja full-stack sprzed pivotu, którą zastąpiła, jest wycofana.