شغّل paper-qa مقابل نقطة نهاية مخصصة متوافقة مع OpenAI.

Updated 2026-07-30

يُهيِّئ paper-qa نماذجه عبر قواميس مُوجِّه LiteLLM، ويقبل litellm_params مفتاح api_base. وجّهه إلى https://api.apisrouter.com/v1، مرّر مفتاحاً واحداً، ويمكن لفتحات الإجابة والملخص والوكيل أن تُشغِّل كل منها أي نموذج كتالوج فوق مكتبة أوراقك.

إجابة سريعة: قاموس مُوجِّه بـ api_base، مُعاد استخدامه لكل فتحة.

كائن Settings الخاص بـ paper-qa يأخذ اسم نموذج بالإضافة إلى إعداد مُوجِّه LiteLLM اختياري لكل فتحة. إعداد المُوجِّه هو model_list يحمل litellm_params الـ api_base وapi_key، وهو نفس النمط الموثَّق الذي يستخدمه README لخوادم متوافقة مع OpenAI مُستضافة محلياً؛ البوابة ببساطة هي ذلك النمط برابط عام ومفتاح حقيقي. اضبط llm وsummary_llm على model_name الذي أعلنته، أرفق الإعداد بكلتا الفتحتين، ويتوجّه paper-qa عبر البوابة. سلسلة النموذج داخل litellm_params تحتفظ باصطلاح مزوّد litellm: openai/<id> يخبر litellm بالتحدث بـ chat-completions إلى api_base الخاص بك، والمعرّف بعد الشرطة المائلة يُمرَّر إلى نقطة النهاية، لذا معرّفات Claude وGPT وGemini وGLM كلها قابلة للعنونة بنفس القاموس.

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: ثلاث فتحات بالإضافة إلى التضمينات.

paper-qa (Future-House على GitHub، بنحو 9 آلاف نجمة) يقوم بسؤال وجواب مُسنَد بالاسترجاع فوق ملفات PDF علمية بحلقة وكيلية فوقها: يقرر وكيل متى يبحث في مكتبتك، يجمع مقاطع أدلة، يُلخِّص صلتها، ويُصيغ إجابة موثَّقة بالمصادر. هذا يُخطَّط إلى ثلاث فتحات LLM قابلة للإعداد بشكل منفصل. summary_llm يُقيِّم ويُكثِّف الأدلة لكل مقطع مُسترجَع، ما يجعله الفتحة الحجمية. llm يكتب الإجابة النهائية من الأدلة المُجمَّعة، الخطوة الحرجة للجودة. وagent_llm (داخل إعدادات الوكيل) يتخذ قرارات اختيار الأدوات التي تُوجِّه الحلقة. تعتمد الثلاثة جميعاً افتراضياً على نموذج OpenAI، ولكل منها حقل _config مطابق (llm_config، summary_llm_config، agent_llm_config) يقبل نفس قاموس المُوجِّه، لذا يمكن إرفاق كائن إعداد بوابة واحد بكل فتحة بينما يبقى اسم النموذج لكل فتحة مستقلاً. الانقسام الشائع هو معرّف سريع يُلخِّص الأدلة ومعرّف طليعي يكتب الإجابات، كلاهما عبر نقطة نهاية ومفتاح واحدين. التضمينات هي عبء العمل الرابع ومنفصلة عمداً: إعداد التضمين (الافتراضي text-embedding-3-small) يبني فهرس المتجهات لأوراقك. نقل فتحات الدردشة إلى بوابة لا ينقل التضمينات، ويدعم paper-qa sentence-transformers المحلية (بادئة st-، عبر إضافات local) إذا أردت أن يكون الفهرس مستقلاً تماماً عن أي نقطة نهاية بعيدة.

الإعداد الكامل: Settings بإعدادات لكل فتحة.

النمط الكامل يُعلِن مُدخَل مُوجِّه واحداً لكل نموذج تريد عنونته ويُرفِق الإعدادات فتحة تلو فتحة. إعلان مُدخَلَين، سريع للملخصات وقوي للإجابات، يُبقي الإعداد بأكمله في قاموس واحد. نفس التوجيه يعمل من CLI، بما أن pqa يعرض سطح الإعدادات، لكن مسار Python هو القابل للتكرار للاستخدام البحثي: كائن Settings الذي أنتج إجابة يمكن تسجيله بجانب الإجابة نفسها.

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

اختيار نماذج لكل فتحة.

اضبط مع تثبيت خط أنابيب الأدلة: نفس المكتبة، نفس الأسئلة، بدّل فتحة واحدة في كل مرة. خلف نقطة نهاية واحدة كل مرشّح سلسلة model_name، وسجل الاستخدام لكل مفتاح يُسعِّر كل إعداد لكل سؤال، وهذا هو الرقم الذي يُخطِّط له مختبر فعلياً ميزانيته.

  • summary_llm يعمل مرة واحدة لكل مقطع دليل، لكل سؤال. على مكتبة جادة هذا الأغلبية الساحقة من الاستدعاءات، لذا معرّف سريع (claude-haiku-4-5-20251001) يضبط أرضية التكلفة للنظام بأكمله بينما يحتاج فقط للحكم على الصلة، لا كتابة نثر.
  • llm يُصيغ الإجابة الموثَّقة من الأدلة المُجمَّعة. هنا تحدث الكتابة العلمية الدقيقة والمُتحفِّظة أو لا تحدث؛ claude-sonnet-4-6 وgpt-5.5 هما الاختياران الموثوقان، والفتحة قليلة الاستدعاءات لكل سؤال لذا العلاوة محدودة.
  • agent_llm يُوجِّه الحلقة: هل يبحث مجدداً، يجمع أدلة أكثر، أو يُجيب. قرارات ضعيفة هنا تُهدِر tokens في كل مكان آخر، ما يجعل معرّفاً من الفئة المتوسطة أو أفضل الاختيار الاقتصادي رغم حجم الفتحة المنخفض.
  • معرّفات السياق الطويل مثل gemini-3.1-pro-preview تستحق الاختبار كفتحة الإجابة عندما تسحب الأسئلة أدلة من أوراق كثيرة دفعة واحدة.

ادفع حسب الاستخدام · أقل من السعر الرسمي

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.

فتحة تُركَت على افتراضيها. ضبط llm وllm_config لكن ليس summary_llm_config يترك التلخيص على نموذج OpenAI الافتراضي، الذي يطلب حينها OPENAI_API_KEY ويفشل (أو يُقسِّم توجيهك بصمت عبر نقطتَي نهاية إذا وُجِد ذلك المفتاح). لكل فتحة حقل _config خاص بها؛ أرفق قاموس البوابة بكل فتحة تنوي نقلها، بما في ذلك agent_llm_config. أسماء لا تتماشى. Settings.llm يجب أن يساوي model_name في model_list؛ litellm_params.model هو ما يذهب فعلياً إلى الشبكة. عدم تطابق الاسم الخارجي يجعل المُوجِّه بدون مسار؛ خطأ إملائي في المعرّف الداخلي يُرجِع البوابة model-not-found. عند التصحيح، تحقّق من السلسلتين بشكل منفصل لأنهما تفشلان بشكل مختلف. افتراض أن التضمينات ستتبع. فتحة التضمين تبني وتستعلم فهرس المتجهات ولها افتراضها وإعدادها الخاص. إذا لم يكن لديك مفتاح OpenAI للتضمين الافتراضي، اضبط embedding صراحة، أو استخدم sentence-transformers المحلية عبر بادئة st-. إعادة توجيه التضمينات لاحقاً تعني أيضاً إعادة الفهرسة: المتجهات من نماذج تضمين مختلفة لا تختلط. حدود توليد مفقودة للإجابات الطويلة. litellm_params يقبل max_tokens لكل مُدخَل، والأمثلة أعلى للنقطة المحلية تضبطه عمداً. فتحة إجابة بدون حد معقول يمكن أن تقتطع إجابات موثَّقة طويلة، ما يظهر كضعف نموذج لكنه معامل. لوم التوجيه على مشاكل التحليل. جودة paper-qa تعتمد على تحليل PDF وتقسيمه قبل أن يرى أي نموذج النص. إذا لم تستشهد الإجابات بشيء على مكتبة تعرف أنها ذات صلة، افحص خطوة الفهرسة؛ البوابة ترى فقط ما يُرسِله الاسترجاع لها.

من يوجّه paper-qa عبر بوابة.

  • مجموعات البحث التي تُشغِّل سؤال وجواب على الأدبيات العلمية فوق مكتبات مشتركة، حيث الاستخدام لكل مفتاح يُحوِّل "ما ينفقه المختبر لكل سؤال" من تخمين إلى تقرير.
  • الفرق التي تريد كتابة علمية بجودة Claude في فتحة الإجابة مع إبقاء حجم التلخيص على معرّف سريع، مفتاح واحد لكليهما.
  • البناؤون الذين يُضمِّنون paper-qa في أدوات داخلية، مستبدلين حزمة من أسرار البائعين ببيان اعتماد بوابة واحد لكل بيئة.
  • المُقيِّمون الذين يقارنون نماذج الإجابة على خطوط أنابيب أدلة ثابتة، حيث كل مرشّح سلسلة إعداد لا تكامل بائع.
  • المطورون الذين لا يملكون وصولاً إلى فوترة بائع معيّن. الوصول القائم على تعبئة الرصيد بدون شرط بطاقة يزيل الاعتماد على التسجيل لكل مزوّد.

تحقق من نقطة النهاية وصحّح أخطاء أول سؤال.

تأكّد من أن البوابة تخدم المعرّفات التي أعلنتها؛ سلسلة litellm_params.model بعد openai/ يجب أن تطابق معرّفاً مخدوماً تماماً. سلّم الفشل عند أول ask(): خطأ يطلب OPENAI_API_KEY يعني أن فتحة ما لا تزال على نموذجها الافتراضي بدون إعداد مُرفَق؛ ابحث أي من llm وsummary_llm وagent_llm لم تنقله. 401 من البوابة هو api_key داخل litellm_params. خطأ مُوجِّه بشأن نموذج غير معروف يعني أن Settings.llm لا يطابق أي model_name في القائمة. الإخفاقات أثناء الفهرسة بدلاً من الإجابة تشير إلى إعداد التضمين أو تحليل PDF، لا توجيه الدردشة. سؤال واحد يتفرّع إلى استدعاءات ملخص كثيرة بالإضافة إلى خطوات وكيل والإجابة النهائية، لذا بعد أول تشغيل ناجح، عرض كل طلب في لوحة APIsRouter يُظهِر تقسيم الفتحات في tokens حقيقية. هذا هو الرقم الذي تُراقِبه مع نمو المكتبة، لأن حجم الملخص يتناسب مع الأدلة المُسترجَعة، لا عدد الأسئلة وحده.

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

الأسئلة الشائعة

كيف يدعم paper-qa base URL مخصصاً متوافقاً مع OpenAI؟

عبر إعدادات مُوجِّه LiteLLM: كل من llm_config وsummary_llm_config وagent_llm_config يقبل model_list تحمل litellm_params الـ api_base وapi_key. هذا هو نفس النمط الموثَّق الذي يستخدمه paper-qa لخوادم متوافقة مع OpenAI مُستضافة محلياً، مُوجَّهاً إلى رابط بوابة بدلاً من ذلك.

هل يمكن أن يأتي نموذج الإجابة والملخص من بائعين مختلفين؟

نعم. كل فتحة تُزاوِج اسم نموذج بإعدادها الخاص، لذا يمكن لمعرّف Claude سريع تلخيص الأدلة بينما يكتب GPT-5.5 أو Gemini الإجابة النهائية، كلها عبر api_base ومفتاح واحدين. أعلن مُدخَل model_list واحداً لكل معرّف وأشِر إليها لكل فتحة.

هل أحتاج تغيير نموذج التضمين أيضاً؟

لا، وعادة لا يجب عليك ذلك في نفس الخطوة. إعداد التضمين مستقل عن فتحات الدردشة، وتبديل نماذج التضمين يُبطِل فهرس المتجهات الحالي لديك. إذا كنت تفتقر مفتاحاً للتضمين الافتراضي، اضبط embedding صراحة أو استخدم sentence-transformers محلية ببادئة st-.

ما هي فتحة agent_llm وهل تحتاج الإعداد أيضاً؟

agent_llm، داخل AgentSettings، يُوجِّه اختيار الأدوات: متى يبحث، يجمع أدلة، أو يُجيب. يعتمد افتراضياً على نموذج OpenAI مثل الفتحات الأخرى، لذا أرفق agent_llm_config بنفس قاموس البوابة وإلا سيحاول التوجيه إلى المزوّد الافتراضي.

لماذا لا يزال paper-qa يطلب OPENAI_API_KEY بعد تجاوزي؟

فتحة واحدة على الأقل لا تزال على نموذجها الافتراضي بدون إعداد مُوجِّه مُرفَق. تحقّق من llm وsummary_llm وagent_llm بالإضافة إلى حقول _config الخاصة بها؛ الخطأ يُسمّي النموذج الذي حاول استدعاءه، ما يُحدِّد الفتحة التي فاتتك.

هل يعمل هذا من CLI الخاص بـ pqa كما يعمل من Python؟

يعرض CLI نفس سطح الإعدادات، لكن للتوجيه عبر بوابة مسار Python هو العملي: قواميس المُوجِّه غير مريحة كأعلام سطر أوامر، وكائن Settings المُسجَّل بجانب النتائج يجعل التشغيلات البحثية قابلة للتكرار.