chat_logger
# Chat Logger(严格触发规则版)
## ⚠️ 严格触发规则(AGENTS.md 必须遵守)
### 触发规则表
| 用户消息 | 执行动作 | 主 Agent 行为 |
|:---|:---|:---|
| `chatlog汇总` | 调用 `handle_chat_query()` | **禁止处理,直接返回结果** |
| `今日简报` | 调用 `handle_chat_query()` | **禁止处理,直接返回结果** |
| `我的记录` | 调用 `handle_chat_query()` | **禁止处理,直接返回结果** |
| 其他消息 | 调用 `record_message()` | 正常处理 |
### 主 Agent 必须遵守的流程
```python
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 + 显式调用双保险
**记录功能(双保险):**
- ✅ **Hook 自动记录** - `on_incoming_message_hook` 自动触发
- ✅ **主 Agent 显式调用** - `record_message()` 备用
- ✅ **两者都执行** - 确保消息不丢失
**查询功能(主 Agent 显式调用):**
- ✅ `handle_chat_query()` - 主 Agent 检查并处理查询指令
- ✅ 查询前自动记录当前消息
### 为什么用双保险?
| 方案 | 优点 | 缺点 |
|:---|:---|:---|
| 纯 Hook | 自动,无需干预 | Hook 可能失效,难调试 |
| 纯显式调用 | 可控,易调试 | 依赖主 Agent 遵守约定 |
| **双保险(方案B)** | **自动 + 可控** | **稍复杂,但最可靠** |
## 使用方式
### 1. 主 Agent 调用约定(AGENTS.md)
**每次收到用户消息时,必须调用:**
```python
from skills.chat_logger.skill import record_message
# 记录用户消息
record_message(
channel="feishu", # 或 "dingtalk"
user_name="孟凡军",
user_content="用户消息内容",
chat_type="direct" # direct=私聊, group=群聊(群聊自动跳过)
)
```
### 2. 查询指令处理
**当用户发送查询指令时,调用:**
```python
from skills.chat_logger.skill import handle_chat_query
result = handle_chat_query(
message="chatlog汇总",
user_name="孟凡军",
channel="feishu" # 当前渠道
)
if result:
print(result) # 直接返回结果
```
支持的查询指令:
- `chatlog汇总` - 查看所有用户完整汇总
- `今日简报` - 查看今日对话汇总
- `我的记录` - 查看个人今日记录
### 3. 自检功能
```python
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')
记录用户消息
**参数:**
- `channel` (str): 渠道名称 (feishu/dingtalk/飞书/钉钉)
- `user_name` (str): 用户名称
- `user_content` (str): 用户消息内容
- `chat_type` (str): 聊天类型,默认 'direct'(私聊)
**返回:**
- `bool`: 是否记录成功
### handle_chat_query(message, user_name, channel=None)
处理查询指令
**参数:**
- `message` (str): 用户消息
- `user_name` (str): 用户名称
- `channel` (str, optional): 当前渠道
**返回:**
- `str or None`: 查询结果或 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
```
## 文件格式
```markdown
# 2026-03-23 提问记录 - 孟凡军(feishu)
## 提问列表
---
### 07:17
**用户**:chatlog汇总
### 07:26
**用户**:chatlog汇总
```
## 注意事项
1. **群聊自动跳过** - chat_type='group' 时自动返回 True,不记录
2. **渠道名称自动转换** - '飞书' 自动转为 'feishu','钉钉' 自动转为 'dingtalk'
3. **文件名安全处理** - 用户名称中的特殊字符会被替换为下划线
4. **查询前自动记录** - handle_chat_query 会先记录当前查询消息
标签
skill
ai