Draai mem0 tegen een aangepaste OpenAI-compatibele base URL.

Updated 2026-07-29

De OpenAI-provider van mem0 neemt een configsleutel openai_base_url. Zet hem op https://api.apisrouter.com/v1, geef één sleutel door, en het model dat herinneringen extraheert en bijwerkt kan elk ID in de catalogus zijn, Claude en DeepSeek inbegrepen, zonder de rest van je geheugenpipeline aan te raken.

Snel antwoord: één configsleutel binnen het llm-blok.

De OpenAI LLM-provider van mem0 lost zijn endpoint op als eerst config, dan omgeving, dan standaard: self.config.openai_base_url, dan de omgevingsvariabele OPENAI_BASE_URL, dan https://api.openai.com/v1. De schoonste override is dus één sleutel in de llm-config-dict: zet openai_base_url op https://api.apisrouter.com/v1, zet api_key ernaast (of exporteer OPENAI_API_KEY), en elke geheugenextractie-aanroep routeert via de gateway. Dit is upstream mem0-gedrag, leesbaar in mem0/llms/openai.py, geen fork. De TypeScript-SDK biedt hetzelfde paar in camelCase: openaiBaseUrl en apiKey. Waarden in de config-dict overschrijven omgevingsvariabelen, die de standaardwaarden overschrijven, dus een base URL op configniveau wint zelfs op machines waar OPENAI_BASE_URL ergens anders naar wijst.

config = {
    "llm": {
        "provider": "openai",
        "config": {
            "model": "claude-sonnet-4-6",
            "openai_base_url": "https://api.apisrouter.com/v1",
            "api_key": os.environ["APISROUTER_API_KEY"],
        },
    }
}

Wat mem0 daadwerkelijk doet met zijn LLM.

mem0 (mem0ai op GitHub, ruim 61K sterren) is een geheugenlaag voor AI-agents. Elke add()-aanroep draait een pipeline: de LLM leest de nieuwe gespreksbeurten, extraheert kandidaat-herinneringen, vergelijkt ze met wat al is opgeslagen, en beslist per herinnering of hij moet toevoegen, bijwerken, verwijderen, of overslaan. Dat is echt redeneerwerk, en het gebeurt bij elke schrijfactie, dus het LLM-slot vuurt veel vaker af dan de meeste mensen verwachten wanneer ze geheugen aan een productie-agent vastschroeven. Retrieval is de andere helft, en gebruikt de LLM helemaal niet: search() embedt de query en draait vectorgelijkenis tegen de opslag. Twee verschillende clients, twee verschillende modellen, geconfigureerd in twee verschillende blokken (llm en embedder). Deze splitsing is het belangrijkste om te begrijpen voordat je iets herroutet, want het betekent dat je de extractiewerklast naar een multi-vendor gateway kunt verplaatsen terwijl de embedder zijn bestaande provider en index onaangeroerd houdt. De provider blijft "openai" in de config; mem0 geeft het model-veld door als platte string over /v1/chat/completions. Wanneer het endpoint achter openai_base_url meerdere leveranciers bedient, kan die string een Claude-, GPT-, DeepSeek- of GLM-ID zijn, en wordt het wisselen van het extractiemodel een configwijziging van één regel in plaats van een providermigratie.

Volledige instelling: config-dict of omgevingsvariabele.

Het config-dict-pad is het precieze pad: het verplaatst alleen de LLM. Bouw de dict, geef hem aan Memory.from_config, en gebruik de memory-API zoals gewoonlijk. Het veld api_key houdt de gatewaysleutel volledig weg uit je vector-store- en embedder-instellingen. Het omgevingspad bestaat ook: de OpenAI-klassen van mem0 lezen OPENAI_BASE_URL wanneer de configsleutel ontbreekt. Het is één geëxporteerde variabele en geen codewijzigingen, maar let op de reikwijdte: de OpenAI-klasse van de embedder leest dezelfde variabelen (hij eerbiedigt ook de oudere naam OPENAI_API_BASE, die de LLM-klasse niet doet). Exporteer OPENAI_BASE_URL en je hebt beide componenten verplaatst, wat alleen correct is als het endpoint ook je embeddingmodel bedient. Geef bij twijfel de voorkeur aan de config-dict en laat de omgeving met rust.

import os
from mem0 import Memory

config = {
    "llm": {
        "provider": "openai",
        "config": {
            "model": "claude-sonnet-4-6",   # any catalog id
            "openai_base_url": "https://api.apisrouter.com/v1",
            "api_key": os.environ["APISROUTER_API_KEY"],
            "temperature": 0.1,
        },
    },
    # embedder block unchanged: keeps its own provider and key
}

m = Memory.from_config(config)
m.add("I prefer window seats and vegetarian meals.", user_id="alice")
print(m.search("seat preference?", user_id="alice"))

Het extractiemodel kiezen.

De praktische lus: houd je embedder vast, draai dezelfde gespreksfixtures door twee of drie extractiemodellen, en diff de opgeslagen herinneringen. Achter één endpoint is die vergelijking een config-string-bewerking per kandidaat, en het gebruikslogboek per sleutel prijst de run van elke kandidaat voor je.

  • Extractiekwaliteit is geheugenkwaliteit. De LLM beslist wat de moeite waard is om te onthouden en of nieuwe informatie oude tegenspreekt; een model dat een update mist, vervuilt retrieval voor elke toekomstige sessie. claude-sonnet-4-6 en gpt-5.5 zijn de betrouwbare middenweg in deze afweging.
  • Volume zit op elke schrijfactie. Een chatproduct dat add() na elke wisseling aanroept, draait extractie duizenden keren per dag, waar een snel ID zoals claude-haiku-4-5-20251001 of deepseek-v4-flash de geheugenlaag ervan weerhoudt de tokenrekening te domineren.
  • Domeinen rijk aan tegenstrijdigheden (voorkeuren die veranderen, feiten die verlopen) profiteren van een sterker model op add(), ook al kost het meer per aanroep, omdat een verkeerde updatebeslissing later duur is om te detecteren.
  • Temperatuur hoort laag te zijn. Extractie is een gestructureerde beslistaak, geen creatief schrijven; mem0 biedt temperature in hetzelfde configblok, en rond 0,1 houdt add/update/delete-beslissingen consistent.

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 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
Claude Haiku 4.5 20251001$1.00 / $5.00 per M$0.80 / $4.00 per M
DeepSeek V4 Flash$0.14 / $0.28 per M$0.10 / $0.30 per M
GLM-5.2$1.14 / $4.00 per M$1.10 / $4.00 per M

De faalmodi specifiek voor mem0.

Een achtergebleven OPENROUTER_API_KEY kaapt de routering. De OpenAI LLM-klasse van mem0 behandelt die variabele als speciaal geval: wanneer hij is ingesteld, schakelt de klasse over naar het endpoint van OpenRouter en negeert je bedoeling. Als verzoeken de base URL die je hebt geconfigureerd niet bereiken, controleer dan eerst op deze variabele en unset hem. De omgevingsvariabele verplaatst meer dan je bedoelde. OPENAI_BASE_URL wordt gelezen door zowel de LLM als de embedder. Als de gateway je embeddingmodel niet bedient, breekt een override op omgevingsniveau search() terwijl add() blijft werken, wat zich voordoet als "geheugen schrijft prima maar retrieval is leeg of geeft fouten." Beperk de override tot het llm-configblok en de embedder merkt er niets van. Configsleutels zijn per SDK. Python is snake_case (openai_base_url, api_key); TypeScript is camelCase (openaiBaseUrl, apiKey). Een camelCase-sleutel in een Python-dict wordt stilletjes genegeerd en je valt terug op het standaard-endpoint, wat er precies uitziet als de override die "niet werkt." Model-ID's zijn exacte strings. mem0 valideert het model-veld niet; het geeft het door. Een tikfout komt naar voren als een model-not-found-fout van de gateway bij de eerste add(), en de /v1/models-lijst is de gezaghebbende spelling. De embedder wijzigen is een indexbeslissing, geen configbeslissing. Embeddings van verschillende modellen leven in verschillende vectorruimten, dus het herwijzen van de embedder maakt gelijkenis met bestaande vectoren ongeldig. De LLM verplaatsen is gratis; de embedder verplaatsen betekent de opslag opnieuw embedden. Plan ze als aparte migraties.

Wie routeert mem0 via een gateway.

  • Agentbouwers die persistent geheugen toevoegen aan assistenten. Extractie draait bij elke schrijfactie, dus één factureringsoppervlak met gebruik per sleutel wint van een tweede leveranciersdashboard bovenop de stack.
  • Teams die Claude-kwaliteit extractie willen achter een OpenAI-gevormde config. De providerstring blijft "openai"; alleen de base URL en het model-ID veranderen.
  • High-volume chatproducten die de eenheidskosten van de geheugenlaag beheersen door een frontier-chatmodel te koppelen aan een snel extractie-ID, elk aanspreekbaar via hetzelfde endpoint.
  • Developers die extractiemodellen naast elkaar evalueren. Elke kandidaat is één model-string tegen vaste fixtures, geen nieuwe providerintegratie per leverancier.
  • 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 de eerste add().

Bevestig dat de gateway het model vermeldt dat je hebt geconfigureerd voordat je de pipeline draait; het model-veld moet exact overeenkomen met een bediend ID. Fouten bij de eerste run volgen een patroon. Een 401 betekent dat de sleutel die de LLM heeft opgelost fout is voor het endpoint dat hij heeft opgelost, en omdat beide uit een config-boven-omgeving-cascade komen, print beide effectieve waarden in plaats van aan te nemen; een api_key uit config met een base URL uit omgeving (of omgekeerd) is een klassieke mismatch. Een model-not-found-fout is een tikfout in het ID. Verzoeken die zichtbaar naar openrouter.ai gaan, betekenen dat het speciale geval OPENROUTER_API_KEY afvuurde. En als add() slaagt terwijl search() faalt, heb je per ongeluk de embedder verplaatst via de omgeving; beperk de base URL tot het llm-blok. Zodra herinneringen vloeien, toont de APIsRouter-console model per verzoek, tokenaantallen en uitgaven. Extractieaanroepen zijn klein maar meedogenloos, en de gebruiksweergave is hoe je ziet wat de geheugenlaag werkelijk kost per duizend schrijfacties in plaats van het te schatten.

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

Veelgestelde vragen

Welke configsleutel wijst mem0 naar een aangepast OpenAI-compatibel endpoint?

openai_base_url binnen de llm-providerconfig in Python (openaiBaseUrl in TypeScript). Configwaarden overschrijven de omgevingsvariabele OPENAI_BASE_URL, die de standaard https://api.openai.com/v1 overschrijft, dus de config-dict is de meest deterministische plek om hem in te stellen.

Kan mem0 herinneringen extraheren met Claude- of DeepSeek-modellen via deze instelling?

Ja. De provider blijft "openai" en mem0 stuurt het model-veld door als platte string over /v1/chat/completions. Elk ID dat door het endpoint achter openai_base_url wordt bediend werkt, inclusief Claude-, DeepSeek- en GLM-ID's.

Beïnvloedt het instellen van OPENAI_BASE_URL ook de embedder?

Ja. De OpenAI-embedder van mem0 leest dezelfde omgevingsvariabelen (plus de oudere naam OPENAI_API_BASE). Als je alleen de LLM wilt verplaatsen, zet dan openai_base_url binnen het llm-configblok en laat de omgeving ongemoeid.

Moet ik mijn embedder of vector store wijzigen om dit te gebruiken?

Nee. De blokken llm en embedder zijn onafhankelijke clients. De extractie-LLM kan via de gateway routeren terwijl de embedder zijn huidige provider behoudt en je bestaande vectoren geldig blijven. De embedder herwijzen is een aparte migratie die opnieuw embedden van de opslag vereist.

Waarom gaan mijn mem0-verzoeken naar OpenRouter in plaats van mijn base URL?

De OpenAI LLM-klasse van mem0 behandelt de omgevingsvariabele OPENROUTER_API_KEY als speciaal geval: indien ingesteld, herroutet hij naar OpenRouter ongeacht je base URL. Unset die variabele en de configuratie van openai_base_url treedt in werking.

Geldt dit voor het gehoste Mem0-platform of de open-source SDK?

De open-source SDK (Memory / Memory.from_config), waar jij de LLM-config beheert. Het gehoste Mem0-platform beheert zijn eigen modelaanroepen server-side, dus een aangepaste base URL geldt wanneer je de geheugenlaag zelf host.