Emitir plan como bloque tool_use visible en el frontend

El plan del planner se emite como tool_use(name="plan") + tool_result
con los steps formateados. El frontend lo renderiza como un bloque
colapsable de herramienta con el plan de ejecución.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jordan Diaz
2026-04-03 23:32:45 +00:00
parent 2d5cc4e10a
commit ded0e997ed

View File

@@ -201,6 +201,33 @@ class OrchestratorEngine:
task.task_id, task.task_id,
) )
# Emit plan to frontend as a visible block
plan_tool_id = f"plan_{task.task_id}"
plan_steps_list = [
{"step": i + 1, "agent": s.agent_role, "description": s.description}
for i, s in enumerate(plan_result)
]
await self.sse.emit(
EventType.TOOL_STARTED,
{"tool": "plan", "step": 0, "tool_call_id": plan_tool_id},
session_id=session.session_id,
)
plan_text = "\n".join(
f" {s['step']}. [{s['agent']}] {s['description']}"
for s in plan_steps_list
)
await self.sse.emit(
EventType.TOOL_COMPLETED,
{
"tool": "plan",
"status": "completed",
"summary": f"Plan: {len(plan_result)} steps",
"raw_output": f"Plan de ejecución ({len(plan_result)} pasos):\n{plan_text}",
"tool_call_id": plan_tool_id,
},
session_id=session.session_id,
)
# 3. Execute each step — failures are logged and skipped # 3. Execute each step — failures are logged and skipped
results: list[dict[str, Any]] = [] results: list[dict[str, Any]] = []
failed_steps: list[int] = [] failed_steps: list[int] = []