Uruchom paper-qa na niestandardowym endpoincie kompatybilnym z OpenAI.

Updated 2026-07-30

paper-qa konfiguruje swoje modele przez słowniki routera LiteLLM, a litellm_params przyjmuje api_base. Wskaż je na https://api.apisrouter.com/v1, podaj jeden klucz, a sloty odpowiedzi, streszczenia i agenta mogą każdy działać na dowolnym modelu z katalogu nad Twoją własną biblioteką artykułów.

Szybka odpowiedź: słownik routera z api_base, ponownie używany per slot.

Obiekt Settings w paper-qa przyjmuje nazwę modelu plus opcjonalną konfigurację routera LiteLLM per slot. Konfiguracja routera to model_list, którego litellm_params niesie api_base i api_key, co jest tym samym udokumentowanym wzorcem, którego README używa dla lokalnie hostowanych serwerów kompatybilnych z OpenAI; bramka to po prostu ten wzorzec z publicznym URL-em i prawdziwym kluczem. Ustaw llm i summary_llm na model_name, który zadeklarowałeś, dołącz konfigurację do obu slotów, a paper-qa kieruje przez bramkę. String modelu wewnątrz litellm_params zachowuje konwencję providera litellm: openai/<id> mówi litellm, żeby mówiło chat-completions do Twojego api_base, a identyfikator po ukośniku jest przekazywany do endpointu, więc identyfikatory Claude, GPT, Gemini i GLM są wszystkie adresowalne tym samym słownikiem.

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

Gdzie paper-qa wydaje tokeny: trzy sloty plus embeddingi.

paper-qa (Future-House na GitHubie, około 9 tys. gwiazdek) robi odpowiadanie na pytania wspomagane retrievalem nad naukowymi PDF-ami z pętlą agentową na wierzchu: agent decyduje, kiedy przeszukać Twoją bibliotekę, zbiera fragmenty dowodów, streszcza ich trafność i komponuje cytowaną odpowiedź. To mapuje się na trzy osobno konfigurowalne sloty LLM. summary_llm ocenia i kondensuje dowody per pobrany fragment, co czyni go slotem wolumenowym. llm pisze finalną odpowiedź z zebranych dowodów, krok krytyczny dla jakości. A agent_llm (wewnątrz ustawień agenta) podejmuje decyzje o wyborze narzędzia, które sterują pętlą. Wszystkie trzy domyślnie to model OpenAI, a każdy ma pasujące pole _config (llm_config, summary_llm_config, agent_llm_config), które przyjmuje ten sam słownik routera, więc jeden obiekt konfiguracji bramki może być dołączony do każdego slotu, podczas gdy nazwa modelu per slot zostaje niezależna. Częstym podziałem jest szybki identyfikator streszczający dowody i identyfikator z czołówki piszący odpowiedzi, oba przez jeden endpoint i klucz. Embeddingi to czwarte obciążenie i celowo osobne: ustawienie embeddingu (domyślnie text-embedding-3-small) buduje indeks wektorowy Twoich artykułów. Przesunięcie slotów czatu na bramkę nie przesuwa embeddingów, a paper-qa wspiera lokalne sentence-transformers (prefiks st-, przez lokalne extras), jeśli chcesz, żeby indeks był w pełni niezależny od jakiegokolwiek zdalnego endpointu.

Pełna konfiguracja: Settings z konfiguracjami per slot.

Pełny wzorzec deklaruje jeden wpis routera per model, który chcesz mieć adresowalny, i dołącza konfiguracje slot po slocie. Zadeklarowanie dwóch wpisów, szybkiego do streszczeń i mocnego do odpowiedzi, trzyma całą konfigurację w jednym słowniku. Ten sam routing działa z CLI, ponieważ pqa eksponuje powierzchnię ustawień, ale ścieżka Python jest tą odtwarzalną do użytku badawczego: obiekt Settings, który wyprodukował odpowiedź, może być zalogowany obok samej odpowiedzi.

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

Dobór modeli per slot.

Strój z ustalonym pipeline'em dowodów: ta sama biblioteka, te same pytania, zamieniaj jeden slot na raz. Za jednym endpointem każdy kandydat to string model_name, a log użycia per klucz wycenia każdą konfigurację per pytanie, co jest liczbą, na którą faktycznie budżetuje laboratorium.

  • summary_llm działa raz per fragment dowodu, przy każdym pytaniu. Na poważnej bibliotece to przytłaczająca większość wywołań, więc szybki identyfikator (claude-haiku-4-5-20251001) ustawia podłogę kosztową dla całego systemu, mając tylko za zadanie ocenić trafność, nie pisać prozę.
  • llm komponuje cytowaną odpowiedź z zebranych dowodów. To miejsce, gdzie zabezpieczone, precyzyjne pisanie naukowe albo się dzieje, albo nie; claude-sonnet-4-6 i gpt-5.5 to niezawodne wybory, a slot to niewiele wywołań per pytanie, więc premia jest ograniczona.
  • agent_llm steruje pętlą: czy szukać ponownie, zbierać więcej dowodów, czy odpowiedzieć. Słabe decyzje tutaj marnują tokeny wszędzie indziej, co czyni identyfikator ze średniego tieru albo lepszy ekonomicznym wyborem, mimo niskiego wolumenu slotu.
  • Identyfikatory z długim kontekstem jak gemini-3.1-pro-preview warto przetestować jako slot odpowiedzi, gdy pytania ciągną dowody z wielu artykułów naraz.

Płatność za użycie · poniżej cen oficjalnych

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

ModelCena oficjalnaNasza cena
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

Tryby awarii charakterystyczne dla paper-qa.

Slot pozostawiony na wartości domyślnej. Ustawienie llm i llm_config, ale nie summary_llm_config, zostawia streszczanie na domyślnym modelu OpenAI, który wtedy żąda OPENAI_API_KEY i zawodzi (albo po cichu dzieli Twój routing na dwa endpointy, jeśli ten klucz istnieje). Każdy slot ma własne pole _config; dołącz słownik bramki do każdego slotu, który zamierzasz przesunąć, łącznie z agent_llm_config. Nazwy, które się nie zgadzają. Settings.llm musi równać się model_name w model_list; litellm_params.model to to, co faktycznie idzie na drut. Rozjedź zewnętrzną nazwę, a router nie ma trasy; zrób literówkę w wewnętrznym identyfikatorze, a bramka zwróci model-not-found. Przy debugowaniu sprawdzaj oba stringi osobno, bo zawodzą inaczej. Zakładanie, że embeddingi podążą razem. Slot embeddingu buduje i odpytuje indeks wektorowy i ma własną wartość domyślną i konfigurację. Jeśli nie masz klucza OpenAI do domyślnego embeddingu, skonfiguruj embedding jawnie, albo użyj lokalnych sentence-transformers przez prefiks st-. Przekierowanie embeddingów później oznacza też ponowne indeksowanie: wektory z różnych modeli embeddingu się nie mieszają. Brakujące limity generowania dla długich odpowiedzi. litellm_params przyjmuje max_tokens per wpis, a przykłady lokalnego endpointu upstream ustawiają go celowo. Slot odpowiedzi bez sensownego limitu może przycinać długie cytowane odpowiedzi, co prezentuje się jako słabość modelu, ale jest parametrem. Obwinianie routingu za problemy z parsowaniem. Jakość paper-qa zależy od parsowania PDF i dzielenia na fragmenty, zanim jakikolwiek model zobaczy tekst. Jeśli odpowiedzi niczego nie cytują na bibliotece, o której wiesz, że jest trafna, zbadaj krok indeksowania; bramka widzi tylko to, co wysyła jej retrieval.

Kto kieruje paper-qa przez bramkę.

  • Grupy badawcze uruchamiające QA literatury na współdzielonych bibliotekach, gdzie użycie per klucz zamienia "ile laboratorium wydaje per pytanie" z zgadywania w raport.
  • Zespoły, które chcą pisania naukowego jakości Claude w slocie odpowiedzi, trzymając przy tym wolumen streszczania na szybkim identyfikatorze, jeden klucz dla obu.
  • Twórcy osadzający paper-qa w wewnętrznych narzędziach, zastępujący wiązkę sekretów dostawców jednym poświadczeniem bramki per środowisko.
  • Osoby benchmarkujące, porównujące modele odpowiedzi na ustalonych pipeline'ach dowodów, gdzie każdy kandydat to string konfiguracji, a nie integracja dostawcy.
  • Deweloperzy bez dostępu do rozliczeń danego dostawcy. Dostęp oparty na doładowaniu, bez wymogu karty, usuwa zależność od rejestracji u każdego dostawcy z osobna.

Zweryfikuj endpoint i debuguj pierwsze pytanie.

Potwierdź, że bramka serwuje identyfikatory, które zadeklarowałeś; string litellm_params.model po openai/ musi dokładnie zgadzać się z serwowanym identyfikatorem. Drabinka awarii przy pierwszym ask(): błąd żądający OPENAI_API_KEY oznacza, że jakiś slot jest wciąż na swoim domyślnym modelu bez dołączonej konfiguracji; znajdź, którego z llm, summary_llm i agent_llm nie przesunąłeś. 401 z bramki to api_key wewnątrz litellm_params. Błąd routera o nieznanym modelu oznacza, że Settings.llm nie pasuje do żadnego model_name na liście. Awarie podczas indeksowania, a nie odpowiadania, wskazują na ustawienie embeddingu albo parsowanie PDF, nie na routing czatu. Jedno pytanie rozchodzi się na wiele wywołań streszczających plus kroki agenta plus finalną odpowiedź, więc po pierwszym udanym uruchomieniu, widok per żądanie konsoli APIsRouter pokazuje podział slotów w prawdziwych tokenach. To liczba, którą warto obserwować, gdy biblioteka rośnie, ponieważ wolumen streszczania skaluje się z pobranymi dowodami, nie tylko z liczbą pytań.

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

Częste pytania

Jak paper-qa wspiera niestandardowy base URL kompatybilny z OpenAI?

Przez swoje konfiguracje routera LiteLLM: każde z llm_config, summary_llm_config i agent_llm_config przyjmuje model_list, którego litellm_params zawiera api_base i api_key. To ten sam udokumentowany wzorzec, którego paper-qa używa dla lokalnie hostowanych serwerów kompatybilnych z OpenAI, wskazany zamiast tego na URL bramki.

Czy modele odpowiedzi i streszczenia mogą pochodzić od różnych dostawców?

Tak. Każdy slot łączy nazwę modelu z własną konfiguracją, więc szybki identyfikator Claude może streszczać dowody, podczas gdy GPT-5.5 albo Gemini pisze finalną odpowiedź, wszystko przez jedno api_base i jeden klucz. Zadeklaruj jeden wpis model_list per identyfikator i odwołuj się do nich per slot.

Czy muszę zmienić też model embeddingu?

Nie, i zwykle nie powinieneś w tym samym kroku. Ustawienie embeddingu jest niezależne od slotów czatu, a zmiana modeli embeddingu unieważnia Twój istniejący indeks wektorowy. Jeśli brakuje Ci klucza do domyślnego embeddingu, ustaw embedding jawnie albo użyj lokalnych sentence-transformers z prefiksem st-.

Czym jest slot agent_llm i czy też potrzebuje konfiguracji?

agent_llm, wewnątrz AgentSettings, napędza wybór narzędzia: kiedy szukać, zbierać dowody albo odpowiadać. Domyślnie to model OpenAI jak inne sloty, więc dołącz agent_llm_config z tym samym słownikiem bramki, albo nadal będzie próbował kierować do domyślnego providera.

Dlaczego paper-qa nadal prosi o OPENAI_API_KEY po moim nadpisaniu?

Co najmniej jeden slot jest wciąż na swoim domyślnym modelu bez dołączonej konfiguracji routera. Sprawdź llm, summary_llm i agent_llm plus ich pola _config; błąd nazywa model, który próbował wywołać, co identyfikuje slot, który pominąłeś.

Czy to działa z CLI pqa tak samo jak z Pythonem?

CLI eksponuje tę samą powierzchnię ustawień, ale dla routingu przez bramkę ścieżka Python jest tą praktyczną: słowniki routera są niewygodne jako flagi wiersza poleceń, a obiekt Settings zalogowany obok wyników czyni uruchomienia badawcze odtwarzalnymi.