Chat Logger(严格触发规则版)
name: chat_logger
by bjmfjoy · published 2026-04-01
$ claw add gh:bjmfjoy/bjmfjoy-chat-logger---
name: chat_logger
description: |
对话记录 - 自动记录飞书/钉钉消息(严格触发规则版)
⚠️ 严格触发规则:
- 消息 "chatlog汇总" → 只能执行此 Skill,禁止主 Agent 处理
- 消息 "今日简报" → 只能执行此 Skill,禁止主 Agent 处理
- 消息 "我的记录" → 只能执行此 Skill,禁止主 Agent 处理
设计原则:
- 精确匹配触发,不经过主 Agent 判断
- 提供清晰的 API 供主 Agent 使用
- 自检功能确保记录正常
---
# Chat Logger(严格触发规则版)
⚠️ 严格触发规则(AGENTS.md 必须遵守)
触发规则表
| 用户消息 | 执行动作 | 主 Agent 行为 |
|:---|:---|:---|
| `chatlog汇总` | 调用 `handle_chat_query()` | **禁止处理,直接返回结果** |
| `今日简报` | 调用 `handle_chat_query()` | **禁止处理,直接返回结果** |
| `我的记录` | 调用 `handle_chat_query()` | **禁止处理,直接返回结果** |
| 其他消息 | 调用 `record_message()` | 正常处理 |
主 Agent 必须遵守的流程
from skills.chat_logger.skill import handle_chat_query, record_message
# 第1步:检查是否是 Chat-Logger 查询指令(严格匹配)
if message.strip() in ["chatlog汇总", "今日简报", "我的记录"]:
# 严格触发规则:只能执行 Chat-Logger,禁止主 Agent 处理
result = handle_chat_query(message, user_name, channel)
if result:
print(result) # 直接返回,不执行其他逻辑
return # 立即返回,禁止继续处理
# 第2步:非查询指令,记录消息
record_message(channel, user_name, message, chat_type)
# 第3步:正常处理消息
# ... 主 Agent 其他逻辑禁止行为
❌ **禁止**:主 Agent 自己读取 chat-logs 文件生成回复
❌ **禁止**:主 Agent 修改 Chat-Logger 返回的格式
❌ **禁止**:主 Agent 绕过 `handle_chat_query()` 直接查询
✅ **必须**:严格匹配指令,直接调用 `handle_chat_query()`
✅ **必须**:返回结果后立即 `return`,禁止继续执行
✅ **必须**:非查询指令才调用 `record_message()` 和正常处理
核心设计
核心设计
方案B:Hook + 显式调用双保险
**记录功能(双保险):**
**查询功能(主 Agent 显式调用):**
为什么用双保险?
| 方案 | 优点 | 缺点 |
|:---|:---|:---|
| 纯 Hook | 自动,无需干预 | Hook 可能失效,难调试 |
| 纯显式调用 | 可控,易调试 | 依赖主 Agent 遵守约定 |
| **双保险(方案B)** | **自动 + 可控** | **稍复杂,但最可靠** |
使用方式
1. 主 Agent 调用约定(AGENTS.md)
**每次收到用户消息时,必须调用:**
from skills.chat_logger.skill import record_message
# 记录用户消息
record_message(
channel="feishu", # 或 "dingtalk"
user_name="孟凡军",
user_content="用户消息内容",
chat_type="direct" # direct=私聊, group=群聊(群聊自动跳过)
)2. 查询指令处理
**当用户发送查询指令时,调用:**
from skills.chat_logger.skill import handle_chat_query
result = handle_chat_query(
message="chatlog汇总",
user_name="孟凡军",
channel="feishu" # 当前渠道
)
if result:
print(result) # 直接返回结果支持的查询指令:
3. 自检功能
from skills.chat_logger.skill import check_health
status = check_health()
print(status)
# {
# 'status': 'ok',
# 'base_dir_exists': True,
# 'base_dir_writable': True,
# 'total_channels': 2,
# 'total_users': 4,
# 'total_files': 9,
# 'last_error': None
# }API 参考
record_message(channel, user_name, user_content, chat_type='direct')
记录用户消息
**参数:**
**返回:**
handle_chat_query(message, user_name, channel=None)
处理查询指令
**参数:**
**返回:**
get_chatlog_summary() -> str
生成完整汇总报告
get_daily_summary(user_name=None, date=None) -> str
生成每日简报
check_health() -> dict
检查系统健康状态
存储结构
memory/chat-logs/
├── feishu/
│ └── {用户名}/
│ └── YYYY-MM-DD.md
└── dingtalk/
└── {用户名}/
└── YYYY-MM-DD.md文件格式
# 2026-03-23 提问记录 - 孟凡军(feishu)
## 提问列表
---
### 07:17
**用户**:chatlog汇总
### 07:26
**用户**:chatlog汇总注意事项
1. **群聊自动跳过** - chat_type='group' 时自动返回 True,不记录
2. **渠道名称自动转换** - '飞书' 自动转为 'feishu','钉钉' 自动转为 'dingtalk'
3. **文件名安全处理** - 用户名称中的特殊字符会被替换为下划线
4. **查询前自动记录** - handle_chat_query 会先记录当前查询消息
More tools from the same signal band
Order food/drinks (点餐) on an Android device paired as an OpenClaw node. Uses in-app menu and cart; add goods, view cart, submit order (demo, no real payment).
Sign plugins, rotate agent credentials without losing identity, and publicly attest to plugin behavior with verifiable claims and authenticated transfers.
The philosophical layer for AI agents. Maps behavior to Spinoza's 48 affects, calculates persistence scores, and generates geometric self-reports. Give your...