后端:
1.execute 上下文瘦身第一版落地(固定 4 消息骨架 + ReAct 窗口压缩 + JSON 输出约束)
- 新建 prompt/execute_context.go:
execute 阶段改为 message[0..3] 固定结构;
加入历史摘要、当轮 ReAct 绑定展示、同工具 observation 压缩(保留最新)与工具简表返回示例提示
- 更新 prompt/execute.go:
重写 plan/ReAct 执行提示词;
补齐“可做/不可做”约束;
统一严格 JSON 指令;
补充 tool_call.arguments/abort/speak 非空等格式护栏
- 更新 model/execute_contract.go:
新增 ExecuteDecision/ToolCallIntent 自定义 Unmarshal;
兼容空字符串占位与 tool_call.parameters→arguments 回退解析
- 更新 node/correction.go:
为 correction 注入 history kind 标记,避免被当作真实用户输入污染摘要
- 更新 node/execute.go:
补齐 continue/ask_user/confirm 的 speak 兜底;
移除工具结果写入前 3000 字截断
2.工具层微调语义重构(任务视角概览 + 首个空位查询 + 移动权限收紧)
- 更新 tools/read_tools.go:
get_overview 改为任务视角全量输出(课程仅占位统计);
新增 find_first_free(首个命中位 + 当日负载明细);
find_free 保留兼容别名;
list_tasks 增加 status/category 校验与空结果纠偏文案
- 更新 tools/registry.go:
注册 find_first_free;
find_free 改兼容别名;
同步 get_overview/list_tasks/move/batch_move 描述语义
- 更新 tools/write_tools.go:
move/batch_move 仅允许 suggested,existing/pending 明确拒绝并返回可读错误
- 更新 tools/SCHEDULE_TOOLS.md:
同步 get_overview/find_first_free/list_tasks/move/batch_move 的最新入参与返回示例
- 更新 prompt/plan.go:
读工具示例由 find_free 调整为 find_first_free
3.交接文档与阶段说明同步
- 更新 newAgent/HANDOFF_粗排修复与Prompt重构.md:
更新为 2026-04-08;
补充“最新增量交接”章节(当前主矛盾、P0/P1、验证清单)
- 更新 newAgent/阶段3_上下文瘦身设计.md:
同步 existing/suggested 的 move/batch_move 约束口径
- 更新 newAgent/Log.txt:
追加本轮 execute 调试日志快照
前端:无
仓库:无
112 lines
3.6 KiB
Go
112 lines
3.6 KiB
Go
package newagentnode
|
||
|
||
import (
|
||
"fmt"
|
||
"strings"
|
||
|
||
newagentmodel "github.com/LoveLosita/smartflow/backend/newAgent/model"
|
||
"github.com/cloudwego/eino/schema"
|
||
)
|
||
|
||
const (
|
||
correctionHistoryKindKey = "newagent_history_kind"
|
||
correctionHistoryKindCorrectionUser = "llm_correction_prompt"
|
||
)
|
||
|
||
// AppendLLMCorrection 追加 LLM 修正提示到对话历史。
|
||
//
|
||
// 设计目的:
|
||
// 1. 当 LLM 输出不符合预期(如不支持的 action、格式错误等),不应直接报错终止;
|
||
// 2. 应该给 LLM 一个自我修正的机会,把错误反馈写回历史,让它重新生成;
|
||
// 3. 该函数封装了"追加 assistant 消息 + 追加纠正提示"的通用流程。
|
||
//
|
||
// 参数说明:
|
||
// - conversationContext: 对话上下文,用于追加历史消息;
|
||
// - llmOutput: LLM 的原始输出内容,会作为 assistant 消息追加;
|
||
// - validOptionsDesc: 合法选项的描述,用于构造纠正提示。
|
||
//
|
||
// 使用示例:
|
||
//
|
||
// AppendLLMCorrection(conversationContext, decision.Speak, "合法的 action 包括:continue、ask_user、next_plan、done")
|
||
//
|
||
// 返回值:
|
||
// - 返回 nil 表示修正流程完成,调用方应继续 Graph 循环;
|
||
// - 该函数不会返回 error,因为追加历史失败不影响主流程。
|
||
func AppendLLMCorrection(
|
||
conversationContext *newagentmodel.ConversationContext,
|
||
llmOutput string,
|
||
validOptionsDesc string,
|
||
) {
|
||
if conversationContext == nil {
|
||
return
|
||
}
|
||
|
||
// 1. 构造 assistant 消息,让 LLM 知道自己刚才输出了什么。
|
||
// 如果 llmOutput 为空,则生成一个占位描述。
|
||
assistantContent := strings.TrimSpace(llmOutput)
|
||
if assistantContent == "" {
|
||
assistantContent = "[LLM 输出为空或无法解析]"
|
||
}
|
||
conversationContext.AppendHistory(&schema.Message{
|
||
Role: schema.Assistant,
|
||
Content: assistantContent,
|
||
})
|
||
|
||
// 2. 构造纠正提示,明确告知 LLM 哪里错了、合法选项有哪些。
|
||
// 不做硬编码的错误类型,由调用方通过 validOptionsDesc 传入。
|
||
correctionContent := fmt.Sprintf(
|
||
"你的输出不符合预期。%s 请重新分析当前状态,输出正确的内容。",
|
||
validOptionsDesc,
|
||
)
|
||
conversationContext.AppendHistory(&schema.Message{
|
||
Role: schema.User,
|
||
Content: correctionContent,
|
||
Extra: map[string]any{
|
||
correctionHistoryKindKey: correctionHistoryKindCorrectionUser,
|
||
},
|
||
})
|
||
}
|
||
|
||
// AppendLLMCorrectionWithHint 追加 LLM 修正提示(带自定义错误描述)。
|
||
//
|
||
// 相比 AppendLLMCorrection,该函数允许调用方提供更详细的错误描述,
|
||
// 适用于需要明确告知 LLM 具体哪里出错的场景。
|
||
//
|
||
// 参数说明:
|
||
// - conversationContext: 对话上下文;
|
||
// - llmOutput: LLM 的原始输出内容;
|
||
// - errorDesc: 具体的错误描述,如 "action \"invalid\" 不是合法的执行动作";
|
||
// - validOptionsDesc: 合法选项的描述。
|
||
func AppendLLMCorrectionWithHint(
|
||
conversationContext *newagentmodel.ConversationContext,
|
||
llmOutput string,
|
||
errorDesc string,
|
||
validOptionsDesc string,
|
||
) {
|
||
if conversationContext == nil {
|
||
return
|
||
}
|
||
|
||
assistantContent := strings.TrimSpace(llmOutput)
|
||
if assistantContent == "" {
|
||
assistantContent = "[LLM 输出为空或无法解析]"
|
||
}
|
||
conversationContext.AppendHistory(&schema.Message{
|
||
Role: schema.Assistant,
|
||
Content: assistantContent,
|
||
})
|
||
|
||
correctionContent := fmt.Sprintf(
|
||
"%s %s 请重新分析当前状态,输出正确的内容。",
|
||
errorDesc,
|
||
validOptionsDesc,
|
||
)
|
||
conversationContext.AppendHistory(&schema.Message{
|
||
Role: schema.User,
|
||
Content: correctionContent,
|
||
Extra: map[string]any{
|
||
correctionHistoryKindKey: correctionHistoryKindCorrectionUser,
|
||
},
|
||
})
|
||
}
|