Version: 0.9.6.dev.260407

后端:
1.execute 正式终止协议补齐(abort / exhausted / completed 统一建模)
  - 更新model/common_state.go:新增 FlowTerminalStatus / FlowTerminalOutcome;补齐 Abort/Exhaust/ClearTerminalOutcome/IsCompleted 等统一终止语义
  - 更新model/execute_contract.go:新增 ExecuteActionAbort 与 AbortIntent;补齐 action 校验互斥规则
  - 更新prompt/execute.go:Plan/ReAct 两套 execute contract 升级到 V2,补充 abort 协议与 JSON 示例
2.graph 路由与 deliver 收口统一围绕 terminal outcome
  - 更新graph/common_graph.go:RoughBuild 改 branch;粗排异常可直接 Deliver;Execute 路由不再按“最后一轮”提前误收口
  - 更新node/execute.go:轮次耗尽改写为 Exhaust;接入 handleExecuteActionAbort;abort 不在 execute 直接对用户收口
  - 更新node/deliver.go:deliver summary 优先按 abort/exhausted 收口;不再无脑 Done;最终状态文案改为“本轮流程已结束”
  - 更新node/agent_nodes.go:仅 completed 路径写 schedule preview,aborted/exhausted 跳过
3.提示与状态摘要同步终止语义
  - 更新prompt/base.go:state summary 增加 terminal outcome 展示
前端:无 仓库:无
This commit is contained in:
Losita
2026-04-07 23:59:50 +08:00
parent cdedd3c968
commit 310cdfbcb7
8 changed files with 483 additions and 36 deletions

View File

@@ -85,12 +85,10 @@ func RunDeliverNode(ctx context.Context, input DeliverNodeInput) error {
deliverStatusBlockID,
deliverStageName,
"done",
"任务已完成。",
"本轮流程已结束。",
true,
)
// 5. 标记流程结束。
flowState.Done()
return nil
}
@@ -101,6 +99,15 @@ func generateDeliverSummary(
flowState *newagentmodel.CommonState,
conversationContext *newagentmodel.ConversationContext,
) string {
if flowState != nil {
switch {
case flowState.IsAborted():
return normalizeSpeak(buildAbortSummary(flowState))
case flowState.IsExhaustedTerminal():
return normalizeSpeak(buildExhaustedSummary(flowState))
}
}
if client == nil {
return buildMechanicalSummary(flowState)
}
@@ -125,6 +132,38 @@ func generateDeliverSummary(
return normalizeSpeak(result.Text)
}
// buildAbortSummary 生成“流程已终止”的统一交付文案。
//
// 说明:
// 1. 第二轮开始abort 的用户可见文案由终止方提前写入 CommonState
// 2. deliver 不再重新猜测或改写业务异常,只做最终收口;
// 3. 若历史快照缺失 user_message则回退到一份通用说明避免前端收到空白结果。
func buildAbortSummary(state *newagentmodel.CommonState) string {
if state == nil || state.TerminalOutcome == nil {
return "本轮流程已终止。"
}
if msg := strings.TrimSpace(state.TerminalOutcome.UserMessage); msg != "" {
return msg
}
return "本轮流程已终止,请根据当前提示检查后再继续。"
}
// buildExhaustedSummary 生成“轮次耗尽”的统一收口文案。
func buildExhaustedSummary(state *newagentmodel.CommonState) string {
if state == nil {
return "本轮执行已达到安全轮次上限,当前先停止继续操作。"
}
prefix := "本轮执行已达到安全轮次上限,当前先停止继续操作。"
if state.TerminalOutcome != nil && strings.TrimSpace(state.TerminalOutcome.UserMessage) != "" {
prefix = strings.TrimSpace(state.TerminalOutcome.UserMessage)
}
if !state.HasPlan() {
return prefix
}
return prefix + "\n\n" + strings.TrimSpace(buildMechanicalSummary(state))
}
// buildMechanicalSummary 在 LLM 不可用时,机械拼接一份最小可用总结。
func buildMechanicalSummary(state *newagentmodel.CommonState) string {
if state == nil {
@@ -138,7 +177,7 @@ func buildMechanicalSummary(state *newagentmodel.CommonState) string {
return "任务流程已结束。"
}
if state.Exhausted() {
if state.IsExhaustedTerminal() {
sb.WriteString(fmt.Sprintf("任务因执行轮次耗尽提前结束,已完成 %d/%d 步。\n", current, total))
} else {
sb.WriteString("所有计划步骤已执行完毕。\n")
@@ -153,7 +192,7 @@ func buildMechanicalSummary(state *newagentmodel.CommonState) string {
sb.WriteString(fmt.Sprintf("%s %s\n", marker, strings.TrimSpace(step.Content)))
}
if state.Exhausted() && current < total {
if state.IsExhaustedTerminal() && current < total {
sb.WriteString("\n如需继续完成剩余步骤可以告诉我继续。")
}