代理集成
代理集成
相关源文件
本章引用的主要源码文件:
mem0/__init__.pymem0/configs/base.pymem0/configs/prompts.pymem0/configs/vector_stores/azure_ai_search.pymem0/configs/vector_stores/vertex_ai_vector_search.pymem0/configs/vector_stores/weaviate.pymem0/memory/main.pymem0/memory/storage.pymem0/memory/utils.pymem0/proxy/main.pymem0/vector_stores/supabase.pymem0/vector_stores/vertex_ai_vector_search.pymem0/vector_stores/weaviate.pytests/configs/test_prompts.pytests/memory/test_main.pytests/test_chatty_llm_parsing.pytests/test_main.pytests/test_memory.pytests/test_proxy.pytests/vector_stores/test_vertex_ai_vector_search.py
目的与范围
Mem0 代理通过 LiteLLM 为大语言模型(LLM)聊天补全提供透明的记忆集成。该代理会拦截聊天补全请求,自动搜索相关记忆,将其注入对话上下文,并存储新信息以供将来检索。该代理模拟 OpenAI 聊天补全 API,同时增加了记忆功能。
代理实现在 mem0/proxy/main.py mem0/proxy/main.py:1-191 中,同时支持开源的 Memory 类和托管的 MemoryClient。
架构总览
代理架构由三个主要类组成,它们在 LiteLLM 补全调用周围封装了记忆操作:
来源: mem0/proxy/main.py:28-50, tests/test_proxy.py:1-101
核心组件
Mem0 类
Mem0 类 mem0/proxy/main.py:28-40 作为代理初始化的入口点,支持两种初始化模式:
- 平台模式:如果提供了
api_key,则使用MemoryClient初始化mem0/proxy/main.py:35-36。 - 开源模式:使用本地
Memory实例,通过配置字典或默认设置进行初始化mem0/proxy/main.py:38。
该类通过 Chat 类暴露了一个 chat 属性,提供聊天补全接口 mem0/proxy/main.py:40。
Chat 和 Completions 类
Chat 类 mem0/proxy/main.py:43-45 提供了一个类似于 OpenAI 客户端结构的命名空间。它初始化一个 Completions 实例 mem0/proxy/main.py:48-191,该实例处理实际的补全逻辑。
Completions 中的关键方法:
| 方法 | 参数 | 返回值 | 描述 |
|---|---|---|---|
create() | model, messages, user_id, agent_id, run_id, **kwargs | litellm.ModelResponse | 拦截请求,管理记忆,并调用 LiteLLM。 |
_prepare_messages() | messages | List[dict] | 确保存在系统提示词,如果缺失则前置添加 MEMORY_ANSWER_PROMPT mem0/configs/prompts.py:4-13。 |
_async_add_to_memory() | messages, IDs, metadata | None | 生成一个守护线程,将对话存储到记忆中,不会阻塞。 |
_fetch_relevant_memories() | messages, IDs, filters | List | 使用最后 6 条消息作为上下文查询记忆后端。 |
来源: mem0/proxy/main.py:48-177, mem0/configs/prompts.py:4-13
数据流与记忆注入
以下时序图展示了使用代理时的完整请求生命周期:
来源: mem0/proxy/main.py:95-145, mem0/proxy/main.py:152-177
记忆检索与格式化
当检测到用户消息是 messages 列表中的最后一项时,代理会执行记忆注入 mem0/proxy/main.py:104-108:
- 搜索上下文:代理提取最后 6 条消息以形成搜索查询
mem0/proxy/main.py:168。 - 搜索执行:代理使用生成的查询和提供的过滤器调用
self.mem0_client.search()mem0/proxy/main.py:170-177。 - 上下文格式化:
_format_query_with_memories方法mem0/proxy/main.py:179-191将检索到的事实连接成一个字符串。如果使用开源Memory类mem0/memory/main.py:7,它还会包含提取的实体/关系(如果可用)mem0/proxy/main.py:184-186。 - 内容更新:检索到的事实会被前置添加到最终用户消息的内容中
mem0/proxy/main.py:108。
异步存储
为了防止记忆存储增加最终用户的延迟,代理使用 threading.Thread 并设置 daemon=True 在后台调用 self.mem0_client.add() mem0/proxy/main.py:153-164。
配置与使用
初始化
代理可以初始化为使用本地记忆引擎或 Mem0 平台。
from mem0.proxy.main import Mem0
# 模式 1:平台(MemoryClient)
mem0_platform = Mem0(api_key="m0-xxx")
# 模式 2:开源(Memory)
config = {
"vector_store": {"provider": "chroma", "config": {"path": "./db"}},
"llm": {"provider": "openai", "config": {"model": "gpt-4o"}}
}
mem0_oss = Mem0(config=config)
来源: mem0/proxy/main.py:29-40
LiteLLM 集成
代理利用 LiteLLM 的统一接口支持 100 多个大语言模型提供商。在继续之前,它会验证所选模型是否支持函数调用 mem0/proxy/main.py:98-101。所有标准的 OpenAI 兼容参数(例如 temperature、tools、response_format)都会直接转发给 litellm.completion() mem0/proxy/main.py:110-140。
遥测与跟踪
通过代理的每次成功补全都会通过 capture_event(开源模式)或 capture_client_event(平台模式)触发一个遥测事件,事件名称为 mem0.chat.create mem0/proxy/main.py:141-144。
来源: mem0/proxy/main.py:141-144, mem0/memory/telemetry.py:23