Fai girare paper-qa contro un endpoint OpenAI-compatible personalizzato.
Updated 2026-07-30
paper-qa configura i suoi modelli tramite dict router LiteLLM, e litellm_params accetta api_base. Puntalo su https://api.apisrouter.com/v1, passa una chiave, e gli slot di risposta, riassunto, e agente possono ciascuno girare su qualsiasi modello del catalogo sulla tua libreria di paper.
Risposta rapida: un dict router con api_base, riusato per slot.
L'oggetto Settings di paper-qa prende un nome di modello più una config router LiteLLM opzionale per slot. La config router è un model_list il cui litellm_params porta api_base e api_key, che è lo stesso pattern documentato che il README usa per server compatibili OpenAI ospitati localmente; un gateway è semplicemente quel pattern con un URL pubblico e una chiave reale. Imposta llm e summary_llm sul model_name che hai dichiarato, allega la config a entrambi gli slot, e paper-qa instrada attraverso il gateway. La stringa di modello dentro litellm_params mantiene la convenzione di provider di litellm: openai/<id> dice a litellm di parlare chat-completions verso il tuo api_base, e l'id dopo lo slash viene inoltrato all'endpoint, quindi id Claude, GPT, Gemini, e GLM sono tutti indirizzabili con lo stesso 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,
),
)
]
)Dove paper-qa spende token: tre slot più gli embedding.
paper-qa (Future-House su GitHub, circa 9K stelle) fa question answering retrieval-augmented su PDF scientifici con un loop agentico sopra: un agente decide quando cercare nella tua libreria, raccoglie chunk di evidenza, ne riassume la rilevanza, e compone una risposta citata. Questo si mappa su tre slot LLM configurabili separatamente. summary_llm valuta e condensa l'evidenza per ogni chunk recuperato, il che lo rende lo slot di volume. llm scrive la risposta finale dall'evidenza assemblata, il passo critico per la qualità. E agent_llm (dentro le impostazioni dell'agente) prende le decisioni di selezione dei tool che guidano il loop. Tutti e tre hanno come default un modello OpenAI, e ciascuno ha un campo _config corrispondente (llm_config, summary_llm_config, agent_llm_config) che accetta lo stesso dict router, quindi un unico oggetto config gateway può essere allegato a ogni slot mentre il nome del modello per slot resta indipendente. Una divisione comune è un id veloce che riassume l'evidenza e un id di frontiera che scrive le risposte, entrambi tramite un endpoint e una chiave. Gli embedding sono il quarto carico di lavoro e deliberatamente separati: l'impostazione embedding (default text-embedding-3-small) costruisce l'indice vettoriale dei tuoi paper. Spostare gli slot chat su un gateway non sposta gli embedding, e paper-qa supporta sentence-transformers locali (il prefisso st-, tramite gli extra locali) se vuoi che l'indice sia del tutto indipendente da qualsiasi endpoint remoto.
Configurazione completa: Settings con config per slot.
Il pattern completo dichiara una voce router per ogni modello che vuoi indirizzabile e allega le config slot per slot. Dichiarare due voci, una veloce per i riassunti e una forte per le risposte, tiene l'intera configurazione in un dict. Lo stesso routing funziona dalla CLI, poiché pqa espone la superficie di impostazioni, ma il percorso Python è quello riproducibile per uso di ricerca: l'oggetto Settings che ha prodotto una risposta può essere registrato accanto alla risposta stessa.
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",
),
)Scegliere i modelli per slot.
Regola con la pipeline di evidenza fissa: stessa libreria, stesse domande, cambia uno slot alla volta. Dietro un endpoint ogni candidato è una stringa model_name, e il log di utilizzo per chiave prezza ogni configurazione per domanda, che è il numero su cui un laboratorio budgetizza davvero.
- summary_llm gira una volta per chunk di evidenza, a ogni domanda. Su una libreria seria questa è la stragrande maggioranza delle chiamate, quindi un id veloce (claude-haiku-4-5-20251001) fissa il pavimento di costo per l'intero sistema dovendo solo giudicare la rilevanza, non scrivere prosa.
- llm compone la risposta citata dall'evidenza assemblata. Qui è dove la scrittura scientifica precisa e sfumata accade o non accade; claude-sonnet-4-6 e gpt-5.5 sono le scelte affidabili, e lo slot ha poche chiamate per domanda quindi il premio è limitato.
- agent_llm guida il loop: se cercare di nuovo, raccogliere più evidenza, o rispondere. Decisioni deboli qui sprecano token ovunque altro, il che rende un id di fascia media o superiore la scelta economica nonostante il basso volume dello slot.
- Gli id a contesto lungo come gemini-3.1-pro-preview meritano un test come slot di risposta quando le domande attingono evidenza da molti paper contemporaneamente.
Pagamento a consumo · sotto i prezzi ufficiali
Selected models are priced below official list prices. Exact input, output, cache, and per-request prices are shown for each model.
| Modello | Prezzo ufficiale | Il nostro prezzo |
|---|---|---|
| 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 |
Le modalità di errore specifiche di paper-qa.
Uno slot lasciato sul suo default. Impostare llm e llm_config ma non summary_llm_config lascia il riassunto sul modello OpenAI predefinito, che poi richiede OPENAI_API_KEY e fallisce (o divide silenziosamente il tuo routing su due endpoint se quella chiave esiste). Ogni slot ha il proprio campo _config; allega il dict gateway a ogni slot che intendi spostare, agent_llm_config incluso. Nomi che non si allineano. Settings.llm deve essere uguale a un model_name in model_list; litellm_params.model è ciò che va effettivamente sul filo. Disallinea il nome esterno e il router non ha rotta; sbaglia l'id interno e il gateway restituisce model-not-found. Quando fai debug, controlla le due stringhe separatamente perché falliscono in modo diverso. Embedding dati per scontati che seguano. Lo slot embedding costruisce e interroga l'indice vettoriale e ha il proprio default e config. Se non hai una chiave OpenAI per l'embedding predefinito, configura embedding esplicitamente, o usa sentence-transformers locali tramite il prefisso st-. Ripuntare gli embedding più tardi significa anche re-indicizzare: vettori da modelli di embedding diversi non si mescolano. Limiti di generazione mancanti per risposte lunghe. litellm_params accetta max_tokens per voce, e gli esempi di endpoint locale a monte lo impostano deliberatamente. Uno slot di risposta senza un limite sensato può troncare risposte citate lunghe, il che si presenta come debolezza del modello ma è un parametro. Incolpare il routing per problemi di parsing. La qualità di paper-qa dipende dal parsing e chunking dei PDF prima che qualsiasi modello veda testo. Se le risposte non citano nulla su una libreria che sai rilevante, ispeziona il passo di indicizzazione; il gateway vede solo ciò che il retrieval gli invia.
Chi instrada paper-qa tramite un gateway.
- Gruppi di ricerca che eseguono QA sulla letteratura su librerie condivise, dove l'utilizzo per chiave trasforma "quanto spende il laboratorio per domanda" da una supposizione in un report.
- Team che vogliono scrittura scientifica di qualità Claude nello slot di risposta mantenendo il volume di riassunto su un id veloce, una chiave per entrambi.
- Builder che incorporano paper-qa in strumenti interni, sostituendo un pacchetto di segreti fornitore con una credenziale gateway per ambiente.
- Chi fa benchmark confrontando modelli di risposta su pipeline di evidenza fisse, dove ogni candidato è una stringa di config piuttosto che un'integrazione fornitore.
- Sviluppatori senza accesso alla fatturazione di un dato fornitore. L'accesso basato su ricarica senza obbligo di carta rimuove la dipendenza dalla registrazione per provider.
Verifica l'endpoint e fai debug della prima domanda.
Conferma che il gateway serva gli id che hai dichiarato; la stringa litellm_params.model dopo openai/ deve corrispondere esattamente a un id servito. La scala di fallimento su un primo ask(): un errore che richiede OPENAI_API_KEY significa che qualche slot è ancora sul suo modello predefinito senza config allegata; trova quale tra llm, summary_llm, e agent_llm non hai spostato. Un 401 dal gateway è l'api_key dentro litellm_params. Un errore router su un modello sconosciuto significa che Settings.llm non corrisponde a nessun model_name nell'elenco. I fallimenti durante l'indicizzazione piuttosto che durante la risposta puntano all'impostazione embedding o al parsing PDF, non al routing chat. Una domanda si dirama in molte chiamate di riassunto più passi dell'agente più la risposta finale, quindi dopo la prima esecuzione riuscita, la vista per richiesta della console di APIsRouter mostra la divisione degli slot in token reali. Quello è il numero da osservare mentre la libreria cresce, perché il volume di riassunto scala con l'evidenza recuperata, non solo con il numero di domande.
curl -s https://api.apisrouter.com/v1/models \
-H "Authorization: Bearer $APISROUTER_API_KEY" | head -50Domande frequenti
Come supporta paper-qa un URL base OpenAI-compatible personalizzato?
Tramite le sue config router LiteLLM: ognuna di llm_config, summary_llm_config, e agent_llm_config accetta un model_list il cui litellm_params include api_base e api_key. Questo è lo stesso pattern documentato che paper-qa usa per server compatibili OpenAI ospitati localmente, puntato invece su un URL gateway.
I modelli di risposta e riassunto possono provenire da fornitori diversi?
Sì. Ogni slot abbina un nome di modello alla propria config, quindi un id Claude veloce può riassumere l'evidenza mentre GPT-5.5 o Gemini scrive la risposta finale, tutto tramite un api_base e una chiave. Dichiara una voce model_list per id e riferiscile per slot.
Devo cambiare anche il modello di embedding?
No, e di solito non dovresti nello stesso passo. L'impostazione embedding è indipendente dagli slot chat, e cambiare modello di embedding invalida il tuo indice vettoriale esistente. Se non hai una chiave per l'embedding predefinito, imposta embedding esplicitamente o usa sentence-transformers locali con il prefisso st-.
Cos'è lo slot agent_llm e ha bisogno anche lui della config?
agent_llm, dentro AgentSettings, guida la selezione dei tool: quando cercare, raccogliere evidenza, o rispondere. Ha come default un modello OpenAI come gli altri slot, quindi allega agent_llm_config con lo stesso dict gateway o proverà comunque a instradare verso il provider predefinito.
Perché paper-qa chiede ancora OPENAI_API_KEY dopo il mio override?
Almeno uno slot è ancora sul suo modello predefinito senza config router allegata. Controlla llm, summary_llm, e agent_llm più i loro campi _config; l'errore nomina il modello che ha provato a chiamare, il che identifica lo slot che hai perso.
Questo funziona dalla CLI pqa oltre che da Python?
La CLI espone la stessa superficie di impostazioni, ma per il routing gateway il percorso Python è quello pratico: i dict router sono scomodi come flag da riga di comando, e un oggetto Settings registrato accanto ai risultati rende riproducibili le esecuzioni di ricerca.