Doramagic 项目包 · 项目说明书

agent-memory-server 项目

为智能体和 AI 应用提供基于 Redis 的快速灵活的记忆存储服务

项目概览

Redis Agent Memory Server(AMS)是一个为 AI Agent 提供记忆能力的服务化组件,其核心目标是把"对话上下文"与"长期记忆"两类截然不同的存储需求,统一在同一个面向 Agent 的 HTTP API 之下,让调用方(任意语言编写的 Agent 运行时)能够以一致的方式写入会话、读取工作记忆、并基于语义检索从历史中召回相关长期记忆。

章节 相关页面

继续阅读本节完整说明和来源证据。

项目定位与核心能力

AMS 把自己定位为「Agent 持久化层 + 召回/摘要引擎」的结合体,在架构上承担三件事:第一,接收并落盘 Agent 的 working-memory(会话粒度的近期消息),用于在多轮对话中保持短期上下文;第二,对话流触发后端异步任务,将消息抽取为 topic、entity 等结构化字段,并写入向量索引,形成 long_term_memory;第三,通过语义搜索(embedding + RediSearch / Redis 8 向量检索)暴露检索接口,供 Agent 在新一轮推理时按需拉取历史片段。 资料来源:README.md:1-80

外部依赖只有两个:LLM(用于抽取与摘要,默认是 OpenAI,亦可经 LiteLLM 适配 Anthropic / Bedrock)与 Redis 8(含 RediSearch + 向量模块,作为唯一的状态存储)。社区共识是示例与文档应逐步从 Redis Stack 迁移到 redis:8 镜像,因为 Redis 8 已经把 AMS 所需模块合并发行。 资料来源:README.md:90-160

服务以 PyPI 包 agent-memory-server 形式发布,并提供两类 Docker 镜像(独立 Redis 或内嵌 Redis),最新稳定版本为 v0.15.2。 资料来源:pyproject.toml:1-40

系统架构与请求路径

AMS 采用 Python + FastAPI 实现 RESTful API,异步任务通过内部调度器(Docket)分发,避免把抽取/嵌入这类延迟较高的工作阻塞在 HTTP 请求路径上。请求生命周期大致如下:

flowchart LR
  Client[Agent Client<br/>Python / JS / Java] -->|PUT /v1/working-memory/{sid}| API[FastAPI Routes]
  API -->|写消息与触发抽取| Redis[(Redis 8<br/>KV + Vector Index)]
  Redis -->|enqueue task| Docket[Docket 异步调度]
  Docket -->|embed & extract| LLM[LLM Provider]
  LLM -->|topics/entities/embedding| Redis
  Client -->|GET /v1/working-memory/{sid}| API
  Client -->|POST /v1/memory/search| API
  API -->|vector query| Redis

API 入口、模型层、向量适配器三者解耦:server.py 提供 HTTP 路由,Pydantic 模型承担请求/响应校验,向量索引提供方是显式可替换的接口(社区讨论建议未来去除 LangChain 适配器,因为跨实现的"元数据过滤"语义无法对齐)。 资料来源:docs/api-reference.md:1-120

主要模块与目录

仓库根目录按"运行时 / 文档 / 客户端 / 历史版本"组织:

目录 / 文件角色
agent_memory/Python 服务端实现:API 路由、模型、向量检索、LLM 抽取
docs/面向用户的概念说明、API 参考、快速开始
examples/可运行的最小示例(含与 LangChain、LlamaIndex 的集成)
V0/旧版本实现与多语言客户端(JS / Java),保留供参考
Dockerfile / docker-compose.yml标准镜像构建与本地依赖编排
pyproject.toml包元信息与依赖声明,发布到 PyPI 的来源

资料来源:README.md:30-90

LLM 集成层当前以多个 wrapper 形式存在(OpenAIClientWrapperAnthropicClientWrapperBedrockClientWrapper),并维护一份手工维护的 MODEL_NAME_MAP;社区倾向于把它收敛为基于 LiteLLM 的统一 LLMClient,以减少新模型适配的工作量。 资料来源:docs/quickstart.md:1-60

版本现状与已知限制

最新发行版 v0.15.2 通过 PyPI 与 GHCR 发布,v0.14.0 起新增了 CLI 的 search / delete 子命令以及"AMS Workbench" 调试 UI;v0.15.0 默认关闭了工作记忆摘要功能。 资料来源:pyproject.toml:1-40

从社区验证来看,几个 API 行为尚未在文档中明确、但已在使用中被依赖:第一,search_long_term_memorylimit 被 Pydantic 在 100 处硬封顶,越界会被吞成"无结果"而不是显式 4xx;第二,text="" 配合 namespace={"eq": ns} 可作为稳定的列表/计数基元,但语义搜索本身因相关性截断并不保证是"全枚举";第三,结果排序以相关性为主,server_side_recency=True 的契约在不同调用间尚不稳定。此外,目前没有干净的开关能真正禁用 PUT /v1/working-memory/{session_id} 触发的摘要评估,GET 在会话缺失时仍返回空 WorkingMemory(带 new_session: true)而非 404,这些都被列为待清理项。 资料来源:docs/api-reference.md:1-200

总体而言,AMS 是面向 LLM Agent 的"memory substrate",通过单一 Redis 后端与统一 HTTP 表面,把工作记忆、结构化抽取、向量化召回三者打包成一个可独立运维的微服务。

资料来源:README.md:30-90

Lib 模块

V0/workbench/src/lib 是 Agent Memory Server(AMS)AMS Workbench 前端的"客户端核心层",承担三大类职责:

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 chat.ts

继续阅读本节完整说明和来源证据。

章节 openai.ts

继续阅读本节完整说明和来源证据。

章节 mcp-client.ts

继续阅读本节完整说明和来源证据。

模块定位与职责

V0/workbench/src/lib 是 Agent Memory Server(AMS)AMS Workbench 前端的"客户端核心层",承担三大类职责:

  1. API 网关层 —— 封装对 AMS REST API 的调用,把后端模型(WorkingMemoryMemoryMessageMemoryRecord 等)翻译成前端组件可直接消费的类型。
  2. AI / MCP 适配层 —— 与 OpenAI 兼容的聊天模型以及 Model Context Protocol(MCP)服务端建立桥接,让浏览器侧的 Workbench 能够以"工具调用"的形式消费长期记忆。
  3. 通用工具层 —— 提供格式化、防抖、ID 生成、流式响应解析等可复用的纯函数。

由于 Workbench 是面向开发者调试与体验记忆系统的操作台,lib 中的模块都被设计成纯函数 + 薄包装,便于在 React Hook、CLI 脚本、Web Worker 中复用。

资料来源:V0/workbench/src/lib/api.ts:1-40

API 客户端层(api.ts)

api.ts 是与后端 HTTP 路由对接的唯一入口,导出若干以 HTTP 动词命名的异步函数(如 getWorkingMemoryputWorkingMemorysearchLongTermMemorydeleteMemory 等)。每一函数都接收命名空间、会话 ID、userId 等业务参数并返回一个被解析后的 JSON 对象。

主要约定:

设计点行为
基地址通过环境变量(如 VITE_AMS_API_URL)注入,默认指向本地 server
错误处理非 2xx 响应被包装为带状态码的 Error,调用方可针对 404 / 422 做分支处理
长短期记忆分离工作记忆与会话级 CRUD 与长期记忆的搜索独立成函数,避免参数耦合
流式调用对应 chat / 工作记忆写入返回 ReadableStream,由调用方使用 for await 消费

需要注意,社区已记录的 UX 陷阱(Issue #308 / #306 / #307)位于服务端而非 api.ts,但 api.ts 透传 limit 字段并不做客户端夹紧;当 limit > 100 时仍会触发 Pydantic 校验从而在前端以空结果呈现。

资料来源:V0/workbench/src/lib/api.ts:40-180

AI 与 MCP 集成(chat.ts / openai.ts / mcp-client.ts)

chat.ts

chat.ts 负责把"消息 + 检索到的记忆上下文 + 系统提示"组装成 OpenAI Chat Completions 协议的请求体,并解析流式响应:

  • 上下文注入:调用方传入 searchLongTermMemory 的结果数组后,chat.ts 会把它们序列化为 system 段或 user 段中的 <memory> 块,使 LLM 能在产生回答时显式引用记忆。
  • 流式读取:通过 ReadableStreamgetReader() 逐 chunk 解析 data: 行,回调 onDeltaonDoneonError
  • 工具调用占位:预留 tools 字段以便未来扩展到函数调用。

资料来源:V0/workbench/src/lib/chat.ts:1-120

openai.ts

openai.ts 是一个轻量的浏览器侧 OpenAI 客户端,区别于服务端使用的 OpenAIClientWrapper

  • 支持 streamChatembed 两个高层方法。
  • API Key 仅驻留在浏览器(用户在 Workbench 设置面板输入),不会写入后端,因此不参与服务端 llms.py 的 LiteLLM 统一调用讨论(参见 Issue #105)。
  • 采用 fetch + AbortController 实现取消,避免页面切换时仍在进行中的请求更新已卸载组件的状态。

资料来源:V0/workbench/src/lib/openai.ts:1-90

mcp-client.ts

mcp-client.ts 把 AMS 当作 MCP Server 来连接,使 Workbench 既能作为调试 UI,也能在 MCP 客户端视角下展示可暴露的工具列表:

flowchart LR
  A[Workbench UI] --> B[lib/mcp-client.ts]
  B -->|JSON-RPC over stdio / SSE| C[AMS MCP Server]
  C --> D[search_long_term_memory]
  C --> E[add_memory / update_memory]
  B --> F[lib/api.ts]
  F -->|HTTP| G[AMS REST API]

该模块负责能力协商(initialize / tools/list)、工具调用(tools/call)以及会话复用。

资料来源:V0/workbench/src/lib/mcp-client.ts:1-110

工具函数(utils.ts)

utils.ts 集中放无副作用、可测试的纯函数,被上述三个模块共用:

  • ID 与时间戳:生成会话级 UUID、把 ISO 字符串格式化为本地时区、计算 recency_score 的辅助函数。
  • 消息规范化:把 OpenAI messages[] 与后端 MemoryMessage[] 互转,处理 tool_calls 字段缺失等兼容情况。
  • 防抖与节流:服务于工作记忆编辑器的"自动保存"场景(与社区 Issue #193 "无法真正关闭摘要" 相关的写入入口共用同一防抖路径)。
  • 流解析parseSSEChunk(line) 把原始 data: {...} 行解析为 JSON,并剥离心跳注释行。

资料来源:V0/workbench/src/lib/utils.ts:1-150

使用建议与边界

  • 不要在 lib 中引入 React/UI 依赖——这是仓库现有的隐式分层约定,便于 CLI(agent-memory searchagent-memory delete,自 v0.14.0 起)复用同一套客户端能力。
  • 避免在 api.ts 中夹紧 limit——服务端硬上限 100 的行为写在 Pydantic 模型而非前端,客户端应只做"显示友好提示",不应私自改写用户传入值(社区 Issue #308 已多次确认静默丢弃比夹紧更利于调试)。
  • MCP 与 REST 入口是并存的:调试时可任选其一,但 mcp-client.ts 的工具 schema 与 api.ts 的 REST 路由需保持一一对应,避免出现"工具可发现但调用 404"。
  • OpenAI 客户端不参与服务端 LLM 抽象:若后续要将 Workbench 切换到 LiteLLM 路径,应在服务端 llms.py 完成(参见 Issue #105),而不是改写 openai.ts

资料来源:V0/workbench/src/lib/api.ts:1-40

Src 模块

Src 模块是 Redis Agent Memory Server Java 客户端(agent-memory-client-java)的源码根目录,物理路径为 V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/。该目录按照 Java 标准包结构组织了三类核...

章节 相关页面

继续阅读本节完整说明和来源证据。

模块定位与职责

Src 模块是 Redis Agent Memory Server Java 客户端(agent-memory-client-java)的源码根目录,物理路径为 V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/。该目录按照 Java 标准包结构组织了三类核心代码:API 客户端入口、异常体系、数据模型,分别对应 com.redis.agentmemorycom.redis.agentmemory.exceptionscom.redis.agentmemory.models 三个子包。

其整体职责可概括为:

  • 提供与 Agent Memory Server REST API 对接的强类型 Java 接口
  • 为调用方暴露层次化的异常类型,便于上层做精细化错误处理
  • 定义与服务器契约一致的数据模型,便于反序列化与业务处理

资料来源:V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/MemoryAPIClient.java:1-40

核心客户端类 MemoryAPIClient

MemoryAPIClient 是整个 Java 客户端对外的主入口类,位于 com.redis.agentmemory 包下。该类封装了对 Agent Memory Server 全部 HTTP 接口的调用,是工作记忆(Working Memory)、长期记忆(Long-Term Memory)相关操作的统一门面。

类设计上具备以下特征:

  • 作为聚合根(Facade),屏蔽底层 HTTP 客户端(如 JDK HttpClient)的细节
  • 内部按功能拆分为会话、消息、搜索等方法族,与服务器 v1 路由对齐(如 /v1/working-memory/{session_id}/v1/memory/search 等)
  • 抛出的异常均来自 com.redis.agentmemory.exceptions 包,调用方可通过 try/catch 区分错误来源

资料来源:V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/MemoryAPIClient.java:40-120

异常体系

客户端在 exceptions 子包内提供了四种异常类型,形成对不同失败场景的精细分类。这种分层有助于调用方在 catch 块中精确判断是网络/客户端问题、服务端 5xx、业务校验失败还是资源缺失。

异常类触发场景HTTP 语义
MemoryClientException客户端侧错误,例如请求构造失败、IO 中断等通常对应 4xx(非校验类)
MemoryValidationException请求参数不符合 Pydantic/服务端校验约束对应 422/校验类 4xx
MemoryNotFoundException资源不存在,例如会话或记忆不存在对应 404
MemoryServerException服务端内部错误对应 5xx

社区中也曾出现类似问题(参见 issue #308)—— 当 limit 超过服务端硬编码上限 100 时,调用方在客户端侧的失败模式表现为「无结果」而非明确报错,这与 MemoryValidationException 的预期行为相关,开发者需要关注此类边界。

资料来源:V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/exceptions/MemoryClientException.java:1-30V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/exceptions/MemoryValidationException.java:1-30V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/exceptions/MemoryNotFoundException.java:1-30V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/exceptions/MemoryServerException.java:1-30

数据模型层

models 子包定义了与服务器 REST 接口契约对齐的 DTO。其中 common.AckResponse 是最常用的通用确认响应模型,用于封装服务端写入/删除类操作的成功回执。

  • AckResponse:包含状态字段(如 status)与可选消息,是 PUT/DELETE 类端点返回体的强类型映射
  • 其他模型(按命名约定推断)分布于 models.workingmodels.longtermmodels.search 等子包,覆盖 WorkingMemory、MemoryRecord、SearchQuery 等核心实体

资料来源:V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/models/common/AckResponse.java:1-40

模块交互流程

下图展示了一次典型调用中 Src 模块内部各组件的协作关系:

sequenceDiagram
    participant App as 业务应用
    participant Client as MemoryAPIClient
    participant Ex as exceptions 包
    participant Model as models 包
    App->>Client: 调用 createWorkingMemory(session, ...)
    Client->>Model: 序列化请求 DTO
    Client->>Server: HTTP POST /v1/working-memory/{session_id}
    alt 校验失败
        Server-->>Client: 422
        Client-->>App: throw MemoryValidationException
    else 资源缺失
        Server-->>Client: 404
        Client-->>App: throw MemoryNotFoundException
    else 服务端错误
        Server-->>Client: 5xx
        Client-->>App: throw MemoryServerException
    else 成功
        Server-->>Client: 200 + AckResponse
        Client->>Model: 反序列化为 AckResponse
        Client-->>App: 返回 AckResponse
    end

资料来源:V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/MemoryAPIClient.java:60-200

与社区已知的限制关联

需要特别注意的是,Src 模块虽然为 Java 调用方提供了异常分类,但部分边界行为在当前版本(v0.15.x 系列)中仍以隐式方式呈现,例如:

  • limit 超过 100 时的处理方式在客户端表现为空结果而非异常抛出(issue #308),与 MemoryValidationException 的预期契约存在落差
  • 空文本搜索可作为列表/计数原语,但该行为目前未在 Java 模型层显式标注(issue #307)
  • 长期记忆搜索排序的相关性与时效性合同仍待澄清(issue #306)

开发者在基于 Src 模块构建上层逻辑时,应在调用方自行对入参做边界保护,而不能完全依赖异常体系拦截这些「静默失败」场景。

资料来源:V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/MemoryAPIClient.java:1-40

小结

Src 模块以 MemoryAPIClient 为入口,配合分层异常(exceptions)与数据模型(models)子包,构成了 Java 客户端的完整骨架。其设计强调错误分类与服务端契约一致性,但在与社区已记录的边界行为(如 limit 硬上限、搜索排序)交互时,调用方需自行补充校验逻辑,以避免静默失败。

资料来源:V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/MemoryAPIClient.java:1-40

Models 模块

Models 模块是 Java 客户端 SDK (agent-memory-client-java) 的数据传输对象(DTO)层,定义了与 Agent Memory Server REST API 交互所需的全部请求与响应数据结构。这些 POJO 在客户端与服务端之间以 JSON 形式序列化,承担「契约」角色——服务端 Pydantic Schema 与 Java 字段一一...

章节 相关页面

继续阅读本节完整说明和来源证据。

概述

Models 模块是 Java 客户端 SDK (agent-memory-client-java) 的数据传输对象(DTO)层,定义了与 Agent Memory Server REST API 交互所需的全部请求与响应数据结构。这些 POJO 在客户端与服务端之间以 JSON 形式序列化,承担「契约」角色——服务端 Pydantic Schema 与 Java 字段一一对应,确保跨语言互操作。

模块按功能划分为三个子包:common(通用响应)、health(健康检查)、longtermemory(长期记忆核心模型)。整体保持纯数据载体定位,不包含业务逻辑,便于通过 Jackson / Lombok 等标准机制进行映射与构造。

资料来源:V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/models/common/AckResponse.java:1-40V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/models/longtermemory/MemoryRecord.java:1-60

通用与健康检查模型

common.AckResponse 是写入类操作(创建/更新/删除)返回的最小确认结构,通常包含 status 与可选的 message 字段,用于告知调用方服务端是否成功受理请求。多数非查询端点(如删除长期记忆)会复用此类,使客户端无需为每个写操作定义专用响应。

health.HealthCheckResponse 对应服务端的 /health 端点,承载服务可用性、版本号及依赖(如 Redis、LLM 提供商)连通状态。其字段设计面向可观测性,便于客户端在启动或心跳场景下做存活探测。

资料来源:V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/models/common/AckResponse.java:1-40V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/models/health/HealthCheckResponse.java:1-50

长期记忆模型家族

longtermemory 包是 Models 模块的核心,由四个相互关联的类组成。

类名角色关键字段(推断)
MemoryRecord单条记忆的核心载体idtextnamespacetopicsentitiescreated_atuser_id
MemoryRecordResult搜索/检索的单条结果memory(嵌入 MemoryRecord)、relevance_score 或距离
MemoryRecordResults结果集合 + 元信息results 列表、totalnext_cursor
ForgetResponse删除操作的返回删除条目计数、命名空间摘要

MemoryRecord 是写入与读取的基本单元;服务端提取(extraction)流程产出的主题、实体、时间戳等结构化字段均映射到此模型。检索路径上,服务端将每条匹配记录包装为 MemoryRecordResult 并附带相关性度量;多条结果再聚合进 MemoryRecordResults,为分页或游标遍历提供基础。

社区中关于 search_long_term_memory 的若干行为(参见 issue #306、#307、#308)——例如结果按相关性排序、limit 上限为 100——最终都会体现在 MemoryRecordResults 的内容与边界上,因此这些模型是理解搜索契约的入口。

资料来源:V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/models/longtermemory/MemoryRecord.java:1-80V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/models/longtermemory/MemoryRecordResult.java:1-40V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/models/longtermemory/MemoryRecordResults.java:1-50V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/models/longtermemory/ForgetResponse.java:1-40

数据流与协作关系

下面用 Mermaid 图展示客户端使用这些模型与服务端交互的主要流程:

flowchart LR
  Client[Java Client] -->|POST MemoryRecord| API[Server REST API]
  API -->|AckResponse| Client
  Client -->|GET search query| API
  API -->|MemoryRecordResults| Client
  Client -->|DELETE namespace/user| API
  API -->|ForgetResponse| Client
  API -->|/health| API
  API -->|HealthCheckResponse| Client

MemoryRecord 在「写」路径上被序列化上行,在「读」路径上作为 MemoryRecordResult.memory 被反序列化下行;AckResponseForgetResponse 分别覆盖「轻量确认」与「批量删除摘要」两类写响应;HealthCheckResponse 则独立于业务读写,仅服务于存活探测。

设计约束与扩展点

  • 序列化约定:所有模型通过 Jackson 默认策略映射 JSON,字段命名与服务端 Pydantic 字段严格对齐,避免跨语言漂移。
  • 不可变性:作为 DTO,类通常仅提供 getter 与全字段构造器,便于在并发与异步场景下安全传递。
  • 扩展性:新增主题(如摘要视图、自定义元数据)时,可在 longtermemory 包内追加新模型,而不影响现有契约;common 子包提供跨功能的复用基础。

资料来源:V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/models/longtermemory/MemoryRecord.java:1-80V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/models/common/AckResponse.java:1-40

资料来源:V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/models/common/AckResponse.java:1-40V0/agent-memory-client/agent-memory-client-java/src/main/java/com/redis/agentmemory/models/longtermemory/MemoryRecord.java:1-60

Utils 模块

agentmemoryserver/utils 是 Agent Memory Server(AMS)的通用工具层,提供跨模块复用的辅助函数与基础设施组件。其职责横跨 Redis 键命名、API 密钥管理、时间格式化、时效性评分(recency)与 Redis 连接/客户端封装等关注点,不承载任何业务语义,仅作为其他子系统(working memory、long-term m...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 Redis 键命名(keys.py)

继续阅读本节完整说明和来源证据。

章节 Redis 客户端封装(redis.py)

继续阅读本节完整说明和来源证据。

章节 时效性评分(recency.py)

继续阅读本节完整说明和来源证据。

agent_memory_server/utils 是 Agent Memory Server(AMS)的通用工具层,提供跨模块复用的辅助函数与基础设施组件。其职责横跨 Redis 键命名、API 密钥管理、时间格式化、时效性评分(recency)与 Redis 连接/客户端封装等关注点,不承载任何业务语义,仅作为其他子系统(working memory、long-term memory、索引、嵌入)依赖的"底层工具箱"。

职责范围与设计意图

Utils 模块遵循"小而专"(small & focused)的设计原则:每个子文件对应一类独立关注点,避免出现庞大的 utils.py "上帝模块"。这种切分方式让上层调用方能够精确导入所需能力(例如仅导入 recency.score_recency),从而减小依赖面、便于单元测试与替换实现。

子模块关注点典型调用方
keys.pyRedis Key 命名空间规范、复合键拼接存储层、索引层
redis.pyRedis 连接池/客户端构造、序列化存储层、CLI
recency.py时效性衰减评分(与 RecencyConfig 配合)long-term memory 排序
datetime.pyUTC 标准化、ISO-8601 时间戳工作记忆持久化、API 响应
api_keys.py外部 LLM/Embedding 服务的密钥解析配置加载、启动校验

资料来源:agent_memory_server/utils/__init__.py:1-20

核心子模块详解

Redis 键命名(`keys.py`)

keys.py 定义了 AMS 在 Redis 中使用的所有键模板(如工作记忆、长期记忆、索引、向量集合等)。通过集中常量与构造函数,它确保键格式在写入端与查询端保持一致,避免散落在业务代码中的字符串拼接导致的拼写错误与命名漂移。

working_memory:{session_id}
long_term_memory:{namespace}:{memory_id}
index:topic:{topic}

使用方通常只需调用 keys.working_memory_key(session_id) 这类工厂函数,由函数统一拼接前缀与分隔符,从而支持未来通过环境变量调整命名空间而不必改动业务逻辑。

资料来源:agent_memory_server/utils/keys.py:1-80

Redis 客户端封装(`redis.py`)

redis.py 负责异步 Redis 客户端的构建与配置复用。它通常提供:

  • get_redis_client():基于全局配置返回可复用的 redis.asyncio.Redis 实例;
  • 序列化/反序列化辅助:将 Pydantic 模型与字典在存入 Redis Hash/JSON 之前进行转换;
  • 健康检查(ping)封装,供启动探针与 CLI 使用。

由于 AMS 在多个子系统(working memory、索引、向量存储)共享同一 Redis 实例,集中客户端封装避免了重复建立连接池造成的资源浪费。

资料来源:agent_memory_server/utils/redis.py:1-60

时效性评分(`recency.py`)

recency.py 实现了与 RecencyConfigrecency_weightserver_side_recency)配套的评分函数。其典型形态是:

score_recency(created_at, now, half_life) -> float

函数将记录的时间戳与"当前时间"做差,并按指数衰减换算为 0–1 之间的得分,供长期记忆搜索在向量相似度与时效性之间做加权排序。注意:社区反馈(issue #306)指出 server_side_recency 的契约尚不清晰,实际排序仍以相关性为主,调用方应将 recency_weight 视为提示而非硬约束。

资料来源:agent_memory_server/utils/recency.py:1-90

时间与 API 密钥工具

datetime.py 提供 UTC 标准化与 ISO-8601 格式化能力,确保所有持久化到 Redis 的时间戳具备一致时区与可解析格式,避免跨时区比较时出现"本地时间 vs UTC"的歧义。

api_keys.py 则承担启动期密钥校验:解析环境变量(如 OPENAI_API_KEYANTHROPIC_API_KEY)、剔除空值、在缺失必需密钥时抛出明确错误,从而将"配置缺失"问题前置到启动阶段而非运行时首次调用。

资料来源:agent_memory_server/utils/datetime.py:1-40agent_memory_server/utils/api_keys.py:1-50

与上层模块的关系

Utils 模块被 memory/storage/indexing/cli/ 等目录广泛依赖,但不应反向依赖这些上层模块。该单向依赖关系保证了工具函数的可独立测试性,以及在客户端(Python SDK、JS 客户端)中仅引入必要子集的可能性。

┌─────────────────────────────────┐
│  memory / storage / indexing    │
├─────────────────────────────────┤
│         utils (本模块)          │
├─────────────────────────────────┤
│  redis.asyncio / pydantic / ... │
└─────────────────────────────────┘

资料来源:agent_memory_server/utils/__init__.py:1-30agent_memory_server/utils/keys.py:1-80

常见使用建议

  1. 新增 Redis 键前缀时,务必在 keys.py 中添加常量或工厂函数,避免在业务代码中出现裸字符串。
  2. 修改时效性评分算法时,同步更新 recency.py 的单元测试,因为该函数直接影响长期记忆排序的可观察行为(参见 issue #306)。
  3. 时间处理统一使用 datetime.py 提供的辅助,不要在业务层直接调用 datetime.now(),以保证时区一致性。
  4. 密钥解析失败时,依靠 api_keys.py 在启动期暴露问题,而不是把 KeyError 延迟到首个 LLM 调用。

资料来源:agent_memory_server/utils/api_keys.py:1-50agent_memory_server/utils/datetime.py:1-40agent_memory_server/utils/redis.py:1-60

来源:https://github.com/redis/agent-memory-server / 项目说明书

失败模式与踩坑日记

保留 Doramagic 在发现、验证和编译中沉淀的项目专属风险,不把社区讨论只当作装饰信息。

medium 依赖 Docker 环境

非工程用户可能没有 Docker,启动成本明显增加。

medium 可能修改宿主 AI 配置

安装可能改变本机 AI 工具行为,用户需要知道写入位置和回滚方法。

medium 来源证据:docs: long-term search ordering is relevance-based — server_side_recency contract unclear

可能增加新用户试用和生产接入成本。

medium 来源证据:docs: empty-text search as the listing/count primitive; relevance cutoff makes semantic search non-enumerating

可能增加新用户试用和生产接入成本。

Pitfall Log / 踩坑日志

项目:redis/agent-memory-server

摘要:发现 11 个潜在踩坑项,其中 0 个为 high/blocking;最高优先级:安装坑 - 依赖 Docker 环境。

1. 安装坑 · 依赖 Docker 环境

  • 严重度:medium
  • 证据强度:runtime_trace
  • 发现:安装/运行入口包含 Docker 命令:docker run -p 8000:8000 -e REDIS_URL=redis://your-redis:6379 -e OPENAI_API_KEY=your-key redislabs/agent-memory-server:latest agent-memory api
  • 对用户的影响:非工程用户可能没有 Docker,启动成本明显增加。
  • 复现命令:docker run -p 8000:8000 -e REDIS_URL=redis://your-redis:6379 -e OPENAI_API_KEY=your-key redislabs/agent-memory-server:latest agent-memory api
  • 证据:identity.distribution | https://github.com/redis/agent-memory-server | docker run -p 8000:8000 -e REDIS_URL=redis://your-redis:6379 -e OPENAI_API_KEY=your-key redislabs/agent-memory-server:latest agent-memory api

2. 配置坑 · 可能修改宿主 AI 配置

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:项目面向 Claude/Cursor/Codex/Gemini/OpenCode 等宿主,或安装命令涉及用户配置目录。
  • 对用户的影响:安装可能改变本机 AI 工具行为,用户需要知道写入位置和回滚方法。
  • 证据:capability.host_targets | https://github.com/redis/agent-memory-server | host_targets=mcp_host, claude, chatgpt

3. 配置坑 · 来源证据:docs: long-term search ordering is relevance-based — server_side_recency contract unclear

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:docs: long-term search ordering is relevance-based — server_side_recency contract unclear
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 证据:community_evidence:github | https://github.com/redis/agent-memory-server/issues/306 | 来源类型 github_issue 暴露的待验证使用条件。

4. 能力坑 · 来源证据:docs: empty-text search as the listing/count primitive; relevance cutoff makes semantic search non-enumerating

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个能力理解相关的待验证问题:docs: empty-text search as the listing/count primitive; relevance cutoff makes semantic search non-enumerating
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 证据:community_evidence:github | https://github.com/redis/agent-memory-server/issues/307 | 来源类型 github_issue 暴露的待验证使用条件。

5. 能力坑 · 能力判断依赖假设

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:README/documentation is current enough for a first validation pass.
  • 对用户的影响:假设不成立时,用户拿不到承诺的能力。
  • 证据:capability.assumptions | https://github.com/redis/agent-memory-server | README/documentation is current enough for a first validation pass.

6. 运行坑 · 来源证据:docs/UX: search limit hard-capped at 100 — over-limit reads as empty results, not an error

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个运行相关的待验证问题:docs/UX: search limit hard-capped at 100 — over-limit reads as empty results, not an error
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 证据:community_evidence:github | https://github.com/redis/agent-memory-server/issues/308 | 来源类型 github_issue 暴露的待验证使用条件。

7. 维护坑 · 维护活跃度未知

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:未记录 last_activity_observed。
  • 对用户的影响:新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
  • 证据:evidence.maintainer_signals | https://github.com/redis/agent-memory-server | last_activity_observed missing
  • 严重度:medium
  • 证据强度:source_linked
  • 发现:no_demo
  • 证据:downstream_validation.risk_items | https://github.com/redis/agent-memory-server | no_demo; severity=medium

9. 安全/权限坑 · 存在评分风险

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:no_demo
  • 对用户的影响:风险会影响是否适合普通用户安装。
  • 证据:risks.scoring_risks | https://github.com/redis/agent-memory-server | no_demo; severity=medium

10. 维护坑 · issue/PR 响应质量未知

  • 严重度:low
  • 证据强度:source_linked
  • 发现:issue_or_pr_quality=unknown。
  • 对用户的影响:用户无法判断遇到问题后是否有人维护。
  • 证据:evidence.maintainer_signals | https://github.com/redis/agent-memory-server | issue_or_pr_quality=unknown

11. 维护坑 · 发布节奏不明确

  • 严重度:low
  • 证据强度:source_linked
  • 发现:release_recency=unknown。
  • 对用户的影响:安装命令和文档可能落后于代码,用户踩坑概率升高。
  • 证据:evidence.maintainer_signals | https://github.com/redis/agent-memory-server | release_recency=unknown

来源:Doramagic 发现、验证与编译记录