Jalankan mem0 terhadap base URL OpenAI-compatible custom.

Updated 2026-07-29

Provider OpenAI mem0 menerima key config openai_base_url. Set ke https://api.apisrouter.com/v1, kirim satu key, dan model yang mengekstrak serta memperbarui memori bisa berupa id apa pun di katalog, termasuk Claude dan DeepSeek, tanpa menyentuh sisa pipeline memori Anda.

Jawaban singkat: satu config key di dalam blok llm.

Provider LLM OpenAI mem0 me-resolve endpoint-nya sebagai config dulu, environment kedua, default ketiga: self.config.openai_base_url, lalu environment variable OPENAI_BASE_URL, lalu https://api.openai.com/v1. Jadi override paling bersih adalah satu key di dict config llm: set openai_base_url ke https://api.apisrouter.com/v1, set api_key di sebelahnya (atau export OPENAI_API_KEY), dan setiap panggilan ekstraksi-memori merutekan melalui gateway. Ini adalah perilaku mem0 upstream, terbaca di mem0/llms/openai.py, bukan fork. SDK TypeScript-nya mengekspos pasangan yang sama dalam camelCase: openaiBaseUrl dan apiKey. Nilai di dict config mengalahkan environment variable, yang mengalahkan default, jadi base URL level-config menang bahkan di mesin di mana OPENAI_BASE_URL mengarah ke tempat lain.

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

Apa yang sebenarnya dilakukan mem0 dengan LLM-nya.

mem0 (mem0ai di GitHub, sekitar 61K bintang) adalah lapisan memori untuk agent AI. Setiap panggilan add() menjalankan pipeline: LLM membaca giliran percakapan baru, mengekstrak kandidat memori, membandingkannya dengan yang sudah tersimpan, dan memutuskan per memori apakah akan menambah, memperbarui, menghapus, atau melewatkan. Itu kerja reasoning sungguhan, dan terjadi di setiap penulisan, jadi slot LLM terpicu jauh lebih sering dari yang diperkirakan kebanyakan orang saat mereka menempelkan memori ke agent produksi. Retrieval adalah separuh lainnya, dan sama sekali tidak memakai LLM: search() meng-embed query dan menjalankan kesamaan vector terhadap store-nya. Dua client berbeda, dua model berbeda, dikonfigurasi di dua blok berbeda (llm dan embedder). Pemisahan ini adalah hal terpenting untuk dipahami sebelum merutekan ulang apa pun, karena itu berarti Anda bisa memindahkan workload ekstraksi ke gateway multi-vendor sementara embedder mempertahankan provider dan index yang ada tak tersentuh. Provider tetap "openai" di config; mem0 meneruskan field model apa adanya sebagai string biasa melalui /v1/chat/completions. Saat endpoint di balik openai_base_url melayani banyak vendor, string itu bisa berupa id Claude, GPT, DeepSeek, atau GLM, dan menukar model ekstraksi menjadi perubahan config satu baris alih-alih migrasi provider.

Setup lengkap: config dict atau environment variable.

Jalur config-dict adalah yang paling presisi: ia hanya memindahkan LLM. Bangun dict-nya, serahkan ke Memory.from_config, dan pakai memory API seperti biasa. Field api_key menjaga key gateway sama sekali tidak menyentuh pengaturan vector-store dan embedder Anda. Jalur environment juga ada: class OpenAI mem0 membaca OPENAI_BASE_URL saat config key-nya tidak ada. Ini satu variabel yang di-export dan nol perubahan kode, tapi perhatikan cakupannya: class OpenAI embedder membaca variabel yang sama (ia juga menghormati nama OPENAI_API_BASE yang lebih lama, yang tidak dilakukan class LLM). Export OPENAI_BASE_URL dan Anda sudah memindahkan kedua komponen, yang hanya benar jika endpoint-nya juga melayani model embedding Anda. Jika ragu, lebih baik pakai config dict dan biarkan environment tidak tersentuh.

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

Memilih model ekstraksi.

Loop praktisnya: jaga embedder Anda tetap, jalankan fixture percakapan yang sama lewat dua atau tiga model ekstraksi, dan diff memori yang tersimpan. Di balik satu endpoint, perbandingan itu adalah edit config-string per kandidat, dan log penggunaan per-key memberi harga run setiap kandidat untuk Anda.

  • Kualitas ekstraksi adalah kualitas memori. LLM memutuskan apa yang layak diingat dan apakah informasi baru bertentangan dengan yang lama; model yang melewatkan pembaruan mencemari retrieval untuk setiap sesi mendatang. claude-sonnet-4-6 dan gpt-5.5 adalah titik tengah yang bisa diandalkan dari trade-off ini.
  • Volume ada di setiap penulisan. Produk chat yang memanggil add() setelah setiap pertukaran menjalankan ekstraksi ribuan kali sehari, itulah tempat id cepat seperti claude-haiku-4-5-20251001 atau deepseek-v4-flash menjaga lapisan memori agar tidak mendominasi tagihan token.
  • Domain yang kaya kontradiksi (preferensi yang berubah, fakta yang kedaluwarsa) diuntungkan dari model yang lebih kuat di add() bahkan jika biayanya lebih mahal per panggilan, karena keputusan update yang salah mahal untuk dideteksi belakangan.
  • Temperature seharusnya rendah. Ekstraksi adalah tugas keputusan terstruktur, bukan penulisan kreatif; mem0 mengekspos temperature di blok config yang sama, dan sekitar 0,1 menjaga keputusan add/update/delete tetap konsisten.

Bayar sesuai pemakaian · di bawah harga resmi

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

ModelHarga ResmiHarga Kami
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

Mode kegagalan spesifik mem0.

OPENROUTER_API_KEY yang tersisa membajak routing. Class LLM OpenAI mem0 memberi perlakuan khusus untuk variabel itu: saat diset, class-nya berpindah ke endpoint OpenRouter dan mengabaikan niat Anda. Jika request tidak mencapai base URL yang Anda konfigurasi, cek variabel ini dulu dan unset. Environment variable memindahkan lebih banyak dari yang Anda maksudkan. OPENAI_BASE_URL dibaca baik oleh LLM maupun embedder. Jika gateway tidak melayani model embedding Anda, override level-env merusak search() sementara add() tetap berfungsi, yang tampil sebagai "penulisan memori baik-baik saja tapi retrieval kosong atau error." Batasi override ke blok config llm dan embedder tidak akan pernah sadar. Config key bersifat per-SDK. Python pakai snake_case (openai_base_url, api_key); TypeScript pakai camelCase (openaiBaseUrl, apiKey). Key camelCase di dict Python diam-diam diabaikan dan Anda jatuh ke endpoint default, yang terlihat persis seperti override "tidak berfungsi." Id model adalah string yang persis. mem0 tidak memvalidasi field model; ia meneruskannya. Salah ketik muncul sebagai error model-not-found dari gateway di add() pertama, dan listing /v1/models adalah ejaan otoritatif. Mengganti embedder adalah keputusan index, bukan keputusan config. Embedding dari model berbeda hidup di ruang vector yang berbeda, jadi mengarahkan ulang embedder membatalkan kesamaan terhadap vector yang ada. Memindahkan LLM gratis; memindahkan embedder berarti re-embed store-nya. Rencanakan keduanya sebagai migrasi terpisah.

Siapa yang merutekan mem0 melalui gateway.

  • Builder agent yang menambahkan memori persisten ke asisten. Ekstraksi berjalan di setiap penulisan, jadi satu permukaan billing dengan penggunaan per-key mengalahkan dashboard vendor kedua yang ditempel ke stack.
  • Tim yang menginginkan ekstraksi berkualitas Claude di balik config berbentuk OpenAI. String provider tetap "openai"; hanya base URL dan id model yang berubah.
  • Produk chat volume tinggi yang mengontrol unit cost lapisan memori dengan memasangkan chat model frontier dengan id ekstraksi cepat, masing-masing bisa dialamatkan melalui endpoint yang sama.
  • Developer yang mengevaluasi model ekstraksi berdampingan. Setiap kandidat adalah satu string model terhadap fixture tetap, bukan integrasi provider baru per vendor.
  • Developer tanpa akses ke billing vendor tertentu. Akses berbasis top-up tanpa syarat kartu menghilangkan ketergantungan sign-up per provider.

Verifikasi endpoint dan debug add() pertama.

Konfirmasi gateway mencantumkan model yang Anda konfigurasi sebelum menjalankan pipeline-nya; field model harus cocok persis dengan id yang dilayani. Kegagalan first-run mengikuti pola. 401 berarti key yang di-resolve LLM salah untuk endpoint yang di-resolve-nya, dan karena keduanya berasal dari cascade config-over-env, cetak kedua nilai efektifnya alih-alih berasumsi; api_key config dengan base URL env (atau sebaliknya) adalah ketidakcocokan klasik. Error model-not-found adalah salah ketik id. Request yang terlihat pergi ke openrouter.ai berarti kasus khusus OPENROUTER_API_KEY terpicu. Dan jika add() berhasil sementara search() gagal, Anda tidak sengaja memindahkan embedder lewat environment; batasi base URL ke blok llm. Setelah memori mengalir, konsol APIsRouter menunjukkan model per request, hitungan token, dan pengeluaran. Panggilan ekstraksi kecil tapi tanpa henti, dan tampilan penggunaan adalah cara Anda melihat berapa biaya sebenarnya lapisan memori per seribu penulisan alih-alih menaksirnya.

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

Pertanyaan umum

Config key mana yang mengarahkan mem0 ke endpoint OpenAI-compatible custom?

openai_base_url di dalam config provider llm di Python (openaiBaseUrl di TypeScript). Nilai config mengalahkan environment variable OPENAI_BASE_URL, yang mengalahkan default https://api.openai.com/v1, jadi config dict adalah tempat paling deterministik untuk mengaturnya.

Bisakah mem0 mengekstrak memori dengan model Claude atau DeepSeek melalui setup ini?

Ya. Provider tetap "openai" dan mem0 meneruskan field model sebagai string biasa melalui /v1/chat/completions. Id apa pun yang dilayani endpoint di balik openai_base_url berfungsi, termasuk id Claude, DeepSeek, dan GLM.

Apakah mengatur OPENAI_BASE_URL juga memengaruhi embedder?

Ya. Embedder OpenAI mem0 membaca environment variable yang sama (plus nama OPENAI_API_BASE yang lebih lama). Jika Anda hanya ingin memindahkan LLM, set openai_base_url di dalam blok config llm dan biarkan environment tidak tersentuh.

Apakah saya perlu mengganti embedder atau vector store untuk memakai ini?

Tidak. Blok llm dan embedder adalah client independen. LLM ekstraksi bisa merutekan melalui gateway sementara embedder mempertahankan provider saat ini dan vector Anda yang ada tetap valid. Mengarahkan ulang embedder adalah migrasi terpisah yang membutuhkan re-embed store-nya.

Mengapa request mem0 saya pergi ke OpenRouter alih-alih base URL saya?

Class LLM OpenAI mem0 memberi perlakuan khusus untuk environment variable OPENROUTER_API_KEY: saat diset, ia merutekan ulang ke OpenRouter terlepas dari base URL Anda. Unset variabel itu dan konfigurasi openai_base_url berlaku.

Apakah ini berlaku untuk platform Mem0 hosted atau SDK open-source?

SDK open-source (Memory / Memory.from_config), tempat Anda mengontrol config LLM. Platform Mem0 hosted mengelola panggilan modelnya sendiri server-side, jadi base URL custom berlaku saat Anda men-self-host lapisan memori.