شغّل mem0 مقابل base URL مخصص متوافق مع OpenAI.

Updated 2026-07-29

يأخذ مزوّد OpenAI في mem0 مفتاح إعداد openai_base_url. اضبطه على https://api.apisrouter.com/v1، مرّر مفتاحاً واحداً، ويمكن للنموذج الذي يستخرج ويحدّث الذاكريات أن يكون أي معرّف في الكتالوج، بما فيه Claude وDeepSeek، دون لمس بقية أنبوب ذاكرتك.

إجابة سريعة: مفتاح إعداد واحد داخل كتلة llm.

يحل مزوّد LLM من نوع OpenAI في mem0 نقطة نهايته بترتيب: الإعداد أولاً، البيئة ثانياً، الافتراضي ثالثاً: self.config.openai_base_url، ثم متغيّر البيئة OPENAI_BASE_URL، ثم https://api.openai.com/v1. لذا أنظف تجاوز هو مفتاح واحد في قاموس إعداد llm: اضبط openai_base_url على https://api.apisrouter.com/v1، اضبط api_key بجانبه (أو صدّر OPENAI_API_KEY)، وكل استدعاء استخراج ذاكرة يتوجّه عبر البوابة. هذا سلوك mem0 الأصلي، مقروء في mem0/llms/openai.py، لا تفريعة. حزمة TypeScript تكشف نفس الزوج بصياغة camelCase: openaiBaseUrl وapiKey. القيم في قاموس الإعداد تتجاوز متغيرات البيئة، التي تتجاوز الافتراضات، لذا base URL على مستوى الإعداد يفوز حتى على الأجهزة حيث يشير OPENAI_BASE_URL إلى مكان آخر.

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 (mem0ai على GitHub، بنحو 61 ألف نجمة) طبقة ذاكرة لوكلاء AI. كل استدعاء add() يشغّل أنبوباً: يقرأ LLM أدوار المحادثة الجديدة، يستخرج ذاكريات مرشَّحة، يقارنها بما هو مخزَّن بالفعل، ويقرر لكل ذاكرة ما إذا كان سيضيف أو يحدّث أو يحذف أو يتخطى. هذا عمل استدلال حقيقي، ويحدث في كل كتابة، لذا تُطلَق فتحة LLM أكثر بكثير مما يتوقع معظم الناس عند إضافة الذاكرة إلى وكيل إنتاج. الاسترجاع هو النصف الآخر، ولا يستخدم LLM على الإطلاق: search() يُضمِّن الاستعلام ويشغّل تشابهاً متجهياً مقابل المخزن. عميلان مختلفان، نموذجان مختلفان، مُعَدّان في كتلتين مختلفتين (llm وembedder). هذا الفصل هو أهم شيء واحد يجب فهمه قبل إعادة توجيه أي شيء، لأنه يعني أنه يمكنك نقل حِمل عمل الاستخراج إلى بوابة متعددة البائعين بينما يحتفظ المُضمِّن بمزوّده وفهرسه الحاليين دون مساس. يبقى المزوّد "openai" في الإعداد؛ يُمرِّر mem0 حقل model كسلسلة نصية عادية عبر /v1/chat/completions. عندما تخدم نقطة النهاية خلف openai_base_url بائعين متعددين، يمكن أن تكون تلك السلسلة معرّف Claude أو GPT أو DeepSeek أو GLM، ويصبح تبديل نموذج الاستخراج تغيير إعداد بسطر واحد بدلاً من ترحيل مزوّد.

الإعداد الكامل: قاموس إعداد أو متغيّر بيئة.

مسار قاموس الإعداد هو الأدق: يُحرِّك فقط LLM. ابنِ القاموس، سلِّمه إلى Memory.from_config، واستخدم واجهة الذاكرة برمجياً كالمعتاد. حقل api_key يُبقي مفتاح البوابة تماماً خارج إعدادات مخزن المتجهات والمُضمِّن. مسار البيئة موجود أيضاً: تقرأ فئات OpenAI الخاصة بـ mem0 OPENAI_BASE_URL عندما يكون مفتاح الإعداد غائباً. هو متغيّر واحد مُصدَّر وصفر تغييرات كود، لكن لاحظ النطاق: تقرأ فئة OpenAI الخاصة بالمُضمِّن نفس المتغيرات (وتحترم أيضاً الاسم الأقدم OPENAI_API_BASE، الذي لا تحترمه فئة LLM). صدّر OPENAI_BASE_URL وستكون قد حرّكت كلا المكوّنين، وهذا صحيح فقط إذا كانت نقطة النهاية تخدم نموذج التضمين الخاص بك أيضاً. عند الشك، فضّل قاموس الإعداد واترك البيئة دون مساس.

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

اختيار نموذج الاستخراج.

الحلقة العملية: ثبّت مُضمِّنك، شغّل نفس تركيبات المحادثة التجريبية عبر نموذجَي أو ثلاثة استخراج، وقارن الذاكريات المخزَّنة بالاختلاف. خلف نقطة نهاية واحدة تلك المقارنة تعديل سلسلة إعداد لكل مرشّح، وسجل الاستخدام لكل مفتاح يسعّر تشغيل كل مرشّح لك.

  • جودة الاستخراج هي جودة الذاكرة. يقرر LLM ما يستحق التذكّر وما إذا كانت المعلومات الجديدة تناقض القديمة؛ نموذج يفوّت تحديثاً يلوّث الاسترجاع لكل جلسة مستقبلية. claude-sonnet-4-6 وgpt-5.5 هما المتوسط الموثوق في هذه المفاضلة.
  • الحجم على كل كتابة. منتج محادثة يستدعي add() بعد كل تبادل يشغّل الاستخراج آلاف المرات يومياً، وهذا حيث يُبقي معرّف سريع مثل claude-haiku-4-5-20251001 أو deepseek-v4-flash طبقة الذاكرة من الهيمنة على فاتورة tokens.
  • المجالات الغنية بالتناقضات (تفضيلات تتغير، حقائق تنتهي صلاحيتها) تستفيد من نموذج أقوى على add() حتى لو كلّف أكثر لكل استدعاء، لأن قرار تحديث خاطئ مكلف اكتشافه لاحقاً.
  • درجة الحرارة تنتمي منخفضة. الاستخراج مهمة قرار مُهيكَل، لا كتابة إبداعية؛ يكشف mem0 temperature في نفس كتلة الإعداد، وحوالي 0.1 يُبقي قرارات add/update/delete متسقة.

ادفع حسب الاستخدام · أقل من السعر الرسمي

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.

OPENROUTER_API_KEY متبقٍّ يختطف التوجيه. تعامل فئة LLM الخاصة بـ OpenAI في mem0 ذلك المتغيّر كحالة خاصة: عندما يُضبَط، تتحول الفئة إلى نقطة نهاية OpenRouter وتتجاهل نيتك. إذا لم تكن الطلبات تصل إلى base URL الذي أعددته، تحقق من هذا المتغيّر أولاً وأزِله. متغيّر البيئة يُحرِّك أكثر مما قصدت. يُقرَأ OPENAI_BASE_URL من قِبل كل من LLM والمُضمِّن. إذا لم تخدم البوابة نموذج التضمين الخاص بك، تجاوز على مستوى البيئة يكسر search() بينما يستمر add() في العمل، وهو ما يظهر كـ "كتابة الذاكرة تعمل لكن الاسترجاع فارغ أو يخطئ". حصر التجاوز في كتلة إعداد llm ولن يلاحظ المُضمِّن شيئاً. مفاتيح الإعداد لكل SDK. Python بصياغة snake_case (openai_base_url، api_key)؛ TypeScript بصياغة camelCase (openaiBaseUrl، apiKey). مفتاح camelCase في قاموس Python يُتجاهَل بصمت وتسقط إلى نقطة النهاية الافتراضية، وهو ما يبدو تماماً كتجاوز "لا يعمل". معرّفات النموذج سلاسل دقيقة. لا يتحقق mem0 من حقل model؛ يُمرِّره فقط. خطأ إملائي يظهر كخطأ model-not-found من البوابة عند أول add()، وقائمة /v1/models هي الهجاء المرجعي. تغيير المُضمِّن قرار فهرسة، لا قرار إعداد. التضمينات من نماذج مختلفة تعيش في فضاءات متجهية مختلفة، لذا إعادة توجيه المُضمِّن تُبطِل التشابه مقابل المتجهات الموجودة. نقل LLM مجاني؛ نقل المُضمِّن يعني إعادة تضمين المخزن. خطّط لهما كترحيلين منفصلين.

من يوجّه mem0 عبر بوابة.

  • مُنشِئو الوكلاء الذين يضيفون ذاكرة دائمة للمساعدين. يُطلَق الاستخراج في كل كتابة، لذا سطح فوترة واحد بالاستخدام لكل مفتاح يفوز على لوحة تحكم بائع ثانية مُلصَقة بالمكدس.
  • الفرق التي تريد استخراجاً بجودة Claude خلف إعداد على شكل OpenAI. يبقى نص المزوّد "openai"؛ فقط base URL ومعرّف النموذج يتغيّران.
  • منتجات المحادثة عالية الحجم التي تتحكم في تكلفة الوحدة لطبقة الذاكرة بقرن نموذج محادثة حديث بمعرّف استخراج سريع، كل واحد قابل للعنونة عبر نفس نقطة النهاية.
  • المطورون الذين يقيّمون نماذج الاستخراج جنباً إلى جنب. كل مرشّح سلسلة نموذج واحدة مقابل تركيبات ثابتة، لا تكامل مزوّد جديد لكل بائع.
  • المطورون الذين لا يملكون وصولاً إلى فوترة بائع معيّن. الوصول القائم على تعبئة الرصيد بدون شرط بطاقة يزيل الاعتماد على التسجيل لكل مزوّد.

تحقق من نقطة النهاية وصحّح أخطاء أول add().

أكّد أن البوابة تسرد النموذج الذي أعددته قبل تشغيل الأنبوب؛ يجب أن يطابق حقل model معرّفاً مخدوماً تماماً. أعطال أول تشغيل تتبع نمطاً. 401 يعني أن المفتاح الذي حلّه LLM خاطئ بالنسبة لنقطة النهاية التي حلّها، ولأن كليهما يأتي من تتالي الإعداد فوق البيئة، اطبع كلتا القيمتين الفعليتين بدلاً من الافتراض؛ api_key من الإعداد مع base URL من البيئة (أو العكس) تعارض كلاسيكي. خطأ model-not-found هو خطأ إملائي في المعرّف. طلبات تذهب بوضوح إلى openrouter.ai تعني أن حالة OPENROUTER_API_KEY الخاصة أُطلقت. وإذا نجح add() بينما فشل search()، فقد حرّكت المُضمِّن عن طريق الخطأ عبر البيئة؛ احصر base URL في كتلة llm. بمجرد تدفّق الذاكريات، تعرض لوحة APIsRouter النموذج لكل طلب، وعدد tokens، والإنفاق. استدعاءات الاستخراج صغيرة لكن متواصلة، وعرض الاستخدام هو كيفية رؤية ما تكلّفه طبقة الذاكرة فعلياً لكل ألف كتابة بدلاً من تقديره.

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

الأسئلة الشائعة

أي مفتاح إعداد يوجّه mem0 نحو نقطة نهاية مخصصة متوافقة مع OpenAI؟

openai_base_url داخل إعداد مزوّد llm في Python (openaiBaseUrl في TypeScript). قيم الإعداد تتجاوز متغيّر البيئة OPENAI_BASE_URL، الذي يتجاوز الافتراضي https://api.openai.com/v1، لذا قاموس الإعداد هو المكان الأكثر حتمية لضبطه.

هل يمكن لـ mem0 استخراج ذاكريات بنماذج Claude أو DeepSeek عبر هذا الإعداد؟

نعم. يبقى المزوّد "openai" ويُمرِّر mem0 حقل model كسلسلة نصية عادية عبر /v1/chat/completions. أي معرّف تخدمه نقطة النهاية خلف openai_base_url يعمل، بما فيه معرّفات Claude وDeepSeek وGLM.

هل ضبط OPENAI_BASE_URL يؤثر على المُضمِّن أيضاً؟

نعم. يقرأ مُضمِّن OpenAI في mem0 نفس متغيرات البيئة (بالإضافة إلى الاسم الأقدم OPENAI_API_BASE). إذا أردت نقل LLM فقط، اضبط openai_base_url داخل كتلة إعداد llm واترك البيئة دون مساس.

هل أحتاج إلى تغيير المُضمِّن أو مخزن المتجهات لاستخدام هذا؟

لا. كتلتا llm وembedder عميلان مستقلان. يمكن لـ LLM الاستخراج التوجيه عبر البوابة بينما يحتفظ المُضمِّن بمزوّده الحالي وتبقى متجهاتك الموجودة صالحة. إعادة توجيه المُضمِّن ترحيل منفصل يتطلب إعادة تضمين المخزن.

لماذا تذهب طلبات mem0 الخاصة بي إلى OpenRouter بدلاً من base URL الخاص بي؟

تعامل فئة LLM الخاصة بـ OpenAI في mem0 متغيّر البيئة OPENROUTER_API_KEY كحالة خاصة: عند ضبطه، يعيد التوجيه إلى OpenRouter بغض النظر عن base URL الخاص بك. أزِل ذلك المتغيّر ويسري إعداد openai_base_url.

هل ينطبق هذا على منصة Mem0 المُستضافة أم حزمة SDK مفتوحة المصدر؟

حزمة SDK مفتوحة المصدر (Memory / Memory.from_config)، حيث تتحكم في إعداد LLM. تدير منصة Mem0 المُستضافة استدعاءات نموذجها الخاصة من جانب الخادم، لذا base URL مخصص ينطبق عندما تستضيف طبقة الذاكرة بنفسك.