paper-qa को एक custom OpenAI-compatible endpoint के against चलाएं।

Updated 2026-07-30

paper-qa अपने models LiteLLM router dicts से configure करता है, और litellm_params api_base accept करता है। इसे https://api.apisrouter.com/v1 पर point करें, एक key pass करें, और answer, summary, और agent slots आपकी अपनी paper library पर हर एक कोई भी catalog model चला सकते हैं।

Quick answer: api_base वाला एक router dict, per slot reused।

paper-qa का Settings object एक model name plus per slot एक optional LiteLLM router config लेता है। Router config एक model_list है जिसके litellm_params api_base और api_key carry करते हैं, जो वही documented pattern है जो README locally hosted OpenAI-compatible servers के लिए इस्तेमाल करता है; एक gateway बस वह pattern है एक public URL और एक असली key के साथ। llm और summary_llm को उस model_name पर set करें जो आपने declare किया, config को दोनों slots से attach करें, और paper-qa gateway के through route होता है। litellm_params के अंदर model string litellm की provider convention रखती है: openai/<id> litellm को बताता है आपके api_base पर chat-completions बोलो, और slash के बाद वाली id endpoint को pass through हो जाती है, तो Claude, GPT, Gemini, और GLM ids सब same 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 tokens कहां खर्च करता है: तीन slots plus embeddings।

paper-qa (GitHub पर Future-House, लगभग 9K stars) scientific PDFs पर retrieval-augmented question answering करता है, ऊपर एक agentic loop के साथ: एक agent तय करता है कब आपकी library search करनी है, evidence chunks इकट्ठा करता है, इनकी relevance summarize करता है, और एक cited answer compose करता है। यह तीन अलग-अलग configurable LLM slots में map होता है। summary_llm हर retrieved chunk के लिए evidence evaluate और condense करता है, जो इसे volume slot बनाता है। llm assembled evidence से final answer लिखता है, quality-critical step। और agent_llm (agent settings के अंदर) वे tool-selection decisions लेता है जो loop को steer करते हैं। तीनों default में एक OpenAI model पर हैं, और हर एक की एक matching _config field है (llm_config, summary_llm_config, agent_llm_config) जो same router dict accept करती है, तो एक gateway config object हर slot से attach हो सकता है जबकि per slot model name independent रहता है। एक common split है evidence summarize करने वाली एक fast id और answers लिखने वाली एक frontier id, दोनों एक endpoint और key के through। Embeddings चौथा workload है और जानबूझकर separate है: embedding setting (default text-embedding-3-small) आपके papers का vector index बनाती है। Chat slots को gateway पर move करना embeddings को move नहीं करता, और paper-qa local sentence-transformers support करता है (st- prefix, local extras के through) अगर आप index को किसी भी remote endpoint से पूरी तरह independent चाहते हैं।

पूरा setup: per-slot configs वाला Settings।

Full pattern हर उस model के लिए एक router entry declare करता है जिसे आप addressable चाहते हैं और configs slot by slot attach करता है। दो entries declare करना, summaries के लिए एक fast और answers के लिए एक strong, पूरे setup को एक dict में रखता है। Same routing CLI से भी काम करती है, क्योंकि pqa settings surface expose करता है, लेकिन research use के लिए Python path reproducible वाला है: वह Settings object जिसने एक answer produce किया answer के बगल में log किया जा सकता है।

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",
    ),
)

Per slot models चुनना।

Evidence pipeline fixed रखते हुए tune करें: same library, same questions, एक बार में एक slot swap करें। एक endpoint के पीछे हर candidate एक model_name string है, और per-key usage log हर configuration को per question price करता है, जो वह number है जो एक lab असल में budget करता है।

  • summary_llm हर evidence chunk पर एक बार चलता है, हर question पर। एक serious library पर यह calls का overwhelming majority है, तो एक fast id (claude-haiku-4-5-20251001) पूरे system के लिए cost floor set करती है जबकि सिर्फ relevance judge करती है, prose नहीं लिखती।
  • llm assembled evidence से cited answer compose करता है। यहीं hedged, precise scientific writing होती है या नहीं होती; claude-sonnet-4-6 और gpt-5.5 भरोसेमंद choices हैं, और यह slot per question कम calls है तो premium bounded है।
  • agent_llm loop को steer करता है: दोबारा search करें, ज़्यादा evidence इकट्ठा करें, या answer दें। यहां weak decisions बाकी सब जगह tokens waste करते हैं, जो slot के low volume के बावजूद एक mid-tier या better id को economical choice बना देता है।
  • gemini-3.1-pro-preview जैसी long-context ids answer slot के तौर पर test करने लायक हैं जब questions एक साथ कई papers से 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 modes।

एक slot अपने default पर छूट गया। llm और llm_config set करना पर summary_llm_config नहीं, summarization को default OpenAI model पर छोड़ देता है, जो फिर OPENAI_API_KEY मांगता है और fail करता है (या अगर वह key exist करती है तो चुपचाप आपकी routing को दो endpoints में split कर देता है)। हर slot की अपनी _config field है; जिस भी slot को आप move करना चाहते हैं उससे gateway dict attach करें, agent_llm_config शामिल। Names जो align नहीं होते। Settings.llm model_list में किसी model_name के बराबर होना चाहिए; litellm_params.model वह है जो असल में wire पर जाता है। बाहरी नाम mismatch करें और router के पास कोई route नहीं है; अंदरूनी id में typo करें और gateway model-not-found return करता है। Debug करते समय, दोनों strings अलग-अलग check करें क्योंकि ये अलग-अलग तरीके से fail होती हैं। Embeddings को follow करते हुए मान लिया गया। Embedding slot vector index बनाता और query करता है और इसका अपना default और config है। अगर आपके पास default embedding के लिए OpenAI key नहीं है, तो embedding explicitly configure करें, या st- prefix से local sentence-transformers इस्तेमाल करें। Embeddings को बाद में re-point करना re-indexing भी मतलब रखता है: अलग-अलग embedding models के vectors mix नहीं होते। लंबे answers के लिए missing generation limits। litellm_params per entry max_tokens accept करता है, और upstream के local-endpoint examples इसे जानबूझकर set करते हैं। बिना sensible limit वाला एक answer slot लंबे cited answers truncate कर सकता है, जो model weakness जैसा दिखता है पर एक parameter है। Parsing problems के लिए routing को blame करना। paper-qa की quality किसी model के text देखने से पहले PDF parsing और chunking पर depend करती है। अगर answers एक ऐसी library पर कुछ भी cite नहीं करते जिसे आप relevant जानते हैं, indexing step inspect करें; gateway सिर्फ वह देखता है जो retrieval इसे भेजता है।

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

  • Research groups जो shared libraries पर literature QA चलाते हैं, जहां per-key usage "lab per question क्या खर्च करती है" को एक guess से एक report बना देता है।
  • Teams जो answer slot में Claude-quality scientific writing चाहती हैं जबकि summarization volume को एक fast id पर रखती हैं, एक key दोनों के लिए।
  • Builders जो paper-qa को internal tools में embed करते हैं, per environment vendor secrets के bundle को एक gateway credential से replace करते हुए।
  • Benchmarkers जो fixed evidence pipelines पर answer models compare करते हैं, जहां हर candidate एक config string है, vendor integration नहीं।
  • Developers जिनके पास किसी given vendor की billing तक access नहीं है। बिना card requirement वाला top-up based access per-provider sign-up dependency हटा देता है।

Endpoint verify करें और पहले question को debug करें।

Confirm करें कि gateway आपने declare की ids serve करता है; openai/ के बाद litellm_params.model string exactly एक served id से match होनी चाहिए। पहले ask() पर failure ladder: OPENAI_API_KEY मांगने वाली एक error मतलब कोई slot अब भी बिना attached config के अपने default model पर है; पता करें llm, summary_llm, और agent_llm में से कौन सा आपने move नहीं किया। Gateway से एक 401 litellm_params के अंदर की api_key है। एक unknown model वाला router error मतलब Settings.llm list में किसी model_name से match नहीं करता। Answering की बजाय indexing के दौरान failures embedding setting या PDF parsing की तरफ इशारा करते हैं, chat routing की तरफ नहीं। एक question कई summary calls plus agent steps plus final answer में fan out होता है, तो पहली successful run के बाद, APIsRouter console का per-request view असली tokens में slot split दिखाता है। वही number है जो 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 custom OpenAI-compatible base URL कैसे support करता है?

अपने LiteLLM router configs के through: llm_config, summary_llm_config, और agent_llm_config में से हर एक एक model_list accept करती है जिसके litellm_params में api_base और api_key शामिल हैं। यह वही documented pattern है जो paper-qa locally hosted OpenAI-compatible servers के लिए इस्तेमाल करता है, बस एक gateway URL पर point किया हुआ।

क्या answer और summary models अलग-अलग vendors से आ सकते हैं?

हां। हर slot एक model name को अपनी config के साथ pair करता है, तो एक fast Claude id evidence summarize कर सकती है जबकि GPT-5.5 या Gemini final answer लिखते हैं, सब एक api_base और एक key के through। Per id एक model_list entry declare करें और इन्हें per slot reference करें।

क्या मुझे embedding model भी बदलनी पड़ेगी?

नहीं, और आमतौर पर आपको same step में नहीं करनी चाहिए। Embedding setting chat slots से independent है, और embedding models बदलना आपके existing vector index को invalidate करता है। अगर आपके पास default embedding के लिए key नहीं है, embedding explicitly set करें या st- prefix के साथ local sentence-transformers इस्तेमाल करें।

agent_llm slot क्या है और क्या इसे भी config चाहिए?

agent_llm, AgentSettings के अंदर, tool selection drive करता है: कब search करें, evidence इकट्ठा करें, या answer दें। यह दूसरे slots की तरह default में एक OpenAI model पर है, तो same gateway dict के साथ agent_llm_config attach करें वरना यह अब भी default provider पर route करने की कोशिश करेगा।

मेरे override के बाद भी paper-qa OPENAI_API_KEY क्यों मांगता है?

कम से कम एक slot अब भी बिना attached router config के अपने default model पर है। llm, summary_llm, और agent_llm plus इनकी _config fields check करें; error उस model का नाम लेती है जिसे call करने की कोशिश हुई, जो missed slot identify करती है।

क्या यह Python की तरह pqa CLI से भी काम करता है?

CLI same settings surface expose करता है, पर gateway routing के लिए Python path practical है: router dicts command-line flags के तौर पर awkward हैं, और results के बगल में logged एक Settings object research runs को reproducible बनाता है।