paper-qa کو ایک custom OpenAI-compatible endpoint کے خلاف چلائیں۔

Updated 2026-07-30

paper-qa اپنے models کو LiteLLM router dicts کے ذریعے configure کرتا ہے، اور litellm_params میں api_base قبول ہوتا ہے۔ اسے https://api.apisrouter.com/v1 پر point کریں، ایک key pass کریں، اور answer، summary، اور agent slots ہر ایک آپ کی اپنی paper library پر کوئی بھی کیٹلاگ model چلا سکتی ہے۔

فوری جواب: api_base والا ایک router dict، فی slot دوبارہ استعمال شدہ۔

paper-qa کا Settings object ایک model name کے ساتھ فی slot ایک اختیاری LiteLLM router config لیتا ہے۔ router config ایک model_list ہے جس کے litellm_params میں api_base اور api_key ہوتے ہیں، جو وہی documented pattern ہے جو README locally hosted OpenAI-compatible servers کے لیے استعمال کرتا ہے؛ ایک gateway محض وہی pattern ہے مگر public URL اور ایک اصل key کے ساتھ۔ llm اور summary_llm کو اس model_name پر سیٹ کریں جو آپ نے declare کی، config کو دونوں slots سے جوڑیں، اور paper-qa gateway کے ذریعے route ہونے لگتا ہے۔ litellm_params کے اندر model string litellm کا provider convention برقرار رکھتا ہے: openai/<id> litellm کو بتاتا ہے کہ آپ کے api_base سے chat-completions بولے، اور slash کے بعد آنے والی id endpoint تک pass ہو جاتی ہے، تو Claude، GPT، Gemini، اور GLM ids سب ایک ہی dict کے ساتھ قابلِ رسائی ہیں۔

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 جمع embeddings۔

paper-qa (GitHub پر Future-House، تقریباً 9K stars) scientific PDFs پر retrieval-augmented question answering کرتا ہے، اوپر ایک agentic loop کے ساتھ: ایک agent فیصلہ کرتا ہے کہ آپ کی library کب search کرے، evidence chunks جمع کرتا ہے، ان کی relevance کا خلاصہ کرتا ہے، اور ایک cited answer compose کرتا ہے۔ یہ تین الگ configurable LLM slots پر map ہوتا ہے۔ summary_llm ہر retrieved chunk کا evidence جانچتا اور مختصر کرتا ہے، جو اسے volume slot بناتا ہے۔ llm جمع شدہ evidence سے آخری answer لکھتا ہے، وہ quality-critical step۔ اور agent_llm (agent settings کے اندر) وہ tool-selection فیصلے کرتا ہے جو loop کو سمت دیتے ہیں۔ تینوں default طور پر ایک OpenAI model پر ہیں، اور ہر ایک کا ایک matching _config field ہے (llm_config، summary_llm_config، agent_llm_config) جو وہی router dict قبول کرتا ہے، تو ایک gateway config object ہر slot سے جوڑا جا سکتا ہے جبکہ فی slot model name خودمختار رہتا ہے۔ ایک عام تقسیم ہے: evidence summarize کرنے والی ایک تیز id اور answers لکھنے والی ایک frontier id، دونوں ایک ہی endpoint اور key کے ذریعے۔ Embeddings چوتھا workload ہے اور جان بوجھ کر الگ ہے: embedding setting (default text-embedding-3-small) آپ کے papers کا vector index بناتی ہے۔ chat slots کو gateway پر منتقل کرنا embeddings کو نہیں منتقل کرتا، اور paper-qa local sentence-transformers سپورٹ کرتا ہے (st- prefix، local extras کے ذریعے) اگر آپ چاہیں کہ index کسی بھی remote endpoint سے مکمل طور پر خودمختار رہے۔

مکمل سیٹ اپ: فی-slot configs کے ساتھ Settings۔

مکمل pattern ہر اس model کے لیے ایک router entry declare کرتا ہے جسے آپ قابلِ رسائی بنانا چاہتے ہیں اور configs کو slot بہ slot جوڑتا ہے۔ دو entries declare کرنا، summaries کے لیے ایک تیز اور answers کے لیے ایک مضبوط، پورے سیٹ اپ کو ایک dict میں رکھتا ہے۔ وہی routing CLI سے بھی کام کرتی ہے، کیونکہ pqa settings surface ظاہر کرتا ہے، مگر research use کے لیے Python راستہ reproducible والا ہے: وہ Settings object جس نے ایک answer پیدا کیا اسے 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",
    ),
)

فی slot models چننا۔

evidence pipeline کو fixed رکھ کر tune کریں: وہی library، وہی سوالات، ایک وقت میں ایک slot بدلیں۔ ایک endpoint کے پیچھے ہر candidate ایک model_name string ہے، اور per-key usage log ہر configuration کی قیمت فی سوال لگاتا ہے، جو وہ عدد ہے جو ایک lab اصل میں budget کرتا ہے۔

  • summary_llm ہر evidence chunk پر ایک بار چلتا ہے، ہر سوال کے ساتھ۔ ایک سنجیدہ library پر یہ calls کی بھاری اکثریت ہے، تو ایک تیز id (claude-haiku-4-5-20251001) پوری system کے لیے cost floor سیٹ کرتی ہے جبکہ صرف relevance judge کرنا ہوتا ہے، prose لکھنا نہیں۔
  • llm جمع شدہ evidence سے cited answer compose کرتا ہے۔ یہاں hedged، precise scientific writing ہوتی ہے یا نہیں ہوتی؛ claude-sonnet-4-6 اور gpt-5.5 قابلِ اعتماد انتخاب ہیں، اور یہ slot فی سوال چند calls کا ہے تو premium محدود رہتا ہے۔
  • agent_llm loop کو سمت دیتا ہے: دوبارہ search کرنی ہے، مزید evidence جمع کرنی ہے، یا جواب دینا ہے۔ یہاں کمزور فیصلے ہر جگہ tokens ضائع کرتے ہیں، جو اس slot کی کم volume کے باوجود ایک mid-tier یا بہتر id کو معاشی انتخاب بنا دیتا ہے۔
  • gemini-3.1-pro-preview جیسی long-context ids answer slot کے طور پر ٹیسٹ کرنے کے قابل ہیں جب سوالات ایک ساتھ کئی 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 سے مخصوص failure modes۔

ایک slot جو اپنے default پر رہ گیا۔ llm اور llm_config سیٹ کرنا مگر summary_llm_config نہیں، summarization کو default OpenAI model پر چھوڑ دیتا ہے، جو پھر OPENAI_API_KEY مانگتا ہے اور فیل ہوتا ہے (یا خاموشی سے آپ کی routing کو دو endpoints میں تقسیم کر دیتا ہے اگر وہ key موجود ہو)۔ ہر slot کا اپنا _config field ہے؛ gateway dict کو ہر اس slot سے جوڑیں جسے آپ منتقل کرنا چاہتے ہیں، agent_llm_config سمیت۔ نام جو میچ نہیں کرتے۔ Settings.llm کو model_list میں کسی model_name کے برابر ہونا چاہیے؛ litellm_params.model وہی ہے جو حقیقت میں wire پر جاتا ہے۔ بیرونی نام mismatch کریں تو router کے پاس کوئی route نہیں ہوتا؛ اندرونی id میں typo کریں تو gateway model-not-found لوٹاتا ہے۔ debug کرتے وقت، دونوں strings الگ چیک کریں کیونکہ وہ مختلف طریقوں سے فیل ہوتی ہیں۔ Embeddings کا خودبخود پیروی کرنے کا فرض۔ embedding slot vector index بناتی اور query کرتی ہے اور اس کا اپنا default اور config ہے۔ اگر آپ کے پاس default embedding کے لیے OpenAI key نہیں، تو embedding صراحتاً configure کریں، یا st- prefix کے ذریعے local sentence-transformers استعمال کریں۔ بعد میں embeddings کو دوبارہ point کرنے کا مطلب دوبارہ indexing بھی ہے: مختلف embedding models کے vectors نہیں ملتے۔ لمبے answers کے لیے generation limits غائب۔ litellm_params فی entry max_tokens قبول کرتا ہے، اور upstream کی local-endpoint examples اسے جان بوجھ کر سیٹ کرتی ہیں۔ ایک sensible limit کے بغیر answer slot لمبے cited answers کو truncate کر سکتی ہے، جو model کی کمزوری لگتی ہے مگر ایک parameter ہے۔ Parsing مسائل کے لیے routing کو الزام دینا۔ paper-qa کی quality کا انحصار کسی بھی model کے text دیکھنے سے پہلے PDF parsing اور chunking پر ہے۔ اگر answers ایک ایسی library پر کچھ بھی cite نہ کریں جسے آپ relevant جانتے ہیں، تو indexing step دیکھیں؛ gateway صرف وہی دیکھتا ہے جو retrieval اسے بھیجے۔

paper-qa کو gateway کے ذریعے کون route کرتا ہے۔

  • وہ research groups جو shared libraries پر literature QA چلاتی ہیں، جہاں per-key usage "lab فی سوال کتنا خرچ کرتی ہے" کو اندازے سے ایک report میں بدل دیتی ہے۔
  • وہ teams جو answer slot میں Claude-quality scientific writing چاہتی ہیں جبکہ summarization volume ایک تیز id پر رکھتی ہیں، دونوں کے لیے ایک key۔
  • وہ builders جو paper-qa کو internal tools میں embed کرتے ہیں، vendor secrets کے bundle کی جگہ فی-environment ایک gateway credential استعمال کرتے ہوئے۔
  • وہ benchmarkers جو fixed evidence pipelines پر answer models کا موازنہ کرتے ہیں، جہاں ہر candidate ایک vendor integration کی بجائے ایک config string ہے۔
  • وہ developers جن کے پاس کسی مخصوص vendor کی billing تک رسائی نہیں۔ Top-up پر مبنی رسائی بغیر کارڈ کی شرط کے فی-provider sign-up کا انحصار ختم کر دیتی ہے۔

Endpoint verify کریں اور پہلا سوال debug کریں۔

تصدیق کریں کہ gateway آپ کی declare کردہ ids serve کرتا ہے؛ openai/ کے بعد آنے والی litellm_params.model string کو ایک serve کی گئی id سے بالکل میچ ہونا چاہیے۔ پہلے ask() پر failure ladder: ایک error جو OPENAI_API_KEY مانگے مطلب کوئی slot ابھی بھی بغیر کسی جڑے config کے اپنے default model پر ہے؛ معلوم کریں llm، summary_llm، اور agent_llm میں سے کون سا آپ نے منتقل نہیں کیا۔ gateway سے ایک 401 مطلب litellm_params کے اندر api_key کا مسئلہ ہے۔ کسی نامعلوم model کے بارے میں router error مطلب Settings.llm list میں کسی model_name سے میچ نہیں کرتی۔ Answering کی بجائے indexing کے دوران failures embedding setting یا PDF parsing کی طرف اشارہ کرتی ہیں، chat routing کی طرف نہیں۔ ایک سوال کئی summary calls جمع agent steps جمع آخری answer میں پھیل جاتا ہے، تو پہلی کامیاب run کے بعد، APIsRouter console کا per-request view حقیقی tokens میں slot split دکھاتا ہے۔ library بڑھنے کے ساتھ یہی وہ عدد ہے جسے دیکھنا چاہیے، کیونکہ summary volume صرف سوالوں کی تعداد سے نہیں بلکہ retrieved evidence کے ساتھ scale کرتا ہے۔

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

عمومی سوالات

paper-qa ایک custom OpenAI-compatible base URL کیسے سپورٹ کرتا ہے؟

اپنے LiteLLM router configs کے ذریعے: llm_config، summary_llm_config، اور agent_llm_config میں سے ہر ایک ایک model_list قبول کرتا ہے جس کے 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 کے ساتھ جوڑتا ہے، تو ایک تیز Claude id evidence summarize کر سکتی ہے جبکہ GPT-5.5 یا Gemini آخری answer لکھے، سب ایک ہی api_base اور ایک key کے ذریعے۔ فی id ایک model_list entry declare کریں اور انہیں فی slot reference کریں۔

کیا مجھے embedding model بھی بدلنی ہوگی؟

نہیں، اور عام طور پر آپ کو ایک ہی step میں ایسا نہیں کرنا چاہیے۔ embedding setting chat slots سے خودمختار ہے، اور embedding models بدلنا آپ کے موجودہ vector index کو invalidate کر دیتا ہے۔ اگر آپ کے پاس default embedding کے لیے key نہیں، تو embedding صراحتاً سیٹ کریں یا st- prefix کے ساتھ local sentence-transformers استعمال کریں۔

agent_llm slot کیا ہے اور کیا اسے بھی config کی ضرورت ہے؟

AgentSettings کے اندر agent_llm، tool selection کو چلاتا ہے: کب search کرنی ہے، evidence جمع کرنی ہے، یا جواب دینا ہے۔ یہ باقی slots کی طرح default طور پر ایک OpenAI model پر ہے، تو agent_llm_config کو اسی gateway dict کے ساتھ جوڑیں ورنہ یہ اب بھی default provider پر route کرنے کی کوشش کرے گا۔

میرے override کے بعد بھی paper-qa OPENAI_API_KEY کیوں مانگتا رہتا ہے؟

کم از کم ایک slot ابھی بھی بغیر کسی جڑے router config کے اپنے default model پر ہے۔ llm، summary_llm، اور agent_llm کے ساتھ ان کے _config fields چیک کریں؛ error اس model کا نام لیتا ہے جسے اس نے call کرنے کی کوشش کی، جو آپ کے چھوٹے ہوئے slot کی نشاندہی کرتا ہے۔

کیا یہ pqa CLI سے بھی اسی طرح کام کرتا ہے جیسے Python سے؟

CLI وہی settings surface ظاہر کرتا ہے، مگر gateway routing کے لیے Python راستہ عملی ہے: router dicts کو command-line flags کے طور پر رکھنا بوجھل ہے، اور نتائج کے ساتھ log کیا گیا ایک Settings object research runs کو reproducible بناتا ہے۔