
mem0-ts OSS 完整指南用 TypeScript 构建可扩展的 Agent 记忆层【免费下载链接】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-ts/src/oss目录下的 TypeScript 记忆系统包名mem0ai-oss为核心结合其默认配置、配置合并器、工厂类与示例代码的源码实现讲解如何在 TypeScript/Node.js 项目中接入 mem0 记忆层从最小配置只提供 API Key到自定义向量库、LLM 与 Embedder 的全参数配置再到add/search/update/delete/history等公共 API 的底层行为与到期记忆expiration机制。读完本文你可以独立完成安装、配置、向量库替换与自定义扩展并理解每个配置项在源码中的实际作用。特性概览mem0-ts是 mem0 记忆系统的 TypeScript 实现官方描述为「使用 OpenAI 做 embeddings 和 completions 的 TypeScript 实现」见 mem0-ts/src/oss/README.md。其核心特性包括基于向量嵌入的记忆存储与检索内存通过 embedder 转为向量后存入可插拔的向量库基于 LLM 的事实抽取从对话文本中抽取事实并智能决定增/改/删哪条记忆infer机制SQLite 历史追踪默认使用 SQLite 记录每条记忆的操作历史可通过history(memoryId)查询可选的图记忆关系TypeScript 类型安全全部配置经 Zod schema 校验MemoryConfigSchema内置 OpenAI 默认集成只需提供 API Key 即可跑通完整流程内存向量库provider 为memory零外部依赖适合开发与演示可扩展架构通过Embedder、VectorStore、LLM等接口可以替换任意组件。安装与构建mem0-ts位于仓库的mem0-ts/src/oss子项目包名为mem0ai-oss版本 1.0.0MIT 协议。依据 package.json 中的 scripts 定义标准开发流程如下# 进入项目目录在 mem0-ts 工作区内 cd mem0-ts/src/oss # 安装依赖含 better-sqlite3、openai、zod、dotenv、pg、redis、qdrant/js-client-rest 等 npm install # 准备环境变量OpenAI API Key 是最小运行前提 cp .env.example .env # 编辑 .env 填入 OPENAI_API_KEY # 构建tsc 编译到 dist/产物入口为 dist/index.js类型声明 dist/index.d.ts npm run build # 清理构建产物rimraf dist npm run clean # 运行综合示例ts-node examples/vector-stores/index.ts npm run example关键点main指向dist/index.js因此必须先执行npm run build才能以包形式被其他项目引用prepare脚本会在npm install后自动触发一次构建。快速上手三种配置粒度默认配置Memory构造函数接受一个PartialMemoryConfig见 src/memory/index.ts因此「零配置 环境变量」即可启动import { Memory } from mem0-ts; // 默认 OpenAI 配置只需 OPENAI_API_KEY 环境变量 const memory new Memory(); // 或者显式只填 API Keyembedder 与 llm 各一份 const memory new Memory({ embedder: { config: { apiKey: process.env.OPENAI_API_KEY }, }, llm: { config: { apiKey: process.env.OPENAI_API_KEY }, }, });最小自定义配置const memory new Memory({ embedder: { provider: openai, config: { apiKey: process.env.OPENAI_API_KEY, model: text-embedding-3-small, }, }, vectorStore: { provider: memory, // 进程内存向量库 config: { collectionName: custom-memories, }, }, llm: { provider: openai, config: { apiKey: process.env.OPENAI_API_KEY, model: gpt-4-turbo-preview, }, }, });基本操作// 添加一条记忆归属到 user123 await memory.add(The sky is blue, { userId: user123 }); // 语义搜索 const results await memory.search(What color is the sky?, { filters: { user_id: user123 }, });注意README 中的方法签名写作add(messages, userId?, ...)而从源码签名add(messages: string | Message[], config: AddMemoryOptions)src/memory/index.ts看第二个参数是一个结构化选项对象AddMemoryOptions支持userId / agentId / runId / metadata / filters / infer / timestamp / expirationDate定义见 src/memory/memory.types.ts。官方示例examples/basic.ts中也一律采用add(text, { userId: john })的对象式写法实际使用时请以源码签名为准。默认配置与配置合并机制源码级内置默认值src/config/defaults.ts 定义了DEFAULT_MEMORY_CONFIG这是理解默认行为的事实来源组件provider关键默认值embedderopenaimodel: text-embedding-3-smallapiKey回落到process.env.OPENAI_API_KEYvectorStorememorycollectionName: memoriesdimension: 1536与 text-embedding-3-small 的输出维度一致llmopenaibaseURL: https://api.openai.com/v1model: gpt-5-minihistoryStoresqlitehistoryDbPath: memory.db其他—version: v1.1disableHistory: false值得注意README「Default Configuration」一节描述的 LLM 默认模型为 GPT-4 Turbo而当前defaults.ts中已更新为gpt-5-mini两者不一致时以源码为准——默认值可能随版本演进配置文档仅表达「LLM 默认走 OpenAI」这一意图。配置是如何被合并的new Memory(config)的第一步是ConfigManager.mergeConfig(config)src/config/manager.ts合并逻辑有四个工程上值得关注的细节逐字段深度合并用户配置只覆盖显式给出的字段。embedder 的apiKey在用户未提供时回落到默认值即OPENAI_API_KEY环境变量其余字段先展开用户配置...userConf再叠加规范化字段保证 provider 专属字段如 Vertex AI 的 project/location/credentials不会在合并中丢失。snake_case 兼容baseURL会从lmstudio_base_url、url等 Python 风格字段归一化LLM 侧同样兼容vllm_base_url、top_p、max_tokens、aws_region等。这意味着从 Python SDK 复制过来的配置对象大多可以直接使用无需改写键名。向量库维度的自动探测若用户既没给vectorStore.config.dimension也没给embedder.config.embeddingDims合并结果中dimension保持undefined。随后Memory构造函数会启动_autoInitialize()src/memory/index.ts它先对探针文本做一次 embed用返回向量长度回填dimension再创建并初始化向量库。所有公共方法都会先await这个初始化 Promise因此「任意 embedder 开箱即用无需手动指定维度」在实现上有明确依据。若显式提供了client实例依赖注入场景则优先使用用户 client 并透传其余字段。Zod 终校验合并结果最后经过MemoryConfigSchema.parse()src/types/index.ts做结构校验其中vectorStore.config与llm.config都使用.passthrough()即未知字段放行——这是「provider 专属字段零维护透传」的设计。MemoryConfig的完整类型定义见 src/types/index.tsinterface MemoryConfig { version?: string; embedder: { provider: string; config: EmbeddingConfig }; vectorStore: { provider: string; config: VectorStoreConfig }; llm: { provider: string; config: LLMConfig }; reranker?: { provider: string; config: RerankerConfig }; historyStore?: HistoryStoreConfig; disableHistory?: boolean; historyDbPath?: string; customInstructions?: string; }其中reranker支持cohere、cross_encoder、llm_reranker、zeroentropy等 provider见 src/rerankers/ 目录配置项含model/topK/device/normalize/maxLength等search()时传rerank: true才会实际启用重排。公共 API 全解Memory类src/memory/index.ts暴露的完整方法与行为语义如下签名与 README「Methods」一节对应并补充了源码中的类型细节方法签名说明addadd(messages: string \| Message[], config: AddMemoryOptions): PromiseSearchResult接受单条字符串或Message[]对话Message { role, content }content 支持image_url多模态。经 LLM 事实抽取后与既有记忆比对决定 ADD/UPDATE/DELETE。infer: false可跳过抽取直接落库。注意传入timestamp会直接抛错当前版本不支持时间戳触发源码中显式拦截searchsearch(query: string, options?: SearchMemoryOptions): PromiseSearchResult支持topK、filtersuser_id/agent_id/run_id及任意元数据键、threshold、explain、rerank、showExpired、referenceDategetget(memoryId: string): PromiseMemoryItem \| null按 ID 精确取回即使记忆已到期也照常返回getAllgetAll(options: GetAllMemoryOptions): PromiseSearchResult按filters列出记忆默认剔除到期记忆showExpired: true可包含updateupdate(memoryId: string, config: string \| UpdateMemoryOptions): Promise{ message: string }UpdateMemoryOptions { text?, data?, metadata?, expirationDate? }至少提供一项未提供的字段保持原值expirationDate: null清除已有到期日data是text的弃用别名源码注释标明将在下个主版本移除传裸字符串等价于{ text }deletedelete(memoryId: string): Promise{ message: string }删除单条记忆deleteAlldeleteAll(config: DeleteAllMemoryOptions): Promise{ message: string }按userId/agentId/runId维度清空historyhistory(memoryId: string): Promiseany[]查询该记忆的历史变更依赖 historyStore默认 SQLiteresetreset(): Promisevoid清空全部数据示例中用于测试前初始化返回结构统一为SearchResult { results: MemoryItem[] }MemoryItem含id / memory / hash? / createdAt? / updatedAt? / score? / rerankScore? / metadata? / attributedTo?src/types/index.ts。启用 reranker 时重排分以rerankScore附加返回不覆盖向量相似度score。到期记忆expirationDate这是 README 重点标注的新特性完整语义为add时可带expirationDate: YYYY-MM-DD该日期之后记忆视为过期search与getAll默认不返回过期记忆除非传showExpired: trueget(memoryId)按 ID 获取时不受过期限制update(memoryId, { expirationDate: 2030-01-31 })设置到期日update(memoryId, { expirationDate: null })清除。await memory.update(memoryId, { text: Alex now prefers decaf coffee }); await memory.update(memoryId, { metadata: { category: preferences } }); // 只改元数据 await memory.update(memoryId, { expirationDate: 2030-01-31 }); await memory.update(memoryId, { expirationDate: null }); await memory.getAll({ filters: { user_id: alice }, showExpired: true }); await memory.search(coffee, { filters: { user_id: alice }, showExpired: true });到期判断的日期工具函数位于 src/utils/expiration.ts。可插拔组件Provider 全景README 指出系统可通过实现Embedder、VectorStore、LLM接口扩展。实际可用的 provider 集合由 src/utils/factory.ts 中四个工厂类的switch分支决定这是「当前版本支持哪些后端」的权威清单EmbedderEmbedderFactoryfactory.tsopenai、aws_bedrock、ollama、lmstudio、together、google别名gemini、azure_openai、fastembed本地嵌入默认模型集与 API 型不同合并器会刻意不把 OpenAI 默认模型注入它、langchain、vertexai、huggingfaceLLMLLMFactoryopenai、openai_structured、anthropic、groq、ollama、lmstudio、google/gemini、azure_openai、mistral、langchain、deepseek、xai、sarvam、aws_bedrock、litellm、minimax、together、vllm。Bedrock 支持awsRegion/awsAccessKeyId/awsSecretAccessKey/awsSessionToken缺省时走 AWS 标准凭证链也可通过client注入预构建客户端便于测试VectorStoreVectorStoreFactorymemory、pgvector、qdrant、redis、valkey、chroma、pinecone、milvus、mongodb、weaviate、elasticsearch、opensearch、supabase、cassandra、databricks、baidu、azure-ai-search、azure_mysql、oracledb、vertex_ai_vector_search、neptune别名neptune-analytics、upstash_vector、s3-vectors、turbopuffer、vectorize、langchainHistoryStoreHistoryManagerFactorysqlite默认historyDbPath缺省为:memory:、supabasesupabaseUrl/supabaseKey/tableName表名默认memory_history、memory配置disableHistory: true时直接使用DummyHistoryManager不落任何历史。由于 provider 名在工厂中一律toLowerCase()后匹配大小写不敏感ConfigManager还会对vectorStore.provider额外做一次小写归一化避免大小写差异导致按 provider 分支取配置时静默失配。各后端的配置示例PGVector、Qdrant、Redis、Supabase、Azure AI Search 及纯本地 Ollama 组合可分别查看 examples/ 目录例如 examples/vector-stores/pgvector.ts、examples/vector-stores/qdrant.ts、examples/vector-stores/redis.ts、examples/local-llms.ts。综合示例examples/basic.ts 走一遍examples/basic.ts 是 README 提到的「comprehensive example」它按顺序演示了默认配置、内存向量库、Ollama 本地全链路、PGVector、Qdrant、Redis 六种部署形态每种都复用同一个runTests()流程非常适合当接入模板import { Memory } from ../src; import dotenv from dotenv; dotenv.config(); // 1) 全默认new Memory() 即可 const memory new Memory(); // 2) 本地 Ollama 组合nomic-embed-text 嵌入 llama3.1:8b 抽取 // 注意 dimension: 768 必须与所选 embedding 模型匹配或由自动探测回填 const localMemory new Memory({ embedder: { provider: ollama, config: { model: nomic-embed-text:latest } }, vectorStore: { provider: memory, config: { collectionName: memories, dimension: 768 } }, llm: { provider: ollama, config: { model: llama3.1:8b } }, });runTests()覆盖的完整操作序列为reset()清空环境add(Hi, my name is John..., { userId: john })添加单条记忆add([...对话 Message[]...], { userId: john })添加多轮对话LLM 抽取「最爱城市是 Paris」再次add一段回答「New York」的对话触发对既有城市记忆的智能更新get(result1.results[0].id)按 ID 取回update(id, { text: I love India... })显式改写getAll({ filters: { user_id: john } })列出该用户全部记忆search(What do you know about Paris?, { filters: { user_id: john } })语义检索history(id)拉取变更历史SQLite 中delete(id)与reset()收尾。其中 PGVector/Qdrant/Redis 分支仅在相应环境变量存在时才运行PGVECTOR_DB、QDRANT_URL或QDRANT_HOST QDRANT_PORT、REDIS_URL未设置则打印跳过提示——这给出了多后端示例的健壮写法参考。运行示例npm run example # 等价于 ts-node examples/vector-stores/index.ts测试与扩展开发测试npm test使用 Jest 运行ts-jestsrc/oss/src/tests/下覆盖 pgvector 兼容、SQLite 路径解析与向后兼容、Chroma/Milvus/MongoDB/Pinecone 等向量的行为用例reranker 测试cohere/cross-encoder/llm/zeroentropy与utils/factory.test.ts与源码同目录放置可作为新增 provider 时的用例参考扩展接口自定义 Embedder 需实现 src/embeddings/base.ts 的Embedder接口核心是embed()自定义向量库实现 src/vector_stores/base.ts 的VectorStore接口search()等。实现后仍需在 src/utils/factory.ts 的对应switch中注册 provider 分支才能通过标准Memory配置路径使用构建注意npm run build即tsc类型声明与产物统一在dist/对外发布时main: dist/index.js、types: dist/index.d.ts。小结mem0-ts OSS 把「事实抽取 向量检索 变更历史」封装进一个Memory类默认值OpenAI 嵌入/LLM、内存向量库、SQLite 历史保证最小接入成本ConfigManager的深度合并 Zod 校验 维度自动探测保证配置的兼容性与健壮性四个工厂类则把 embedder、LLM、向量库、历史存储做成可替换积木——28 个向量库 provider 与 19 个 LLM provider 的覆盖面使其既能纯本地Ollama/FastEmbed运行也能接生产级存储PGVector、Qdrant、Pinecone 等。所有行为均可在mem0-ts/src/oss/src下对照源码验证配置细节以src/config/defaults.ts与src/types/index.ts为准。【免费下载链接】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),仅供参考