Skip to content

私人标签

概览

使用 <private> 标签来标记你不希望保存在 claude-mem 观察数据库中的内容。这可以让你对跨会话记忆的内容进行精细控制。

运作方式

将任何内容包裹在 <private> 标签中:

<private>
This content will not be stored in memory
</private>

Claude 可以在当前会话中查看和使用此内容,但不会将其保存为观察记录。

使用案例

1. 敏感信息

Please analyze this error:

<private>
Error: Database connection failed
Host: internal-db-prod.company.com
Port: 5432
User: admin_user
</private>

What might be causing this?

克洛德看到了完整的错误,但只有问题被保存下来。

2. 临时上下文

<private>
Here's some background context just for this session:
- Project deadline is tomorrow
- This is a hotfix for production
- Manager asked for this specifically
</private>

Help me fix this bug quickly.

3. 调试信息

<private>
Debug output from previous run:
[... 500 lines of logs ...]
</private>

Based on these logs, what's the root cause?

4. 探索性提示

<private>
I'm just brainstorming here, not making a final decision
</private>

What are some wild approaches to solving this?

技术细节

标签行为

  • 多行支持:标签可以换行显示多行内容
  • 多个标签:你可以在一条消息中使用多个 <private> 部分
  • 嵌套标签:内层标签包含在外层标签删除中
  • 始终启用:无需配置 - 自动工作

被过滤的内容

<private> 标签从存储和内存中过滤内容:

  • 用户提示存储 - 在保存到 user_prompts 表之前,会删除标签
  • 工具输入 - 传递给工具的参数在创建观察之前会被过滤
  • 工具响应 - 工具的输出在创建观察前会被过滤
  • 所有可搜索的内容 - 私密内容永远不会进入数据库或搜索索引

重要:标签在存储时会被剥离,而不是在实时对话中。Claude 在会话期间可以看到包括 <private> 标签在内的完整内容,只有当内容被保存到数据库时,它们才会消失。

未被过滤的内容

  • 会议总结(仅根据非私人观察生成)
  • 克洛德的回应(未被 claude-mem 捕获)

例子

示例 1:API 密钥

<private>
API_KEY=sk-proj-abc123xyz789
</private>

Test this API connection for me

API 密钥不会被存储,但 Claude 可以在会话期间使用它。

示例 2:个人笔记

<private>
Note to self: This is for the Smith project - the one we discussed
last Tuesday. Don't confuse with the Jones project.
</private>

Review the authentication implementation and suggest improvements.

个人上下文帮助 Claude 理解你的请求,而不会污染你的观察历史。

最佳实践

  1. 不要过度标记:仅在你确实不希望保存内容时使用 <private>
  2. 上下文很重要:Claude 对你项目的理解来自观察——过度的私人标记会降低未来上下文的质量
  3. 秘密属于别处:虽然 <private> 阻止存储,敏感数据仍应使用适当的秘密管理
  4. 测试它是否有效:如果你不确定标签是否被移除,请检查 ~/.claude-mem/silent.log

验证

要验证标签是否工作:

  1. 提交一个包含 <private> 标签的提示
  2. 检查数据库以确保不存储私人内容:
    bash
    # Check user prompts
    sqlite3 ~/.claude-mem/claude-mem.db "SELECT prompt_text FROM user_prompts ORDER BY created_at_epoch DESC LIMIT 1;"
    
    # Check observations
    sqlite3 ~/.claude-mem/claude-mem.db "SELECT narrative FROM observations ORDER BY created_at_epoch DESC LIMIT 1;"
  3. 私人内容不应出现在 user_prompts 或 observations 中
  4. <private> 标签本身也应该被去掉

建筑

<private> 标签使用 边缘处理模式

  • 内容在任何存储之前会在钩子层进行过滤
    • UserPromptSubmit 钩子:在将用户提示保存到 user_prompts 表之前清除标签(您输入的提示在存入数据库前会被清理)
    • PostToolUse 钩子:在创建观察之前,从序列化的 tool_input 和 tool_response JSON 中去除标签
  • 在数据到达Worker 服务或数据库之前会进行过滤
  • 这保持了工作器的简单性,并遵循单向数据流
  • 标签在实时对话中保持可见,但会从所有持久存储中移除

标签去除范围:该实现从工具输入和工具响应的序列化 JSON 表示中去除标签,而不是从对话界面中的原始用户提示文本中去除。您输入的用户提示文本存储在一个单独的表(user_prompts)中,在存储之前标签也会被去除。

这个设计确保私密内容永远不会到达数据库、搜索索引或内存代理,从而保持临时数据和持久数据之间的清晰分离。

相关功能

故障排除

标签未被去除

  1. 验证正确的语法:<private>content</private>
  2. 检查 ~/.claude-mem/silent.log 是否有错误
  3. 确保工作进程正在运行:npm run worker:status
  4. 重新启动 Worker 进程:npm run worker:restart

部分内容已存储

如果内容在观察中部分出现:

  • 确保标签正确关闭
  • 检查标签名称中的拼写错误
  • 验证内容是否在工具执行中(不仅仅是在你的提示文本中)

静默日志显示错误

如果您在 ~/.claude-mem/silent.log 中看到错误:

[save-hook] stripMemoryTags received non-string: { type: 'object' }

这通常是无害的——它表明防御型类型检查正在起作用。然而,如果你经常看到这些,可能意味着存在一个错误。请在 https://github.com/thedotmack/claude-mem/issues 上报告。