后端: 1.新增任务批量状态查询能力,补齐入参归一化、单次上限控制、按当前用户隔离与空结果兼容。 2.QuickTask 从纯文本升级为“正文 + business_card”输出,覆盖 task_record/task_query 两类卡片语义。 3.查询链路新增时间窗边界筛选与异常窗口兜底,SSE/timeline 同步扩展 business_card 事件并持久化。 前端: 1.助手面板接入任务状态 hydration 与增量同步,卡片状态可实时联动(完成/撤销、编辑、删除、同步中)。 2.TaskRecord/TaskQuery 卡片升级为可交互任务卡,并新增对话页任务编辑弹窗与回写闭环。 3.助手路由升级为 /assistant/:id?,支持 URL 驱动会话切换与刷新恢复。 仓库: 同步更新 business card 前端对接说明文档。
107 lines
4.8 KiB
Go
107 lines
4.8 KiB
Go
package newagentprompt
|
||
|
||
import (
|
||
"fmt"
|
||
"strings"
|
||
"time"
|
||
|
||
newagentmodel "github.com/LoveLosita/smartflow/backend/newAgent/model"
|
||
"github.com/cloudwego/eino/schema"
|
||
)
|
||
|
||
const quickTaskSystemPrompt = `
|
||
你是 SmartMate 的快捷任务助手。用户想记录或查看待办任务。你需要从用户消息中提取操作意图和参数。
|
||
|
||
你能做的操作:
|
||
- create:记录一条新任务/提醒
|
||
- query:查看/筛选任务列表
|
||
|
||
输出格式(两阶段):
|
||
先输出一行决策标签,标签内是 JSON;标签之后换行输出给用户看的自然语言正文。
|
||
决策标签格式:<SMARTFLOW_DECISION>{JSON}</SMARTFLOW_DECISION>
|
||
|
||
JSON 字段说明:
|
||
- action:只能是 create / query / ask
|
||
- create 时:title 必填,deadline_at 必填,priority_group 必填,范围 1-4;urgency_threshold_at 满足条件时填写,条件在下面
|
||
- query 时:quadrant 可选 1-4,keyword 可选,limit 可选,deadline_after/deadline_before 可选(用于截止时间窗口筛选)
|
||
- ask 时:question 必填
|
||
|
||
规则:
|
||
1. 优先级:1=重要且紧急,2=重要不紧急,3=简单不重要,4=复杂不重要;紧急判定:截止时间距今不超过 48 小时为紧急(1),超过 48 小时为不紧急(2),无截止时间默认 3
|
||
2. 信息不足时(如缺少 title),输出 {"action":"ask","question":"追问内容"}
|
||
3. deadline_at 支持「明天下午3点」「下周一」「2026-04-20 18:00」等格式
|
||
4. 未提供的可选字段直接省略,不要填 null 或空字符串
|
||
5. JSON 中不要包含 speak 字段,给用户看的话放在 </SMARTFLOW_DECISION> 标签之后
|
||
6. 紧急分界时间,即任务从"重要不紧急"自动轮换到"重要且紧急"的时间点;格式同 deadline_at ——当 priority_group=2 时必填,你必须根据 deadline 自动推算一个合理的紧急分界时间(通常为 deadline 前 24-48 小时),不要等用户提供;priority_group 为 1、3、4 或无截止时间时不要输出此字段
|
||
7. query 里出现相对日期窗口(如"明天有什么事要做")时,优先输出明确边界:deadline_after="明天 00:00",deadline_before="后天 00:00",按 [after, before) 语义筛选
|
||
|
||
示例:
|
||
|
||
<SMARTFLOW_DECISION>{"action":"create","title":"明天开会","deadline_at":"明天下午3点"}</SMARTFLOW_DECISION>
|
||
好的,我来帮你记一下。
|
||
<SMARTFLOW_DECISION>{"action":"create","title":"下周交报告","deadline_at":"下周五 18:00","priority_group":2,"urgency_threshold_at":"下周四 09:00"}</SMARTFLOW_DECISION>
|
||
好的,我也帮你记一下。
|
||
|
||
<SMARTFLOW_DECISION>{"action":"query","limit":5}</SMARTFLOW_DECISION>
|
||
我帮你查一下当前的任务。
|
||
|
||
<SMARTFLOW_DECISION>{"action":"query","deadline_after":"明天 00:00","deadline_before":"后天 00:00","limit":10}</SMARTFLOW_DECISION>
|
||
我帮你查一下明天要做的事。
|
||
|
||
<SMARTFLOW_DECISION>{"action":"ask","question":"你想记录什么呢?告诉我具体内容吧。"}</SMARTFLOW_DECISION>
|
||
你想记录什么呢?告诉我具体内容吧。`
|
||
|
||
// BuildQuickTaskSystemPrompt 返回快捷任务阶段的系统提示词。
|
||
func BuildQuickTaskSystemPrompt() string {
|
||
return strings.TrimSpace(quickTaskSystemPrompt)
|
||
}
|
||
|
||
// BuildQuickTaskMessagesSimple 组装快捷任务阶段的最简 messages(无对话历史)。
|
||
func BuildQuickTaskMessagesSimple(userInput string) []*schema.Message {
|
||
systemMsg := schema.SystemMessage(BuildQuickTaskSystemPrompt())
|
||
userMsg := schema.UserMessage(buildQuickTaskUserPrompt(userInput))
|
||
return []*schema.Message{systemMsg, userMsg}
|
||
}
|
||
|
||
func buildQuickTaskUserPrompt(userInput string) string {
|
||
var sb strings.Builder
|
||
sb.WriteString(fmt.Sprintf("当前时间=%s\n", time.Now().In(time.Local).Format("2006-01-02 15:04")))
|
||
sb.WriteString("\n请从用户消息中提取操作意图和参数,严格按 SMARTFLOW_DECISION 标签格式输出。\n\n")
|
||
|
||
trimmedInput := strings.TrimSpace(userInput)
|
||
if trimmedInput != "" {
|
||
sb.WriteString("用户输入:\n")
|
||
sb.WriteString(trimmedInput)
|
||
sb.WriteString("\n")
|
||
}
|
||
|
||
return sb.String()
|
||
}
|
||
|
||
// BuildQuickTaskMessages 组装快捷任务阶段的完整 messages(含对话历史)。
|
||
func BuildQuickTaskMessages(
|
||
ctx *newagentmodel.ConversationContext,
|
||
userInput string,
|
||
toolSchemas []newagentmodel.ToolSchemaContext,
|
||
) []*schema.Message {
|
||
return buildUnifiedStageMessages(
|
||
ctx,
|
||
StageMessagesConfig{
|
||
SystemPrompt: BuildQuickTaskSystemPrompt(),
|
||
Msg1Content: buildChatConversationMessage(ctx),
|
||
Msg2Content: buildQuickTaskWorkspace(toolSchemas),
|
||
Msg3Suffix: buildQuickTaskUserPrompt(userInput),
|
||
Msg3Role: schema.User,
|
||
},
|
||
)
|
||
}
|
||
|
||
func buildQuickTaskWorkspace(toolSchemas []newagentmodel.ToolSchemaContext) string {
|
||
var sb strings.Builder
|
||
sb.WriteString("可用工具:\n")
|
||
for _, ts := range toolSchemas {
|
||
sb.WriteString(fmt.Sprintf("- %s: %s\n 参数: %s\n", ts.Name, ts.Desc, ts.SchemaText))
|
||
}
|
||
return sb.String()
|
||
}
|