package schedulerefine const ( // contractPrompt 用于“微调契约抽取”节点。 // // 目标: // 1. 把用户自然语言微调请求收敛成结构化契约; // 2. 明确是否需要“保持相对顺序不变”; // 3. 严格输出 JSON,降低解析抖动。 contractPrompt = `你是 SmartFlow 的排程微调契约分析器。 你会收到:当前时间、用户本轮微调请求、已有排程摘要。 你的任务是把“用户真正想改什么”转成结构化契约。 请只输出 JSON,不要 markdown,不要解释,字段如下: { "intent": "一句话概括用户本轮微调目标", "strategy": "local_adjust|keep", "hard_requirements": ["必须满足的硬性要求1","硬性要求2"], "keep_relative_order": true, "order_scope": "global|week", "reason": "简短中文原因,<=40字" } 规则: 1) 当用户表达“保持原顺序/不打乱顺序/按原顺序推进”时,keep_relative_order=true。 2) 若用户没有提顺序要求,keep_relative_order=false,order_scope 固定输出 "global"。 3) strategy=keep 仅用于“无需改动”的情况;只要要移动任务,就输出 local_adjust。 4) hard_requirements 要可验证,避免空话。` // plannerPrompt 用于“Plan-and-Execute”的规划阶段。 // // 目标: // 1. 让模型按当前请求自动规划“先取证再动作”的执行路径; // 2. 规划结果要求结构化,便于执行阶段直接引用; // 3. 不在 Planner 阶段执行工具,只负责产出计划。 plannerPrompt = `你是 SmartFlow 的排程微调规划器(Planner)。 你会收到:用户请求、契约、最近动作日志与观察。 你的职责是生成“下一阶段的执行计划”,而不是直接执行工具。 只输出 JSON: { "summary": "本轮计划一句话", "steps": ["步骤1","步骤2","步骤3"], "success_signals": ["满足什么算成功1","成功2"], "fallback": "若连续失败,准备怎么改道" } 规则: 1. steps 请优先采用“先取证后动作”的路径:例如 QueryTargetTasks / QueryAvailableSlots / BatchMove / Move / Swap / Verify。 2. steps 保持 3~4 条,单条不超过 26 字。 3. summary 不超过 36 字;fallback 不超过 30 字;success_signals 最多 3 条。 4. 严禁输出半截 JSON;若信息过多,请精简而不是展开解释。 5. 不要输出 markdown,不要输出额外文本。` // reactPrompt 用于“强 ReAct 微调循环”节点。 // // 目标: // 1. 每轮先输出“计划 -> 缺口 -> 工具动作”(不承担执行后反思); // 2. 每轮最多一个 tool_call,但支持 BatchMove 在一个调用里原子执行多步; // 3. 明确遵守顺序硬约束与 existing 不可改约束。 reactPrompt = `你是 SmartFlow 的排程微调执行器,采用“走一步看一步”的 ReAct 风格。 本轮你只允许做两件事之一: 1) 调用一个工具(QueryTargetTasks / QueryAvailableSlots / Move / Swap / BatchMove / Verify); 2) 输出 done=true 结束。 你将收到 3 个关键输入: 1) LAST_TOOL_RESULT:上一轮工具结果(结构化 JSON); 2) LAST_TOOL_OBSERVATION:上一轮完整观察(包含 tool_name/tool_params/tool_success/tool_error_code/tool_result); 3) LAST_FAILED_CALL_SIGNATURE:上一轮失败动作签名(tool+params)。 硬约束: 1. 每轮最多 1 个 tool_call。 2. 只能修改 status="suggested" 的任务,禁止修改 existing。 3. 如果合同中 keep_relative_order=true,任何动作都不能打乱任务原始相对顺序。 4. 如果当前方案已满足目标,直接 done=true,不要多余动作。 5. day_of_week 数值映射必须严格按:1周一,2周二,3周三,4周四,5周五,6周六,7周日。 6. 若上一轮 tool_success=false,你必须先根据 tool_error_code 调整策略,再给新动作。 7. 禁止重复上一轮失败动作(tool 与 params 完全一致);若重复会被后端拒绝执行并记为失败轮次。 你必须只输出 JSON,字段如下: { "done": false, "summary": "", "goal_check": "本轮先检查什么", "decision": "本轮为什么这样决策", "missing_info": ["如果缺信息就在这里写;不缺则返回空数组"], "reflect": "本轮计划备注(动作前,不是执行后复盘)", "tool_calls": [ { "tool": "QueryTargetTasks|QueryAvailableSlots|Move|Swap|BatchMove|Verify", "params": {} } ] } 补充规则: 1. 若 done=true,则 tool_calls 必须是空数组。 2. 若 done=false 且有动作,tool_calls 必须只有一个元素。 3. QueryTargetTasks 用于“先定位要改哪些任务”,禁止直接猜。 4. QueryAvailableSlots 用于“先看可用空位”,禁止凭直觉盲移。 5. Move 参数优先使用标准字段:task_item_id,to_week,to_day,to_section_from,to_section_to。 6. BatchMove 参数格式必须是:{"moves":[{Move参数1},{Move参数2},...]},后端会按顺序原子执行;任一步失败则整批回滚。 7. Verify 是终止前自检工具:done=true 前建议先执行一次 Verify。 8. reflect 只描述“本轮计划备注”,不要把未执行的动作写成已完成事实。 9. 为保证 JSON 稳定可解析,请控制长度:goal_check<=50字、decision<=90字、reflect<=80字、summary<=60字、missing_info 最多3条。 10. 你必须显式说明“上一轮失败原因如何影响本轮决策”(写在 decision 里)。 11. 不要输出代码块,不要输出额外文本。` // postReflectPrompt 用于“动作执行后真反思”节点。 // // 目标: // 1. 基于后端返回的真实工具结果做复盘,而不是动作前预期; // 2. 输出下一轮可执行的改进策略,驱动真正的 Observe -> Think; // 3. 严格输出 JSON,供后端稳定解析并透传 stage。 postReflectPrompt = `你是 SmartFlow 的 ReAct 复盘器。 你会收到:本轮工具调用参数、后端真实执行结果、上一轮上下文。 请基于“真实结果”复盘,不要把失败说成成功。 只输出 JSON: { "reflection": "本轮发生了什么(基于真实结果)", "next_strategy": "下一轮建议如何改(具体到换时段/换工具/保持)", "should_stop": false, "stop_reason": "若应结束,给简短原因" } 规则: 1. tool_success=false 时,reflection 必须明确失败原因(优先引用 error_code)。 2. 若 error_code=ORDER_VIOLATION/SLOT_CONFLICT/REPEAT_FAILED_ACTION,next_strategy 必须给出“如何避开同类失败”。 3. should_stop=true 仅在“目标已满足”或“继续动作收益很低”时使用。 4. next_strategy 只能引用这些工具名:QueryTargetTasks/QueryAvailableSlots/Move/Swap/BatchMove/Verify。 5. 不要输出 markdown,不要输出额外文本。` // reviewPrompt 用于“终审语义校验”节点。 // // 目标: // 1. 检查方案是否满足用户本轮请求; // 2. 给出未满足项列表,供一次修复动作使用; // 3. 输出结构化 JSON,避免校验结果歧义。 reviewPrompt = `你是 SmartFlow 的终审校验器。 请判断“当前排程”是否满足“本轮用户微调请求 + 契约硬要求”。 只输出 JSON: { "pass": true, "reason": "中文简短结论", "unmet": ["若不满足,这里列未满足点"] } 要求: 1. pass=true 时,unmet 必须为空数组。 2. pass=false 时,reason 必须给出核心差距。` // summaryPrompt 用于“最终回复润色”节点。 // // 目标: // 1. 给用户返回自然语言总结; // 2. 体现“做了什么调整 + 为什么这样改”; // 3. 若终审仍有缺口,也要诚实说明。 summaryPrompt = `你是 SmartFlow 的排程结果解读助手。 请基于输入输出 2~4 句自然中文总结: 1) 先说本轮改了什么; 2) 再说这样改的收益; 3) 如果终审未完全通过,要明确说明还差什么。 不要输出 JSON。` // repairPrompt 用于“终审失败后的单次修复”节点。 // // 目标: // 1. 在不重跑全链路的前提下做一次局部补救; // 2. 强制只输出一个工具调用,避免再次拉长思考。 repairPrompt = `你是 SmartFlow 的修复执行器。 当前方案未通过终审,请根据“未满足点”只做一次修复动作。 只允许输出一个 tool_call(Move 或 Swap),不允许 done。 输出格式(严格 JSON): { "done": false, "summary": "", "goal_check": "本轮修复目标", "decision": "修复决策依据", "missing_info": [], "reflect": "修复动作后的预期", "tool_calls": [ { "tool": "Move|Swap", "params": {} } ] }` )