Jalankan paper-qa terhadap endpoint OpenAI-compatible custom.

Updated 2026-07-30

paper-qa mengonfigurasi model-modelnya lewat dict router LiteLLM, dan litellm_params menerima api_base. Arahkan ke https://api.apisrouter.com/v1, berikan satu key, dan slot answer, summary, serta agent masing-masing bisa menjalankan model katalog apa pun atas library paper Anda sendiri.

Jawaban singkat: dict router dengan api_base, dipakai ulang per slot.

Objek Settings paper-qa menerima nama model plus config router LiteLLM opsional per slot. Config router-nya adalah model_list yang litellm_params-nya membawa api_base dan api_key, yang merupakan pola terdokumentasi yang sama dipakai README untuk server OpenAI-compatible yang di-hosting lokal; gateway hanyalah pola itu dengan URL publik dan key sungguhan. Setel llm dan summary_llm ke model_name yang Anda deklarasikan, lampirkan config ke kedua slot, dan paper-qa merutekan lewat gateway. String model di dalam litellm_params mempertahankan konvensi provider litellm: openai/<id> memberi tahu litellm untuk berbicara chat-completions ke api_base Anda, dan id setelah garis miring diteruskan ke endpoint, jadi id Claude, GPT, Gemini, dan GLM semuanya bisa dialamatkan dengan dict yang sama.

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

Di mana paper-qa membelanjakan token: tiga slot plus embedding.

paper-qa (Future-House di GitHub, sekitar 9K bintang) melakukan question answering retrieval-augmented atas PDF ilmiah dengan loop agentic di atasnya: agent memutuskan kapan mencari di library Anda, mengumpulkan chunk bukti, meringkas relevansinya, dan menyusun jawaban bersitasi. Itu memetakan ke tiga slot LLM yang bisa dikonfigurasi terpisah. summary_llm mengevaluasi dan memampatkan bukti per chunk yang diambil, yang menjadikannya slot volume. llm menulis jawaban akhir dari bukti yang dirakit, langkah yang kritis-kualitas. Dan agent_llm (di dalam pengaturan agent) membuat keputusan pemilihan-tool yang mengemudikan loop-nya. Ketiganya default ke model OpenAI, dan masing-masing punya field _config yang cocok (llm_config, summary_llm_config, agent_llm_config) yang menerima dict router yang sama, jadi satu objek config gateway bisa dilampirkan ke setiap slot sementara nama model per slot tetap independen. Pembagian yang umum adalah id cepat meringkas bukti dan id frontier menulis jawaban, keduanya lewat satu endpoint dan key. Embedding adalah beban kerja keempat dan sengaja dipisahkan: pengaturan embedding (default text-embedding-3-small) membangun indeks vektor paper Anda. Memindahkan slot chat ke gateway tidak memindahkan embedding, dan paper-qa mendukung sentence-transformers lokal (prefiks st-, lewat extras lokal) jika Anda menginginkan indeks sepenuhnya independen dari endpoint remote mana pun.

Setup lengkap: Settings dengan config per-slot.

Pola lengkapnya mendeklarasikan satu entri router per model yang ingin Anda alamatkan dan melampirkan config slot demi slot. Mendeklarasikan dua entri, satu cepat untuk ringkasan dan satu kuat untuk jawaban, menjaga seluruh setup dalam satu dict. Routing yang sama berfungsi dari CLI, karena pqa mengekspos permukaan settings, tapi jalur Python adalah yang bisa direproduksi untuk pemakaian riset: objek Settings yang menghasilkan sebuah jawaban bisa dicatat di samping jawabannya sendiri.

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

Memilih model per slot.

Setel dengan pipeline bukti yang tetap: library yang sama, pertanyaan yang sama, tukar satu slot pada satu waktu. Di balik satu endpoint, setiap kandidat hanya string model_name, dan log penggunaan per-key memberi harga setiap konfigurasi per pertanyaan, yang merupakan angka yang benar-benar dianggarkan sebuah lab.

  • summary_llm berjalan sekali per chunk bukti, setiap pertanyaan. Pada library yang serius ini adalah mayoritas dominan panggilan, jadi id cepat (claude-haiku-4-5-20251001) menetapkan lantai biaya untuk seluruh sistem sementara hanya perlu menilai relevansi, bukan menulis prosa.
  • llm menyusun jawaban bersitasi dari bukti yang dirakit. Di sinilah penulisan ilmiah yang hati-hati dan presisi terjadi atau tidak; claude-sonnet-4-6 dan gpt-5.5 adalah pilihan yang bisa diandalkan, dan slot ini hanya sedikit panggilan per pertanyaan jadi premium-nya terbatas.
  • agent_llm mengemudikan loop-nya: apakah mencari lagi, mengumpulkan lebih banyak bukti, atau menjawab. Keputusan yang lemah di sini membuang token di tempat lain, yang membuat id mid-tier atau lebih baik jadi pilihan ekonomis meski volume slot ini rendah.
  • Id long-context seperti gemini-3.1-pro-preview layak diuji sebagai slot answer saat pertanyaan menarik bukti dari banyak paper sekaligus.

Bayar sesuai pemakaian · di bawah harga resmi

Selected models are priced below official list prices. Exact input, output, cache, and per-request prices are shown for each model.

ModelHarga ResmiHarga Kami
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

Mode kegagalan spesifik paper-qa.

Slot yang ditinggalkan pada default-nya. Mengeset llm dan llm_config tapi tidak summary_llm_config membiarkan peringkasan pada model OpenAI default, yang kemudian menuntut OPENAI_API_KEY dan gagal (atau diam-diam memecah routing Anda ke dua endpoint jika key itu ada). Setiap slot punya field _config-nya sendiri; lampirkan dict gateway ke setiap slot yang Anda niatkan untuk dipindah, termasuk agent_llm_config. Nama yang tidak selaras. Settings.llm harus sama dengan model_name di model_list; litellm_params.model adalah yang benar-benar pergi ke wire. Salahkan nama luarnya dan router tidak punya rute; salah ketik id dalamnya dan gateway mengembalikan model-not-found. Saat debug, periksa kedua string secara terpisah karena keduanya gagal dengan cara berbeda. Embedding yang diasumsikan ikut. Slot embedding membangun dan meng-query indeks vektor dan punya default serta config-nya sendiri. Jika Anda tidak punya key OpenAI untuk embedding default, konfigurasikan embedding secara eksplisit, atau pakai sentence-transformers lokal lewat prefiks st-. Mengarahkan ulang embedding nanti juga berarti mengindeks ulang: vektor dari model embedding berbeda tidak bercampur. Batas generasi yang hilang untuk jawaban panjang. litellm_params menerima max_tokens per entri, dan contoh endpoint-lokal upstream mengesetnya dengan sengaja. Slot answer tanpa batas yang masuk akal bisa memotong jawaban bersitasi yang panjang, yang tampil seperti kelemahan model tapi sebenarnya parameter. Menyalahkan routing untuk masalah parsing. Kualitas paper-qa bergantung pada parsing dan chunking PDF sebelum model mana pun melihat teksnya. Jika jawaban tidak menyitasi apa pun pada library yang Anda tahu relevan, periksa langkah pengindeksan; gateway hanya melihat apa yang dikirim retrieval.

Siapa yang merutekan paper-qa melalui gateway.

  • Kelompok riset yang menjalankan QA literatur atas library bersama, di mana penggunaan per-key mengubah "berapa yang dikeluarkan lab per pertanyaan" dari tebakan jadi laporan.
  • Tim yang menginginkan penulisan ilmiah berkualitas-Claude di slot answer sambil menjaga volume peringkasan pada id cepat, satu key untuk keduanya.
  • Builder yang menyematkan paper-qa di tool internal, menggantikan sekumpulan secret vendor dengan satu kredensial gateway per environment.
  • Benchmarker yang membandingkan model answer pada pipeline bukti yang tetap, di mana setiap kandidat hanya string config alih-alih integrasi vendor.
  • Developer tanpa akses ke billing vendor tertentu. Akses berbasis top-up tanpa syarat kartu menghilangkan ketergantungan sign-up per provider.

Verifikasi endpoint dan debug pertanyaan pertama.

Konfirmasi gateway melayani id yang Anda deklarasikan; string litellm_params.model setelah openai/ harus cocok persis dengan id yang dilayani. Tangga kegagalan pada ask() pertama: error yang menuntut OPENAI_API_KEY berarti ada slot yang masih pada model default-nya tanpa config terlampir; cari mana dari llm, summary_llm, dan agent_llm yang belum Anda pindah. 401 dari gateway adalah api_key di dalam litellm_params. Error router tentang model tidak dikenal berarti Settings.llm tidak cocok dengan model_name mana pun di list. Kegagalan saat pengindeksan alih-alih menjawab menunjuk ke pengaturan embedding atau parsing PDF, bukan routing chat. Satu pertanyaan menyebar ke banyak panggilan summary plus langkah agent plus jawaban akhir, jadi setelah run pertama berhasil, tampilan per-request konsol APIsRouter menunjukkan pembagian slot dalam token nyata. Itulah angka yang harus diamati saat library tumbuh, karena volume summary berskala dengan bukti yang diambil, bukan hanya jumlah pertanyaan.

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

Pertanyaan umum

Bagaimana paper-qa mendukung base URL OpenAI-compatible custom?

Lewat config router LiteLLM-nya: masing-masing dari llm_config, summary_llm_config, dan agent_llm_config menerima model_list yang litellm_params-nya menyertakan api_base dan api_key. Ini adalah pola terdokumentasi yang sama dipakai paper-qa untuk server OpenAI-compatible yang di-hosting lokal, hanya diarahkan ke URL gateway.

Bisakah model answer dan summary berasal dari vendor berbeda?

Ya. Setiap slot memasangkan nama model dengan config-nya sendiri, jadi id Claude yang cepat bisa meringkas bukti sementara GPT-5.5 atau Gemini menulis jawaban akhir, semuanya lewat satu api_base dan satu key. Deklarasikan satu entri model_list per id dan rujuk mereka per slot.

Apakah saya perlu mengubah model embedding juga?

Tidak, dan biasanya sebaiknya tidak dalam langkah yang sama. Pengaturan embedding independen dari slot chat, dan mengganti model embedding membatalkan indeks vektor Anda yang ada. Jika Anda tidak punya key untuk embedding default, setel embedding secara eksplisit atau pakai sentence-transformers lokal dengan prefiks st-.

Apa itu slot agent_llm dan apakah ia juga butuh config?

agent_llm, di dalam AgentSettings, menggerakkan pemilihan tool: kapan mencari, mengumpulkan bukti, atau menjawab. Ia default ke model OpenAI seperti slot lainnya, jadi lampirkan agent_llm_config dengan dict gateway yang sama atau ia tetap mencoba merutekan ke provider default.

Mengapa paper-qa masih meminta OPENAI_API_KEY setelah override saya?

Setidaknya satu slot masih pada model default-nya tanpa config router terlampir. Periksa llm, summary_llm, dan agent_llm plus field _config mereka; error-nya menyebut model yang dicoba dipanggilnya, yang mengidentifikasi slot mana yang terlewat.

Apakah ini berfungsi dari CLI pqa selain Python?

CLI mengekspos permukaan settings yang sama, tapi untuk routing gateway, jalur Python adalah yang praktis: dict router canggung sebagai flag command-line, dan objek Settings yang dicatat di samping hasil membuat run riset bisa direproduksi.