agentscope-ai / agentscope-ai/agentscope-java

Plan 完成态 hint 在最后一步与 finish_plan 同轮调用时无法触达

Abierto
#1,779 1 comentario 0 reacciones 0 asignados Ver en GitHub
area/core/agent bug
Lenguaje dominante
Java
Estrellas
5.6k
Forks
1.3k
Merge medio
4 d 12 h
PR fusionados (30 d)
77

Descripción

## 问题描述

在 PlanNotebook 的默认提示逻辑中,`DefaultPlanToHint` 存在一个“所有子任务均已 done/abandoned”时提示调用 `finish_plan` 的分支:

```java
if (nDone + nAbandoned == plan.getSubtasks().size()) {
hint = AT_THE_END.replace("{plan}", plan.toMarkdown(false));
}
```

但在实际 ReAct 流程中,LLM 很容易在完成最后一个子任务时,在同一轮 reasoning 里同时调用:

1. `finish_subtask`,完成最后一个 subtask
2. `finish_plan`,完成整个 plan

默认工具执行是串行的,因此 `finish_subtask` 会先把最后一个 subtask 标记为 done,随后 `finish_plan` 立刻将 `currentPlan` 归档并置为 `null`。等下一轮 `PreReasoningEvent` 触发 hint 注入时,PlanNotebook 已经没有 active plan,`DefaultPlanToHint` 无法再看到“所有 subtasks 已完成但 plan 尚未 finish”的状态窗口。

## 实际表现

- `AT_THE_END` 分支在单元测试或人工直接调用 `generateHint(plan)` 时可达。
- 但在真实 agent 执行路径中,如果模型一次性返回 `finish_subtask(last)` + `finish_plan` 两个工具调用,这个 end hint 不会被注入。
- 下一轮 prereason 时 `currentPlan == null`,hint 会变成 `NO_PLAN`,或者在带 iteration guard 的逻辑中被跳过。

## 预期表现

当最后一个 subtask 完成后,agent 应该有机会看到明确的完成态提示,或者框架应该避免/处理同一轮中同时调用 `finish_subtask(last)` 与 `finish_plan` 导致 end hint 状态窗口被跳过的问题。

## 影响

这个问题会让 `DefaultPlanToHint` 中“所有 subtasks 已完成,提示调用 finish_plan 并总结”的设计在真实多工具调用场景中不稳定。模型如果自行提前调用了 `finish_plan`,后续 hint 生命周期会直接进入无计划状态。

## 可能的改进方向

可以考虑以下任一方案:

- 在 `finish_subtask` 完成最后一个 subtask 后,通过工具返回消息明确提示下一步只应调用 `finish_plan` 并总结。
- 在 `finish_plan` 内部校验所有 subtasks 是否已完成,并对同轮调用场景提供更清晰的结果消息。
- 在 plan hint hook 或工具执行层面保留一个刚完成的 plan 状态,使下一轮仍可注入一次 end hint。
- 调整工具描述,约束模型不要在同一轮同时调用 `finish_subtask` 和 `finish_plan`。

## 相关位置

- `DefaultPlanToHint.generateHint(...)` 的全部子任务完成分支
- `PlanNotebook.finishSubtask(...)`
- `PlanNotebook.finishPlan(...)` 中 `currentPlan = null`
- `ReActAgent` 的 plan hint hook 注入逻辑

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.