私人标签
概览
使用 <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 meAPI 密钥不会被存储,但 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 理解你的请求,而不会污染你的观察历史。
最佳实践
- 不要过度标记:仅在你确实不希望保存内容时使用
<private> - 上下文很重要:Claude 对你项目的理解来自观察——过度的私人标记会降低未来上下文的质量
- 秘密属于别处:虽然
<private>阻止存储,敏感数据仍应使用适当的秘密管理 - 测试它是否有效:如果你不确定标签是否被移除,请检查
~/.claude-mem/silent.log
验证
要验证标签是否工作:
- 提交一个包含
<private>标签的提示 - 检查数据库以确保不存储私人内容: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;" - 私人内容不应出现在 user_prompts 或 observations 中
<private>标签本身也应该被去掉
建筑
<private> 标签使用 边缘处理模式:
- 内容在任何存储之前会在钩子层进行过滤
- UserPromptSubmit 钩子:在将用户提示保存到 user_prompts 表之前清除标签(您输入的提示在存入数据库前会被清理)
- PostToolUse 钩子:在创建观察之前,从序列化的 tool_input 和 tool_response JSON 中去除标签
- 在数据到达Worker 服务或数据库之前会进行过滤
- 这保持了工作器的简单性,并遵循单向数据流
- 标签在实时对话中保持可见,但会从所有持久存储中移除
标签去除范围:该实现从工具输入和工具响应的序列化 JSON 表示中去除标签,而不是从对话界面中的原始用户提示文本中去除。您输入的用户提示文本存储在一个单独的表(user_prompts)中,在存储之前标签也会被去除。
这个设计确保私密内容永远不会到达数据库、搜索索引或内存代理,从而保持临时数据和持久数据之间的清晰分离。
相关功能
- 搜索工具 - 如何搜索过去的观察记录
- 入门 - 基本使用指南
- Configuration - 系统设置和环境变量]
故障排除
标签未被去除
- 验证正确的语法:
<private>content</private> - 检查
~/.claude-mem/silent.log是否有错误 - 确保工作进程正在运行:
npm run worker:status - 重新启动 Worker 进程:
npm run worker:restart
部分内容已存储
如果内容在观察中部分出现:
- 确保标签正确关闭
- 检查标签名称中的拼写错误
- 验证内容是否在工具执行中(不仅仅是在你的提示文本中)
静默日志显示错误
如果您在 ~/.claude-mem/silent.log 中看到错误:
[save-hook] stripMemoryTags received non-string: { type: 'object' }这通常是无害的——它表明防御型类型检查正在起作用。然而,如果你经常看到这些,可能意味着存在一个错误。请在 https://github.com/thedotmack/claude-mem/issues 上报告。