Chat Logger(严格触发规则版)
⚠️ 严格触发规则(AGENTS.md 必须遵守)
触发规则表
| 用户消息 | 执行动作 | 主 Agent 行为 |
|---|
| INLINECODE0 | 调用 INLINECODE1 | 禁止处理,直接返回结果 |
| INLINECODE2 |
调用
handle_chat_query() |
禁止处理,直接返回结果 |
|
我的记录 | 调用
handle_chat_query() |
禁止处理,直接返回结果 |
| 其他消息 | 调用
record_message() | 正常处理 |
主 Agent 必须遵守的流程
CODEBLOCK0
禁止行为
❌ 禁止:主 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)
每次收到用户消息时,必须调用:
CODEBLOCK1
2. 查询指令处理
当用户发送查询指令时,调用:
CODEBLOCK2
支持的查询指令:
- -
chatlog汇总 - 查看所有用户完整汇总 - INLINECODE15 - 查看今日对话汇总
- INLINECODE16 - 查看个人今日记录
3. 自检功能
CODEBLOCK3
API 参考
recordmessage(channel, username, usercontent, chattype='direct')
记录用户消息
参数:
- -
channel (str): 渠道名称 (feishu/dingtalk/飞书/钉钉) - INLINECODE18 (str): 用户名称
- INLINECODE19 (str): 用户消息内容
- INLINECODE20 (str): 聊天类型,默认 'direct'(私聊)
返回:
handlechatquery(message, user_name, channel=None)
处理查询指令
参数:
- -
message (str): 用户消息 - INLINECODE23 (str): 用户名称
- INLINECODE24 (str, optional): 当前渠道
返回:
- -
str or None: 查询结果或 None(非查询指令)
getchatlogsummary() -> str
生成完整汇总报告
getdailysummary(user_name=None, date=None) -> str
生成每日简报
check_health() -> dict
检查系统健康状态
存储结构
CODEBLOCK4
文件格式
CODEBLOCK5
注意事项
- 1. 群聊自动跳过 - chattype='group' 时自动返回 True,不记录
- 渠道名称自动转换 - '飞书' 自动转为 'feishu','钉钉' 自动转为 'dingtalk'
- 文件名安全处理 - 用户名称中的特殊字符会被替换为下划线
- 查询前自动记录 - handlechat_query 会先记录当前查询消息
技能名称: chat_logger
详细描述:
Chat Logger(严格触发规则版)
⚠️ 严格触发规则(AGENTS.md 必须遵守)
触发规则表
| 用户消息 | 执行动作 | 主 Agent 行为 |
|---|
| chatlog汇总 | 调用 handlechatquery() | 禁止处理,直接返回结果 |
| 今日简报 |
调用 handle
chatquery() |
禁止处理,直接返回结果 |
| 我的记录 | 调用 handle
chatquery() |
禁止处理,直接返回结果 |
| 其他消息 | 调用 record_message() | 正常处理 |
主 Agent 必须遵守的流程
python
from skills.chatlogger.skill import handlechatquery, recordmessage
第1步:检查是否是 Chat-Logger 查询指令(严格匹配)
if message.strip() in [chatlog汇总, 今日简报, 我的记录]:
# 严格触发规则:只能执行 Chat-Logger,禁止主 Agent 处理
result = handle
chatquery(message, user_name, channel)
if result:
print(result) # 直接返回,不执行其他逻辑
return # 立即返回,禁止继续处理
第2步:非查询指令,记录消息
record
message(channel, username, message, chat_type)
第3步:正常处理消息
... 主 Agent 其他逻辑
禁止行为
❌ 禁止:主 Agent 自己读取 chat-logs 文件生成回复
❌ 禁止:主 Agent 修改 Chat-Logger 返回的格式
❌ 禁止:主 Agent 绕过 handlechatquery() 直接查询
✅ 必须:严格匹配指令,直接调用 handlechatquery()
✅ 必须:返回结果后立即 return,禁止继续执行
✅ 必须:非查询指令才调用 record_message() 和正常处理
核心设计
核心设计
方案B:Hook + 显式调用双保险
记录功能(双保险):
- - ✅ Hook 自动记录 - onincomingmessagehook 自动触发
- ✅ 主 Agent 显式调用 - recordmessage() 备用
- ✅ 两者都执行 - 确保消息不丢失
查询功能(主 Agent 显式调用):
- - ✅ handlechatquery() - 主 Agent 检查并处理查询指令
- ✅ 查询前自动记录当前消息
为什么用双保险?
| 方案 | 优点 | 缺点 |
|---|
| 纯 Hook | 自动,无需干预 | Hook 可能失效,难调试 |
| 纯显式调用 |
可控,易调试 | 依赖主 Agent 遵守约定 |
|
双保险(方案B) |
自动 + 可控 |
稍复杂,但最可靠 |
使用方式
1. 主 Agent 调用约定(AGENTS.md)
每次收到用户消息时,必须调用:
python
from skills.chatlogger.skill import recordmessage
记录用户消息
record_message(
channel=feishu, # 或 dingtalk
user_name=孟凡军,
user_content=用户消息内容,
chat_type=direct # direct=私聊, group=群聊(群聊自动跳过)
)
2. 查询指令处理
当用户发送查询指令时,调用:
python
from skills.chatlogger.skill import handlechat_query
result = handlechatquery(
message=chatlog汇总,
user_name=孟凡军,
channel=feishu # 当前渠道
)
if result:
print(result) # 直接返回结果
支持的查询指令:
- - chatlog汇总 - 查看所有用户完整汇总
- 今日简报 - 查看今日对话汇总
- 我的记录 - 查看个人今日记录
3. 自检功能
python
from skills.chatlogger.skill import checkhealth
status = check_health()
print(status)
{
status: ok,
basedirexists: True,
basedirwritable: True,
total_channels: 2,
total_users: 4,
total_files: 9,
last_error: None
}
API 参考
recordmessage(channel, username, usercontent, chattype=direct)
记录用户消息
参数:
- - channel (str): 渠道名称 (feishu/dingtalk/飞书/钉钉)
- username (str): 用户名称
- usercontent (str): 用户消息内容
- chat_type (str): 聊天类型,默认 direct(私聊)
返回:
handlechatquery(message, user_name, channel=None)
处理查询指令
参数:
- - message (str): 用户消息
- user_name (str): 用户名称
- channel (str, optional): 当前渠道
返回:
- - str or None: 查询结果或 None(非查询指令)
getchatlogsummary() -> str
生成完整汇总报告
getdailysummary(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. 群聊自动跳过 - chattype=group 时自动返回 True,不记录
- 渠道名称自动转换 - 飞书 自动转为 feishu,钉钉 自动转为 dingtalk
- 文件名安全处理 - 用户名称中的特殊字符会被替换为下划线
- 查询前自动记录 - handlechat_query 会先记录当前查询消息