后端: 1. deliver 收口上下文重构——历史折叠到工作区,仅基于本轮 execute 窗口诚实收口 - newAgent/prompt/deliver.go:BuildDeliverMessages 改为向 buildDeliverWorkspace 透传 ConversationContext - newAgent/prompt/deliver_context.go:deliver 的 msg1 改为轻量提示,不再回灌完整历史;msg2 追加本轮 execute 窗口与结果态信息 前端: 2. 品牌命名统一切换为 SmartMate - index.html:页面标题从 SmartFlow 改为 SmartMate - package.json:前端包名改为 smartmate-frontend - App.vue:布局类名从 smartflow-* 统一改为 smartmate-* - stores/auth.ts:access/refresh token 与 last username 的 localStorage key 全部切到 smartmate_* - utils/idempotency.ts:默认幂等键前缀从 smartflow 改为 smartmate - DashboardView.vue:首页默认问候名从 SmartFlow 用户改为 SmartMate 用户 3. 助手页体验重做——默认空会话、排程卡片懒加载、上下文统计刷新时机收口 - components/dashboard/AssistantPanel.vue:进入页面不再自动打开最后一次会话,改为展示居中欢迎空态 - components/dashboard/AssistantPanel.vue:schedule_completed 改为先展示占位卡片,点击后再拉取 schedule preview,避免预览未落库时并发 404 - components/dashboard/AssistantPanel.vue:tool done、schedule card、SSE block done、[DONE] 与整轮流结束后统一刷新 context stats - components/dashboard/AssistantPanel.vue:重构聊天区布局、空态欢迎内容、底部交互区与内外边距,整体视觉切到更轻的阅读式界面 - views/AssistantView.vue:移除外层白底卡片壳,交由 AssistantPanel 自己承接容器视觉 4. 排程微调保存链路补幂等保护,并修正请求头口径 - api/schedule_agent.ts:正式应用接口请求头从 Idempotency-Key 改为 X-Idempotency-Key - components/assistant/ScheduleFineTuneModal.vue:同一预览会话复用稳定幂等键,保存成功后再刷新新 key,避免重试或延迟导致重复落库 - components/assistant/ScheduleResultCard.vue:结果卡片样式、hover 与进场动效整体升级 5. 任务类选择器与侧边导航细节调整 - components/assistant/TaskClassPlanningPicker.vue:popover、骨架屏、列表项、选中态与按钮视觉整体重绘 - components/common/MainSidebar.vue:移除“任务”占位入口,侧栏只保留总览 / 日程 / 助手 6. 登录页与首页展示风格重做 - views/AuthView.vue:品牌文案切到 SmartMate,登录/注册从 tabs 改为自定义双态切换,重做背景、玻璃卡片、表单与动效 - views/DashboardView.vue:首页主区改为 auto + 1fr 布局,锁定顶部栏高度,避免缩放时形变 仓库: 7. README 全量更新到当前版本能力边界 - README.md:重写项目定位、功能描述、业务闭环图、newAgent graph 流程、工具定义、前端衔接边界、页面展示、部署方案与监控说明
146 lines
5.3 KiB
Go
146 lines
5.3 KiB
Go
package newagentprompt
|
||
|
||
import (
|
||
"fmt"
|
||
"strings"
|
||
|
||
newagentmodel "github.com/LoveLosita/smartflow/backend/newAgent/model"
|
||
)
|
||
|
||
// buildDeliverConversationMessage 生成 deliver 节点看到的轻量历史提示。
|
||
//
|
||
// 职责边界:
|
||
// 1. 这里不再承载完整历史,也不再把旧轮次对话重新灌回 deliver;
|
||
// 2. 真正可供收口的本轮 execute 窗口放到 msg2,由工作区统一呈现;
|
||
// 3. 这里只给模型一个明确提示:历史已经折叠,请不要主动回顾旧轮次。
|
||
func buildDeliverConversationMessage(ctx *newagentmodel.ConversationContext) string {
|
||
return "历史视图:已折叠到交付工作区的本轮 execute 窗口,请仅依据 msg2 收口,不要回顾旧轮次。"
|
||
}
|
||
|
||
// buildDeliverRoughBuildPrefix 构造 deliver 在“粗排已完成”场景下的专属前缀。
|
||
//
|
||
// 职责边界:
|
||
// 1. 这里只负责把粗排相关的任务类信息补进 msg3 前缀,不改写交付总结本身;
|
||
// 2. 只有在上下文里明确存在 rough_build_done 时才注入,避免普通交付场景被额外信息污染;
|
||
// 3. 这段前缀用于补齐第一次粗排没有正式计划时的任务类详情,优先让 deliver 看到 task_class_ids 和任务类约束。
|
||
func buildDeliverRoughBuildPrefix(ctx *newagentmodel.ConversationContext, state *newagentmodel.CommonState) string {
|
||
if !hasExecuteRoughBuildDone(ctx) {
|
||
return ""
|
||
}
|
||
|
||
lines := []string{
|
||
"粗排补充信息:",
|
||
"- 本轮已经完成粗排,相关任务类已进入 suggested/existing,不要把它们说成正式计划。",
|
||
}
|
||
|
||
if taskClassIDs := renderPlanTaskClassIDs(state); taskClassIDs != "" {
|
||
lines = append(lines, "- "+taskClassIDs)
|
||
}
|
||
if taskClassMeta := renderPlanTaskClassMeta(state); taskClassMeta != "" {
|
||
lines = append(lines, "任务类详情:")
|
||
lines = append(lines, taskClassMeta)
|
||
}
|
||
|
||
if state == nil || !state.HasPlan() {
|
||
lines = append(lines, "- 当前没有正式计划,请把这批任务类的粗排结果作为总结重点。")
|
||
}
|
||
|
||
return strings.Join(lines, "\n")
|
||
}
|
||
|
||
// buildDeliverWorkspace 渲染 deliver 节点自己的结果态工作区。
|
||
//
|
||
// 设计说明:
|
||
// 1. 先保留 deliver 原本依赖的结果态信息:terminal outcome、计划进度、步骤简表;
|
||
// 2. 再把基于 execute_loop_closed 切出来的“本轮 execute 窗口”拼到 msg2,作为唯一的本轮事实视图;
|
||
// 3. 没有正式计划时也保留 execute 窗口,保证 deliver 仍能基于当前轮活跃上下文诚实收口。
|
||
func buildDeliverWorkspace(state *newagentmodel.CommonState, ctx *newagentmodel.ConversationContext) string {
|
||
lines := []string{"交付工作区:"}
|
||
if state == nil {
|
||
lines = append(lines, "- 当前缺少流程状态,请仅基于可见结果态与本轮 execute 窗口诚实收口。")
|
||
lines = append(lines, "", buildDeliverExecuteWindow(ctx))
|
||
return strings.Join(lines, "\n")
|
||
}
|
||
|
||
lines = append(lines, renderDeliverTerminalSummary(state))
|
||
if !state.HasPlan() {
|
||
lines = append(lines, "- 当前没有正式计划,请只概括本次互动。")
|
||
lines = append(lines, "", buildDeliverExecuteWindow(ctx))
|
||
return strings.Join(lines, "\n")
|
||
}
|
||
|
||
total := len(state.PlanSteps)
|
||
completed := countCompletedPlanSteps(state)
|
||
lines = append(lines, fmt.Sprintf("- 计划进度:已完成 %d/%d 步。", completed, total))
|
||
lines = append(lines, "计划步骤:")
|
||
lines = append(lines, renderDeliverStepOutline(state, completed))
|
||
lines = append(lines, "", buildDeliverExecuteWindow(ctx))
|
||
|
||
return strings.Join(lines, "\n")
|
||
}
|
||
|
||
// renderDeliverTerminalSummary 返回 deliver 节点需要知道的收口状态。
|
||
func renderDeliverTerminalSummary(state *newagentmodel.CommonState) string {
|
||
if state == nil || !state.HasTerminalOutcome() || state.TerminalOutcome == nil {
|
||
return "- 当前没有正式终止结果,请按最近对话和计划进度自然总结。"
|
||
}
|
||
|
||
outcome := state.TerminalOutcome
|
||
line := fmt.Sprintf("- 收口状态:%s", outcome.Status)
|
||
if stage := strings.TrimSpace(outcome.Stage); stage != "" {
|
||
line += fmt.Sprintf(";阶段:%s", stage)
|
||
}
|
||
if msg := strings.TrimSpace(outcome.UserMessage); msg != "" {
|
||
line += fmt.Sprintf(";用户提示:%s", msg)
|
||
}
|
||
return line
|
||
}
|
||
|
||
// renderDeliverStepOutline 生成 deliver 节点使用的步骤简表。
|
||
func renderDeliverStepOutline(state *newagentmodel.CommonState, completed int) string {
|
||
if state == nil || len(state.PlanSteps) == 0 {
|
||
return "- 暂无。"
|
||
}
|
||
|
||
lines := make([]string, 0, len(state.PlanSteps))
|
||
for i, step := range state.PlanSteps {
|
||
status := "未完成"
|
||
if i < completed {
|
||
status = "已完成"
|
||
}
|
||
|
||
content := strings.TrimSpace(step.Content)
|
||
if content == "" {
|
||
content = "(步骤正文为空)"
|
||
}
|
||
line := fmt.Sprintf("%d. [%s] %s", i+1, status, content)
|
||
if doneWhen := strings.TrimSpace(step.DoneWhen); doneWhen != "" {
|
||
line += fmt.Sprintf(" | 完成判定:%s", doneWhen)
|
||
}
|
||
lines = append(lines, line)
|
||
}
|
||
return strings.Join(lines, "\n")
|
||
}
|
||
|
||
// countCompletedPlanSteps 统计当前已经完成的计划步骤数。
|
||
func countCompletedPlanSteps(state *newagentmodel.CommonState) int {
|
||
if state == nil {
|
||
return 0
|
||
}
|
||
|
||
total := len(state.PlanSteps)
|
||
if total == 0 {
|
||
return 0
|
||
}
|
||
if state.CurrentStep <= 0 {
|
||
if state.IsCompleted() {
|
||
return total
|
||
}
|
||
return 0
|
||
}
|
||
if state.CurrentStep >= total {
|
||
return total
|
||
}
|
||
return state.CurrentStep
|
||
}
|