27a497e397
- reminder_create 新增 platform/channel_type/channel_id/adapter_name 参数 - Gateway Reminder 模型 + DB 迁移 + CRUD 全部支持新字段 - 提醒到期时:群聊提醒 → platform-bridge 发回原群聊 - 非群聊提醒 → 走 Web 端推送 - Thinker 新增 PushPlatformMessage 方法 Co-Authored-By: Claude <noreply@anthropic.com>
161 lines
5.7 KiB
Go
161 lines
5.7 KiB
Go
package tools
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// --- ReminderCreateTool ---
|
|
|
|
type ReminderCreateTool struct {
|
|
gw *GatewayClient
|
|
adminID string
|
|
}
|
|
|
|
func NewReminderCreateTool(gw *GatewayClient, adminID string) *ReminderCreateTool {
|
|
return &ReminderCreateTool{gw: gw, adminID: adminID}
|
|
}
|
|
|
|
func (t *ReminderCreateTool) Definition() ToolDefinition {
|
|
return ToolDefinition{
|
|
Name: "reminder_create",
|
|
Description: "创建一个定时提醒。时间格式为 ISO8601(如 2026-06-23T08:00:00+08:00)。如果在群聊中创建提醒,请传入 platform/channel_id/channel_type/adapter_name 以便提醒时发回原群聊。",
|
|
Parameters: map[string]interface{}{
|
|
"type": "object",
|
|
"properties": map[string]interface{}{
|
|
"title": map[string]string{"type": "string", "description": "提醒标题"},
|
|
"description": map[string]string{"type": "string", "description": "提醒详细描述(可选)"},
|
|
"remind_at": map[string]string{"type": "string", "description": "提醒时间,ISO8601 格式,如 2026-06-23T08:00:00+08:00"},
|
|
"repeat_type": map[string]string{"type": "string", "description": "重复类型:none(不重复), daily(每天), weekly(每周), monthly(每月),默认 none"},
|
|
"platform": map[string]string{"type": "string", "description": "(群聊提醒时必填)平台类型,如 obv11"},
|
|
"channel_type": map[string]string{"type": "string", "description": "(群聊提醒时必填)频道类型:group"},
|
|
"channel_id": map[string]string{"type": "string", "description": "(群聊提醒时必填)群号"},
|
|
"adapter_name": map[string]string{"type": "string", "description": "(群聊提醒时必填)适配器名,如 obv11-main"},
|
|
},
|
|
"required": []string{"title", "remind_at"},
|
|
},
|
|
}
|
|
}
|
|
|
|
func (t *ReminderCreateTool) Execute(ctx context.Context, args map[string]interface{}) (*ToolResult, error) {
|
|
title, _ := args["title"].(string)
|
|
description, _ := args["description"].(string)
|
|
remindAt, _ := args["remind_at"].(string)
|
|
repeatType, _ := args["repeat_type"].(string)
|
|
if repeatType == "" {
|
|
repeatType = "none"
|
|
}
|
|
|
|
if title == "" || remindAt == "" {
|
|
return &ToolResult{Success: false, Error: "title 和 remind_at 为必填项"}, nil
|
|
}
|
|
|
|
platform, _ := args["platform"].(string)
|
|
channelType, _ := args["channel_type"].(string)
|
|
channelID, _ := args["channel_id"].(string)
|
|
adapterName, _ := args["adapter_name"].(string)
|
|
reminder, err := t.gw.CreateReminder(ctx, t.adminID, title, description, remindAt, repeatType, "", platform, channelType, channelID, adapterName)
|
|
if err != nil {
|
|
return &ToolResult{Success: false, Error: err.Error()}, nil
|
|
}
|
|
|
|
return &ToolResult{
|
|
Success: true,
|
|
Data: fmt.Sprintf("✅ 提醒已创建\nID: %s\n标题: %s\n时间: %s\n重复: %s", reminder.ID, reminder.Title, reminder.RemindAt, reminder.RepeatType),
|
|
}, nil
|
|
}
|
|
|
|
// --- ReminderListTool ---
|
|
|
|
type ReminderListTool struct {
|
|
gw *GatewayClient
|
|
adminID string
|
|
}
|
|
|
|
func NewReminderListTool(gw *GatewayClient, adminID string) *ReminderListTool {
|
|
return &ReminderListTool{gw: gw, adminID: adminID}
|
|
}
|
|
|
|
func (t *ReminderListTool) Definition() ToolDefinition {
|
|
return ToolDefinition{
|
|
Name: "reminder_list",
|
|
Description: "列出当前用户的提醒列表,可按状态过滤(pending/completed/cancelled)。",
|
|
Parameters: map[string]interface{}{
|
|
"type": "object",
|
|
"properties": map[string]interface{}{
|
|
"status": map[string]string{"type": "string", "description": "过滤状态:pending(待执行), completed(已完成), cancelled(已取消),默认为空(全部)"},
|
|
"limit": map[string]interface{}{"type": "integer", "description": "返回条数上限,默认 20"},
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
func (t *ReminderListTool) Execute(ctx context.Context, args map[string]interface{}) (*ToolResult, error) {
|
|
status, _ := args["status"].(string)
|
|
limit := 20
|
|
if l, ok := args["limit"].(float64); ok && l > 0 {
|
|
limit = int(l)
|
|
}
|
|
|
|
reminders, err := t.gw.ListReminders(ctx, t.adminID, status, limit)
|
|
if err != nil {
|
|
return &ToolResult{Success: false, Error: err.Error()}, nil
|
|
}
|
|
|
|
if len(reminders) == 0 {
|
|
return &ToolResult{Success: true, Data: "📋 暂无提醒"}, nil
|
|
}
|
|
|
|
var sb strings.Builder
|
|
sb.WriteString(fmt.Sprintf("📋 提醒列表(共 %d 条):\n", len(reminders)))
|
|
for _, r := range reminders {
|
|
icon := "⏳"
|
|
if r.Status == "completed" {
|
|
icon = "✅"
|
|
} else if r.Status == "cancelled" {
|
|
icon = "❌"
|
|
}
|
|
sb.WriteString(fmt.Sprintf("%s [%s] %s — %s (ID: %s)\n", icon, r.Status, r.Title, r.RemindAt, r.ID))
|
|
}
|
|
return &ToolResult{Success: true, Data: sb.String()}, nil
|
|
}
|
|
|
|
// --- ReminderDeleteTool ---
|
|
|
|
type ReminderDeleteTool struct {
|
|
gw *GatewayClient
|
|
adminID string
|
|
}
|
|
|
|
func NewReminderDeleteTool(gw *GatewayClient, adminID string) *ReminderDeleteTool {
|
|
return &ReminderDeleteTool{gw: gw, adminID: adminID}
|
|
}
|
|
|
|
func (t *ReminderDeleteTool) Definition() ToolDefinition {
|
|
return ToolDefinition{
|
|
Name: "reminder_delete",
|
|
Description: "删除一个提醒。只能删除自己创建的提醒。",
|
|
Parameters: map[string]interface{}{
|
|
"type": "object",
|
|
"properties": map[string]interface{}{
|
|
"reminder_id": map[string]string{"type": "string", "description": "要删除的提醒 ID"},
|
|
},
|
|
"required": []string{"reminder_id"},
|
|
},
|
|
}
|
|
}
|
|
|
|
func (t *ReminderDeleteTool) Execute(ctx context.Context, args map[string]interface{}) (*ToolResult, error) {
|
|
reminderID, _ := args["reminder_id"].(string)
|
|
if reminderID == "" {
|
|
return &ToolResult{Success: false, Error: "reminder_id 为必填项"}, nil
|
|
}
|
|
|
|
if err := t.gw.DeleteReminder(ctx, reminderID); err != nil {
|
|
return &ToolResult{Success: false, Error: err.Error()}, nil
|
|
}
|
|
|
|
return &ToolResult{Success: true, Data: fmt.Sprintf("✅ 提醒 %s 已删除", reminderID)}, nil
|
|
}
|