跳转至

配置

设置文件

设置存储在 ~/.claude-mem/settings.json 中。首次运行时,该文件将使用默认值自动创建。

核心设置

设置 默认值 描述
CLAUDE_MEM_MODEL claude-haiku-4-5-20251001 用于压缩观察结果的 Claude 模型(使用 Claude 提供方时)
CLAUDE_MEM_PROVIDER claude AI 提供方:claude、codex、gemini、openrouter 或 openai-compatible
CLAUDE_MEM_CLAUDE_AUTH_METHOD subscription Claude 提供方的身份验证模式:subscription、api-key 或 gateway
CLAUDE_MEM_CLAUDE_OBSERVATION_BATCH_SIZE 1 Claude 提供方在单个观察器提示中可发送的排队观察数量(1–32)。只有具有相同提示编号、代理和工作目录的事件才会按队列顺序合并;并且仅当提示保持在两个设有上限的字段内时,排队事件才会被添加。当某个会话排队事件的速度快于其观察器回答速度时,可调高此值。与 Codex 批处理一样需要权衡:批处理回复中的每一条观察都会列出该批次中所有事件的文件;若回复连续失败两次,则会丢弃整个批次。同名环境变量会覆盖 settings.json。
CLAUDE_MEM_LLM_TIMEOUT_MS 180000 非流式观察器请求的每请求截止时间(毫秒,500–300000):Gemini、Codex 以及 cmem.ai 网关(以及任何拒绝流式的 OpenAI 兼容端点)。它的存在是为了捕获卡住的请求;如果后端较慢,只需调高此值。OpenRouter 和 OpenAI 兼容的请求使用流式传输,不受此设置限制:它们在没有 token 或 keep-alive 的情况下,在空闲时间窗(CLAUDE_MEM_LLM_STREAM_IDLE_TIMEOUT_MS)结束后终止,整个请求上限为 300 秒。如果 settings.json 仍保留旧的 30000 默认值,会一次性迁移到新默认值;而之后你手动设置的 30000 会被保留。同名环境变量会覆盖 settings.json。
CLAUDE_MEM_FIELD_OPTIMIZE_TIMEOUT_MS 180000 在发送观察结果之前,用于压缩一个过大的工具字段的截止时间(毫秒,500–300000);超时后该字段将被截断。它是与观察器请求发往同一后端的请求,因此具有相同的默认值。如果 settings.json 仍保留旧的 30000 默认值,会一次性迁移到新默认值;而之后你手动设置的 30000 会被保留。同名环境变量会覆盖 settings.json。
CLAUDE_MEM_LLM_STREAM_IDLE_TIMEOUT_MS 90000 静默时长(毫秒,500–300000),超过该时长后流式 OpenRouter 或 OpenAI 兼容请求会结束:在这段时间内既没有 token 也没有 keep-alive,请求将被放弃(整个请求以 300 秒为上限)。当自托管后端在负载均衡器后面排队请求时,请调高此值——队列等待是静默的,因此会被视为空闲,默认的 90 秒可能在后端开始生成之前就触发。这是一个独立的调节项,因此不会影响 CLAUDE_MEM_LLM_TIMEOUT_MS(流式请求会忽略该设置)。同名环境变量会覆盖 settings.json。
CLAUDE_MEM_WORKER_HEARTBEAT_STALE_MS 120000 静默 worker(两次健康重探均失败)在其存活心跳比此值更新(毫秒,10000–3600000)时,会被免于卡死 worker 回收,除非它已有 10 分钟没有完成任何 HTTP 响应。Worker 会通过定时器每 5 秒刷新一次 worker-heartbeat.json,因此新鲜的心跳意味着其事件循环仍在运转——例如在访问时扫描的杀毒软件环境下可能变慢,但并未死亡。没有心跳的 worker,或心跳由其他进程写入的 worker,将像以前一样被判定。同名环境变量会覆盖 settings.json。
CLAUDE_MEM_MODE code 当前模式配置文件(例如 code--es、email-investigation)
CLAUDE_MEM_CONTEXT_OBSERVATIONS 50 要注入的观察结果数量
CLAUDE_MEM_SESSION_START_INCLUDE_ALL_SOURCES false 在 SessionStart 上下文中包含来自所有 harness 的观察结果
CLAUDE_MEM_CONTEXT_PROJECTS current current 在 SessionStart 时读取此检出(checkout)的记忆;all 读取所有项目(被排除的项目除外)。观察结果上限在所有项目之间共享。仅 Worker 运行时
CLAUDE_MEM_CONTEXT_MAIN_AGENT_ONLY true 将子代理(subagent)的观察结果排除在 SessionStart 上下文之外,以免其步骤日志将持久的主会话记忆挤出窗口。子代理行同时带有代理 ID 和代理类型;transcript-watch 行(例如 Grok Bot 席位)仍会保留。这在服务器运行时同样适用:当生成该行的 hook 事件同时携带两者时,该行即被视为子代理行。搜索和查看器仍会显示所有内容。
CLAUDE_MEM_REINFORCE_ALPHA 0 为 SessionStart 上下文提供的可选 ACT-R 排序。0(默认)保持最近的 N 条观察结果不变。当值大于 0(可尝试 0.5)时,写入路径在后续日子中再次确认过的观察结果可以进入窗口:每条观察的创建日期与再次确认日期均使用幂律衰减进行评分:ln(1 + age^-0.5 + ALPHA · Σ age_k^-0.5)。窗口中最新的四分之一始终按最近性保留。
CLAUDE_MEM_WORK_STATE_ENABLED true false 会为以自己的方式跟踪工作的宿主关闭工作状态(work state)功能:SessionStart 上下文会省略 work-state 部分(即 work_state_write 是你的权威待办清单这一规则,以及打开的清单列表),MCP 服务器也不会列出或运行 work_state_write 和 work_state_read。已写入的清单会保留在数据库中,并在重新启用后恢复。同名环境变量会覆盖 settings.json。更改后请重启 worker,并开启新会话,以便 MCP 服务器读取该设置。
CLAUDE_MEM_SEMANTIC_INJECT false 将每个提示词最匹配的观测结果添加到该提示词的上下文(UserPromptSubmit)中,并叠加在 SessionStart 上下文之上。
CLAUDE_MEM_SEMANTIC_INJECT_LIMIT 5 每个提示词添加的观测结果数量(1–20)。
CLAUDE_MEM_SEMANTIC_INJECT_FORMAT narrative narrative 会添加每个匹配项的标题和完整叙述。index 为每个匹配项添加一行,包含其 id、标题和副标题,并引导 Claude 通过 get_observations 获取详细信息。narrative 是默认选项,因为它在 Claude 无需进行工具调用的情况下即可工作:在 index 模式下,Claude 未展开的匹配项仅贡献其标题和副标题。index 一行的开销仅为 narrative 的一小部分,因此在相同 token 下可以承载更多匹配项;可搭配更高的限制使用。
CLAUDE_MEM_SEARCH_RECENCY_DAYS 90 无日期的语义搜索(search、search_observations、时间线)仅对最近 N 天内创建的匹配项进行排序;较旧的匹配项不会出现在结果中。0 会关闭该时间窗口,使所有已索引的匹配项保持可用;N 越大窗口越宽。传递 dateStart/dateEnd 的请求始终使用该范围而非时间窗口。修改后需重启 worker。
CLAUDE_MEM_FILE_READ_GATE_ENABLED true 阻止对 32 KB 及以上、且有观测历史的代码文件进行整文件读取,并改为引导 Claude 使用 smart_outline / smart_unfold / get_observations(仅限 Claude Code)。带 offset/limit 的定向读取仍可正常工作。设为 false 时所有读取均可通过,且仍会将文件的时间线作为上下文添加。参见 File Read Gate。
CLAUDE_MEM_WORKER_PORT 37700 + (uid % 100) Worker Service 端口(按用户的默认值;可覆盖以使用固定端口)
CLAUDE_MEM_WORKER_HOST 127.0.0.1 Worker Service 主机地址
CLAUDE_MEM_WORKER_AUTOSTART true 当你自行运行 worker 时(通过进程管理器、容器或 worker-service.cjs --daemon),请设为 false。此时 hooks、MCP 服务器和 start 会使用已在运行的 worker,但绝不会启动、终止或回收 worker:不会惰性启动,不会因版本不匹配而回收,也不会回收或收回卡死的 worker。当你的 worker 处于停止状态时,hooks 会静默跳过其工作,而不会将其计为失败。
CLAUDE_MEM_WORKER_INGEST_TOKEN 空 用于远程 hook-spool 投递的共享令牌。在 worker 和每个客户端中通过设置或环境变量配置相同的值。在 worker 获得此令牌之前,远程 spool 端点处于禁用状态。在设置回复中会被掩码显示。
CLAUDE_MEM_WORKER_INGEST_MAX_BYTES 5242880 (5 MiB) 经过身份验证的 POST /api/spool/ingest 请求(包括信封)的最大已解码 JSON 请求体大小。请在 worker 上配置此值并重启;客户端无需更改。20 MiB 请使用 20971520。无效或非正整数值将回退为 5 MiB。其他 JSON 端点保持其 5 MiB 限制。更大的限制会增加内存和磁盘使用;超过限制的请求会收到 HTTP 413,客户端会将原始事件隔离。
CLAUDE_MEM_HOOK_SPOOL_TRANSPORT auto auto 对非回环的 worker 主机使用 HTTP,对本地 worker 使用文件系统。若通过回环端口转发连接到远程 worker,请设为 http;仅当 hooks 与 worker 共享同一 spool 目录时才使用 filesystem。
CLAUDE_MEM_ALLOWED_ORIGINS (空) 除 http://localhost:* 和 http://127.0.0.1:* 之外,允许以跨源方式调用 worker API 的逗号分隔浏览器来源(origin),例如 https://app.example.com。从 worker 自身地址加载的页面(位于 http://<lan-ip>:<port> 的查看器)始终被允许。其他 http://localhost:* 页面可以读取 API 但不能删除:删除操作会同步到每台设备,因此 DELETE 请求仅接受来自查看器自身页面、此处列出的来源,或不发送 Origin 头的客户端(hooks、CLI、curl)。为阻止 DNS 重绑定攻击,worker 还会拒绝 Host 为不受信任 DNS 名称的请求。IP 地址、localhost、host.docker.internal、CLAUDE_MEM_WORKER_HOST、CLAUDE_MEM_PUBLIC_URL 的主机以及此处列出的主机均受信任。如需通过机器名称打开查看器(如 http://mybox.local:37777),请将该来源列在此处。修改后需重启 worker。
CLAUDE_MEM_PUBLIC_URL (空) 当 worker 运行在端口转发后的远程沙箱中时,为查看器打印的、浏览器可访问的基础 URL(实时视图、欢迎提示、重启链接),例如 https://37700.host.example。留空 = http://localhost:<port>。环境变量优先于设置。(托管服务器运行时 会读取同一变量作为其自身的公共基础 URL。)
CLAUDE_MEM_TV_TOKEN — 用于 Observation TV 远程访问的共享密钥。留空 = 关闭。当 CLAUDE_MEM_WORKER_HOST 为非回环地址时,只有 /tv、/tv.html、/stream 和 GET /api/observations 可访问,且必须携带此令牌。
CLAUDE_MEM_DATA_DIR ~/.claude-mem 数据根目录 — 所有其他路径(database、chroma、logs、settings.json、worker.pid)均由此派生
CLAUDE_MEM_SKIP_TOOLS ListMcpResourcesTool,SlashCommand,Skill,TodoWrite,AskUserQuestion 需要从观测结果中排除的逗号分隔工具列表
CLAUDE_MEM_SKIP_BASH_PATTERNS — 用于匹配每条 shell 命令的正则表达式(Claude Code Bash 和 PowerShell、Codex exec_command);匹配成功时跳过该观测结果。留空则捕获所有命令。多个模式请使用交替语法,例如 ^(ls\|cat\|pwd\|git status)\b。无效的正则表达式会被忽略,因此捕获永远不会被丢弃
CLAUDE_MEM_SKIP_SUBAGENT_OBSERVATIONS false 当为 true 时,跳过 所有 子代理观察(即同时带有代理 ID 和代理类型的工具调用)。参见 子代理与动态工作流过滤。
CLAUDE_MEM_CODEX_SUBAGENT_INGESTION false 当为 true 时,从 ~/.codex/sessions 下的 rollout 文件中捕获 Codex CLI 生成的子代理线程(其原生钩子永远不会报告这些线程)。默认关闭:一个繁忙的 Codex 会话每天会生成数十个子代理,而他们的每次工具调用都会向你的观察者提供商多发起一次请求。CLAUDE_MEM_SKIP_SUBAGENT_OBSERVATIONS=true 可保持其关闭。更改后请重启 worker。
CLAUDE_MEM_SKIP_AGENT_TYPES (empty) 要跳过的子代理 agent_type 值的逗号分隔列表,例如 workflow-subagent,Explore,Plan。主会话观察不受影响。
CLAUDE_MEM_CAPTURE_ADVISOR_CALLS false 当为 true 时,Stop 钩子会将每次 Claude Code advisor 工具调用(建议文本、advisor 模型以及该轮的提示)记录到本地数据库中,可通过 GET /api/advisor-calls 读取。advisor 从不触发 PostToolUse,因此钩子会读取转录内容的末尾来获取它。<private> 内容在存储前会被移除。仅 worker 运行时生效;不生成任何内容,因此不消耗令牌。
CLAUDE_MEM_DELIVERABLES_ENABLED true 当为 true 时,Stop 钩子会将本轮的可交付成果(作为 work_product 附加的 work_state_write 文件,以及写在源目录树之外的演示文稿、文档、页面、图片、视频或电子表格)复制到 ~/.claude-mem/deliverables/<project>/,并记录它们,同时 My Work 会在请求卡片上链接它们。false 会关闭复制;已存在于存储桶中的文件会保留。仅在此计算机上的 worker 运行时生效;提示完全为 <private> 的轮次永远不会被复制。
CLAUDE_MEM_REDACT_ENABLED false 选择启用的自动脱敏:在存储前,工具输入和输出、提示、摘要以及 server-runtime 事件体中的已识别机密模式会被替换为 <redacted type='…'/> 标记(server-runtime 会话元数据除外)。内置模式列表请参阅 自动脱敏。
CLAUDE_MEM_REDACT_GENERIC_ENABLED false 启用脱敏后,还会对没有供应商前缀的凭据进行脱敏:password=、*_PWD=、*_TOKEN=、*_SECRET=、*_API_KEY= 值以及 Authorization: Bearer …。其置信度低于 11 种供应商模式,因此作为单独的选项启用。
CLAUDE_MEM_REDACT_DISABLED_BUILTINS (empty) 内置模式名称的 CSV 列表,这些模式将保持不脱敏,而其余模式继续生效,例如 jwt,slack_token。
CLAUDE_MEM_REDACT_CUSTOM_PATTERNS [] 额外 { "name", "regex" } 模式的 JSON 数组,在内置模式之前求值,因此可以覆盖某个令牌族。
CLAUDE_MEM_REDACT_LOG_MATCHES false 每次脱敏扫描记录一行 pattern,count(匹配到的字节永远不会被记录)。

子代理与动态工作流过滤

Claude Code 动态工作流 会将单个提示扇出到数十到数百个并行子代理(agent_type: workflow-subagent)。每个子代理的每次工具调用都会触发 PostToolUse 钩子,因此 claude-mem 会为每次调用创建一条由提供商分析的观察记录——单次运行可能产生 成百上千 条低信号观察。这可能会耗尽所配置提供商的免费层配额(HTTP 429),并丢弃该运行的其余部分,包括有价值的主会话工作。

有两项设置可让你在这些观察 进入任何 worker 往返或提供商调用之前 将其过滤掉。两者默认均为关闭,因此现有行为保持不变。

  • 丢弃所有子代理噪声(推荐给重度工作流用户):
{ "CLAUDE_MEM_SKIP_SUBAGENT_OBSERVATIONS": "true" }

这是最稳妥的控制手段——无论类型如何,它都会捕获每个子代理工具调用(同时带有代理 ID 和代理类型的调用)。主会话观察会被保留,包括 claude --agent <type> 主线程以及诸如 Grok Bot 席位等转录监控宿主,后者只携带两者之一。

  • 精准丢弃特定代理类型(保留某些子代理,丢弃其他子代理):
{ "CLAUDE_MEM_SKIP_AGENT_TYPES": "workflow-subagent" }

添加一个逗号分隔的 agent_type 值列表。两项设置以并集方式组合:如果全局开关打开,或 其 agent_type 在列表中,则该子代理观察会被跳过。

子代理 摘要 本来就会自动跳过;这些设置则为 观察 增加了同样的控制。跨会话的持久知识通常来自主会话,因此丢弃短暂的子代理步骤通常会提高信噪比。SessionStart 在默认情况下已经不让子代理行进入注入的上下文(CLAUDE_MEM_CONTEXT_MAIN_AGENT_ONLY);这些设置则更进一步,完全跳过对它们的捕获,这也能节省观察者提供商的令牌。

Gemini 提供商设置

设置 默认值 描述
CLAUDE_MEM_GEMINI_API_KEY — Gemini API 密钥(获取免费密钥)
CLAUDE_MEM_GEMINI_API_KEYS — 可选:更多密钥(以换行、逗号或空格分隔),当一个密钥被限流、用完或被拒绝时进行轮换(多密钥轮换)
CLAUDE_MEM_GEMINI_MODEL gemini-flash-latest Gemini 模型:gemini-flash-latest、gemini-flash-lite-latest、gemini-3.5-flash、gemini-3.1-flash-lite、gemini-3-flash-preview

有关详细配置和速率限制信息,请参阅 Gemini 提供商。

Codex 订阅提供商设置

以运行 worker 的用户身份执行 codex login,然后使用 npx claude-mem install --provider codex 安装。添加 --model gpt-6-luna 可选择该模型,或在查看器设置中选择 Codex 并输入模型。Codex 使用本地 CLI 订阅登录,不需要 OpenAI API 密钥。

不带 --model 重新安装会保留已保存的 Codex 模型。首次安装时该设置为空,Codex 会选择其默认模型。之后若要恢复默认值,请在查看器中清除 Codex Model 字段。

设置 默认值 描述
CLAUDE_MEM_CODEX_MODEL 空 为空时 Codex 选择其默认模型;否则使用你的订阅可用的模型。
CLAUDE_MEM_CODEX_REASONING_EFFORT low 推理强度:none、minimal、low、medium、high、xhigh、max 或 ultra,视模型支持而定;为空时使用 Codex 的默认值。高级覆盖可在 settings.json 或环境中设置。如果 Codex 拒绝了某个强度或模型,Codex 记忆将停止,直到更改此设置;SessionStart 会说明这一点。
CLAUDE_MEM_CODEX_PATH codex CLI 可执行文件或路径。仅限文件或环境变量;查看器设置 API 无法更改。
CLAUDE_MEM_CODEX_MAX_CONCURRENT_AGENTS 2 并行处理请求的 App-server 客户端(1–8)。仅限文件;更改后需重启 worker。
CLAUDE_MEM_CODEX_OBSERVATION_BATCH_SIZE 8 Codex 可将排队中的观察记录合并为一个请求(1–32)。
CLAUDE_MEM_CODEX_OBSERVATION_BATCH_MAX_CHARS 32000 单个合并观察记录请求的字符预算(4000–128000)。

worker 使用隔离的 codex app-server 会话处理观察记录和摘要。Codex CLI 身份验证必须是基于文件的 ChatGPT 登录;不接受 API 密钥登录。每个请求都使用共享的 CLAUDE_MEM_LLM_TIMEOUT_MS 超时截止时间。有关故障如何暂停和恢复的详细信息,请参阅仓库中的 docs/codex-provider.md。

OpenRouter 提供商设置

设置 默认值 描述
CLAUDE_MEM_OPENROUTER_API_KEY — OpenRouter API 密钥(获取密钥)
CLAUDE_MEM_OPENROUTER_API_KEYS — 可选:当一个密钥被限流、额度用尽或被拒绝时,可轮换使用更多密钥(多密钥轮换)。绝不在 cmem.ai 网关上使用。
CLAUDE_MEM_OPENROUTER_MODEL cohere/north-mini-code:free 模型标识符(支持 100 多种模型)
CLAUDE_MEM_OPENROUTER_BASE_URL — 可选:自定义 OpenAI 兼容基础 URL(DeepSeek、LM Studio、IO Intelligence)
CLAUDE_MEM_OPENROUTER_SITE_URL — 可选:用于分析的 URL
CLAUDE_MEM_OPENROUTER_REASONING_EFFORT — 可选:none、minimal、low、medium 或 high,仅适用于 openrouter.ai(详情)
CLAUDE_MEM_OPENROUTER_APP_NAME claude-mem 可选:用于分析的 App 名称
CLAUDE_MEM_OPENROUTER_EXTRA_BODY — 可选:额外请求字段的 JSON 对象,例如 {"reasoning":{"enabled":false}}(详情)

有关详细配置、免费模型列表和使用指南,请参阅 OpenRouter 提供商。

OpenAI 兼容提供商设置

对于 CLAUDE_MEM_PROVIDER=openai-compatible:任何支持 /chat/completions 的端点,无论是托管还是本地均可。

设置 默认值 描述
CLAUDE_MEM_OPENAI_COMPAT_PRESET — 命名端点预设(列表)。为空 = custom:自行设置 base URL
CLAUDE_MEM_OPENAI_COMPAT_BASE_URL — OpenAI 兼容基础 URL。覆盖预设中的 base URL
CLAUDE_MEM_OPENAI_COMPAT_MODEL — 模型 ID,按原样发送。为空 = 预设的默认模型
CLAUDE_MEM_OPENAI_COMPAT_API_KEY — 此端点发放的密钥。可通过设置文件或环境变量设置,也可在 ~/.claude-mem/.env 中设置 OPENAI_COMPAT_API_KEY;查看器无法设置它。本地服务器无需密钥。
CLAUDE_MEM_OPENAI_COMPAT_API_KEYS — 可选:用于轮换的更多密钥(多密钥轮换)。可通过设置文件或环境变量设置,也可在 ~/.claude-mem/.env 中设置 OPENAI_COMPAT_API_KEYS

有关预设和配置,请参阅 OpenAI 兼容提供商。

配额回退设置

设置 默认值 描述
CLAUDE_MEM_QUOTA_FALLBACK_PROVIDER claude 该设置决定在所选提供商无法提供服务时(额度用尽、限流或过载拒绝超过重试次数、发生中断、反复返回不可用回复),观察工作将转往何处,直到其恢复:claude(你的 Anthropic 套餐,仅当存在 Claude 登录或密钥时使用)、gemini、openrouter、openai-compatible,或 off 以改为等待。为空(来自旧版设置文件)等于 claude。参见 配额回退
CLAUDE_MEM_QUOTA_FALLBACK_MODEL — Claude 回退运行所用的 Claude 模型。为空时等于 CLAUDE_MEM_MODEL 并使用层级路由。其他回退方式忽略此设置。
CLAUDE_MEM_QUOTA_FALLBACK_AUTH_METHOD — 在主凭据因配额被占用时用于运行的 Claude 凭据:subscription(Claude Code 登录,用于已耗尽的 ANTHROPIC_API_KEY)或 api-key(ANTHROPIC_FALLBACK_API_KEY,用于已耗尽或被防护暂停的登录)。在 CLAUDE_MEM_QUOTA_FALLBACK_PROVIDER 之前尝试。留空 = 关闭。参见 配额回退

参见 配额回退 了解回退如何开始和结束。

配额防护设置

使用订阅身份验证时,一旦某个使用窗口达到其阈值,观察者就会停止。提供程序已拒绝的窗口无论阈值如何都始终会使其停止。五小时窗口在重置后 15 分钟内达到 85% 或更高时也会使其停止,即使低于其阈值。API-key 身份验证从不停止。

阈值是 0 到 1 之间的小数(0.93 = 93%)。超出该范围的值(例如 93)会回退到默认值,并在 worker 日志中发出警告。空白值使用默认值。

设置 默认值 描述
CLAUDE_MEM_QUOTA_THRESHOLD_FIVE_HOUR 0.95 五小时窗口
CLAUDE_MEM_QUOTA_THRESHOLD_SEVEN_DAY 0.93 每周窗口
CLAUDE_MEM_QUOTA_THRESHOLD_SEVEN_DAY_OPUS 0.93 每周 Opus 窗口
CLAUDE_MEM_QUOTA_THRESHOLD_SEVEN_DAY_SONNET 0.92 每周 Sonnet 窗口
CLAUDE_MEM_QUOTA_THRESHOLD_OVERAGE 0.95 超额用量,正在使用时

观察者预算设置

这些设置适用于所有观察者提供程序。观察者的对话按代(generation)运行。当一代达到其预算时,claude-mem 会将其退役,并启动一个以会话自身观察结果为简报的新一代。预算是 CLAUDE_MEM_OBSERVER_MAX_CONVERSATION_CHARS 与观察者模型上下文窗口一半(约每 token 4 个字符)中的较小值。每个工具调用的参数和结果上限为窗口的十分之一,最多 16,000 个字符。

设置 默认值 描述
CLAUDE_MEM_OBSERVER_MAX_CONVERSATION_CHARS 400000 单个观察者代在退役前可容纳的字符数
CLAUDE_MEM_OBSERVER_CONTEXT_WINDOW — 观察者模型的上下文窗口(以 token 为单位)。留空 = 自动解析:Claude 模型为 200000([1m] 模型 ID 为 1000000),Gemini 模型来自内置映射,OpenRouter 模型来自 OpenRouter 模型目录。任何其他 OpenAI 兼容端点(本地服务器、自定义网关)回退到 131072,因此对于窗口较小的模型,请设置此项,例如 16384。低于 8192 的值会被向上钳制到 8192
CLAUDE_MEM_OBSERVER_MAX_OUTPUT_TOKENS 4096 所有 OpenRouter、自定义端点和 Gemini 观察者请求的输出 token 上限(max_tokens,或对于要求它的端点使用 max_completion_tokens;Gemini 使用 maxOutputTokens)。对于在回答之前就用完上限的推理模型,请调高此值。256–1000000
CLAUDE_MEM_OBSERVE_BARE_PROMPTS false false:用户提示不会单独发送给观察者;它会随下一个工具调用或摘要一起,在同一个请求中发出。true:每个提示发送一个观察者请求,与之前一样

如果提供程序仍以请求超出模型窗口为由拒绝请求,观察者会退役该代,并在新的一代中重试相同的工作,处理方式与它处理 Claude 的“Prompt is too long”的方式相同。

对于这些 HTTP 提供程序,观察者的指令和输出格式作为系统消息发送,用户的请求作为第一条用户消息发送。在输出 token 上限处被截断的回复会以警告形式记录,并指明该上限。

Claude 网关设置

网关凭据存放在 ~/.claude-mem/.env 中,而不是 settings.json。

环境变量 默认值 描述
ANTHROPIC_BASE_URL none 用于 Claude Agent SDK 路径的 LiteLLM 或 Anthropic 兼容网关 URL
ANTHROPIC_AUTH_TOKEN none 可选的 LiteLLM 主密钥或虚拟密钥
ANTHROPIC_API_KEY none 直接使用的 Anthropic API 密钥;在 LiteLLM 网关模式下通常省略此项
ANTHROPIC_FALLBACK_API_KEY none 仅当 Claude Code 登录因配额被占用时使用的 Anthropic API 密钥(CLAUDE_MEM_QUOTA_FALLBACK_AUTH_METHOD=api-key)。其他情况下绝不传递给 CLI

当你希望 CLAUDE_MEM_PROVIDER=claude 通过 LiteLLM 路由,同时保留 Claude Agent SDK worker 路径时,请使用 LiteLLM 网关。

设置 默认值 描述
CLAUDE_MEM_OBSERVER_THINKING disabled Claude 观察者发送的 thinking 参数。disabled 在 Anthropic 原生端点上节省 token。omit 不发送 thinking 字段,适用于上游模型总是思考并拒绝 disabled 的网关(例如 GLM 的错误 1210)。adaptive 让模型自行决定思考多少,这是为不接受预算的模型(如 Claude Haiku 5.5)开启思考的唯一方式。enabled 或 enabled:<budget>(默认预算 1024)开启思考,并在每个观察者请求上消耗思考 token。服务器运行时的 claude 提供程序会从其环境读取相同的设置,并将已启用的预算加到 CLAUDE_MEM_SERVER_MAX_OUTPUT_TOKENS 上,这样思考就不会消耗答案的 token

如果 Anthropic 兼容网关以 400 拒绝 thinking 参数,worker 的观察者会在该会话的剩余时间内丢弃该参数并重试同一批次,这样你在更改设置期间不会丢失任何内容。服务器的提供程序不会重试;对于此类网关,请设置 omit。

系统配置

设置 默认值 描述
CLAUDE_MEM_DATA_DIR ~/.claude-mem 数据目录位置。
CLAUDE_MEM_LOG_LEVEL INFO 日志详细级别(DEBUG、INFO、WARN、ERROR、SILENT)。
CLAUDE_MEM_FETCH_VERBOSE (未设置 / 关闭) 可选择启用的 worker-IPC fetch() 诊断(1/true/on/yes)。传递 Node/undici { verbose: true },并在 socket 级钩子失败时写入错误原因链。默认保持关闭。
CLAUDE_MEM_SESSION_INIT_TIMEOUT_MS 10000(Windows 上为 7000) UserPromptSubmit 钩子每次提示词可用于到达 worker 的总时间(启动检查、会话初始化、语义上下文)。当该时间耗尽时,该提示词将在没有记忆的情况下通过这一轮。接受 500–14000;它必须保持在 Claude Code 对该钩子的 15 秒超时以下。时钟在钩子进程加载后才开始计时,在 Windows 上需要 4–5 秒,因此 Windows 默认值为 7000,任何更高的值都会被截为 7000。Codex 保持其自身的受限 worker 启动等待,其请求都在此预算内。也会从环境中读取。
CLAUDE_MEM_IDLE_EXIT_SEC 0(关闭) 可选的 worker 空闲退出,以秒为单位。0(默认值)永不退出,1 到 59 的值会被提升为 60。如果超过这段时间没有会话活动或运行中的 observer,没有排队的工作,没有打开或最近发出的请求(查看器标签页、记忆搜索、语料库构建),也没有 AI 交互,worker 将通过与 claude-mem stop 相同的优雅关闭流程停止(遥测 shutdown_reason: idle)。下一个读取记忆的钩子(例如会话开始或你的下一条提示词)会再次启动它。那第一条提示词将承担冷启动,如果启动时间超出钩子的时间预算,该提示词将在没有记忆的情况下通过,期间捕获的观察结果会暂存在 hook 暂存区中,直到 worker 恢复。仅在 claude-mem 的钩子运行的场景下启用,例如 Claude Code 和 Codex。对于 OpenCode 插件捕获和 OpenClaw(它们从不启动 worker),以及仅 MCP 的主机(每次空闲退出后的第一次记忆调用都要等待 worker 启动),请保持关闭。当 CLAUDE_MEM_WORKER_AUTOSTART=false 或转录监视处于活动状态时,它保持关闭,因为没有任何东西会再次启动 worker。云同步和转录捕获仅在 worker 运行期间进行。也会从环境中读取。
CLAUDE_MEM_TOOL_USES_RETENTION_DAYS 0(永久保留) 针对 get_tool_uses 背后的原始工具输入/响应索引的可选保留策略。当天数设置为正数时,worker 会在启动时删除一次早于该天数 并且 仍然关联到某个观察记录的 tool_uses 行。没有观察记录、或其观察记录已被删除的行,是这些工具 I/O 的唯一副本,永远不会被删除。被清除的 id 会从 get_tool_uses 返回通常的未找到结果。释放的页面会被 SQLite 重用;要缩小磁盘上的文件则需要执行 VACUUM。30 和 "30" 都有效。任何不是整数天数的值(空值、负数、abc)都会保留全部数据。
CLAUDE_MEM_PYTHON_VERSION 3.13 chroma-mcp 的 Python 版本。
CLAUDE_MEM_CHROMA_UVX_PATH (空——先搜索 uv 的安装文件夹,再搜索 PATH) 用于启动 chroma-mcp 的 uvx,可以是二进制文件的完整路径(在 Windows 上,例如 C:\Users\you\AppData\Local\Programs\Python\Python313\Scripts\uvx.exe)或其所在文件夹。当 pip install uv 将 uvx 安装到 uv 通常的文件夹之外,或另一个工具的 uvx 在 PATH 中排在前面时,请设置此项。同名的环境变量会覆盖 settings.json。仅限文件/环境变量——不能通过查看器 HTTP API 写入。更改后请重启 worker。
CLAUDE_CODE_PATH (自动检测) Claude Code CLI 的路径(用于 Windows)。仅限文件/环境变量——不能通过查看器 HTTP API 写入。
CLAUDE_MEM_PROJECT_NAME_SOURCE path git 仓库的项目名称的推导方式:path(仓库文件夹的名称)或 git-remote(从 origin 远程来源获取的稳定的 org/repo 标识,在重命名文件夹后依然有效,并能区分同名仓库;仓库的每个工作树都共享它)。可选择启用。切换之前存储在文件夹名称下的记忆仍然可读。参见项目名称。
CLAUDE_MEM_PROJECT_ENVIRONMENTS [] 命名环境:一个 JSON 数组,元素为 {"name", "patterns"}。匹配某个环境 glob 模式(与 CLAUDE_MEM_EXCLUDED_PROJECTS 相同的规则)的文件夹会共享一个以该环境命名的项目。参见项目名称。
CLAUDE_MEM_CLAUDE_CONFIG_DIR (未设置——回退到 CLAUDE_CONFIG_DIR/~/.claude) 覆盖要读取哪一个 CLAUDE_CONFIG_DIR 配置文件的 OAuth 钥匙串条目,以及生成的 SDK 子进程所看到的 CLAUDE_CONFIG_DIR。用于在一台机器上同时运行多个命名的 Claude Code 配置文件(例如 ~/.claude-profiles/<name>,每个配置文件分别登录)。仅 macOS 支持钥匙串查找;Windows/Linux 的凭据存储尚不支持配置文件感知。
CLAUDE_MEM_OBSERVER_CLAUDE_CONFIG_DIR (未设置——转录跟随凭据配置文件目录) 仅转录的 CLAUDE_CONFIG_DIR,用于 claude-mem 的内部 SDK 会话(observer、知识语料库)。默认情况下,它们会持久化到 ~/.claude/projects/ 下,像 Codex 这样的导入器会将其作为用户聊天内容拾取;将此设置为专用目录(例如 ~/.claude-mem/observer-claude)可将其隔离在外。凭据不受影响——worker 会继续读取你的默认登录状态,并在每次生成子进程时注入新的 OAuth 令牌,因此该目录本身无需登录。仅当 CLAUDE_MEM_CLAUDE_CONFIG_DIR 未设置时才生效(按设计,显式配置文件会将其转录保留在凭据旁边)。有两点需要注意:注入令牌的子进程无法自行刷新令牌——如果你的 Claude Code 登录过期,捕获会暂停并显示常见的重新登录提示;而且在你设置此目录之前记录的会话无法恢复——在启用此项之前预热的语料库会错过一次恢复,其下一次查询会通过现有的重新预热路径自动恢复到此处的新会话中。若要保留旧会话而不是从头开始,请先移动存储目录:mkdir -p <dir>/projects && mv ~/.claude/projects/-<munged-home>-claude-mem-observer-sessions <dir>/projects/。

Grok Bot Brainbeat Webhook

可选。设置 CLAUDE_MEM_GROK_BOT_WEBHOOK_URL 后,claude-mem 会将每条符合 Grok Bot 感知触发器(CLAUDE_MEM_GROK_BOT_AWARENESS_TRIGGER_TYPES / CLAUDE_MEM_GROK_BOT_AWARENESS_TRIGGER_CONCEPTS,默认类型为 decision,bugfix,security_alert,sensitive)的观察记录 POST 到该 URL。它独立于所有 Telegram 设置。

设置 默认值 说明
CLAUDE_MEM_GROK_BOT_WEBHOOK_URL — brainbeat POST 的接收方;留空 = 关闭。仅限文件/环境变量,会被 GET /api/settings 掩码
CLAUDE_MEM_GROK_BOT_WEBHOOK_SECRET — 可选共享密钥,以 x-claude-mem-shared-secret 发送。仅限文件/环境变量,会被 GET /api/settings 掩码

每条匹配的观察记录以一次 JSON POST 的形式发送:

{
  "event": "claude_mem.brainbeat",
  "observation_id": 1234,
  "type": "security_alert",
  "title": "PII exposure in logs",
  "subtitle": "Raw token printed in retry path",
  "project": "payments-service",
  "concepts": ["auth", "logging"],
  "why_fired": {
    "matched_type": true,
    "matched_concepts": ["auth"]
  },
  "timestamp": "2026-09-02T02:56:46.087Z"
}

POST 会并发发送,每个请求在 5 秒后超时。拒绝重定向,因此共享密钥和观察记录只会被发送到配置的 URL;请将接收方的最终地址填入该设置。失败时仅记录接收方的来源和简短原因(绝不会记录完整 URL),并且绝不会阻塞观察记录的存储或其他通知。

Notion 导出

可选。每条新观察记录在存储时会被复制到 Notion 数据库中。有关设置和数据库结构,请参阅 Notion 导出。

设置 默认值 说明
CLAUDE_MEM_NOTION_ENABLED false 开启导出功能
CLAUDE_MEM_NOTION_TOKEN — Notion 集成密钥。仅限文件/环境变量,会被 GET /api/settings 掩码
CLAUDE_MEM_NOTION_DATABASE_ID — 目标数据库 ID 或 URL
CLAUDE_MEM_NOTION_AUTO_CREATE_PROPERTIES true 首次运行时自动补充缺失的数据库属性

近似重复去重

可选(默认关闭)的去重功能,针对那些标题描述相同重复工作但措辞略有不同的观察记录——仅按字节级相同匹配的 content_hash 会漏掉它们。该功能分为两个确定性的层级:

  • 第 0 层 — 规范化标题精确匹配 → 安全静默自动合并:新观察记录的标题经小写化/空白折叠/去标点处理后与已有记录匹配时,会合并到已有行上,并递增其 occurrence_count(跨会话,且需在同一项目、同一主机平台和同一代理作用域内:主会话的工作绝不会合并到子代理行,SessionStart 会将其排除在外)。升级前存储的行会通过 POST /api/dedup/scan 重新建立键。
  • 第 1 层 — IDF 加权相似度 → 仅供审核的近似重复候选会记录在 observation_dedup_candidates 中(绝不会自动合并),这样仅在一个稀有 token 上存在差异的不同工作(rdlp-api 与 rdlp-plugin)绝不会被静默销毁。
设置 默认值 说明
CLAUDE_MEM_DEDUP_ENABLED false 总开关。关闭时 = 仅字节级相同的旧行为
CLAUDE_MEM_DEDUP_COSINE_THRESHOLD 0.80 第 1 层候选的最小 IDF 加权余弦值
CLAUDE_MEM_DEDUP_IDF_VETO_DF 10 标题 token 出现在 ≤ N 个项目行中时具有“区分性”,可否决合并
CLAUDE_MEM_DEDUP_MIN_SHARED_TOKENS 2 评分前要求至少共享 N 个 token(消除稀疏向量噪声)
CLAUDE_MEM_DEDUP_MIN_PROJECT_DOCS 10 冷启动门槛:项目文档数低于 N 时跳过第 1 层(IDF 不可靠)
CLAUDE_MEM_DEDUP_MAX_SCAN 2000 每次插入时第 1 层候选扫描的上限
CLAUDE_MEM_DEDUP_MAX_BACKFILL_ROWS 50000 dedup-scan 会跳过大于此规模的项目(内存安全)

在现有数据库上启用后,请运行一次性扫描来回填 IDF 模型并呈现累积的近似重复项:POST /api/dedup/scan(worker,仅限 localhost)。通过 GET /api/dedup/candidates?project=<name> 审核候选(添加 &status=pending 可仅查看未审核的候选),并使用 POST /api/dedup/candidates/<id>/resolve 及请求体 {"status": "distinct"} 或 {"status": "dismissed"} 记录判定。后续扫描会保留该判定。

模型配置

配置由哪个 Claude 模型来压缩你的观察记录(仅在 CLAUDE_MEM_PROVIDER=claude 时生效)。

可用模型

值 说明
claude-haiku-4-5-20251001 默认 — 最快,非常适合压缩
claude-sonnet-5 质量与速度均衡
claude-opus-4-8 质量最高(最慢)

通过安装程序选择

npx claude-mem install 会提示选择 Claude 模型(当选中 Claude 提供方时),并将选择持久化到 ~/.claude-mem/settings.json。

手动配置

编辑 ~/.claude-mem/settings.json:

{
  "CLAUDE_MEM_MODEL": "claude-haiku-4-5-20251001"
}

模式配置

配置当前的工作流模式和语言。

设置

设置 默认值 说明
CLAUDE_MEM_MODE code 定义行为和语言。参见 模式与语言。

示例

西班牙语代码模式:

{
  "CLAUDE_MEM_MODE": "code--es"
}

邮件调查模式:

{
  "CLAUDE_MEM_MODE": "email-investigation"
}

项目名称

claude-mem 将每条观察记录按项目名称归档,SessionStart 会注入为当前项目存储的记忆。

  • 在 git 仓库内,名称是仓库根目录的文件夹名称,因此每个子文件夹都共用该名称。git worktree 存储为 <repo>/<worktree>(如果一个 worktree 的文件夹与仓库自身同名,例如 Codex 的 ~/.codex/worktrees/<id>/<repo>,则存储为 <repo>),git 子模块存储为 <superproject>/<path>;两者也都会读取其父仓库的记忆。子模块在按这种方式归组之前以其自身文件夹名称存储的记忆,仍可从该子模块中读取。当删除某个 worktree 或子模块检出时,worker 会在下次启动时将其记忆并入父仓库(无论是否已合并),因此不会有任何记忆被遗留。
  • 设置 CLAUDE_MEM_PROJECT_NAME_SOURCE=git-remote 后,带有 origin 远程的仓库改用其 org/repo 简称来命名(例如 thedotmack/claude-mem),这样重命名或重新克隆文件夹后仍能保留其记忆,两个同名文件夹的仓库也会彼此区分开,并且该仓库的每个 worktree 都共用这一简称(子模块作为独立仓库,则按其自身的 origin 命名)。以文件夹名称为基础存储的记忆仍然可读,而且切换前被删除的 worktree 的记忆仍会并入仓库。没有可用 origin(或 origin 为本地)的仓库继续使用基于文件夹的名称。
  • 在 git 之外,名称就是当前文件夹的名称。若要为某个非 git 项目在所有子文件夹中统一使用一个名称,请在其根文件夹中放置一个空的 .claude-mem-project 文件(或 .claude-mem.json):其下的所有文件夹随即都使用根文件夹的名称。在添加该文件之前,以子文件夹自身名称存储的记忆仍可从该子文件夹中读取。位于主目录、系统临时目录或 Claude 配置目录中的标记文件会被忽略,因此它们绝不会把无关的文件夹归并到一起。
  • 命名环境(CLAUDE_MEM_PROJECT_ENVIRONMENTS)会将多个文件夹(无论是否为 git)归组到同一个项目中,并优先于上述所有规则。例如,[{"name": "acme", "patterns": ["~/work/acme/**"]}] 会把 ~/work/acme 下的所有内容统一记作 acme,SessionStart 也会将其标记为环境。这些文件夹以其自身名称存储的记忆仍可从它们中读取;若要将其永久并入该环境,请运行 npx claude-mem project merge <old-name> acme(只要 worker 正在运行,该命令便会在 claude-mem 的 worker 内执行)。该合并不会重写任何内容(行会被标记为已合并,正如 worktree 并入其仓库的方式),并且会一并带入已经并入旧名称的记忆,例如某个已合并 worktree 的记忆。它会通过云同步到达你的其他设备,并更新语义搜索;如果最后一步失败,命令会明确提示,再次运行即可重试。

环境模式与 CLAUDE_MEM_EXCLUDED_PROJECTS 使用相同的 glob 规则。完整的 **/ 段匹配零个或多个目录:~/work/**/private 同时匹配 ~/work/private 和 ~/work/team/private。在末尾添加 /** 即可同时匹配它们的后代。

文件与目录

数据目录结构

数据目录的位置取决于环境: - 生产环境(已安装的插件):~/.claude-mem/(始终如此,无论 CLAUDE_PLUGIN_ROOT 为何) - 开发环境:可使用 CLAUDE_MEM_DATA_DIR 覆盖

~/.claude-mem/
├── claude-mem.db           # SQLite database
├── .install-version        # Version marker written by `npx claude-mem install`/`repair`
├── settings.json           # Worker port + provider/model settings
└── logs/
    ├── worker-out.log      # Worker stdout logs
    └── worker-error.log    # Worker stderr logs

插件目录结构

${CLAUDE_PLUGIN_ROOT}/
├── .claude-plugin/
│   └── plugin.json         # Plugin metadata
├── .mcp.json               # MCP server configuration
├── hooks/
│   └── hooks.json          # Hook configuration
├── scripts/                # Built executables
│   ├── claude-mem-launcher.cjs # Compiled at install into the on-PATH `claude-mem` hook launcher
│   ├── ensure-launcher.cjs # Startup SessionStart self-heal for the launcher
│   ├── version-check.js    # Setup hook (--init / --maintenance): completes missing dependencies, records the install marker
│   ├── worker-service.cjs  # Worker service + hook dispatcher (CJS)
│   └── mcp-server.cjs      # MCP search server (CJS)
└── ui/
    └── viewer.html         # Web viewer UI bundle

插件配置

Hook 配置

Hook 注册在 plugin/hooks/hooks.json 中。每个运行时 hook 都是一条 exec 形式的条目,不使用 shell:{"command": "claude-mem", "args": ["hook", "claude-code", "<event>"]}。Claude Code 会在 PATH 中找到 claude-mem:这是一个小型编译启动器,由 npx claude-mem install / update 放置到 ~/.local/bin(POSIX)或 %LOCALAPPDATA%\claude-mem\bin(Windows)。该启动器在 Bun 下运行单一分发器 worker-service.cjs hook claude-code <event>。接入的事件有:

  • Setup → version-check.js(安装缺失的插件依赖,记录 .install-version)。唯一使用 bash 的条目;Claude Code 仅在 claude --init / --maintenance 时触发它。
  • SessionStart → claude-mem start(worker,异步),随后执行 hook claude-code context(上下文注入);启动时还会执行 node ${CLAUDE_PLUGIN_ROOT}/scripts/ensure-launcher.cjs,该脚本会为仅通过 marketplace 安装的情况放置或刷新启动器
  • UserPromptSubmit → hook claude-code session-init
  • PreToolUse(匹配器 Read)→ hook claude-code file-context(同步:将文件的观察时间线作为上下文添加,并可阻止对整个文件的 Read;请参阅 文件读取门控)
  • PostToolUse(匹配器 *)→ hook claude-code observation
  • Stop → hook claude-code summarize
  • SessionEnd → hook claude-code session-end

确切的 hooks.json 条目由 scripts/build-hooks.js 生成并随插件一起发布;除非你清楚自己在做什么,否则不要在 marketplace 副本中手工编辑它们。npx claude-mem doctor 会针对 hooks 将要运行的 claude-mem 显示一行 Hook 启动器。

关闭工具钩子

这些开关只从钩子的环境中读取,而不是从 ~/.claude-mem/settings.json 读取。将它们设置在 ~/.claude/settings.json 的 env 块中(Claude Code 会将该块传递给每个钩子),或者在 shell 中导出它们:

变量 设为 1 时的效果
CLAUDE_MEM_DISABLE_TOOL_HOOKS PreToolUse(file-context)和 PostToolUse(observation)会立即返回空操作。SessionStart、UserPromptSubmit 和 Stop 继续正常工作。
CLAUDE_MEM_DISABLE_OBSERVATION 只有 PostToolUse observation 返回空操作(不再捕获工具调用)。
CLAUDE_MEM_DISABLE_FILE_CONTEXT 只有 PreToolUse file-context 返回空操作:在 Read 之前不再注入文件历史,并且文件读取门永远不会阻止 Read。

Claude Code 仍然会启动每个钩子。claude-mem 钩子启动器会在解析插件或启动 Bun 之前检查这些开关,因此被禁用的工具钩子不会加载 worker bundle。Codex shell 钩子会在启动 Node 之前检查它们;Codex Windows 启动器仍会先启动 Node,然后在解析脚本或启动 Bun 之前检查开关。这些开关不会改变 settings.json 中的功能设置。

关闭会话结束摘要

变量 设为 1 时的效果
CLAUDE_MEM_DISABLE_SUMMARY Stop 钩子(summarize)会跳过会话结束摘要和 advisor 调用捕获:不会进行 observer-model 调用,也不会产生 session_summaries 行。SessionStart 和 UserPromptSubmit 继续正常工作,Kimi 在压缩后的上下文刷新仍会发生。

编排器如果会启动短时无头运行(比如对暂存 diff 执行 codex exec 审查),通常会设置 CLAUDE_MEM_DISABLE_OBSERVATION=1,这样该运行过程中观察到的任何内容都不会被捕获。摘要开关为这些运行补齐了最后一块拼图:它们仍会在会话开始时读取 claude-mem 上下文,但它们的 Stop 不再把中间 diff 的摘要写入项目的近期摘要。与工具钩子开关不同,这项检查在 summarize 处理器内部运行,因此钩子进程仍会启动并读取其输入,然后摘要才会被跳过。

搜索配置

Claude-Mem 提供 MCP 搜索工具,用于查询你的项目历史。

无需配置——MCP 工具在 Claude Code 会话中自动可用。

搜索操作可通过以下方式使用:

  • MCP Server:3 个工具(search、timeline、get_observations),支持渐进式披露
  • HTTP API:worker service 端口上的 10 个端点(按用户计算,默认 37700 + (uid % 100);参见 ~/.claude-mem/settings.json)
  • 自动调用:Claude 能识别关于过往工作的自然语言查询

Worker Service 管理

Worker service 由 Bun 作为后台进程管理。worker 会在首次会话时自动启动,并在后台持续运行。

Observation TV 远程访问

默认情况下,worker 绑定到 127.0.0.1,并且没有任何请求认证——回环绑定是它唯一的防线。CLAUDE_MEM_TV_TOKEN 增加了一个只读广播通道,因此你局域网上的第二台设备(手机、iPad、备用显示器)可以观看 Observation TV,除此之外什么都做不了。

生成令牌:

node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"

主机设置和令牌成对配合:

CLAUDE_MEM_WORKER_HOST CLAUDE_MEM_TV_TOKEN 结果
127.0.0.1(默认) 空 与当前一致:机器外部无法访问任何内容。推荐给所有不远程使用 TV 的人。
127.0.0.1 已设置 令牌不起作用——反正没有任何东西能访问该端口。无害。
0.0.0.0 空 危险,且与当前一致:完整 API——包括设置(含 provider API 密钥)、删除、导入、better-auth——都暴露在局域网中。这正是 Docker 配置已经在要求大家做的事,所以 worker 会发出警告而不是拒绝绑定。
0.0.0.0 已设置 该功能的意义所在。局域网设备携带该机密可以访问 /tv、/tv.html、/stream、GET /api/observations,访问其他任何内容都会得到 404/403/401。

使用非回环主机且未设置令牌启动时,会记录一条 SECURITY 警告;worker 仍会绑定。

本地端口转发会让整个 API 重新暴露。该守卫按 socket 对端来豁免回环,因此任何以回环身份到达的流量都会完全绕过它——包括从另一台设备执行 ssh -L <port>:127.0.0.1:<port> <box>,或任何本地转发代理。对于 worker 来说,这些流量与操作者自己的浏览器流量无法区分,因此它能获得完整 API,包括 GET /api/settings 及其中的 provider API 密钥。这是“该设备无法做任何其他事”这一说法不再成立的唯一切实方式:只把端口转发给你愿意把整台机器交给它的设备。

Docker 与桥接网络。 在桥接网络容器内,如果设置了 CLAUDE_MEM_WORKER_HOST=0.0.0.0,来自宿主机自身浏览器的请求会从桥接网关地址到达,而不是 127.0.0.1。一旦设置了令牌,该浏览器就会像任何其他设备一样被视为远程设备,必须提供 ?token= 才能打开 TV——并且 / 上的 React 查看器会被直接拒绝,与任何其他远程设备完全相同。

在第二台设备上通过 http://<lan-ip>:<port>/tv.html?token=<secret> 打开 TV。

设置令牌后,位于 / 的 React 查看器将无法远程工作。 这是有意为之——查看器需要守卫所拒绝的写入路由和设置路由。回环从不受限制,因此该查看器在运行 worker 的机器上仍可正常工作。

将 URL 视为机密。 令牌随查询字符串附加在 /stream 中,因为浏览器的 EventSource API 无法设置请求头。它不会被写入 worker 日志(请求记录器记录的是 req.path,不包含查询字符串),但它会留在你打开它的设备的浏览器历史记录中。对于任何可以设置请求头的方式,Authorization: Bearer <token> 和 X-Api-Key: <token> 也同样有效。

这是纯 HTTP。 token 可阻止未认证的设备读取流;但它不会加密。任何能嗅探你局域网的人都能看到观察标题。对于家庭网络,这是可接受的权衡;对于其他场景,请在 worker 前端终止 TLS(此处不展开)——并且仍然绝不要对未修改的 worker 使用隧道,否则会把 GET /api/settings 及其供应商 API 密钥发布到公网。

请使用精确路径。 允许列表是精确匹配且区分大小写的:/tv.html、/tv、/stream、/api/observations,仅此而已。尾部斜杠或不同大小写——/tv/、/API/observations、/api/observations/by-file——即使使用有效 token 也会返回 404。这是刻意设计的 fail-closed 行为,而非 bug。

TV 的 ?project= 和 ?source= 过滤器仅限客户端。它们是显示过滤器,不是访问控制——token 持有者仍会收到每个项目的观察记录。

已接受的风险,明确列出:

  1. GET /api/observations 返回完整的观察正文 —— narrative、facts、text、files_read、files_modified —— 涵盖机器上的每个项目,而不仅仅是 TV 渲染的四个字段。token 持有者可以使用 offset 翻遍整个记忆数据库。
  2. /stream 不过滤。 它承载机器上每个项目的所有观察记录,外加项目目录和处理状态。没有按客户端进行过滤。
  3. 没有速率限制。 token 持有者可以随意频繁请求 GET /api/observations。
  4. token 可通过 GET /api/settings 在 loopback 上读取,正如你当前的供应商 API 密钥一样。它刻意不能通过 POST /api/settings 写入(该路由未认证),因此只有具备文件系统或环境访问权限的人才能设置它。
  5. /stream 并非无副作用。 每次新连接都会触发一次 initial_load 广播,发送给所有已连接的客户端,而且客户端列表无上限。因此,token 持有者循环重连可能会干扰操作者自己的本地查看器。这是 worker 既有的行为;token 只是让它新近可以从局域网访问。

手动配置

编辑 ~/.claude-mem/settings.json:

{
  "CLAUDE_MEM_WORKER_HOST": "0.0.0.0",
  "CLAUDE_MEM_TV_TOKEN": "your-minted-token"
}

然后重启 worker:

npm run worker:restart

在局域网外观看(cmem.ai Pro)

以上都是局域网路径。从外部网络观看——在蜂窝网络、咖啡馆、另一处住所——是 cmem.ai Pro 功能:在登录你的账户后,于任意浏览器打开 https://cmem.ai/tv。它要求启用 Cloud Sync,因为托管页面读取的是你的 worker 已经推送到同步中心的标题。

无需 token,无需开放端口,无需入站连接。 此路径既不需要 CLAUDE_MEM_TV_TOKEN,也不需要非 loopback 的 CLAUDE_MEM_WORKER_HOST——两者都属于局域网路径,对它没有影响,因此请保持默认值。机器绝不会为托管 TV 接受入站连接;worker 只会向外拨出。不需要任何隧道(cloudflared、ngrok 或类似工具),也不建议使用任何隧道。

托管 TV 界面只显示观察标题,不显示任何其他内容。 它从不渲染叙事、事实、文件列表、片段或 prompt 文本。

这与“只有标题离开你的机器”不是一回事。 托管 TV 是 cloud sync 的一项功能,而 cloud sync 会将你的观察叙事和完整 prompt 文本上传到你的 cmem.ai 账户下的同步中心。托管页面仅包含标题;其背后的上传并非如此。如果这些内容必须保留在你的机器上,请不要启用 cloud sync。

一个渲染上的差异。 没有标题的观察记录仍会出现在局域网 TV 上,此时会回退到副标题。它不会出现在托管手机 TV 上——该界面只接收标题,因此没有副标题可供回退。

文件夹上下文文件

Claude-mem 可以自动在你的项目文件夹中生成带有活动时间线的 CLAUDE.md 文件。此功能默认禁用。

设置 默认值 描述
CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED false 启用文件夹 CLAUDE.md 文件的自动生成

Grok Bot 实时 INDEX

worker 会将不断增长的观察 INDEX 写入每个 Grok Bot 席位的 Memory mid-attach 文件(agents/<uuid>/memory/log/zz-claude-mem-inject.md)。参见 Grok Bot 集成。

设置 默认值 描述
CLAUDE_MEM_GROK_BOT_INJECT_ENABLED true 实时写入 INDEX。设为 false 可禁用。当不存在任何 Grok Bot 席位时无操作。
CLAUDE_MEM_GROK_BOT_INJECT_AGENT_IDS * * / all / 空 = 每个活跃席位;或一个以逗号分隔的 UUID 列表。
CLAUDE_MEM_GROK_BOT_INJECT_FALLBACK house house 用最新的 worker 观察记录填充内容较少的席位日记。off = 仅限席位项目。
CLAUDE_MEM_GROK_BOT_INJECT_TIER episode 记忆等级前缀(episode、plain、note)。
CLAUDE_MEM_GROK_BOT_INJECT_WINDOW 80 保留的最新 INDEX 行数(最大 100)。
CLAUDE_MEM_GROK_BOT_INJECT_PLATFORM_SOURCE — 可选的主机过滤器。除非你想要仅 grok 的行,否则请留空。
CLAUDE_MEM_GROK_BOT_INJECT_PROJECTS_BY_AGENT — 可选的 uuid=projA,projB;uuid2=projC 覆盖,用于转录监控项目。

关于此功能的工作原理、配置选项和 git 集成建议的完整文档,请参见 文件夹上下文文件。

上下文注入配置

Claude-Mem 会将过去的观察记录注入每个新会话,让 Claude 了解近期工作。你可以使用上下文设置模态框精确配置要注入的内容。

上下文设置模态框

从 Web 查看器访问设置模态框。worker 会在启动时打印其 URL;端口来自 CLAUDE_MEM_WORKER_PORT。

  1. 点击页眉中的齿轮图标
  2. 在右侧面板中调整设置
  3. 在左侧的终端预览中实时查看更改
  4. 点击保存以保留更改

终端预览会显示所选项目和来源。选择 所有来源 可预览合并后的 SessionStart 上下文。

加载设置

控制注入多少条观察记录:

设置 默认值 范围 描述
观察记录 50 1-200 要包含的近期观察记录总数
在会话开始时包含所有来源 关 开/关 在启动上下文中包含来自 Claude、Codex 和其他工具链的观察记录
会话 10 1-50 从中提取观察记录的近期会话数

注意事项: - 值越高 = 上下文越多,但 SessionStart 越慢且消耗更多 Token - 值越低 = SessionStart 更快,但历史感知更弱 - 默认从 10 个会话中提取 50 条观察记录,在上下文丰富度与性能之间取得平衡

筛选设置

控制包含哪些观察类型和概念:

类型(可选择任意组合): - bugfix — Bug 修复与错误解决 - feature — 新增功能 - refactor — 代码重构 - discovery — 对代码运行方式的了解 - decision — 架构或设计决策 - change — 一般代码变更

概念(可选择任意组合): - how-it-works — 系统行为说明 - why-it-exists — 代码/设计存在的原因 - what-changed — 变更摘要 - problem-solution — 问题/解决方案对 - gotcha — 边界情况与陷阱 - pattern — 反复出现的模式 - trade-off — 设计权衡

使用“全部”或“无”按钮可快速全选/取消全选所有选项。

显示设置

控制观察记录在上下文中的显示方式:

完整观察记录: | 设置 | 默认值 | 选项 | 描述 | |---------|---------|---------|-------------| | 数量 | 5 | 0-20 | 显示展开详情的观察记录条数 | | 字段 | narrative | narrative、facts | 展开哪个字段 |

最近的 N 条观察记录(由数量设置)显示完整的叙述或事实。其余观察记录仅以紧凑表格格式显示标题、类型和 Token 数量。

Token 经济性(开关): | 设置 | 默认值 | 描述 | |---------|---------|-------------| | 读取成本 | true | 显示读取每条观察记录所需的 Token | | 工作投入 | true | 显示创建观察记录所花费的 Token | | 节省量 | true | 显示通过重用上下文节省的 Token 总量 |

Token 经济性帮助您理解缓存观察记录与重新读取文件相比的价值。

高级设置

设置 默认值 描述
模型 sonnet 用于生成观察记录的 AI 模型
工作端口 37700 + (uid % 100) 后台 Worker Service 的端口(可通过 CLAUDE_MEM_WORKER_PORT 覆盖)
MCP 搜索服务器 true 启用 Model Context Protocol 搜索工具
包含上次摘要 false 将上一会话的摘要添加到上下文
包含最后一条消息 false 将上一会话的最后一条消息添加到上下文
阻止整文件读取 true 阻止对具有观察历史的 32 KB 及以上代码文件进行整文件读取(文件读取门控)

手动配置

设置存储于 ~/.claude-mem/settings.json:

{
  "CLAUDE_MEM_CONTEXT_OBSERVATIONS": "100",
  "CLAUDE_MEM_SESSION_START_INCLUDE_ALL_SOURCES": "true",
  "CLAUDE_MEM_CONTEXT_SESSION_COUNT": "20",
  "CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES": "bugfix,decision,discovery",
  "CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS": "how-it-works,gotcha",
  "CLAUDE_MEM_CONTEXT_FULL_COUNT": "10",
  "CLAUDE_MEM_CONTEXT_FULL_FIELD": "narrative",
  "CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS": "true",
  "CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS": "true",
  "CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT": "true",
  "CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY": "false",
  "CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE": "false"
}

注意:上下文设置弹窗(位于 Web 查看器中)是配置这些设置的推荐方式,因为它提供变更的实时预览。

自定义

可在 ~/.claude-mem/settings.json 中自定义设置。

自定义数据目录

编辑 ~/.claude-mem/settings.json:

{
  "CLAUDE_MEM_DATA_DIR": "/custom/path"
}

自定义工作端口

编辑 ~/.claude-mem/settings.json:

{
  "CLAUDE_MEM_WORKER_PORT": "38000"
}

然后重启 Worker Service:

npm run worker:restart

自定义模型

编辑 ~/.claude-mem/settings.json:

{
  "CLAUDE_MEM_MODEL": "opus"
}

然后重启 Worker Service:

export CLAUDE_MEM_MODEL=opus
npm run worker:restart

自定义跳过工具

控制哪些工具被排除在观察记录之外。编辑 ~/.claude-mem/settings.json:

{
  "CLAUDE_MEM_SKIP_TOOLS": "ListMcpResourcesTool,SlashCommand,Skill"
}

默认排除的工具: - ListMcpResourcesTool - SlashCommand - Skill - TodoWrite - AskUserQuestion

常见自定义: - 包含 TodoWrite:从跳过列表中移除以跟踪任务规划 - 包含 AskUserQuestion:移除以捕获决策对话 - 跳过更多工具:添加工具名称以减少观察记录噪音

更改将在下一次工具执行时生效(无需重启 Worker Service)。

高级配置

Hook 超时

Hook 超时设置在 plugin/hooks/hooks.json 中。当前默认值与每个生命周期阶段的工作负载形态相匹配:

  • Setup(version-check.js,仅 claude --init / --maintenance):300 秒上限;插件依赖完整时很快,需要运行 bun install 时最多 120 秒
  • SessionStart(worker-start + 上下文):60 秒
  • SessionStart(ensure-launcher,仅启动时,同步):180 秒,足以编译启动器
  • UserPromptSubmit:15 秒
  • PreToolUse(file-context,Read 匹配器):15 秒,同步执行以便文件读取门控能够阻止 Read;其 Worker Service 查找在 3 秒后放弃
  • PostToolUse(观察):120 秒
  • Stop(摘要):120 秒

npx claude-mem install / npx claude-mem repair 在会话生命周期之外安装运行时(Bun、uv、bun install)。Setup Hook 仅在所加载插件的依赖缺失时运行 bun install(通常是插件市场安装或 claude plugin update),并在依赖完成后写入 .install-version 标记。Claude Code 在插件安装或更新时不会触发 Setup,因此请运行 claude --init-only 或 npx claude-mem install 来触发该修复。

Worker 内存限制

Worker Service 由 Bun 管理,遇到问题时会自动重启。内存使用量通常较低(约 100-200MB)。

日志详细程度

启用调试日志:

export DEBUG=claude-mem:*
npm run worker:restart
npm run worker:logs

配置最佳实践

  1. 使用默认值:默认配置适用于大多数使用场景
  2. 有选择地覆盖:只修改你需要的配置
  3. 记录变更:跟踪自定义配置
  4. 变更后测试:验证 Worker 能成功重启
  5. 监控日志:配置更改后检查 Worker 日志

配置故障排查

配置未生效

  1. 更改后重启 Worker:

    npm run worker:restart
    

  2. 验证环境变量:

    echo $CLAUDE_MEM_MODEL
    echo $CLAUDE_MEM_WORKER_PORT
    

  3. 检查 Worker 日志:

    npm run worker:logs
    

无效的模型名称

如果你指定了无效的 Claude 模型名称,Worker 会记录一条警告并使用默认模型。CLAUDE_MEM_MODEL 的有效 Claude 模型:

  • claude-haiku-4-5-20251001(默认)
  • claude-sonnet-5
  • claude-opus-4-8

端口已被占用

默认 Worker 端口是 37700 + (uid % 100),因此同一台机器上的不同操作系统用户会自动获得不同的端口。如果仍然遇到冲突(例如以相同的 UID 运行多个配置文件),请设置固定端口:

  1. 设置自定义端口:

    export CLAUDE_MEM_WORKER_PORT=38000
    

  2. 重启 Worker:

    npm run worker:restart
    

  3. 验证新端口:

    curl -s http://127.0.0.1:$CLAUDE_MEM_WORKER_PORT/api/health | jq .port
    

后续步骤

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/claude-mem