mem0-strands 集成详解:为 Strands Agents 接入 Mem0 持久化长期记忆的 MemoryStore 实现

mem0-strands 集成详解:为 Strands Agents 接入 Mem0 持久化长期记忆的 MemoryStore 实现 mem0-strands 集成详解为 Strands Agents 接入 Mem0 持久化长期记忆的 MemoryStore 实现【免费下载链接】embedchainThe Memory Layer for AI Agents - Drop-in memory infrastructure for AI agents and apps. Context that persists. Built for production.项目地址: https://gitcode.com/GitHub_Trending/em/embedchain本文基于 Mem0 仓库中的 mem0-strands 集成文档 展开讲解如何把 Mem0 作为一等公民的MemoryStore接入 Strands Agents自动召回与注入、服务端事实抽取、托管与自托管双后端配置。读完你将掌握Mem0MemoryStore的三个钩子方法与 Mem0 SDK 的映射关系、全部构造参数、底层Mem0ServiceClient的后端路由机制以及匿名遥测的行为边界与本地开发验证方式。集成定位让 Strands Agent 拥有跨会话记忆mem0-strands 是一个社区集成包为 Strands Agents 提供由 Mem0 支撑的、可跨会话存活的持久化长期记忆。它和工具路线的核心区别在于mem0_memory工具由模型显式调用而Mem0MemoryStore直接插入agent loop——MemoryManager自动完成上下文召回与注入并按需写入新记忆可以是逐字写入也可以从对话中抽取事实。三个核心能力自动召回 注入每轮对话都无需工具调用相关记忆会被检索并前置拼入 prompt服务端抽取原始对话轮次直接交给 Mem0由其自有管线完成事实蒸馏与去重不产生额外的客户端模型调用托管或自托管默认使用 Mem0 托管平台Mem0 Platform也可以通过传入config字典接入自建的 Mem0 OSS 后端。包源码位于 integrations/mem0-strands/python 目录采用与 Strands extension-template 一致的 monorepo 式布局src/mem0_strands/tests/pyproject.toml 声明了 Python3.10依赖strands-agents1.45.0首个提供strands.memory模块即MemoryStore/MemoryManager的版本与mem0ai2.0.11。安装pip install mem0-strands该包会一并安装mem0aiSDK。注意 store.py 中客户端是惰性构建的Mem0ServiceClient在第一次真正访问client属性时才创建平台客户端会向 HTTP 校验 API keyOSS 客户端要构建 embedding 模型/向量库这些操作可能阻塞并且始终通过asyncio.to_thread在工作线程中执行从不落在事件循环上。快速上手三行代码接入 Agentfrom strands import Agent from strands.memory import MemoryManager from mem0_strands import Mem0MemoryStore # 召回 写入通过 Mem0 的服务端抽取从对话中蒸馏事实 store Mem0MemoryStore(user_idalex, writableTrue, extractionTrue) agent Agent(memory_managerMemoryManager(stores[store])) # Agent 从此无需显式工具调用即可读写 Mem0 agent(Remember that I prefer dark-mode dashboards and only drink oat milk.) agent(How do I like my dashboards?) # 自动召回已存储的偏好认证二选一托管平台设置MEM0_API_KEY环境变量在 app.mem0.ai 获取或显式传api_key...自托管 OSS改为传config...Mem0 OSS 配置字典例如{vector_store: {provider: qdrant}}。工作原理三个 MemoryStore 钩子与 Mem0 的映射Mem0MemoryStore实现了 StrandsMemoryStore协议的全部三个钩子见 store.py方法映射到触发时机search(query)mem0.search(query, filters{...})每轮对话执行用于召回并注入上下文add(content)mem0.add(content, inferFalse)add_memory工具 / 客户端抽取器——逐字存储一条事实add_messages(messages)mem0.add(rendered_turns, inferTrue)抽取——把对话轮次渲染为文本后交给 Mem0 的服务端抽取关键点在于同时实现了两个写入通道这是它与向量库式存储的本质差异add是逐字事实写入inferFalse。内容由add_memory工具或客户端抽取器产出的已是蒸馏好的事实跳过 Mem0 的抽取以原样保留add_messages是原始消息摄入inferTrue。正因为该通道存在开启extraction时对话轮次会直接走 Mem0 自己的抽取管线——没有额外的客户端模型调用且 Mem0 服务端的去重逻辑生效。若某个 store 只实现了add则必须依赖客户端ModelExtractor多一次模型调用才能先蒸馏事实。search 的 top_k 解析顺序从 store.py 的search实现与 test_store.py 的用例可以确认优先级SearchOptions中的max_search_results每次调用的选项构造时的max_search_results参数兜底默认值DEFAULT_MAX_SEARCH_RESULTS 5。测试test_search_options_override_top_k与test_search_config_top_k分别验证了选项覆盖构造默认值、构造值覆盖内置 5 条两条路径。add_messages 的内容渲染细节Strands 的Message.content是内容块列表文本块形如{text: ...}。Mem0 只保留{type: text}部分因此_render_content会把每轮消息的文本块拼接成字符串并跳过渲染后为空的轮次纯工具调用/工具结果轮次避免写入静默失效见 store.py 及测试test_add_messages_skips_empty_turns。实体作用域scope校验Mem0 记忆按实体作用域隔离四个字段user_id/agent_id/run_id/app_id至少设置一个否则构造时立即抛出ValueError测试test_requires_a_scope覆盖此行为。另有两条硬性约束app_id是平台专用作用域OSSMemory.add没有app_id参数因此与config自托管同传会在构造期直接报错而不是等到第一次写入时才以TypeError形式暴露只传了部分字段时scope只收集实际设置的键测试test_scope_collects_only_set_fields验证scope {user_id: alex, agent_id: assistant}。完整配置参数表参数默认值说明user_id/agent_id/run_id/app_id至少一项必填拥有这些记忆的 Mem0 实体作用域app_id仅限平台namemem0存储标识符用于从记忆工具中定向引用该 storedescriptionPersistent long-term memory backed by Mem0.人类可读描述会出现在工具描述中writableTrueManager 是否允许写入该 storeextractionNone自动抽取配置bool或ExtractionConfigmax_search_resultsNone回退为 5每次搜索的默认结果上限metadataNone合并进每次写入的默认元数据api_key环境变量$MEM0_API_KEYMem0 平台 keyhostSDK 默认Mem0 平台 base URL仅在显式设置时传入避免把 SDK 默认值覆盖为NoneconfigNone自托管后端的 Mem0 OSS 配置字典clientNone预构建的Mem0ServiceClient用于测试或包装自己的原始 Mem0 客户端元数据合并规则见 store.py 的_merge_metadata调用级 metadata 覆盖 store 级默认值例如store.metadata{team: growth}加调用add(new fact, {source: chat})会得到{team: growth, source: chat}测试test_add_writes_a_verbatim_fact覆盖。底层客户端Mem0ServiceClient 的后端路由client.py 中的Mem0ServiceClient是对 Mem0 SDK 的薄封装构造时恰好选择一个后端传入client直接使用mem0.MemoryClient或mem0.Memory主要用于测试与高级 OSS 场景传入config构建自托管mem0.MemoryMemory.from_config(config)否则用api_key/$MEM0_API_KEY构建托管mem0.MemoryClient。该封装隐藏了两处后端差异app_id拦截平台独有作用域OSS 后端在每次调用前由_check_scope拒绝避免以TypeError形式出现在调用中途或search静默漏命中source遥测标签平台写入会附加sourceSTRANDS见 _SOURCE 常量让 Mem0 后端能把记忆归属到本集成OSSMemory.add是固定签名、不接受未知 kwarg因此自托管路径不带该标签。两个容易踩坑的实现细节源码与测试都有明确约束异步客户端被拒绝AsyncMemoryClient的add/search是协程函数asyncio.to_thread会返回未被 await 的协程导致每次写入静默 no-op。因此__init__通过inspect.iscoroutinefunction检测并抛出ValueError测试test_client.py中有FakeAsyncMemoryClient覆盖搜索结果归一化_extract_results兼容 Mem0 返回{results: [...]}v1.1或裸列表两种形态统一为记忆字典列表再由_to_entry映射为 StrandsMemoryEntry保留id、score、categories、created_at、updated_at及各实体字段与自定义 metadata。tests/test_client.py 中的 fake 刻意复刻了真实 SDK 的严格签名——search只接受关键字参数并拒绝顶层实体参数、OSSadd无**kwargs——使得真实 SDK 会拒绝的调用形态在测试中同样会失败这是测试可信度的关键设计。与显式工具的关系store 与 tool 共享同一后端如果希望模型显式调用工具store/retrieve/get/delete四个动作使用strands-agents-tools中的mem0_memory工具。store 与 tool 可以共享同一个 Mem0 后端与命名空间——即同一个user_id/agent_id作用域下agent loop 的自动注入和模型显式调用看到的是同一份记忆两条路线互补而非互斥。遥测匿名、去内容、可关闭telemetry.py 通过 Mem0 SDK 自带的 PostHog 客户端发送匿名使用事件事件名形如strands.store.search、strands.store.add不打额外依赖。每个事件携带sourceSTRANDS、语言、store 版本、后端类型platform/oss及属性。发送store 配置、操作类型、耗时duration_ms、结果计数、粗略的失败类别error_kind将异常归类为timeout/auth/rate-limited/server-error/bad-request或异常类名。绝不发送查询语句、记忆文本、消息内容、实体 id、元数据、API key。此外store 调用是 agent 级动作而非循环热路径因此这些事件不做采样区别于 SDK OSS 热路径事件。record函数永不抛异常内部try/except pass兜底。关闭方式export MEM0_TELEMETRYfalse本地开发与测试包采用 hatch 管理测试完全使用 mock 客户端无需真实 Mem0 服务端cd integrations/mem0-strands/python pip install hatch hatch run test # pytestmock client无需 live server hatch run prepare # format lint typecheck test测试分布见 python/teststest_store.py 覆盖协议符合性、scope 校验、search top_k 优先级、add/add_messages 写入语义与惰性客户端构建test_client.py 覆盖双后端路由、严格签名兼容与响应归一化test_telemetry.py 覆盖事件字段与脱敏边界。小结mem0-strands的价值在于把 Mem0 从模型手动调用的工具升级为agent loop 的一等记忆层search每轮自动召回注入add逐字落盘已蒸馏事实add_messages借助 Mem0 服务端抽取免去额外模型调用三钩子实现让托管平台与自托管 OSS 两种后端共享同一套调用形态。对需要跨会话记忆、个性化上下文的 Strands Agent 开发者这是当前 Mem0 仓库中可直接pip install的官方集成路径源码与测试均可在 integrations/mem0-strands/python 下逐行查证。项目采用 Apache-2.0 许可见 LICENSE。【免费下载链接】embedchainThe Memory Layer for AI Agents - Drop-in memory infrastructure for AI agents and apps. Context that persists. Built for production.项目地址: https://gitcode.com/GitHub_Trending/em/embedchain创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考