Files
smartmate/backend/newAgent/prompt/execute.go
Losita 2038185730 Version: 0.9.2.dev.260406
后端:
   1.Chat 四路由升级(二分类 chat/task → 四路由 direct_reply/execute/deep_answer/plan)
     - 新建model/chat_contract.go:路由决策模型,含 NeedsRoughBuild 粗排标记
     - 更新node/chat.go:四路由分流;新增 deep_answer 深度回答路径(二次 LLM 开 thinking)
     - 更新prompt/chat.go:意图分类 prompt 升级为四路由 prompt;新增 deep_answer prompt
   2.粗排节点(RoughBuild)全链路
     - 新建node/rough_build.go:粗排节点,调用注入的算法函数,结果写入 ScheduleState 后进 Execute 微调
     - 更新graph/common_graph.go:注册 RoughBuild 节点;Chat/Confirm 后可路由至粗排
     - 更新model/graph_run_state.go:新增 RoughBuildPlacement/RoughBuildFunc 类型;Deps 注入入口
     - 更新model/plan_contract.go:PlanDecision 新增 NeedsRoughBuild/TaskClassIDs 字段
     - 更新node/plan.go:plan_done 时写入粗排标记和 TaskClassIDs
   3.任务类约束元数据(TaskClassMeta)贯穿 prompt → tools → 持久化
     - 更新tools/state.go:新增 TaskClassMeta;ScheduleState.TaskClasses;ScheduleTask.TaskClassID;Clone 深拷贝
     - 更新conv/schedule_state.go:加载时构建 TaskClassMeta;Diff 支持 HostEventID 嵌入关系
     - 更新conv/schedule_provider.go:新增 LoadTaskClassMetas 按需加载
     - 更新model/state_store.go:ScheduleStateProvider 接口新增 LoadTaskClassMetas
     - 更新prompt/base.go:renderStateSummary 渲染任务类约束
     - 更新prompt/plan.go:注入任务类 ID 上下文和粗排识别规则
     - 更新tools/read_tools.go:GetOverview 展示任务类约束
     - 更新model/common_state.go:CommonState 新增 TaskClassIDs/TaskClasses/NeedsRoughBuild
   4.Execute 健壮性增强(correction 重试 + 纯 ReAct 模式)
     - 更新node/execute.go:未知工具名/空文本走 correction 重试而非 fatal;maxConsecutiveCorrections 提升为包级常量;新增无 plan 纯ReAct 模式;工具结果截断;speak 排除 ask_user/confirm
     - 更新prompt/execute.go:新增 ReAct 模式 system prompt 和 contract
   5.写入持久化完善(task_item source + 嵌入水课)
     - 更新conv/schedule_persist.go:place/move/unplace 支持 task_item source,含嵌入水课和普通 task event 两条路径
     - 新建conv/schedule_preview.go:ScheduleState → 排程预览缓存,复用旧格式,前端无需改动
   6.状态持久化体系(Redis → MySQL outbox 异步)
     - 更新dao/cache.go:Redis 快照 TTL 从 24h 改为 2h,配合 MySQL outbox
     - 新建model/agent_state_snapshot_record.go:快照 MySQL 记录模型
     - 新建service/events/agent_state_persist.go:outbox 异步持久化处理器
     - 更新cmd/start.go + inits/mysql.go:注册快照事件处理器 + AutoMigrate
     - 更新service/agentsvc/agent_newagent.go:注入 RoughBuildFunc;outbox 异步写快照;排程结果写 Redis 预览缓存
   7.基础设施与稳定性
     - 更新stream/sse_adapter.go:outChan 满时静默丢弃,保证持久化不被 SSE 阻断
     - 更新service/agentsvc/agent.go:新增 readAgentExtraIntSlice;outChan 容量 8→256
     - 更新node/agent_nodes.go:Chat 注入工具 schema;Deliver 改 saveAgentState 替代 deleteAgentState
前端:无
仓库:无
2026-04-06 23:15:54 +08:00

244 lines
9.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package newagentprompt
import (
"fmt"
"strings"
newagentmodel "github.com/LoveLosita/smartflow/backend/newAgent/model"
"github.com/cloudwego/eino/schema"
)
const executeSystemPromptWithPlan = `
你是 SmartFlow NewAgent 的执行器。
你的职责是在"当前 plan 步骤"的约束下,进行思考、执行、观察,再决定下一步动作。
请遵守以下规则:
1. 只围绕当前步骤行动,不要擅自跳到其他 plan 步骤。
2. 只输出严格 JSON不要输出 markdown不要输出额外解释不要在 JSON 外再补文字。
3. 只有当你确认当前步骤已经完成时,才输出 action=next_plan且必须在 goal_check 中逐条对照 done_when 说明完成依据。
4. 只有当你确认整个任务已经完成时,才输出 action=done且必须在 goal_check 中总结整体完成证据。
5. 如果执行当前步骤缺少关键上下文,且无法通过已有历史或工具补齐,输出 action=ask_user。
6. 不要伪造工具结果;如果尚未真正拿到观察结果,就不要假装已经完成。
7. goal_check 是你输出 next_plan / done 时的强制字段,禁止为空;必须显式地逐条对照 done_when说明"哪些条件已满足、依据是什么"。
你会看到:
- 当前完整 plan
- 当前步骤
- 置顶上下文块
- 工具摘要
- 历史对话与历史观察
请把注意力聚焦在"当前步骤是否完成,以及下一步最合理的执行动作"上。
`
const executeSystemPromptReAct = `
你是 SmartFlow NewAgent 的执行器,当前为自由执行模式(无预定义计划步骤)。
你需要根据用户意图,自主决定使用哪些工具来完成任务。
请遵守以下规则:
1. 每轮先分析当前情况,决定下一步动作。
2. 只输出严格 JSON不要输出 markdown不要输出额外解释不要在 JSON 外再补文字。
3. 需要查询数据 → 输出 action=continue 并附带 tool_call。
4. 需要修改数据(写操作)→ 输出 action=confirm 并附带 tool_call等待用户确认。
5. 缺少关键信息且无法通过工具补齐 → 输出 action=ask_user。
6. 任务完成 → 输出 action=done并在 goal_check 中总结完成证据。
7. 不要伪造工具结果;如果尚未真正拿到观察结果,就不要假装已经完成。
8. 尽量高效:能用一次工具调用完成的,不要分多轮。
你会看到:
- 用户原始请求
- 置顶上下文块(粗排结果等)
- 工具摘要
- 历史对话与历史观察
请直接行动,不要犹豫,不要重复已经做过的操作。
`
// BuildExecuteSystemPrompt 返回执行阶段系统提示词。
func BuildExecuteSystemPrompt() string {
return strings.TrimSpace(executeSystemPromptWithPlan)
}
// BuildExecuteReActSystemPrompt 返回纯 ReAct 模式的系统提示词。
func BuildExecuteReActSystemPrompt() string {
return strings.TrimSpace(executeSystemPromptReAct)
}
// BuildExecuteDecisionContractText 返回执行阶段的输出协议说明(有 plan 模式)。
func BuildExecuteDecisionContractText() string {
return strings.TrimSpace(fmt.Sprintf(`
输出协议(严格 JSON
- speak给用户看的话
- action只能是 %s / %s / %s / %s / %s
- reason给后端和日志看的简短说明
- goal_check输出 %s 或 %s 时必填,对照 done_when 逐条验证
- tool_call输出 %s 时可附带写工具意图(需 confirm输出 %s 时可附带读工具调用
- tool_call 格式:{"name": "工具名", "arguments": {...}}
合法示例:
{
"speak": "我来查一下本周的安排。",
"action": "%s",
"reason": "需要先调用 get_overview 获取当前数据",
"tool_call": {
"name": "get_overview",
"arguments": {}
}
}
{
"speak": "查询完成。",
"action": "%s",
"reason": "已拿到当前周课程列表",
"goal_check": "已通过 get_overview 确认本周课程列表,满足完成条件"
}
{
"speak": "",
"action": "%s",
"reason": "整个任务已完成"
}
`,
newagentmodel.ExecuteActionContinue,
newagentmodel.ExecuteActionAskUser,
newagentmodel.ExecuteActionConfirm,
newagentmodel.ExecuteActionNextPlan,
newagentmodel.ExecuteActionDone,
newagentmodel.ExecuteActionNextPlan,
newagentmodel.ExecuteActionDone,
newagentmodel.ExecuteActionConfirm,
newagentmodel.ExecuteActionContinue,
newagentmodel.ExecuteActionContinue,
newagentmodel.ExecuteActionNextPlan,
newagentmodel.ExecuteActionDone,
))
}
// BuildExecuteReActContractText 返回纯 ReAct 模式的输出协议说明。
func BuildExecuteReActContractText() string {
return strings.TrimSpace(fmt.Sprintf(`
输出协议(严格 JSON
- speak给用户看的话可以是分析结果、中间进展、或最终回复
- action只能是 %s / %s / %s / %s
- reason给后端和日志看的简短说明
- goal_check输出 %s 时必填,总结任务完成证据
- tool_call输出 %s 时可附带写工具意图(需 confirm输出 %s 时可附带读工具调用
- tool_call 格式:{"name": "工具名", "arguments": {...}}
合法示例:
{
"speak": "我来查一下今天的安排。",
"action": "%s",
"reason": "需要调用 get_overview 查询",
"tool_call": {
"name": "get_overview",
"arguments": {}
}
}
{
"speak": "已将概率论移到周三第1-2节。",
"action": "%s",
"reason": "用户要求移动课程,写操作需确认",
"tool_call": {
"name": "move",
"arguments": {"task_state_id": 5, "target_day": 3, "target_slot_start": 1, "target_slot_end": 2}
}
}
{
"speak": "今天共3节课分别是...",
"action": "%s",
"reason": "查询完成,已回答用户",
"goal_check": "已通过 get_overview 查到今天的课程并展示给用户"
}
`,
newagentmodel.ExecuteActionContinue,
newagentmodel.ExecuteActionAskUser,
newagentmodel.ExecuteActionConfirm,
newagentmodel.ExecuteActionDone,
newagentmodel.ExecuteActionDone,
newagentmodel.ExecuteActionConfirm,
newagentmodel.ExecuteActionContinue,
newagentmodel.ExecuteActionContinue,
newagentmodel.ExecuteActionConfirm,
newagentmodel.ExecuteActionDone,
))
}
// BuildExecuteMessages 组装执行阶段的 messages。
func BuildExecuteMessages(state *newagentmodel.CommonState, ctx *newagentmodel.ConversationContext) []*schema.Message {
if state != nil && state.HasPlan() {
return buildStageMessages(
BuildExecuteSystemPrompt(),
ctx,
BuildExecuteUserPrompt(state),
)
}
// 无 plan纯 ReAct 模式。
return buildStageMessages(
BuildExecuteReActSystemPrompt(),
ctx,
BuildExecuteReActUserPrompt(state),
)
}
// BuildExecuteUserPrompt 构造有 plan 模式的用户提示词。
func BuildExecuteUserPrompt(state *newagentmodel.CommonState) string {
var sb strings.Builder
sb.WriteString("请继续当前任务的执行阶段。\n")
sb.WriteString(renderStateSummary(state))
sb.WriteString("\n")
if state == nil || !state.HasPlan() {
sb.WriteString("当前没有可执行的完整 plan请不要盲目进入执行如有需要请回退到规划阶段。\n")
return strings.TrimSpace(sb.String())
}
if currentStep, ok := state.CurrentPlanStep(); ok {
sb.WriteString("执行要求:\n")
sb.WriteString("1. 始终围绕下面这个当前步骤行动。\n")
sb.WriteString("2. 若当前步骤未完成,请继续思考-执行-观察循环。\n")
sb.WriteString("3. 若当前步骤已完成,请输出 action=next_plan并填写 goal_check 说明完成依据。\n")
sb.WriteString("4. 若整个任务已完成,请输出 action=done并填写 goal_check 总结整体证据。\n")
sb.WriteString("5. 若缺少关键用户信息且现有上下文无法补足,请输出 action=ask_user。\n")
sb.WriteString("6. 输出 next_plan 或 done 时goal_check 不能为空,必须对照 done_when 逐条验证。\n")
sb.WriteString("\n")
sb.WriteString(BuildExecuteDecisionContractText())
sb.WriteString("\n当前步骤正文\n")
sb.WriteString(strings.TrimSpace(currentStep.Content))
sb.WriteString("\n")
if strings.TrimSpace(currentStep.DoneWhen) != "" {
sb.WriteString("\n当前步骤完成判定\n")
sb.WriteString(strings.TrimSpace(currentStep.DoneWhen))
sb.WriteString("\n")
}
} else {
sb.WriteString("当前 plan 已存在,但当前步骤索引无效;请不要擅自执行其他步骤。\n")
}
return strings.TrimSpace(sb.String())
}
// BuildExecuteReActUserPrompt 构造纯 ReAct 模式的用户提示词。
func BuildExecuteReActUserPrompt(state *newagentmodel.CommonState) string {
var sb strings.Builder
sb.WriteString("当前为自由执行模式,无预定义计划步骤。\n")
sb.WriteString("请根据用户意图直接使用工具完成请求。\n\n")
sb.WriteString(renderStateSummary(state))
sb.WriteString("\n\n")
sb.WriteString("判断规则:\n")
sb.WriteString("- 需要查询/读取数据 → action=continue + tool_call读工具\n")
sb.WriteString("- 需要修改/写入数据 → action=confirm + tool_call写工具需用户确认\n")
sb.WriteString("- 缺少关键信息 → action=ask_user\n")
sb.WriteString("- 任务完成 → action=done + goal_check\n\n")
sb.WriteString(BuildExecuteReActContractText())
return strings.TrimSpace(sb.String())
}