Quivr-এর RAG brain একটা কাস্টম OpenAI-compatible endpoint-এ চালান।
Updated 2026-07-29
quivr-core-এর LLMEndpointConfig একটা llm_base_url field নেয়। supplier openai-ই রাখুন, llm_base_url-কে https://api.apisrouter.com/v1-এ সেট করুন, এক key পাস করুন, এবং প্রতিটা brain.ask() gateway দিয়ে তার উত্তর generate করে যেকোনো catalog model id দিয়ে।
দ্রুত উত্তর: 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; LLMEndpoint.from_config() সেসব field থেকে আসল client বানায়, এবং openai supplier-এর জন্য সেই client হলো LangChain-এর ChatOpenAI, আপনার base URL দিয়ে construct করা। llm_base_url-কে https://api.apisrouter.com/v1-এ সেট করুন, model-কে যেকোনো catalog id-তে সেট করুন, এবং endpoint আপনার Brain-এর হাতে দিন। Key config field থেকে বা environment থেকে আসতে পারে: llm_api_key সেট না থাকলে, quivr-core supplier-এর নাম অনুসারে একটা environment variable থেকে এটা resolve করে, যা openai supplier-এর জন্য OPENAI_API_KEY। দুটো path-ই 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 star) একটা সম্পূর্ণ second-brain application হিসেবে শুরু হয়েছিল এবং pivot করেছে quivr-core-এ: একটা opinionated RAG library যা আপনার নিজের product-এ embed করেন। আপনি file দেন, এটা parse এবং chunk করে, chunk-গুলো একটা vector store-এ embed করে (default FAISS, PGVector সাপোর্টেড), এবং একটা configurable retrieval workflow দিয়ে তাদের উপর প্রশ্নের উত্তর দেয়। Brain object হলো unit: Brain.from_files() ingest করে, brain.ask() retrieve এবং generate করে। Generation-ই একমাত্র step যার একটা chat model দরকার। Retrieval workflow আপনার document থেকে context assemble করে, এবং আপনার পাস করা LLMEndpoint grounded উত্তর লেখে। সেই endpoint একবার LLMEndpointConfig থেকে বানানো হয়, তাই base URL decision construction time-এ নেওয়া হয় এবং সেই brain-এর প্রতিটা ask()-এ প্রযোজ্য। যেহেতু ChatOpenAI model field-কে /v1/chat/completions-এর মধ্য দিয়ে একটা plain string হিসেবে forward করে, llm_base_url-এর পেছনের endpoint সেগুলো serve করলে id Claude, DeepSeek, GPT, বা Gemini হতে পারে। Project status নিয়ে একটা honest note: repository 2025 mid থেকে শান্ত, তাই quivr-core-কে একটা stable library হিসেবে treat করুন, দ্রুত-চলমান কিছু না। এখানে বর্ণিত config surface latest main branch-এর সাথে মেলে, এবং শান্ত history মানে এটা আপনার নিচে shift করার সম্ভাবনা কম; এর মানে এটাও যে retired হয়ে যাওয়া full-stack app বর্ণনা করা পুরনো tutorial (backend .env file, একটা hosted frontend) আর code-এর সাথে মেলে না।
সম্পূর্ণ সেটআপ: gateway-routed LLM সহ একটা brain।
সম্পূর্ণ pattern configured LLMEndpoint-কে Brain.from_files-এ পাস করে। brain সম্পর্কে বাকি সবকিছু (parsing, chunking, FAISS store, retrieval workflow) LLM endpoint থেকে independent এবং এর default রাখে। Embedder-এর দিকে খেয়াল রাখুন। যদি একটা পাস না করেন, quivr-core LangChain-এর OpenAIEmbeddings তার নিজস্ব default দিয়ে বানায়, যা OPENAI_API_KEY দিয়ে authenticate করে এবং stock OpenAI endpoint টার্গেট করে। এটা chat LLM থেকে একটা আলাদা client: gateway দিয়ে generation route করলে এটা move হয় না। আপনার নিজস্ব embedder পাস করুন (একটা local sentence-transformers wrapper, বা আপনার configure করা যেকোনো LangChain Embeddings instance) যদি embedding অর্ধেক-কেও একটা OpenAI account-এর উপর নির্ভরশীল রাখতে না চান।
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 উত্তরের জন্য generation model বেছে নেওয়া।
Candidate তুলনা করা একটা construction-time change: একই base URL-এর বিরুদ্ধে দুটো LLMEndpoint, একই file-এর উপর দুটো brain বানান, এবং একটা fixed প্রশ্ন সেটে উত্তর diff করুন। Per-key usage log প্রতিটা candidate-এর run price করে, তাই quality-per-token argue না করে measure করা হয়।
- RAG generation input-heavy: retrieved chunk prompt-এ প্রাধান্য পায়। Per-input-token price একটা উত্তরের cost ঠিক করে, যে কারণে একটা fast id প্রায়ই retrieval quality touch না করেই bill অর্ধেক করে দেয়।
- claude-sonnet-4-6 grounded উত্তরের জন্য reliable default, যা retrieved context respect করে এবং document-এ উত্তর না থাকলে পরিষ্কারভাবে decline করে।
- High-volume embedded product (Quivr-এর stated use case) claude-haiku-4-5-20251001, deepseek-v4-flash, বা gemini-3.5-flash-এ দৈনন্দিন প্রশ্নের mix-এর জন্য ভালো চলে।
- একই config-এর max_context_tokens govern করে pipeline কতটা retrieved context packs করে; এটা raise করা naturally long-context id-এর সাথে pair করে এবং input spend সমানুপাতে বাড়ায়।
- Unknown model prefix budgeting-এর জন্য একটা generic tokenizer-এ fall back করে, যা cosmetic; request নিজেই আপনার id endpoint-এ অপরিবর্তিত বহন করে।
ব্যবহার অনুযায়ী পেমেন্ট · অফিশিয়াল মূল্যের নিচে
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 lore-এর সংশোধন।
চালু guide এমন surface বর্ণনা করে যা Quivr-এর আর নেই, তাই current code আসলে কী করে তা বলা যোগ্য। 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 করতে বলে, এটা একটা পুরনো architecture বর্ণনা করছে; current field LLMEndpointConfig-এ llm_base_url। Full-stack app retired। একটা backend .env, Supabase setup, বা একটা in-app model picker সম্পর্কে instruction pre-pivot application reference করে, যা আর repository ship করে না। Configuration এখন আপনার Python code-এ ঘটে (বা library-র চারপাশে আপনার নিজের app-এ)। Key env var supplier-derived। supplier openai-এর জন্য এটা OPENAI_API_KEY, endpoint OpenAI না হলেও। যদি সেই নাম overload করতে না চান, config-এ explicitly llm_api_key পাস করুন, যা প্রাধান্য পায় এবং environment পরিষ্কার রাখে। Embedder আলাদা। Generation routing embedding move করে না; default embedder হলো OpenAIEmbeddings তার নিজস্ব credential সহ। দুটো অর্ধেক স্বাধীনভাবে সিদ্ধান্ত নিন, এবং একটা existing store re-embed করা শুধু তখনই দরকার যদি embedding model নিজেই পাল্টান।
কারা একটা gateway দিয়ে quivr-core route করে।
- Product team যারা তাদের app-এ RAG embed করছে এবং generation model-কে stack-এ baked একটা vendor commitment না বরং একটা config value চায়।
- Developer যারা ভিন্ন quality tier-এ অনেক brain চালায়: এক key, এক endpoint, প্রতি brain model id।
- Team যারা একটা দ্বিতীয় SDK বা provider account যোগ না করে একটা OpenAI-shaped config-এর পেছনে Claude-quality grounded উত্তর চায়।
- Builder যারা fixed corpus-এ generation model benchmark করছে, যেখানে প্রতিটা candidate একটা LLMEndpointConfig change।
- Developer যাদের কোনো নির্দিষ্ট vendor-এর billing-এ access নেই। কোনো card requirement ছাড়া Top-up based access per-provider sign-up dependency সরিয়ে দেয়।
Endpoint verify করুন এবং প্রথম ask() debug করুন।
কিছু ingest করার আগে confirm করুন gateway আপনার model list করে; model field অবশ্যই একটা served id-র সাথে exactly মিলতে হবে। First-run failure predictable। supplier openai-এর জন্য API key সেট নেই এমন একটা warning মানে config construct হওয়ার সময় llm_api_key বা OPENAI_API_KEY কোনোটাই visible ছিল না; warning construction-এ হয়, failure প্রথম ask()-এ। একটা 401 মানে resolved key llm_base_url-এর endpoint-এর অন্তর্গত না। একটা model-not-found error /v1/models-এর বিরুদ্ধে একটা id typo। এবং Brain.from_files-এর সময় একটা embedding-related authentication error হলো আলাদা default embedder তার নিজস্ব OpenAI credential চাইছে, যা কোনো llm_base_url setting fix করবে না; আপনার নিয়ন্ত্রণে থাকা একটা embedder পাস করুন। একবার উত্তর চললে, APIsRouter console per-request model, token count, এবং spend দেখায়। যে library প্রতিটা prompt-এ retrieved chunk packs করে, তার জন্য আপনার real corpus-এ tokens-per-answer সংখ্যা-ই আপনার model choice চালানো উচিত এমন figure।
curl -s https://api.apisrouter.com/v1/models \
-H "Authorization: Bearer $APISROUTER_API_KEY" | head -50সাধারণ প্রশ্ন
Quivr কি একটা কাস্টম OpenAI-compatible base URL সাপোর্ট করে?
হ্যাঁ। quivr-core-এর LLMEndpointConfig-এ একটা llm_base_url field আছে, এবং openai supplier-এর জন্য library সেই URL-এর বিরুদ্ধে LangChain-এর ChatOpenAI বানায়। এটাকে gateway endpoint-এ সেট করুন এবং যেকোনো catalog model id পাস করুন।
Quivr কি LiteLLM-based?
Current codebase-এ না। quivr-core supplier অনুসারে LangChain chat class select করে; openai supplier আপনার llm_base_url সহ ChatOpenAI ব্যবহার করে। Quivr-এর ভেতরে একটা LiteLLM api_base বর্ণনা করা guide একটা পুরনো architecture reference করে।
brain.ask() কি Claude বা DeepSeek model দিয়ে উত্তর দিতে পারে?
হ্যাঁ। model field /v1/chat/completions-এর মাধ্যমে একটা plain string হিসেবে forward হয়, তাই openai supplier-এর নিচে claude-sonnet-4-6, deepseek-v4-flash, বা endpoint serve করা অন্য যেকোনো id কাজ করে।
কোন environment variable-এ key থাকে?
config-এ llm_api_key সেট না থাকলে, quivr-core supplier নাম থেকে variable derive করে: supplier openai-এর জন্য OPENAI_API_KEY। LLMEndpointConfig-এ একটা explicit llm_api_key প্রাধান্য পায় এবং সেই নাম overload হওয়া এড়ায়।
llm_base_url কি embedding-ও move করে?
না। Default embedder একটা আলাদা OpenAIEmbeddings client তার নিজস্ব credential এবং endpoint সহ। Gateway দিয়ে generation route করুন এবং embedding অর্ধেক-কেও OpenAI থেকে সরাতে চাইলে আপনার নিজস্ব embedder পাস করুন।
Quivr project কি এখনো maintained?
Repository 2025 mid থেকে শান্ত, তাই একে একটা active-এর বদলে একটা stable library হিসেবে treat করুন। এখানে documented llm_base_url surface latest main branch-এর সাথে মেলে, এবং এটা যে pre-pivot full-stack app replace করেছে তা retired।