Uruchom mem0 względem niestandardowego base URL kompatybilnego z OpenAI.

Updated 2026-07-29

Dostawca OpenAI w mem0 przyjmuje klucz konfiguracyjny openai_base_url. Ustaw go na https://api.apisrouter.com/v1, przekaż jeden klucz, a model, który wyodrębnia i aktualizuje wspomnienia, może być dowolnym identyfikatorem z katalogu, Claude i DeepSeek włącznie, bez dotykania reszty Twojego pipeline'u pamięci.

Szybka odpowiedź: jeden klucz konfiguracyjny wewnątrz bloku llm.

Dostawca LLM OpenAI w mem0 rozwiązuje swój endpoint najpierw z konfiguracji, potem ze środowiska, na końcu z domyślnej wartości: self.config.openai_base_url, potem zmienna środowiskowa OPENAI_BASE_URL, potem https://api.openai.com/v1. Więc najczystszym nadpisaniem jest jeden klucz w słowniku konfiguracji llm: ustaw openai_base_url na https://api.apisrouter.com/v1, ustaw obok niego api_key (albo wyeksportuj OPENAI_API_KEY), a każde wywołanie ekstrakcji pamięci będzie kierowane przez bramkę. To zachowanie upstreamowego mem0, czytelne w mem0/llms/openai.py, nie forka. SDK TypeScript eksponuje tę samą parę w camelCase: openaiBaseUrl i apiKey. Wartości w słowniku konfiguracji nadpisują zmienne środowiskowe, które nadpisują wartości domyślne, więc base URL na poziomie konfiguracji wygrywa nawet na maszynach, gdzie OPENAI_BASE_URL wskazuje gdzie indziej.

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"],
        },
    }
}

Co mem0 faktycznie robi ze swoim LLM.

mem0 (mem0ai na GitHubie, około 61 tys. gwiazdek) to warstwa pamięci dla agentów AI. Każde wywołanie add() uruchamia pipeline: LLM czyta nowe tury rozmowy, wyodrębnia kandydackie wspomnienia, porównuje je z tym, co już jest zapisane, i decyduje per wspomnienie, czy dodać, zaktualizować, usunąć czy pominąć. To prawdziwa praca rozumowania i dzieje się przy każdym zapisie, więc slot LLM odpala się znacznie częściej, niż większość ludzi się spodziewa, gdy doczepiają pamięć do produkcyjnego agenta. Retrieval to druga połowa i w ogóle nie używa LLM: search() embeduje zapytanie i uruchamia podobieństwo wektorowe względem magazynu. Dwóch różnych klientów, dwa różne modele, skonfigurowane w dwóch różnych blokach (llm i embedder). Ten podział to jedyna najważniejsza rzecz do zrozumienia, zanim cokolwiek przekierujesz, ponieważ oznacza, że możesz przenieść obciążenie ekstrakcji na wielodostawcową bramkę, podczas gdy embedder zachowuje swojego obecnego dostawcę i indeks nietknięte. Dostawca w konfiguracji zostaje "openai"; mem0 przekazuje pole model jako zwykły string przez /v1/chat/completions. Gdy endpoint za openai_base_url obsługuje wielu dostawców, ten string może być identyfikatorem Claude, GPT, DeepSeek albo GLM, a zamiana modelu ekstrakcji staje się jednolinijkową zmianą konfiguracji zamiast migracją dostawcy.

Pełna konfiguracja: słownik konfiguracji albo zmienna środowiskowa.

Ścieżka słownika konfiguracji jest precyzyjna: przenosi tylko LLM. Zbuduj słownik, podaj go do Memory.from_config i używaj API pamięci normalnie. Pole api_key całkowicie trzyma klucz bramki z dala od ustawień magazynu wektorów i embeddera. Istnieje też ścieżka środowiskowa: klasy OpenAI w mem0 czytają OPENAI_BASE_URL, gdy klucz konfiguracji jest nieobecny. To jedna wyeksportowana zmienna i zero zmian w kodzie, ale zwróć uwagę na zasięg: klasa OpenAI embeddera czyta te same zmienne (honoruje też starszą nazwę OPENAI_API_BASE, czego nie robi klasa LLM). Wyeksportuj OPENAI_BASE_URL, a przeniesiesz oba komponenty, co jest poprawne tylko wtedy, gdy endpoint obsługuje też Twój model embeddingu. W razie wątpliwości preferuj słownik konfiguracji i zostaw środowisko w spokoju.

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

Dobór modelu ekstrakcji.

Praktyczna pętla: trzymaj embedder ustalony, przepuść te same fixtures rozmów przez dwa albo trzy modele ekstrakcji i porównaj zapisane wspomnienia. Za jednym endpointem to porównanie to edycja stringa konfiguracji per kandydat, a log użycia per klucz wycenia za Ciebie uruchomienie każdego kandydata.

  • Jakość ekstrakcji to jakość pamięci. LLM decyduje, co warto zapamiętać i czy nowa informacja przeczy starej; model, który przegapi aktualizację, zanieczyszcza retrieval dla każdej przyszłej sesji. claude-sonnet-4-6 i gpt-5.5 to niezawodny środek tego kompromisu.
  • Wolumen jest przy każdym zapisie. Produkt czatowy wywołujący add() po każdej wymianie uruchamia ekstrakcję tysiące razy dziennie, i to tu szybki identyfikator, taki jak claude-haiku-4-5-20251001 albo deepseek-v4-flash, powstrzymuje warstwę pamięci przed zdominowaniem rachunku za tokeny.
  • Domeny bogate w sprzeczności (preferencje, które się zmieniają, fakty, które wygasają) zyskują na silniejszym modelu w add(), nawet jeśli kosztuje więcej per wywołanie, ponieważ błędną decyzję aktualizacji drogo jest wykryć później.
  • Temperature powinna być niska. Ekstrakcja to zadanie ustrukturyzowanej decyzji, nie kreatywne pisanie; mem0 eksponuje temperature w tym samym bloku konfiguracji, a około 0.1 utrzymuje decyzje add/update/delete spójnymi.

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
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

Tryby awarii charakterystyczne dla mem0.

Utrzymujący się OPENROUTER_API_KEY przechwytuje routing. Klasa LLM OpenAI w mem0 traktuje tę zmienną specjalnie: gdy jest ustawiona, klasa przełącza się na endpoint OpenRouter i ignoruje Twoją intencję. Jeśli żądania nie docierają do skonfigurowanego przez Ciebie base URL, sprawdź najpierw tę zmienną i ją odznacz. Zmienna środowiskowa przenosi więcej, niż zamierzałeś. OPENAI_BASE_URL jest czytana zarówno przez LLM, jak i embedder. Jeśli bramka nie obsługuje Twojego modelu embeddingu, nadpisanie na poziomie środowiska psuje search(), podczas gdy add() nadal działa, co objawia się jako "zapisy pamięci działają dobrze, ale retrieval jest pusty albo zwraca błąd." Ogranicz nadpisanie do bloku konfiguracji llm, a embedder nigdy tego nie zauważy. Klucze konfiguracji są per SDK. Python używa snake_case (openai_base_url, api_key); TypeScript camelCase (openaiBaseUrl, apiKey). Klucz w camelCase w słowniku Pythona jest po cichu ignorowany i wpadasz z powrotem na domyślny endpoint, co wygląda dokładnie jak nadpisanie, które "nie działa." Identyfikatory modeli to dokładne stringi. mem0 nie waliduje pola model; przekazuje je dalej. Literówka ujawnia się jako błąd model-not-found z bramki przy pierwszym add(), a listing /v1/models jest autorytatywnym zapisem. Zmiana embeddera to decyzja indeksowa, nie decyzja konfiguracyjna. Embeddingi z różnych modeli żyją w różnych przestrzeniach wektorowych, więc przekierowanie embeddera unieważnia podobieństwo względem istniejących wektorów. Przenoszenie LLM jest darmowe; przenoszenie embeddera oznacza ponowne embedowanie magazynu. Planuj je jako osobne migracje.

Kto kieruje mem0 przez bramkę.

  • Twórcy agentów dodający trwałą pamięć do asystentów. Ekstrakcja działa przy każdym zapisie, więc pojedyncza powierzchnia rozliczeniowa z użyciem per klucz bije drugi dashboard dostawcy doczepiony do stosu.
  • Zespoły, które chcą ekstrakcji jakości Claude za konfiguracją w kształcie OpenAI. String dostawcy zostaje "openai"; zmienia się tylko base URL i identyfikator modelu.
  • Wysokowolumenowe produkty czatowe kontrolujące koszt jednostkowy warstwy pamięci przez łączenie modelu czatu frontier z szybkim identyfikatorem ekstrakcji, każdy adresowalny przez ten sam endpoint.
  • Deweloperzy ewaluujący modele ekstrakcji obok siebie. Każdy kandydat to jeden string modelu na stałych fixtures, nie nowa integracja dostawcy na każdego z osobna.
  • 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 add().

Potwierdź, że bramka listuje skonfigurowany przez Ciebie model, zanim uruchomisz pipeline; pole model musi dokładnie zgadzać się z obsługiwanym identyfikatorem. Awarie pierwszego uruchomienia mają wzorzec. 401 oznacza, że klucz rozwiązany przez LLM jest zły dla endpointu, który rozwiązano, a ponieważ oba pochodzą z kaskady konfiguracja-ponad-środowisko, wydrukuj obie efektywne wartości zamiast zakładać; api_key z konfiguracji z base URL ze środowiska (albo odwrotnie) to klasyczna niezgodność. Błąd model-not-found to literówka w identyfikatorze. Żądania widocznie idące do openrouter.ai oznaczają, że zadziałał specjalny przypadek OPENROUTER_API_KEY. A jeśli add() się udaje, podczas gdy search() zawodzi, przypadkiem przeniosłeś embedder przez środowisko; ogranicz base URL do bloku llm. Gdy wspomnienia już płyną, konsola APIsRouter pokazuje model per żądanie, liczbę tokenów i wydatki. Wywołania ekstrakcji są małe, ale nieustępliwe, a widok użycia to sposób, żeby zobaczyć, ile warstwa pamięci naprawdę kosztuje na tysiąc zapisów, zamiast to szacować.

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

Częste pytania

Który klucz konfiguracji wskazuje mem0 na niestandardowy endpoint kompatybilny z OpenAI?

openai_base_url wewnątrz konfiguracji dostawcy llm w Pythonie (openaiBaseUrl w TypeScript). Wartości konfiguracji nadpisują zmienną środowiskową OPENAI_BASE_URL, która nadpisuje domyślne https://api.openai.com/v1, więc słownik konfiguracji jest najbardziej deterministycznym miejscem, żeby to ustawić.

Czy mem0 może wyodrębniać wspomnienia modelami Claude albo DeepSeek przy tej konfiguracji?

Tak. Dostawca zostaje "openai", a mem0 przekazuje pole model jako zwykły string przez /v1/chat/completions. Działa dowolny identyfikator obsługiwany przez endpoint za openai_base_url, łącznie z identyfikatorami Claude, DeepSeek i GLM.

Czy ustawienie OPENAI_BASE_URL wpływa też na embedder?

Tak. Embedder OpenAI w mem0 czyta te same zmienne środowiskowe (plus starszą nazwę OPENAI_API_BASE). Jeśli chcesz przenieść tylko LLM, ustaw openai_base_url wewnątrz bloku konfiguracji llm i zostaw środowisko nietknięte.

Czy muszę zmienić embedder albo magazyn wektorów, żeby tego użyć?

Nie. Bloki llm i embedder to niezależni klienci. LLM ekstrakcji może kierować ruch przez bramkę, podczas gdy embedder zachowuje swojego obecnego dostawcę, a Twoje istniejące wektory pozostają ważne. Przekierowanie embeddera to osobna migracja wymagająca ponownego embedowania magazynu.

Dlaczego moje żądania mem0 idą do OpenRouter zamiast do mojego base URL?

Klasa LLM OpenAI w mem0 traktuje specjalnie zmienną środowiskową OPENROUTER_API_KEY: gdy jest ustawiona, przekierowuje do OpenRouter niezależnie od Twojego base URL. Odznacz tę zmienną, a konfiguracja openai_base_url zacznie działać.

Czy to dotyczy hostowanej platformy Mem0, czy open-source'owego SDK?

Open-source'owe SDK (Memory / Memory.from_config), gdzie kontrolujesz konfigurację LLM. Hostowana platforma Mem0 zarządza własnymi wywołaniami modeli po stronie serwera, więc niestandardowy base URL ma zastosowanie, gdy self-hostujesz warstwę pamięci.