Draai gpt-researcher op een aangepast OpenAI-compatibel endpoint.

Updated 2026-07-30

gpt-researcher leest OPENAI_BASE_URL uit de omgeving en splitst zijn werk over drie modelslots. Zet de base URL op https://api.apisrouter.com/v1, behoud het voorvoegsel openai:, en FAST_LLM, SMART_LLM en STRATEGIC_LLM kunnen elk een ander catalogusmodel zijn achter één sleutel.

Snel antwoord: een blok van vijf regels in .env.

Het gedocumenteerde aangepaste-endpointpad van gpt-researcher zijn omgevingsvariabelen. Zet OPENAI_BASE_URL op https://api.apisrouter.com/v1, zet OPENAI_API_KEY op je gatewaysleutel, en wijs de drie modelslots toe met het openai:-providervoorvoegsel. Het voorvoegsel vertelt gpt-researcher welke client te gebruiken; de string na de dubbele punt wordt doorgegeven aan het endpoint, dus elk ID dat de gateway bedient is geldig, Claude- en Gemini-ID's inbegrepen. Dit is de configuratie gedocumenteerd op docs.gptr.dev voor aangepaste OpenAI-compatibele endpoints, en hij werkt identiek voor het pip-pakket, de webapp, en de multi-agent-flows, omdat ze allemaal dezelfde config resolveren.

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

Hoe gpt-researcher tokens uitgeeft over drie slots.

gpt-researcher (assafelovic op GitHub, ongeveer 28K sterren) verandert een vraag in een onderzocht, geciteerd rapport: het plant onderzoeksvragen, waaiert uit met websearches via een retriever, schraapt en samenvat bronnen, en schrijft dan een langvormig rapport. Het framework splitst die pijplijn over drie configureerbare modelslots in plaats van één. FAST_LLM handelt het hoogvolume, laag-inzet werk af, voornamelijk het samenvatten van geschraapte pagina's. SMART_LLM doet het zware schrijfwerk, inclusief het uiteindelijke rapport. STRATEGIC_LLM handelt de planning af: het genereren van de onderzoeksvragen en het bepalen van de aanpak. Standaard vallen deze terug op OpenAI-modellen (gpt-4o-mini, gpt-4.1 en o4-mini respectievelijk op het moment van schrijven), wat precies is waarom de enkele OPENAI_BASE_URL-override zo effectief is: alle drie slots gebruiken de OpenAI-gevormde client, dus één base URL verplaatst de hele pijplijn. Omdat elk slot zijn eigen provider:model-string neemt, hoeven de slots geen leverancier te delen. Een run kan samenvatten met een snel Claude-model, schrijven met een sterker Claude- of GPT-model, en plannen met een redeneer-tier-model, allemaal via hetzelfde endpoint en dezelfde sleutel. Op een enkele-leverancier-sleutel zou die mix drie accounts vereisen; achter een gateway is het drie regels in .env.

Volledige instelling: .env plus de Python-API.

Maak een .env-bestand in je werkmap (of exporteer de variabelen in de shell) en draai gpt-researcher zoals gebruikelijk; het pip-pakket en de webapp lezen beide dezelfde omgeving. De Python-API heeft helemaal geen endpointspecifieke code nodig, wat het punt is: routering is configuratie, en de onderzoekscode blijft identiek of het endpoint nu van OpenAI is of een gateway. Twee aangrenzende instellingen doen ertoe. Webretrieval draait via een retriever, standaard Tavily, met zijn eigen sleutel (TAVILY_API_KEY); die credential is onafhankelijk van het LLM-endpoint en nog steeds vereist voor live webonderzoek. En embeddings vallen standaard terug op openai:text-embedding-3-small, wat betekent dat de embeddingaanroepen dezelfde OpenAI-gevormde clientconfiguratie volgen; als het endpoint achter OPENAI_BASE_URL dat embeddingmodel niet bedient, configureer dan EMBEDDING naar een provider die dat wel doet (de documentatie gebruikt het voorvoegsel custom: voor OpenAI-compatibele embedding-endpoints, en lokale opties zoals Ollama worden ook ondersteund).

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

Modellen kiezen per slot.

De upstream-standaarden coderen de juiste vorm, klein model voor volume, sterk model voor schrijven, redeneermodel voor planning, dus behoud die vorm en upgrade de slots in plaats van ze plat te slaan naar één model. Achter één endpoint is een A/B tussen twee schrijvers een .env-wijziging van één regel per run, en het gebruikslogboek per sleutel vertelt je wat elke rapportconfiguratie daadwerkelijk kostte.

  • FAST_LLM vuurt het meest: elke geschraapte bron wordt samengevat. Een snel ID (claude-haiku-4-5-20251001, deepseek-v4-flash) voorkomt dat een rapport met veel bronnen wordt gedomineerd door samenvattingskosten, en kwaliteitsverlies hier is begrensd omdat samenvattingen de schrijver voeden, niet de lezer.
  • SMART_LLM schrijft het rapport dat de gebruiker daadwerkelijk leest. Lange output, volgehouden structuur, citatiediscipline: hier verdient claude-sonnet-4-6 of gpt-5.5 zijn geld, en hier is kwaliteitsverlies onmiddellijk zichtbaar.
  • STRATEGIC_LLM vormt de run voordat hij begint. Slechte onderzoeksvragen leveren een slecht rapport op ongeacht hoe goed de schrijver is; een redeneer-sterk model hier is weinig aanroepen maar hoge hefboomwerking.
  • Langecontext-ID's zoals gemini-3.1-pro-preview zijn het waard om te testen in het SMART-slot voor detailed_report-runs, waar de schrijver werkt over een grote opgebouwde context van samenvattingen.

Betaal naar gebruik · onder officiële prijzen

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

ModelOfficiële prijsOnze prijs
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

De faalmodi specifiek voor gpt-researcher.

Het providervoorvoegsel laten vallen. Het slotformaat is provider:model, en het voorvoegsel selecteert de client. SMART_LLM=claude-sonnet-4-6 instellen zonder openai: routeert geen Claude-ID via je base URL; het laat gpt-researcher de string proberen te interpreteren als een andere provider. Elk aangepast-endpointmodel moet het voorvoegsel openai: behouden, want "openai" noemt hier het protocol, niet de leverancier. Embeddings die stilletjes de override volgen. De standaard EMBEDDING is een OpenAI-gevormd model, dus zodra OPENAI_BASE_URL naar een gateway wijst, gaan embeddingverzoeken daar ook naartoe. Als de gateway dat embedding-ID niet bedient, falen onderzoeksruns tijdens bronverwerking in plaats van bij de eerste chataanroep, wat mensen misleidt naar het verkeerde slot debuggen. Zet EMBEDDING expliciet en het symptoom verdwijnt. De endpoint de schuld geven van retrieverfouten. Een ontbrekende of uitgeputte TAVILY_API_KEY breekt de zoekfase, en de resulterende lege-bronnenfouten lijken oppervlakkig op LLM-fouten. De retriever is een aparte service met een aparte sleutel; controleer hem apart. Verouderde omgeving tussen runs. Het .env-bestand wordt gelezen uit de werkmap. De webapp vanuit de ene map draaien en de Python-API vanuit een andere betekent twee verschillende configs, en "het werkt in de app maar niet in mijn script" is bijna altijd dit. Tokenlimietinstellingen zijn los van modelcapaciteit. gpt-researcher draagt zijn eigen tokenlimieten per slot (FAST_TOKEN_LIMIT, SMART_TOKEN_LIMIT en gerelateerde instellingen) met conservatieve standaarden. SMART_LLM naar een langecontextmodel wijzen verhoogt die limieten niet vanzelf; stem ze bewust af als je langere generaties wilt.

Wie routeert gpt-researcher via een gateway.

  • Teams die terugkerende rapporten genereren (marktscans, literatuuroverzichten, concurrentiebriefings) waar zichtbaarheid van kosten per run over drie modelslots meer doet dan één leveranciersrelatie.
  • Onderzoekers die schrijversmodellen vergelijken. FAST en STRATEGIC vast houden terwijl je SMART wisselt tussen Claude-, GPT- en DeepSeek-ID's is drie .env-bewerkingen, geen drie leveranciersaccounts.
  • Bouwers die gpt-researcher in producten inbedden, waar één gatewaysleutel per omgeving een bundel leverancierssecrets in de deploypijplijn vervangt.
  • Gebruikers die willen dat Claude of Gemini het rapport schrijft terwijl de standaard OpenAI-gevormde configuratie van gpt-researcher onaangeroerd blijft.
  • Developers zonder toegang tot de facturering van een bepaalde leverancier. Toegang op basis van opwaarderen zonder kaartvereiste verwijdert de aanmeldingsafhankelijkheid per provider.

Verifieer het endpoint en debug het eerste rapport.

Lijst eerst de modellen van de gateway op; de string na openai: in elk slot moet exact overeenkomen met een bediend ID, versieachtervoegsels inbegrepen. Fouten bij de eerste run sorteren netjes. Een 401 betekent dat OPENAI_API_KEY afwezig is in de omgeving die het proces daadwerkelijk ziet; .env-bestanden laden vanuit de werkmap, dus draai vanaf waar het bestand leeft of exporteer de variabelen globaal. Een model-not-found-fout noemt het slot met de tikfout. Een fout tijdens bronverwerking in plaats van tijdens planning wijst naar embeddings of de retriever, niet naar de chatslots: controleer EMBEDDING en TAVILY_API_KEY voordat je de LLM-config aanraakt. Een volledige onderzoeksrun is een burst van tientallen verzoeken over alle drie slots, dus zodra hij voltooit, is de weergave per verzoek van de APIsRouter-console de snelste manier om de FAST/SMART/STRATEGIC-splitsing te zien in echte tokens en echte uitgaven, en om een slot te vangen dat meer verbruikt dan zijn rol rechtvaardigt.

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

Veelgestelde vragen

Kan gpt-researcher Claude- of Gemini-modellen gebruiken via OPENAI_BASE_URL?

Ja. Het voorvoegsel openai: selecteert de OpenAI-gevormde client, en de model-string na de dubbele punt wordt doorgegeven aan het endpoint. Elk ID dat de gateway bedient is geldig in elk van de drie slots, inclusief Claude-, Gemini- en DeepSeek-ID's.

Moeten FAST_LLM, SMART_LLM en STRATEGIC_LLM dezelfde leverancier zijn?

Nee. Elk slot is een onafhankelijke provider:model-string. Achter een multi-vendor-endpoint is een veelvoorkomende opstelling een snel Claude-ID voor samenvattingen, een sterker Claude- of GPT-ID voor rapportschrijven, en een redeneer-tier-ID voor planning, allemaal op één sleutel.

Heb ik nog steeds een Tavily-sleutel nodig na het wijzigen van het LLM-endpoint?

Ja, als je live webonderzoek wilt. De retriever (standaard Tavily, ingesteld via RETRIEVER) haalt zoekresultaten op en heeft zijn eigen sleutel. Het is een aparte service van het LLM-endpoint en wordt niet beïnvloed door OPENAI_BASE_URL.

Wat gebeurt er met embeddings wanneer ik OPENAI_BASE_URL instel?

De standaardembedding is een OpenAI-gevormd model, dus embeddingaanroepen volgen dezelfde clientconfiguratie en raken je gateway. Als de gateway dat embedding-ID niet bedient, zet EMBEDDING expliciet naar een provider die dat wel doet, of naar een lokale optie; anders falen runs tijdens bronverwerking.

Werkt deze configuratie ook voor de webapp en de multi-agent-modus?

Ja. Het pip-pakket, de webapplicatie en de multi-agent-flows resolveren allemaal dezelfde omgevingsconfiguratie, dus één .env-bestand routeert ze identiek.

Hoeveel kost één onderzoeksrun via de gateway?

Het hangt af van het rapporttype en hoeveel bronnen de retriever teruggeeft: FAST_LLM vat elke bron samen, SMART_LLM schrijft het rapport, STRATEGIC_LLM plant. De meeste runs landen in de tienduizenden tot honderdduizenden tokens. De gebruiksweergave per sleutel toont de exacte splitsing per slot, wat betrouwbaarder is dan schatten.