mem0-কে একটা কাস্টম OpenAI-compatible base URL দিয়ে চালান।
Updated 2026-07-30
mem0-এর OpenAI provider একটা openai_base_url config key নেয়। এটাকে https://api.apisrouter.com/v1-এ সেট করুন, এক key পাস করুন, এবং memory extract ও update করা model catalog-এর যেকোনো id হতে পারে, Claude এবং DeepSeek সহ, আপনার বাকি memory pipeline touch না করেই।
দ্রুত উত্তর: llm block-এর ভেতরে একটা config key।
mem0-এর OpenAI LLM provider এর endpoint resolve করে প্রথমে config, দ্বিতীয়ত environment, তৃতীয়ত default হিসেবে: self.config.openai_base_url, তারপর OPENAI_BASE_URL environment variable, তারপর https://api.openai.com/v1। তাই সবচেয়ে পরিষ্কার override হলো llm config dict-এ একটা key: openai_base_url-কে https://api.apisrouter.com/v1-এ সেট করুন, এর পাশে api_key সেট করুন (বা OPENAI_API_KEY export করুন), এবং প্রতিটা memory-extraction call gateway দিয়ে route হয়। এটা upstream mem0 behavior, mem0/llms/openai.py-তে পড়া যায়, কোনো fork না। TypeScript SDK camelCase-এ একই জোড়া expose করে: openaiBaseUrl এবং apiKey। config dict-এর value environment variable-কে override করে, যা default-কে override করে, তাই একটা config-level base URL জেতে এমনকি এমন machine-এও যেখানে OPENAI_BASE_URL অন্য কোথাও point করছে।
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"],
},
}
}mem0 আসলে তার LLM দিয়ে কী করে।
mem0 (GitHub-এ mem0ai, প্রায় 61K star) হলো AI agent-এর জন্য একটা memory layer। প্রতিটা add() call একটা pipeline চালায়: LLM নতুন conversation turn পড়ে, candidate memory extract করে, ইতিমধ্যে stored যা আছে তার সাথে তুলনা করে, এবং প্রতি memory-তে add, update, delete, বা skip সিদ্ধান্ত নেয়। এটা real reasoning কাজ, এবং এটা প্রতিটা write-এ ঘটে, তাই একটা production agent-এ memory bolt করলে মানুষ যা আশা করে তার চেয়ে বেশিবার LLM slot fire করে। Retrieval হলো বাকি অর্ধেক, এবং এটা মোটেও LLM ব্যবহার করে না: search() query embed করে এবং store-এর ওপর vector similarity চালায়। দুটো ভিন্ন client, দুটো ভিন্ন model, দুটো ভিন্ন block-এ configured (llm এবং embedder)। যা কিছু re-route করার আগে বোঝার জন্য এই split-ই সবচেয়ে গুরুত্বপূর্ণ, কারণ এর মানে আপনি extraction workload-কে একটা multi-vendor gateway-এ move করতে পারেন যখন embedder তার existing provider এবং index অক্ষত রাখে। provider config-এ "openai" থেকে যায়; mem0 model field-কে /v1/chat/completions-এর মধ্য দিয়ে একটা plain string হিসেবে pass through করে। openai_base_url-এর পেছনে endpoint একাধিক vendor serve করলে, সেই string একটা Claude, GPT, DeepSeek, বা GLM id হতে পারে, এবং extraction model swap করা একটা provider migration না বরং এক-লাইনের config change হয়ে যায়।
সম্পূর্ণ সেটআপ: config dict বা environment variable।
Config-dict path সবচেয়ে precise: এটা শুধু LLM move করে। dict বানান, Memory.from_config-কে দিন, এবং স্বাভাবিকভাবে memory API ব্যবহার করুন। api_key field আপনার vector-store এবং embedder setting থেকে gateway key-কে সম্পূর্ণভাবে দূরে রাখে। Environment path-ও আছে: config key অনুপস্থিত থাকলে mem0-এর OpenAI class OPENAI_BASE_URL পড়ে। এটা এক export করা variable এবং শূন্য code change, কিন্তু scope নোট করুন: embedder-এর OpenAI class একই variable পড়ে (এটা পুরনো OPENAI_API_BASE নামও honor করে, যা LLM class করে না)। OPENAI_BASE_URL export করলে আপনি দুটো component-ই move করেছেন, যা তখনই সঠিক যখন endpoint আপনার embedding model-ও serve করে। সন্দেহ হলে, config dict পছন্দ করুন এবং environment ছুঁবেন না।
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"))Extraction model বেছে নেওয়া।
Practical loop: আপনার embedder স্থির রাখুন, একই conversation fixture দুই-তিনটা extraction model-এর মধ্য দিয়ে চালান, এবং stored memory diff করুন। এক endpoint-এর পেছনে সেই comparison প্রতি candidate একটা config-string edit, এবং per-key usage log প্রতিটা candidate-এর run price করে দেয়।
- Extraction quality-ই memory quality। LLM সিদ্ধান্ত নেয় কী মনে রাখার যোগ্য এবং নতুন তথ্য পুরনোটাকে contradict করে কিনা; একটা update miss করা একটা model প্রতিটা future session-এর retrieval-কে দূষিত করে। claude-sonnet-4-6 এবং gpt-5.5 এই trade-off-এর reliable মধ্যবিন্দু।
- Volume প্রতিটা write-এ। একটা chat product যা প্রতিটা exchange-এর পরে add() call করে দিনে হাজার হাজার বার extraction চালায়, যেখানে claude-haiku-4-5-20251001 বা deepseek-v4-flash-এর মতো একটা fast id memory layer-কে token bill-এ প্রাধান্য পেতে বাধা দেয়।
- Contradiction-heavy domain (পাল্টে যাওয়া preference, expire হওয়া fact) add()-এ একটা stronger model থেকে লাভবান হয় যদিও প্রতি call খরচ বেশি, কারণ একটা ভুল update decision পরে detect করা costly।
- Temperature কম হওয়া উচিত। Extraction একটা structured-decision task, creative writing না; mem0 একই config block-এ temperature expose করে, এবং প্রায় 0.1 add/update/delete decision consistent রাখে।
ব্যবহার অনুযায়ী পেমেন্ট · অফিশিয়াল মূল্যের নিচে
Selected models are priced below official list prices. Exact input, output, cache, and per-request prices are shown for each model.
| মডেল | অফিশিয়াল মূল্য | আমাদের মূল্য |
|---|---|---|
| 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 |
mem0-এর জন্য নির্দিষ্ট failure mode।
একটা লেগে থাকা OPENROUTER_API_KEY routing hijack করে। mem0-এর OpenAI LLM class সেই variable special-case করে: এটা সেট থাকলে, class OpenRouter-এর endpoint-এ switch করে এবং আপনার intent ignore করে। যদি request আপনার configure করা base URL-এ না পৌঁছায়, প্রথমে এই variable check করুন এবং unset করুন। Environment variable আপনার ইচ্ছার চেয়ে বেশি move করে। OPENAI_BASE_URL LLM এবং embedder দুটোই পড়ে। gateway আপনার embedding model serve না করলে, একটা env-level override search()-কে ভাঙে যখন add() কাজ করতে থাকে, যা "memory write ঠিকঠাক কিন্তু retrieval খালি বা error করছে" হিসেবে দেখা যায়। override-কে llm config block-এ scope করুন এবং embedder কখনো লক্ষ্যই করবে না। Config key প্রতি SDK-তে ভিন্ন। Python snake_case (openai_base_url, api_key); TypeScript camelCase (openaiBaseUrl, apiKey)। Python dict-এ একটা camelCase key নীরবে ignore হয়ে যায় এবং আপনি default endpoint-এ পড়ে যান, যা ঠিক "কাজ করছে না" override-এর মতো দেখায়। Model id exact string। mem0 model field validate করে না; এটা forward করে। একটা typo প্রথম add()-এ একটা model-not-found error হিসেবে surface করে, এবং /v1/models listing-ই authoritative spelling। Embedder পাল্টানো একটা index decision, config decision না। ভিন্ন model থেকে embedding ভিন্ন vector space-এ থাকে, তাই embedder repoint করলে existing vector-এর বিরুদ্ধে similarity invalidate হয়ে যায়। LLM move করা বিনামূল্যে; embedder move করার মানে store re-embed করা। এগুলোকে আলাদা migration হিসেবে plan করুন।
কারা একটা gateway দিয়ে mem0 route করে।
- Agent builder যারা assistant-এ persistent memory যোগ করছে। Extraction প্রতিটা write-এ চলে, তাই stack-এ bolt করা একটা দ্বিতীয় vendor dashboard-এর চেয়ে per-key usage সহ একটা single billing surface ভালো।
- Team যারা একটা OpenAI-shaped config-এর পেছনে Claude-quality extraction চায়। provider string "openai" থেকে যায়; শুধু base URL এবং model id পাল্টায়।
- High-volume chat product যারা একটা frontier chat model-কে একটা fast extraction id-র সাথে pair করে memory layer-এর unit cost নিয়ন্ত্রণ করে, প্রতিটা একই endpoint দিয়ে addressable।
- Developer যারা পাশাপাশি extraction model evaluate করছে। প্রতিটা candidate fixed fixture-এর বিরুদ্ধে একটা model string, প্রতি vendor নতুন provider integration না।
- Developer যাদের কোনো নির্দিষ্ট vendor-এর billing-এ access নেই। কোনো card requirement ছাড়া Top-up based access per-provider sign-up dependency সরিয়ে দেয়।
Endpoint verify করুন এবং প্রথম add() debug করুন।
Pipeline চালানোর আগে confirm করুন gateway আপনার configure করা model list করে; model field অবশ্যই একটা served id-র সাথে exactly মিলতে হবে। First-run failure একটা pattern অনুসরণ করে। একটা 401 মানে LLM যে key resolve করেছে তা resolve করা endpoint-এর জন্য ভুল, এবং যেহেতু দুটোই একটা config-over-env cascade থেকে আসে, ধরে না নিয়ে দুটো effective value print করুন; একটা env base URL সহ config api_key (বা উল্টো) একটা classic mismatch। একটা model-not-found error একটা id typo। Request দৃশ্যত openrouter.ai-তে যাওয়া মানে OPENROUTER_API_KEY special case fire করেছে। এবং যদি add() সফল হয় কিন্তু search() fail করে, আপনি দুর্ঘটনাক্রমে environment দিয়ে embedder move করেছেন; base URL-কে llm block-এ scope করুন। একবার memory চললে, APIsRouter console per-request model, token count, এবং spend দেখায়। Extraction call ছোট কিন্তু relentless, এবং usage view-ই কীভাবে আপনি দেখেন memory layer আসলে প্রতি হাজার write-এ কত খরচ করে, আন্দাজ না করে।
curl -s https://api.apisrouter.com/v1/models \
-H "Authorization: Bearer $APISROUTER_API_KEY" | head -50সাধারণ প্রশ্ন
কোন config key mem0-কে একটা কাস্টম OpenAI-compatible endpoint-এ point করে?
Python-এ llm provider config-এর ভেতরে openai_base_url (TypeScript-এ openaiBaseUrl)। Config value OPENAI_BASE_URL environment variable-কে override করে, যা default https://api.openai.com/v1-কে override করে, তাই config dict-ই এটা সেট করার সবচেয়ে deterministic জায়গা।
এই setup দিয়ে mem0 কি Claude বা DeepSeek model দিয়ে memory extract করতে পারে?
হ্যাঁ। provider "openai" থেকে যায় এবং mem0 model field-কে /v1/chat/completions-এর মাধ্যমে একটা plain string হিসেবে forward করে। openai_base_url-এর পেছনে endpoint serve করা যেকোনো id কাজ করে, Claude, DeepSeek, এবং GLM id সহ।
OPENAI_BASE_URL সেট করা কি embedder-কেও প্রভাবিত করে?
হ্যাঁ। mem0-এর OpenAI embedder একই environment variable পড়ে (প্লাস পুরনো OPENAI_API_BASE নাম)। যদি শুধু LLM move করতে চান, llm config block-এর ভেতরে openai_base_url সেট করুন এবং environment ছুঁবেন না।
এটা ব্যবহার করতে কি আমার embedder বা vector store পাল্টাতে হবে?
না। llm এবং embedder block independent client। Extraction LLM gateway দিয়ে route করতে পারে যখন embedder তার current provider রাখে এবং আপনার existing vector valid থাকে। Embedder repoint করা একটা আলাদা migration যার জন্য store re-embed করা দরকার।
আমার mem0 request কেন আমার base URL-এর বদলে OpenRouter-এ যাচ্ছে?
mem0-এর OpenAI LLM class OPENROUTER_API_KEY environment variable special-case করে: সেট থাকলে, এটা আপনার base URL নির্বিশেষে OpenRouter-এ reroute করে। সেই variable unset করুন এবং openai_base_url configuration effect নেবে।
এটা কি hosted Mem0 platform নাকি open-source SDK-তে প্রযোজ্য?
Open-source SDK (Memory / Memory.from_config), যেখানে আপনি LLM config control করেন। hosted Mem0 platform তার নিজস্ব model call server-side manage করে, তাই একটা কাস্টম base URL তখন প্রযোজ্য যখন আপনি memory layer self-host করেন।