Jalankan otak RAG Quivr di endpoint OpenAI-compatible custom.
Updated 2026-07-29
LLMEndpointConfig quivr-core menerima field llm_base_url. Jaga supplier tetap openai, set llm_base_url ke https://api.apisrouter.com/v1, kirim satu key, dan setiap brain.ask() menghasilkan jawabannya melalui gateway dengan id model katalog apa pun.
Jawaban singkat: llm_base_url di LLMEndpointConfig.
Quivr saat ini adalah quivr-core, library RAG Python, dan pengkabelan LLM-nya eksplisit. LLMEndpointConfig membawa supplier (openai secara default), model, llm_base_url, dan llm_api_key; LLMEndpoint.from_config() membangun client sebenarnya dari field itu, dan untuk supplier openai client itu adalah ChatOpenAI LangChain yang dikonstruksi dengan base URL Anda. Set llm_base_url ke https://api.apisrouter.com/v1, set model ke id katalog apa pun, dan serahkan endpoint-nya ke Brain Anda. Key-nya bisa berasal dari field config atau environment: saat llm_api_key tidak diset, quivr-core me-resolve-nya dari environment variable yang dinamai menurut supplier-nya, yang untuk supplier openai adalah OPENAI_API_KEY. Kedua jalur adalah perilaku upstream, terbaca di quivr_core/rag/entities/config.py dan 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"],
))Apa itu Quivr sekarang, dan di mana slot LLM duduk.
Quivr (QuivrHQ di GitHub, sekitar 39K bintang) dimulai sebagai aplikasi second-brain lengkap dan berpindah haluan menjadi quivr-core: library RAG yang berpendirian yang Anda tanam di produk Anda sendiri. Anda menyuapinya file, ia mem-parse dan mem-chunk-nya, meng-embed chunk itu ke vector store (FAISS secara default, PGVector didukung), dan menjawab pertanyaan atasnya lewat retrieval workflow yang bisa dikonfigurasi. Objek Brain adalah unitnya: Brain.from_files() melakukan ingest, brain.ask() melakukan retrieve dan generate. Generasi adalah satu-satunya langkah yang butuh chat model. Retrieval workflow merakit context dari dokumen Anda, dan LLMEndpoint yang Anda berikan menulis jawaban yang membumi. Endpoint itu dibangun sekali dari LLMEndpointConfig, jadi keputusan base URL dibuat saat waktu konstruksi dan berlaku untuk setiap ask() di brain itu. Karena ChatOpenAI meneruskan field model sebagai string biasa melalui /v1/chat/completions, id-nya bisa Claude, DeepSeek, GPT, atau Gemini saat endpoint di balik llm_base_url melayaninya. Satu catatan jujur soal status proyek: repository-nya sudah sepi sejak pertengahan 2025, jadi perlakukan quivr-core sebagai library yang stabil alih-alih yang bergerak cepat. Permukaan config yang dideskripsikan di sini cocok dengan main branch terbaru, dan riwayat yang sepi berarti kecil kemungkinan berubah di bawah Anda; itu juga berarti tutorial lama yang mendeskripsikan aplikasi full-stack yang sudah pensiun (file .env backend, frontend hosted) tidak lagi cocok dengan kode-nya.
Setup lengkap: brain dengan LLM yang dirutekan gateway.
Pola lengkapnya menyerahkan LLMEndpoint yang dikonfigurasi ke Brain.from_files. Semua hal lain soal brain-nya (parsing, chunking, store FAISS, retrieval workflow) independen dari endpoint LLM dan mempertahankan default-nya. Perhatikan embedder-nya. Jika Anda tidak menyerahkan satu, quivr-core membangun OpenAIEmbeddings LangChain dengan default-nya sendiri, yang mengautentikasi dengan OPENAI_API_KEY dan menargetkan endpoint OpenAI bawaan. Itu client terpisah dari LLM chat: merutekan generasi melalui gateway tidak memindahkannya. Serahkan embedder Anda sendiri (wrapper sentence-transformers lokal, atau instance Embeddings LangChain mana pun yang Anda konfigurasi) jika Anda tidak ingin separuh embedding bergantung pada akun 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)Memilih model generasi untuk jawaban RAG.
Membandingkan kandidat adalah perubahan saat waktu konstruksi: bangun dua LLMEndpoint terhadap base URL yang sama, dua brain di atas file yang sama, dan diff jawabannya pada set pertanyaan tetap. Log penggunaan per-key memberi harga run setiap kandidat, jadi kualitas-per-token diukur alih-alih diperdebatkan.
- Generasi RAG bersifat input-heavy: chunk yang diambil mendominasi prompt. Harga per-token-input menentukan biaya sebuah jawaban, itulah sebabnya id cepat sering memangkas separuh tagihan tanpa menyentuh kualitas retrieval.
- claude-sonnet-4-6 adalah default yang bisa diandalkan untuk jawaban membumi yang menghormati context yang diambil dan menolak dengan bersih saat dokumen tidak berisi jawabannya.
- Produk embedded volume tinggi (use case yang dinyatakan Quivr) berjalan baik di claude-haiku-4-5-20251001, deepseek-v4-flash, atau gemini-3.5-flash untuk campuran pertanyaan sehari-hari.
- max_context_tokens di config yang sama mengatur berapa banyak context yang diambil yang dikemas pipeline; menaikkannya berpasangan secara alami dengan id long-context dan menaikkan pengeluaran input secara proporsional.
- Prefix model yang tidak dikenal jatuh ke tokenizer generik untuk budgeting, yang bersifat kosmetik; request itu sendiri membawa id Anda tidak berubah ke endpoint.
Bayar sesuai pemakaian · di bawah harga resmi
Selected models are priced below official list prices. Exact input, output, cache, and per-request prices are shown for each model.
| Model | Harga Resmi | Harga Kami |
|---|---|---|
| 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 |
Koreksi untuk lore Quivr yang umum.
Panduan yang beredar mendeskripsikan permukaan yang tidak lagi dimiliki Quivr, jadi layak dinyatakan apa yang sebenarnya dilakukan kode saat ini. quivr-core berbasis LangChain, bukan berbasis LiteLLM. Enum supplier memilih class chat LangChain, dan openai memetakan ke ChatOpenAI dengan llm_base_url Anda. Jika tutorial menyuruh Anda mengonfigurasi proxy LiteLLM atau pengaturan api_base di dalam Quivr, itu mendeskripsikan arsitektur lama; field saat ini adalah llm_base_url di LLMEndpointConfig. Aplikasi full-stack sudah pensiun. Instruksi soal .env backend, setup Supabase, atau model picker in-app merujuk ke aplikasi pra-pivot, yang bukan lagi apa yang dikirim repository. Konfigurasi sekarang terjadi di kode Python Anda (atau app Anda sendiri di sekitar library-nya). Env var key-nya berasal dari supplier. Untuk supplier openai itu adalah OPENAI_API_KEY, bahkan saat endpoint-nya bukan OpenAI. Jika Anda lebih suka tidak membebani nama itu, serahkan llm_api_key secara eksplisit di config, yang mengambil prioritas dan menjaga environment tetap bersih. Embedder-nya terpisah. Routing generasi tidak memindahkan embedding; embedder default adalah OpenAIEmbeddings dengan kredensialnya sendiri. Putuskan kedua separuh itu secara independen, dan re-embed store yang ada hanya dibutuhkan jika Anda mengubah model embedding itu sendiri.
Siapa yang merutekan quivr-core melalui gateway.
- Tim produk yang menanam RAG di app mereka yang menginginkan model generasi sebagai nilai config, bukan komitmen vendor yang dipanggang ke dalam stack.
- Developer yang menjalankan banyak brain di tier kualitas berbeda: satu key, satu endpoint, id model per brain.
- Tim yang menginginkan jawaban membumi berkualitas Claude di balik config berbentuk OpenAI tanpa menambahkan SDK atau akun provider kedua.
- Builder yang membenchmark model generasi di atas corpus tetap, di mana setiap kandidat adalah satu perubahan LLMEndpointConfig.
- Developer tanpa akses ke billing vendor tertentu. Akses berbasis top-up tanpa syarat kartu menghilangkan ketergantungan sign-up per provider.
Verifikasi endpoint dan debug ask() pertama.
Konfirmasi gateway mencantumkan model Anda sebelum meng-ingest apa pun; field model harus cocok persis dengan id yang dilayani. Kegagalan first-run bisa diprediksi. Peringatan bahwa API key untuk supplier openai tidak diset berarti baik llm_api_key maupun OPENAI_API_KEY tidak terlihat saat config dikonstruksi; peringatannya terjadi saat konstruksi, kegagalannya di ask() pertama. 401 berarti key yang di-resolve tidak memiliki endpoint di llm_base_url. Error model-not-found adalah salah ketik id terhadap /v1/models. Dan error autentikasi terkait embedding saat Brain.from_files adalah embedder default terpisah yang meminta kredensial OpenAI-nya sendiri, yang tidak akan diperbaiki pengaturan llm_base_url apa pun; serahkan embedder yang Anda kontrol. Setelah jawaban mengalir, konsol APIsRouter menunjukkan model per request, hitungan token, dan pengeluaran. Untuk library yang mengemas chunk yang diambil ke setiap prompt, angka token-per-jawaban pada corpus nyata Anda adalah angka yang seharusnya menggerakkan pilihan model Anda.
curl -s https://api.apisrouter.com/v1/models \
-H "Authorization: Bearer $APISROUTER_API_KEY" | head -50Pertanyaan umum
Apakah Quivr mendukung base URL OpenAI-compatible custom?
Ya. LLMEndpointConfig quivr-core punya field llm_base_url, dan untuk supplier openai library-nya membangun ChatOpenAI LangChain terhadap URL itu. Set ke endpoint gateway dan serahkan id model katalog apa pun.
Apakah Quivr berbasis LiteLLM?
Tidak di codebase saat ini. quivr-core memilih class chat LangChain berdasarkan supplier; supplier openai memakai ChatOpenAI dengan llm_base_url Anda. Panduan yang mendeskripsikan api_base LiteLLM di dalam Quivr merujuk ke arsitektur lama.
Bisakah brain.ask() menjawab dengan model Claude atau DeepSeek?
Ya. Field model diteruskan sebagai string biasa melalui /v1/chat/completions, jadi claude-sonnet-4-6, deepseek-v4-flash, atau id lain apa pun yang dilayani endpoint berfungsi di bawah supplier openai.
Environment variable mana yang menyimpan key-nya?
Saat llm_api_key tidak diset di config, quivr-core menurunkan variabelnya dari nama supplier: OPENAI_API_KEY untuk supplier openai. llm_api_key eksplisit di LLMEndpointConfig mengambil prioritas dan menghindari pembebanan nama itu.
Apakah llm_base_url juga memindahkan embedding?
Tidak. Embedder default adalah client OpenAIEmbeddings terpisah dengan kredensial dan endpoint-nya sendiri. Rutekan generasi melalui gateway dan serahkan embedder Anda sendiri jika Anda ingin separuh embedding juga lepas dari OpenAI.
Apakah proyek Quivr masih dipelihara?
Repository-nya sudah sepi sejak pertengahan 2025, jadi perlakukan sebagai library yang stabil alih-alih yang aktif. Permukaan llm_base_url yang terdokumentasi di sini cocok dengan main branch terbaru, dan aplikasi full-stack pra-pivot yang digantikannya sudah pensiun.