Fai girare gpt-researcher su un endpoint OpenAI-compatible personalizzato.

Updated 2026-07-30

gpt-researcher legge OPENAI_BASE_URL dall'ambiente e divide il suo lavoro su tre slot di modello. Imposta l'URL base su https://api.apisrouter.com/v1, mantieni il prefisso openai:, e FAST_LLM, SMART_LLM, e STRATEGIC_LLM possono essere ciascuno un modello diverso del catalogo dietro una chiave.

Risposta rapida: un blocco .env di cinque righe.

Il percorso documentato di gpt-researcher per endpoint personalizzati sono le variabili d'ambiente. Imposta OPENAI_BASE_URL su https://api.apisrouter.com/v1, imposta OPENAI_API_KEY sulla tua chiave gateway, e assegna i tre slot di modello con il prefisso provider openai:. Il prefisso dice a gpt-researcher quale client usare; la stringa dopo i due punti viene inoltrata all'endpoint, quindi qualsiasi id che il gateway serve è valido, id Claude e Gemini inclusi. Questa è la configurazione documentata su docs.gptr.dev per endpoint compatibili OpenAI personalizzati, e funziona in modo identico per il pacchetto pip, la web app, e i flussi multi-agente, perché tutti risolvono la stessa config.

OPENAI_BASE_URL=https://api.apisrouter.com/v1
OPENAI_API_KEY=sk-APIsRouter-...
FAST_LLM=openai:claude-haiku-4-5-20251001
SMART_LLM=openai:claude-sonnet-4-6
STRATEGIC_LLM=openai:gpt-5.5

Come gpt-researcher spende token su tre slot.

gpt-researcher (assafelovic su GitHub, circa 28K stelle) trasforma una query in un report ricercato e citato: pianifica domande di ricerca, dirama ricerche web tramite un retriever, effettua scraping e riassume le fonti, e poi scrive un report lungo. Il framework divide quella pipeline su tre slot di modello configurabili invece che uno. FAST_LLM gestisce il lavoro ad alto volume e basso rischio, principalmente il riassunto delle pagine sottoposte a scraping. SMART_LLM fa la scrittura pesante, incluso il report finale. STRATEGIC_LLM gestisce la pianificazione: generare le domande di ricerca e decidere l'approccio. Di serie questi hanno come default modelli OpenAI (gpt-4o-mini, gpt-4.1, e o4-mini rispettivamente al momento della scrittura), il che è esattamente il motivo per cui il singolo override OPENAI_BASE_URL è così efficace: tutti e tre gli slot usano il client a forma OpenAI, quindi un URL base sposta l'intera pipeline. Poiché ogni slot prende la propria stringa provider:model, gli slot non hanno bisogno di condividere un fornitore. Un'esecuzione può riassumere con un modello Claude veloce, scrivere con un modello Claude o GPT più forte, e pianificare con un modello di fascia ragionamento, tutto attraverso lo stesso endpoint e la stessa chiave. Su una chiave a fornitore singolo quel mix richiederebbe tre account; dietro un gateway sono tre righe in .env.

Configurazione completa: .env più l'API Python.

Crea un file .env nella tua directory di lavoro (o esporta le variabili nella shell) ed esegui gpt-researcher come al solito; sia il pacchetto pip che la web app leggono lo stesso ambiente. L'API Python non ha bisogno di alcun codice specifico per l'endpoint, il che è il punto: il routing è configurazione, e il codice di ricerca resta identico che l'endpoint sia quello di OpenAI o un gateway. Due impostazioni adiacenti contano. Il retrieval web gira tramite un retriever, Tavily di default, con la propria chiave (TAVILY_API_KEY); quella credenziale è indipendente dall'endpoint LLM ed è ancora richiesta per la ricerca web dal vivo. E gli embedding hanno come default openai:text-embedding-3-small, il che significa che le chiamate di embedding seguono la stessa configurazione del client a forma OpenAI; se l'endpoint dietro OPENAI_BASE_URL non serve quel modello di embedding, configura EMBEDDING su un provider che lo fa (la documentazione usa il prefisso custom: per endpoint di embedding compatibili OpenAI, e sono supportate anche opzioni locali come Ollama).

import asyncio
from gpt_researcher import GPTResearcher

async def main():
    researcher = GPTResearcher(
        query="State of small modular reactors in 2026",
        report_type="research_report",
    )
    await researcher.conduct_research()
    report = await researcher.write_report()
    print(report)

asyncio.run(main())  # routing comes entirely from .env

Scegliere i modelli per slot.

I default a monte codificano la forma giusta, modello piccolo per il volume, modello forte per la scrittura, modello di ragionamento per la pianificazione, quindi mantieni quella forma e potenzia gli slot invece di appiattirli su un unico modello. Dietro un endpoint, un A/B tra due scrittori è una modifica .env di una riga per esecuzione, e il log di utilizzo per chiave ti dice quanto è costata davvero ogni configurazione di report.

  • FAST_LLM spara più spesso: ogni fonte sottoposta a scraping viene riassunta. Un id veloce (claude-haiku-4-5-20251001, deepseek-v4-flash) evita che un report con molte fonti sia dominato dal costo di riassunto, e la perdita di qualità qui è limitata perché i riassunti alimentano lo scrittore, non il lettore.
  • SMART_LLM scrive il report che l'utente legge davvero. Output lungo, struttura sostenuta, disciplina delle citazioni: qui è dove claude-sonnet-4-6 o gpt-5.5 guadagna la spesa, e dove tagliare sulla qualità si vede immediatamente.
  • STRATEGIC_LLM plasma l'esecuzione prima che inizi. Domande di ricerca scadenti producono un report scadente non importa quanto sia bravo lo scrittore; un modello forte nel ragionamento qui costa poche chiamate ma ha una leva alta.
  • Gli id a contesto lungo come gemini-3.1-pro-preview meritano un test nello slot SMART per le esecuzioni detailed_report, dove lo scrittore lavora su un ampio contesto accumulato di riassunti.

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.

ModelloPrezzo ufficialeIl nostro prezzo
Claude Haiku 4.5 20251001$1.00 / $5.00 per M$0.80 / $4.00 per M
Claude Sonnet 4.6$3.00 / $15.00 per M$2.40 / $12.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
DeepSeek V4 Pro$0.43 / $0.87 per M$0.40 / $0.90 per M

Le modalità di errore specifiche di gpt-researcher.

Perdere il prefisso provider. Il formato dello slot è provider:model, e il prefisso seleziona il client. Impostare SMART_LLM=claude-sonnet-4-6 senza openai: non instrada un id Claude attraverso il tuo URL base; fa sì che gpt-researcher provi a interpretare la stringa come un provider diverso. Ogni modello per endpoint personalizzato deve mantenere il prefisso openai:, perché "openai" qui nomina il protocollo, non il fornitore. Gli embedding che seguono silenziosamente l'override. L'EMBEDDING predefinito è un modello a forma OpenAI, quindi una volta che OPENAI_BASE_URL punta a un gateway, anche le richieste di embedding vanno lì. Se il gateway non serve quell'id di embedding, le esecuzioni di ricerca falliscono durante l'elaborazione delle fonti piuttosto che alla prima chiamata chat, il che porta le persone a fare debug dello slot sbagliato. Imposta EMBEDDING esplicitamente e il sintomo scompare. Incolpare l'endpoint per fallimenti del retriever. Una TAVILY_API_KEY mancante o esaurita rompe la fase di ricerca, e gli errori risultanti di fonte-vuota sembrano superficialmente fallimenti LLM. Il retriever è un servizio separato con una chiave separata; controllalo separatamente. Ambiente obsoleto tra esecuzioni. Il file .env viene letto dalla directory di lavoro. Eseguire la web app da una directory e l'API Python da un'altra significa due config diverse, e "funziona nell'app ma non nel mio script" è quasi sempre questo. Le impostazioni di limite token sono separate dalla capacità del modello. gpt-researcher porta i propri limiti di token per slot (FAST_TOKEN_LIMIT, SMART_TOKEN_LIMIT, e impostazioni correlate) con default prudenti. Puntare SMART_LLM verso un modello a contesto lungo non alza da solo quei limiti; regolali deliberatamente se vuoi generazioni più lunghe.

Chi instrada gpt-researcher tramite un gateway.

  • Team che generano report ricorrenti (scansioni di mercato, revisioni della letteratura, brief competitivi) dove la visibilità di costo per esecuzione su tre slot di modello conta più di una relazione con un unico fornitore.
  • Ricercatori che confrontano modelli di scrittura. Tenere fissi FAST e STRATEGIC mentre scambi SMART tra id Claude, GPT, e DeepSeek sono tre modifiche .env, non tre account fornitore.
  • Builder che incorporano gpt-researcher nei prodotti, dove una chiave gateway per ambiente sostituisce un pacchetto di segreti fornitore nella pipeline di deploy.
  • Utenti che vogliono Claude o Gemini a scrivere i report mantenendo intatta la configurazione stock a forma OpenAI di gpt-researcher.
  • 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 del primo report.

Elenca prima i modelli del gateway; la stringa dopo openai: in ogni slot deve corrispondere esattamente a un id servito, suffissi di versione inclusi. I fallimenti alla prima esecuzione si ordinano in modo pulito. Un 401 significa che OPENAI_API_KEY è assente dall'ambiente che il processo vede davvero; i file .env si caricano dalla directory di lavoro, quindi esegui da dove vive il file o esporta le variabili globalmente. Un errore modello-non-trovato nomina lo slot con l'errore di battitura. Un fallimento durante l'elaborazione delle fonti piuttosto che al momento della pianificazione punta agli embedding o al retriever, non agli slot chat: controlla EMBEDDING e TAVILY_API_KEY prima di toccare la config LLM. Un'esecuzione completa di ricerca è una raffica di decine di richieste su tutti e tre gli slot, quindi una volta completata, la vista per richiesta della console di APIsRouter è il modo più rapido per vedere la divisione FAST/SMART/STRATEGIC in token e spesa reali, e per individuare uno slot che consuma più di quanto il suo ruolo meriti.

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

Domande frequenti

gpt-researcher può usare modelli Claude o Gemini tramite OPENAI_BASE_URL?

Sì. Il prefisso openai: seleziona il client a forma OpenAI, e la stringa di modello dopo i due punti viene inoltrata all'endpoint. Qualsiasi id che il gateway serve è valido in ognuno dei tre slot, inclusi id Claude, Gemini, e DeepSeek.

FAST_LLM, SMART_LLM, e STRATEGIC_LLM devono essere dello stesso fornitore?

No. Ogni slot è una stringa provider:model indipendente. Dietro un endpoint multi-fornitore, una configurazione comune è un id Claude veloce per i riassunti, un id Claude o GPT più forte per la scrittura del report, e un id di fascia ragionamento per la pianificazione, tutti su una chiave.

Ho ancora bisogno di una chiave Tavily dopo aver cambiato l'endpoint LLM?

Sì, se vuoi la ricerca web dal vivo. Il retriever (Tavily di default, impostato tramite RETRIEVER) recupera i risultati di ricerca e ha la propria chiave. È un servizio separato dall'endpoint LLM e non è influenzato da OPENAI_BASE_URL.

Cosa succede agli embedding quando imposto OPENAI_BASE_URL?

L'embedding predefinito è un modello a forma OpenAI, quindi le chiamate di embedding seguono la stessa configurazione del client e colpiscono il tuo gateway. Se il gateway non serve quell'id di embedding, imposta EMBEDDING esplicitamente su un provider che lo fa, o su un'opzione locale; altrimenti le esecuzioni falliscono durante l'elaborazione delle fonti.

Questa configurazione funziona anche per la web app e la modalità multi-agente?

Sì. Il pacchetto pip, la web application, e i flussi multi-agente risolvono tutti la stessa configurazione d'ambiente, quindi un file .env li instrada in modo identico.

Quanto costa un'esecuzione di ricerca attraverso il gateway?

Dipende dal tipo di report e da quante fonti restituisce il retriever: FAST_LLM riassume ogni fonte, SMART_LLM scrive il report, STRATEGIC_LLM pianifica. La maggior parte delle esecuzioni arriva a decine o centinaia di migliaia di token. La vista di utilizzo per chiave mostra la divisione esatta per slot, il che batte lo stimare.