From bcfaeb7e3930075a4920edfab259c98e344c19f9 Mon Sep 17 00:00:00 2001 From: Jordan Diaz Date: Fri, 3 Apr 2026 22:56:23 +0000 Subject: [PATCH] =?UTF-8?q?Conversaci=C3=B3n=20continua:=20historial=20com?= =?UTF-8?q?o=20mensajes=20user/assistant=20reales?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El agenticSystem ahora es conversacional — recuerda lo dicho en mensajes anteriores de la misma sesión. - engine.py: direct_response guarda en task_history con formato "User: X → Agent: Y" - context/engine.py: _build_messages() reconstruye el task_history como pares user/assistant reales en el array de messages, antes del mensaje actual. El modelo ve una conversación completa. - base.py: planner/reviewer no emiten AGENT_DELTA al frontend (su output es interno, no para el usuario) Co-Authored-By: Claude Opus 4.6 (1M context) --- src/context/engine.py | 24 ++++++++++++++++++++++-- src/orchestrator/engine.py | 17 +++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/context/engine.py b/src/context/engine.py index 435d6d1..38d5178 100644 --- a/src/context/engine.py +++ b/src/context/engine.py @@ -541,9 +541,29 @@ class ContextEngine: else: user_content = "Awaiting task assignment." - messages: list[dict[str, Any]] = [{"role": "user", "content": user_content}] + messages: list[dict[str, Any]] = [] - # Append real conversation (assistant messages + tool results) + # Include previous task exchanges as conversation history + # (so the model remembers what was said in earlier turns) + for entry in session.task_history[-10:]: + summary = entry.get("summary", "") + objective = entry.get("objective", "") + if summary.startswith("User: "): + # Direct response format: "User: X → Agent: Y" + parts = summary.split(" → Agent: ", 1) + user_msg = objective or parts[0].replace("User: ", "", 1) + agent_msg = parts[1] if len(parts) > 1 else summary + messages.append({"role": "user", "content": user_msg}) + messages.append({"role": "assistant", "content": agent_msg}) + elif objective: + # Task with tools — include as compact exchange + messages.append({"role": "user", "content": objective}) + messages.append({"role": "assistant", "content": summary[:500] if summary else "Tarea completada."}) + + # Current user message + messages.append({"role": "user", "content": user_content}) + + # Append real conversation (assistant messages + tool results from current step) if conversation: messages.extend(conversation) diff --git a/src/orchestrator/engine.py b/src/orchestrator/engine.py index 31f8ed8..9018808 100644 --- a/src/orchestrator/engine.py +++ b/src/orchestrator/engine.py @@ -123,6 +123,23 @@ class OrchestratorEngine: # Direct response — no plan needed (saludo, pregunta simple) if isinstance(plan_result, str): logger.info("Planner returned direct response for task %s", task.task_id) + + # Save to task history so conversation context is preserved + session.task_history.append({ + "task_id": task.task_id, + "objective": message, + "status": "completed", + "steps": 0, + "facts": [], + "key_data": {}, + "tools_used": [], + "artifacts_count": 0, + "summary": f"User: {message[:200]} → Agent: {plan_result[:200]}", + "review": "", + }) + if len(session.task_history) > 20: + session.task_history = session.task_history[-20:] + task.status = TaskStatus.COMPLETED session.complete_task()