paper-qa একটা কাস্টম OpenAI-compatible endpoint-এর বিরুদ্ধে চালান।

Updated 2026-07-30

paper-qa তার model LiteLLM router dict দিয়ে configure করে, এবং litellm_params api_base accept করে। এটাকে https://api.apisrouter.com/v1-এ point করুন, এক key পাস করুন, এবং answer, summary, এবং agent slot প্রতিটা আপনার নিজের paper library-র উপর যেকোনো catalog model চালাতে পারে।

দ্রুত উত্তর: api_base সহ একটা router dict, প্রতি slot-এ reuse হওয়া।

paper-qa-এর Settings object একটা model name প্লাস প্রতি slot-এ একটা optional LiteLLM router config নেয়। Router config হলো একটা model_list যার litellm_params api_base এবং api_key বহন করে, যা README locally hosted OpenAI-compatible server-এর জন্য একই documented pattern ব্যবহার করে; একটা gateway শুধু সেই pattern একটা public URL এবং একটা real key সহ। llm এবং summary_llm-কে আপনার declare করা model_name-এ সেট করুন, দুই slot-এই config attach করুন, এবং paper-qa gateway দিয়ে route করে। litellm_params-এর ভেতরে model string litellm-এর provider convention রাখে: openai/<id> litellm-কে বলে দেয় আপনার api_base-এ chat-completions বলতে, এবং slash-এর পরের id endpoint-এ pass through হয়, তাই Claude, GPT, Gemini, এবং GLM id সবই একই dict দিয়ে addressable।

gateway_config = dict(
    model_list=[
        dict(
            model_name="claude-sonnet-4-6",
            litellm_params=dict(
                model="openai/claude-sonnet-4-6",
                api_base="https://api.apisrouter.com/v1",
                api_key=os.getenv("APISROUTER_API_KEY"),
                temperature=0.1,
            ),
        )
    ]
)

paper-qa কোথায় token খরচ করে: তিনটা slot প্লাস embedding।

paper-qa (GitHub-এ Future-House, প্রায় 9K star) scientific PDF-এর উপর একটা agentic loop সহ retrieval-augmented question answering করে: একটা agent ঠিক করে কখন আপনার library search করতে হবে, evidence chunk জোগাড় করে, তাদের relevance summarize করে, এবং একটা cited answer compose করে। এটা তিনটা আলাদাভাবে configurable LLM slot-এ map করে। summary_llm প্রতিটা retrieved chunk-এর evidence evaluate ও condense করে, যা এটাকে volume slot বানায়। llm assembled evidence থেকে final answer লেখে, quality-critical step। এবং (agent settings-এর ভেতরে) agent_llm সেই tool-selection decision নেয় যা loop steer করে। তিনটা-ই default একটা OpenAI model-এ, এবং প্রতিটার একটা matching _config field আছে (llm_config, summary_llm_config, agent_llm_config) যা একই router dict accept করে, তাই একটা gateway config object প্রতিটা slot-এ attach করা যায় যখন প্রতি-slot model name স্বাধীন থাকে। একটা সাধারণ split হলো একটা fast id evidence summarize করছে এবং একটা frontier id answer লিখছে, দুটোই এক endpoint এবং key দিয়ে। Embedding চতুর্থ workload এবং ইচ্ছাকৃতভাবে আলাদা: embedding setting (default text-embedding-3-small) আপনার paper-এর vector index বানায়। Chat slot-কে একটা gateway-তে move করা embedding move করে না, এবং paper-qa local sentence-transformers সাপোর্ট করে (local extras দিয়ে st- prefix) যদি আপনি index-কে যেকোনো remote endpoint থেকে সম্পূর্ণ স্বাধীন চান।

সম্পূর্ণ সেটআপ: per-slot config সহ Settings।

পূর্ণ pattern আপনি addressable চান এমন প্রতিটা model-এর জন্য একটা router entry declare করে এবং slot ধরে ধরে config attach করে। দুটো entry declare করা, একটা summary-র জন্য fast এবং একটা answer-এর জন্য strong, পুরো setup-কে এক dict-এ রাখে। CLI থেকেও একই routing কাজ করে, কারণ pqa settings surface expose করে, কিন্তু research use-এর জন্য Python path-ই reproducible: যে Settings object একটা answer তৈরি করেছে সেটা answer-এর পাশেই লগ করা যায়।

import os
from paperqa import Settings, ask
from paperqa.settings import AgentSettings

def entry(model_id, **params):
    return dict(
        model_name=model_id,
        litellm_params=dict(
            model=f"openai/{model_id}",
            api_base="https://api.apisrouter.com/v1",
            api_key=os.getenv("APISROUTER_API_KEY"),
            **params,
        ),
    )

gateway = dict(model_list=[
    entry("claude-sonnet-4-6", temperature=0.1),
    entry("claude-haiku-4-5-20251001", temperature=0.1),
])

answer = ask(
    "What is the evidence for LK-99 room-temperature superconductivity?",
    settings=Settings(
        llm="claude-sonnet-4-6",
        llm_config=gateway,
        summary_llm="claude-haiku-4-5-20251001",
        summary_llm_config=gateway,
        agent=AgentSettings(
            agent_llm="claude-sonnet-4-6",
            agent_llm_config=gateway,
        ),
        paper_directory="./papers",
    ),
)

প্রতি slot-এ model বেছে নেওয়া।

Evidence pipeline fix রেখে tune করুন: একই library, একই question, একবারে এক slot swap করুন। এক endpoint-এর পিছনে প্রতিটা candidate একটা model_name string, এবং per-key usage log প্রতি question-এ প্রতিটা configuration price করে, যা একটা lab আসলে budget করার সংখ্যা।

  • summary_llm প্রতি evidence chunk-এ, প্রতি question-এ একবার চলে। একটা serious library-তে এটাই call-এর বিশাল সংখ্যাগরিষ্ঠ, তাই একটা fast id (claude-haiku-4-5-20251001) পুরো system-এর cost floor সেট করে, শুধু relevance বিচার করতে হয়, prose লেখা না।
  • llm assembled evidence থেকে cited answer compose করে। এখানেই hedged, precise scientific writing হয় বা হয় না; claude-sonnet-4-6 এবং gpt-5.5 সংবেদনশীল choice, এবং slot-এ প্রতি question few call বলে premium bounded।
  • agent_llm loop steer করে: আবার search করবে কিনা, আরও evidence জোগাড় করবে কিনা, বা উত্তর দেবে কিনা। এখানে দুর্বল decision বাকি সবখানে token নষ্ট করে, যা slot-এর low volume সত্ত্বেও একটা mid-tier বা better id-কে economical choice বানায়।
  • gemini-3.1-pro-preview-এর মতো long-context id answer slot হিসেবে test করার যোগ্য যখন question একসাথে অনেক paper থেকে evidence টানে।

ব্যবহার অনুযায়ী পেমেন্ট · অফিশিয়াল মূল্যের নিচে

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.5$5.00 / $30.00 per M$4.00 / $24.00 per M
Gemini 3.1 Pro Preview$2.00 / $12.00 per M$1.60 / $9.60 per M
GLM-5.2$1.14 / $4.00 per M$1.10 / $4.00 per M

paper-qa-specific failure mode।

Default-এ রেখে যাওয়া একটা slot। llm এবং llm_config সেট করা কিন্তু summary_llm_config না করা summarization-কে default OpenAI model-এ রেখে দেয়, যা তখন OPENAI_API_KEY দাবি করে এবং fail করে (বা সেই key থাকলে নীরবে আপনার routing দুই endpoint জুড়ে split করে দেয়)। প্রতিটা slot-এর নিজস্ব _config field আছে; আপনি move করতে চান এমন প্রতিটা slot-এ gateway dict attach করুন, agent_llm_config সহ। না মেলা নাম। Settings.llm-কে model_list-এর একটা model_name-এর সমান হতে হবে; litellm_params.model আসলে wire-এ যায়। বাইরের নাম mismatch করলে router-এর কোনো route থাকে না; ভিতরের id-তে typo করলে gateway model-not-found return করে। Debug করার সময়, দুটো string আলাদাভাবে check করুন কারণ তারা ভিন্নভাবে fail করে। অনুসরণ করবে ধরে নেওয়া Embedding। Embedding slot vector index বানায় ও query করে এবং তার নিজস্ব default ও config আছে। Default embedding-এর জন্য একটা OpenAI key না থাকলে, embedding explicitly configure করুন, বা st- prefix দিয়ে local sentence-transformers ব্যবহার করুন। পরে embedding re-point করা মানে re-index করাও: ভিন্ন embedding model থেকে vector মেশে না। লম্বা answer-এর জন্য missing generation limit। litellm_params প্রতি entry-তে max_tokens accept করে, এবং upstream-এর local-endpoint উদাহরণ এটা ইচ্ছাকৃতভাবে সেট করে। একটা সংবেদনশীল limit ছাড়া answer slot লম্বা cited answer truncate করতে পারে, যা model দুর্বলতার মতো দেখায় কিন্তু একটা parameter। Parsing সমস্যার জন্য routing-কে দোষারোপ করা। paper-qa-এর quality কোনো model text দেখার আগে PDF parsing এবং chunking-এর উপর নির্ভর করে। প্রাসঙ্গিক জানা একটা library-তে answer কিছু cite না করলে, indexing step পরীক্ষা করুন; gateway শুধু retrieval যা পাঠায় তাই দেখে।

কারা একটা gateway দিয়ে paper-qa route করে।

  • Shared library-তে literature QA চালানো Research group, যেখানে per-key usage "প্রতি question lab কী খরচ করে" প্রশ্নকে অনুমান থেকে একটা report বানায়।
  • Answer slot-এ Claude-quality scientific writing চান এমন Team, summarization volume-কে একটা fast id-তে রেখে, দুটোর জন্যই এক key।
  • Internal tool-এ paper-qa embed করা Builder, প্রতি environment এক gateway credential দিয়ে vendor secret-এর একটা bundle replace করে।
  • Fixed evidence pipeline-এ answer model তুলনা করা Benchmarker, যেখানে প্রতিটা candidate একটা vendor integration না, একটা config string।
  • Developer যাদের কোনো নির্দিষ্ট vendor-এর billing-এ access নেই। কোনো card requirement ছাড়া Top-up based access per-provider sign-up dependency সরিয়ে দেয়।

Endpoint verify করুন এবং প্রথম question debug করুন।

Confirm করুন gateway আপনার declare করা id serve করছে; openai/-এর পরের litellm_params.model string exactly একটা served id-র সাথে মিলতে হবে। প্রথম ask()-এ failure ladder: OPENAI_API_KEY দাবি করা একটা error মানে কোনো slot এখনও default model-এ আছে কোনো config attach না করে; llm, summary_llm, এবং agent_llm-এর মধ্যে কোনটা আপনি move করেননি খুঁজুন। gateway থেকে একটা 401 মানে litellm_params-এর ভিতরের api_key। একটা unknown model সম্পর্কে router error মানে Settings.llm list-এর কোনো model_name-এর সাথে মেলে না। Answer করার বদলে indexing-এর সময় failure embedding setting বা PDF parsing-এর দিকে ইঙ্গিত করে, chat routing না। একটা question অনেক summary call প্লাস agent step প্লাস final answer-এ fan out করে, তাই প্রথম সফল run-এর পর, APIsRouter console-এর per-request view real token-এ slot split দেখায়। এটাই দেখার সংখ্যা library বাড়ার সাথে সাথে, কারণ summary volume retrieved evidence-এর সাথে scale করে, শুধু question count-এর সাথে না।

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

সাধারণ প্রশ্ন

paper-qa কীভাবে একটা কাস্টম OpenAI-compatible base URL সাপোর্ট করে?

এর LiteLLM router config দিয়ে: llm_config, summary_llm_config, এবং agent_llm_config-এর প্রতিটা একটা model_list accept করে যার litellm_params-এ api_base এবং api_key থাকে। এটা locally hosted OpenAI-compatible server-এর জন্য paper-qa যে একই documented pattern ব্যবহার করে, একটা gateway URL-এ point করা।

Answer এবং summary model কি ভিন্ন vendor থেকে আসতে পারে?

হ্যাঁ। প্রতিটা slot একটা model name-কে তার নিজস্ব config-এর সাথে জোড়া লাগায়, তাই একটা fast Claude id evidence summarize করতে পারে যখন GPT-5.5 বা Gemini final answer লেখে, সবই এক api_base এবং এক key দিয়ে। প্রতি id-তে একটা model_list entry declare করুন এবং প্রতি slot-এ সেগুলো reference করুন।

আমার কি embedding model-ও পাল্টাতে হবে?

না, এবং সাধারণত একই step-এ পাল্টানো উচিত না। Embedding setting chat slot থেকে স্বাধীন, এবং embedding model পাল্টানো আপনার বিদ্যমান vector index invalidate করে। Default embedding-এর জন্য key না থাকলে, embedding explicitly সেট করুন বা st- prefix দিয়ে local sentence-transformers ব্যবহার করুন।

agent_llm slot কী এবং এটাতেও কি config দরকার?

AgentSettings-এর ভেতরে agent_llm tool selection চালায়: কখন search, evidence জোগাড়, বা answer দেবে। বাকি slot-এর মতোই এটা একটা OpenAI model-এ default করে, তাই agent_llm_config-এ একই gateway dict attach করুন নাহলে এটা এখনও default provider-এ route করার চেষ্টা করবে।

আমার override-এর পরও paper-qa কেন এখনও OPENAI_API_KEY চায়?

অন্তত একটা slot এখনও কোনো router config attach না করে তার default model-এ আছে। llm, summary_llm, এবং agent_llm প্লাস তাদের _config field check করুন; error যে model call করার চেষ্টা করেছে তার নাম দেয়, যা আপনি miss করা slot চিহ্নিত করে।

এটা কি pqa CLI থেকেও Python-এর মতোই কাজ করে?

CLI একই settings surface expose করে, কিন্তু gateway routing-এর জন্য Python path-ই practical: router dict command-line flag হিসেবে awkward, এবং result-এর পাশে logged একটা Settings object research run-কে reproducible বানায়।