Quivr के RAG brain को एक custom OpenAI-compatible endpoint पर चलाएं।

Updated 2026-07-29

quivr-core का LLMEndpointConfig एक llm_base_url field लेता है। supplier को openai रखें, llm_base_url को https://api.apisrouter.com/v1 set करें, एक key pass करें, और हर brain.ask() अपना answer किसी भी catalog model id के साथ gateway के through generate करता है।

Quick answer: LLMEndpointConfig में llm_base_url।

Current Quivr quivr-core है, एक Python RAG library, और इसकी LLM wiring explicit है। LLMEndpointConfig supplier (default openai), model, llm_base_url, और llm_api_key carry करता है; LLMEndpoint.from_config() उन fields से actual client बनाता है, और openai supplier के लिए वह client LangChain का ChatOpenAI है जो आपके base URL से बनाया गया। llm_base_url को https://api.apisrouter.com/v1 set करें, model को किसी भी catalog id पर set करें, और endpoint को अपने Brain को दें। Key config field से या environment से आ सकती है: जब llm_api_key set नहीं होता, quivr-core इसे supplier के नाम पर एक environment variable से resolve करता है, जो openai supplier के लिए OPENAI_API_KEY है। दोनों paths upstream behavior हैं, 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 slot कहां बैठता है।

Quivr (GitHub पर QuivrHQ, लगभग 39K stars) एक full second-brain application के तौर पर शुरू हुआ और quivr-core में pivot हुआ: एक opinionated RAG library जिसे आप अपने product में embed करते हैं। आप इसे files देते हैं, यह उन्हें parse और chunk करता है, chunks को एक vector store (default FAISS, PGVector supported) में embed करता है, और एक configurable retrieval workflow के through उन पर सवालों के जवाब देता है। Brain object unit है: Brain.from_files() ingest करता है, brain.ask() retrieve और generate करता है। Generation ही एकमात्र step है जिसे chat model चाहिए। Retrieval workflow आपके documents से context assemble करती है, और आपने pass किया LLMEndpoint grounded answer लिखता है। वह endpoint LLMEndpointConfig से एक बार build होता है, तो base URL decision construction time पर लिया जाता है और उस brain के हर ask() पर apply होता है। चूंकि ChatOpenAI model field को /v1/chat/completions पर एक plain string के तौर पर forward करता है, id Claude, DeepSeek, GPT, या Gemini हो सकती है जब llm_base_url के पीछे वाला endpoint उन्हें serve करे। Project status पर एक honest note: repository mid-2025 से quiet रही है, तो quivr-core को एक fast-moving की बजाय एक stable library मानें। यहां describe की गई config surface latest main branch से match करती है, और quiet history का मतलब है कि यह आपके नीचे shift होने की संभावना कम है; इसका मतलब यह भी है कि retired full-stack app (backend .env files, एक hosted frontend) describe करने वाले पुराने tutorials अब code से match नहीं करते।

पूरा setup: एक gateway-routed LLM वाला brain।

पूरा pattern configured LLMEndpoint को Brain.from_files में pass करता है। Brain के बारे में बाकी सब कुछ (parsing, chunking, FAISS store, retrieval workflow) LLM endpoint से independent है और अपने defaults रखता है। Embedder का ध्यान रखें। अगर आप एक pass नहीं करते, quivr-core अपने defaults के साथ LangChain का OpenAIEmbeddings बनाता है, जो OPENAI_API_KEY से authenticate करता है और stock OpenAI endpoint को target करता है। यह chat LLM से एक अलग client है: generation को gateway के through route करने से यह move नहीं होता। अगर आप embedding half को एक OpenAI account पर depend नहीं करवाना चाहते तो अपना खुद का embedder pass करें (एक local sentence-transformers wrapper, या कोई भी LangChain Embeddings instance जो आप configure करते हैं)।

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 answers के लिए एक generation model चुनना।

Candidates compare करना एक construction-time change है: same base URL के against दो LLMEndpoints बनाएं, same files पर दो brains, और एक fixed question set पर answers diff करें। Per-key usage log हर candidate run की price करता है, तो quality-per-token measured होती है, argued नहीं।

  • RAG generation input-heavy है: retrieved chunks prompt पर हावी रहते हैं। Per-input-token price answer की cost set करती है, यही वजह है कि एक fast id अक्सर retrieval quality छुए बिना bill आधा कर देती है।
  • claude-sonnet-4-6 grounded answers के लिए भरोसेमंद default है जो retrieved context का सम्मान करता है और cleanly decline करता है जब documents में answer नहीं होता।
  • High-volume embedded products (Quivr का stated use case) everyday question mix के लिए claude-haiku-4-5-20251001, deepseek-v4-flash, या gemini-3.5-flash पर अच्छे चलते हैं।
  • Same config में max_context_tokens तय करता है कि pipeline कितना retrieved context pack करती है; इसे raise करना long-context ids के साथ naturally pair होता है और input spend को proportionally raise करता है।
  • Unknown model prefixes budgeting के लिए एक generic tokenizer पर fall back करते हैं, जो cosmetic है; request खुद आपकी id endpoint को unchanged carry करती है।

जितना उपयोग उतना भुगतान · आधिकारिक मूल्य से कम

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

Common Quivr lore में corrections।

Circulation में guides ऐसे surfaces describe करती हैं जो Quivr के पास अब नहीं हैं, तो यह बताने लायक है कि current code actually क्या करता है। quivr-core LangChain-backed है, LiteLLM-backed नहीं। Supplier enum एक LangChain chat class select करता है, और openai आपके llm_base_url के साथ ChatOpenAI पर map होता है। अगर कोई tutorial आपको Quivr के अंदर एक LiteLLM proxy या api_base setting configure करने को कहे, वह एक older architecture describe करता है; current field LLMEndpointConfig पर llm_base_url है। Full-stack app retired है। Backend .env, Supabase setup, या in-app model picker के बारे में instructions pre-pivot application का reference देती हैं, जो अब वह नहीं है जो repository ship करता है। Configuration अब आपके Python code में (या library के around आपके अपने app में) होता है। Key env var supplier-derived है। Supplier openai के लिए यह OPENAI_API_KEY है, तब भी जब endpoint OpenAI नहीं है। अगर आप उस नाम को overload नहीं करना चाहते, config में explicitly llm_api_key pass करें, जो precedence लेता है और environment को clean रखता है। Embedder अलग है। Generation routing embeddings को move नहीं करता; default embedder अपनी credentials वाला OpenAIEmbeddings है। दोनों halves independently decide करें, और एक existing store को re-embed करना सिर्फ तब चाहिए जब आप embedding model खुद बदलें।

कौन quivr-core को एक gateway के through route करता है।

  • Product teams जो अपने apps में RAG embed करती हैं और generation model को stack में baked एक vendor commitment की बजाय एक config value चाहती हैं।
  • Developers जो अलग-अलग quality tiers पर कई brains चलाते हैं: एक key, एक endpoint, per brain model id।
  • Teams जो एक second SDK या provider account add किए बिना OpenAI-shaped config के पीछे Claude-quality grounded answers चाहती हैं।
  • Builders जो एक fixed corpus पर generation models benchmark करते हैं, जहां हर candidate एक LLMEndpointConfig change है।
  • Developers जिनके पास किसी given vendor की billing तक access नहीं है। बिना card requirement वाला top-up based access per-provider sign-up dependency हटा देता है।

Endpoint verify करें और पहले ask() को debug करें।

Kuch भी ingest करने से पहले confirm करें कि gateway आपका model list करता है; model field एक served id से exactly match होनी चाहिए। First-run failures predictable हैं। एक warning कि supplier openai के लिए API key set नहीं है मतलब config बनते समय न तो llm_api_key न ही OPENAI_API_KEY visible थी; warning construction पर होती है, failure पहले ask() पर। एक 401 मतलब resolved key llm_base_url वाले endpoint की नहीं है। एक model-not-found error /v1/models के against एक id typo है। और Brain.from_files के दौरान एक embedding-related authentication error अलग default embedder का अपनी OpenAI credentials मांगना है, जिसे कोई llm_base_url setting fix नहीं करेगी; एक embedder pass करें जो आप control करते हैं। जब answers चलने लगें, APIsRouter console per-request model, token counts, और spend दिखाता है। एक library के लिए जो हर prompt में retrieved chunks pack करती है, आपके असली corpus पर tokens-per-answer number वह figure है जो आपके model choice को drive करना चाहिए।

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

अक्सर पूछे जाने वाले प्रश्न

क्या Quivr custom OpenAI-compatible base URL support करता है?

हां। quivr-core के LLMEndpointConfig में एक llm_base_url field है, और openai supplier के लिए library उस URL के against LangChain का ChatOpenAI बनाती है। इसे gateway endpoint set करें और कोई भी catalog model id pass करें।

क्या Quivr LiteLLM-based है?

Current codebase में नहीं। quivr-core supplier के हिसाब से LangChain chat classes select करता है; openai supplier आपके llm_base_url के साथ ChatOpenAI इस्तेमाल करता है। Quivr के अंदर एक LiteLLM api_base describe करने वाली guides एक older architecture reference देती हैं।

क्या brain.ask() Claude या DeepSeek models से जवाब दे सकता है?

हां। Model field को /v1/chat/completions पर एक plain string के तौर पर forward किया जाता है, तो openai supplier के तहत claude-sonnet-4-6, deepseek-v4-flash, या endpoint serve करने वाली कोई भी दूसरी id काम करती है।

Key कौन-सा environment variable रखता है?

जब config में llm_api_key set नहीं है, quivr-core supplier के नाम से variable derive करता है: supplier openai के लिए OPENAI_API_KEY। LLMEndpointConfig में एक explicit llm_api_key precedence लेता है और उस नाम को overload होने से बचाता है।

क्या llm_base_url embeddings को भी move करता है?

नहीं। Default embedder अपनी credentials और endpoint वाला एक अलग OpenAIEmbeddings client है। Generation को gateway के through route करें और अगर आप embedding half को भी OpenAI से हटाना चाहते हैं तो अपना खुद का embedder pass करें।

क्या Quivr project अभी भी maintained है?

Repository mid-2025 से quiet रही है, तो इसे एक active की बजाय एक stable library मानें। यहां documented llm_base_url surface latest main branch से match करती है, और जिस pre-pivot full-stack app की जगह इसने ली वह retired है।