Files
meshtastic_mqtt_server/doc/SIGN_QUERY_FEATURE.md
T
kevinandClaude Fable 5 57cca6bb7a 签到工具新增检查功能:修复状态误判问题
问题:
- 用户询问'我今天签到了吗'时,AI基于对话历史判断而非查询数据库
- 导致明明没签到,AI却说已经签到了(误判)

解决方案:
- 新增 action=check 操作,专门用于检查当前节点今天是否已签到
- 直接调用 HasSignedOnDay 查询数据库,返回准确的签到状态
- AI 现在会强制调用工具查询,而不是根据记忆猜测

改动内容:
- 工具定义中添加 check 操作类型
- 实现 executeCheck 方法,查询数据库并返回明确状态
- 添加完整的单元测试(未签到/已签到两种场景)
- 更新文档说明 check 操作的使用

使用示例:
- 用户:'我今天签到了吗?'
- AI 调用:{"action": "check"}
- 返回:'XXX 今天还没有签到。' 或 'XXX 今天已经签到过了。'

测试:
-  未签到场景测试通过
-  已签到场景测试通过
-  所有签到工具测试通过
-  项目编译成功

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-23 21:37:44 +08:00

4.6 KiB
Raw Blame History

签到工具查询功能增强

问题描述

原签到工具只支持签到操作,不支持查询。当用户询问"今天有多少人签到"或"最近几天的签到情况"时,AI 无法调用工具获取准确数据,导致:

  1. 数据不准确:AI 只能根据上下文猜测或给出模糊答案
  2. 无法查询历史:询问超过一天的数据时,AI 一问三不知
  3. 功能不完整:数据库层已有完善的查询能力(CountSignsCountSignsByDay),但工具层未暴露给 AI
  4. 状态判断不准:用户问"我今天签到了吗"时,AI 基于对话记忆判断而非查询数据库,导致误判

解决方案

为签到工具添加查询和检查功能,支持以下三种操作模式:

1. 签到操作 (action=sign)

保持原有功能不变:

  • 记录节点今日签到信息
  • 每个节点每天只能签到一次
  • 必填参数:地区、名字、设备

2. 查询操作 (action=query)

查询签到统计功能:

  • 查询指定日期或日期范围的签到统计
  • 返回总人次和按天分组的统计数据
  • 可选参数:
    • date: 查询日期(格式:YYYY-MM-DD),默认今天
    • days: 查询最近 N 天,默认只查询 date 指定的那一天

3. 检查操作 (action=check) 新增

检查当前节点今天是否已签到:

  • 用于回答"我今天签到了吗"之类的问题
  • 直接查询数据库,不依赖对话历史
  • 返回明确的已签到/未签到状态

修改内容

1. 扩展 SignStore 接口

type SignStore interface {
    CreateSign(nodeID string, longName, shortName *string, signText string, signTime time.Time) (*storepkg.SignRecord, error)
    HasSignedOnDay(nodeID string, day time.Time) (bool, error)
    GetNodeInfo(nodeID string) (*storepkg.NodeInfoRecord, error)
    // 新增查询方法
    CountSigns(opts storepkg.ListOptions) (int64, error)
    CountSignsByDay(opts storepkg.ListOptions) ([]storepkg.SignDayCount, error)
    ListSigns(opts storepkg.ListOptions) ([]storepkg.SignRecord, error)
}

2. 更新工具定义

工具描述中明确说明支持两种操作:

  • action=sign:签到
  • action=query:查询统计

3. 实现查询逻辑

  • executeSign(): 原签到逻辑
  • executeQuery(): 新增查询逻辑
    • 解析日期参数
    • 构建查询条件(Since/Until
    • 调用 store 查询接口
    • 格式化返回结果

4. 扩展参数结构

type signParams struct {
    Action        string `json:"action"`         // sign 或 query
    // 签到参数
    Region        string `json:"region"`
    Name          string `json:"name"`
    Device        string `json:"device"`
    TxPower       string `json:"tx_power"`
    AntennaLength string `json:"antenna_length"`
    Altitude      string `json:"altitude"`
    RawText       string `json:"raw_text"`
    // 查询参数
    Date          string `json:"date"`           // YYYY-MM-DD
    Days          int    `json:"days"`           // 最近 N 天
}

使用示例

AI 调用示例

检查今天是否签到(check 操作)

用户"我今天签到了吗?"

AI 调用:

{
  "action": "check"
}

返回(未签到):

Test Node 今天还没有签到。

返回(已签到):

Test Node 今天已经签到过了。

查询今天的签到情况

{
  "action": "query",
  "date": "2024-06-23"
}

返回:

2024-06-23 的签到统计:
总计:5 人次

按天统计:
- 2024-06-23: 5 人

查询最近 7 天的签到情况

{
  "action": "query",
  "date": "2024-06-23",
  "days": 7
}

返回:

最近 7 天的签到统计:
总计:32 人次

按天统计:
- 2024-06-23: 5 人
- 2024-06-22: 6 人
- 2024-06-21: 4 人
- 2024-06-20: 7 人
- 2024-06-19: 3 人
- 2024-06-18: 4 人
- 2024-06-17: 3 人

签到(保持原有功能)

{
  "action": "sign",
  "region": "上海闵行",
  "name": "Kevin",
  "device": "GAT562"
}

测试

创建了完整的单元测试 sign_test.go,覆盖:

  • 查询今天的签到统计
  • 查询最近 N 天的签到统计
  • 查询指定日期的签到统计
  • 签到功能(回归测试)

所有测试通过。

影响范围

  • 向后兼容:原有签到功能完全保持不变
  • 数据库无需修改:查询接口已存在
  • 新增功能:AI 现在可以准确回答签到统计问题
  • 编译通过:整个项目构建成功

后续建议

可以考虑进一步增强:

  1. 支持按节点查询:某个特定节点的签到历史
  2. 支持按地区统计:哪些地区签到最活跃
  3. 支持导出详细列表:不仅是统计,还能看到每条签到的详细内容