Rediseño tool results + compactación por step + integración Docker
- Tool results completos en conversación (como Claude Code/Cursor) en vez de resúmenes en system prompt - Parser multi-tool: trackea tool calls por tool_call_id para OpenAI streaming interleaved - Deduplicación por fingerprint + detección de loop cuando todos los calls de un step son duplicados - Compactación inteligente por step: el orquestador decide cuándo comprimir steps anteriores (cambio de agente o >3 steps) - stdio.js lee URLs del .acai como fallback (local_web_url, local_forge_host) - Buffer MCP aumentado a 1MB para respuestas grandes - Dockerfile adaptado para build context desde raíz del proyecto Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -16,7 +16,7 @@ from ..context.engine import ContextEngine
|
||||
from ..mcp.manager import MCPManager
|
||||
from ..memory.store import MemoryStore
|
||||
from ..models.agent import AgentRole
|
||||
from ..models.session import SessionState, SessionStatus, TaskStatus
|
||||
from ..models.session import SessionState, SessionStatus, TaskState, TaskStatus
|
||||
from ..streaming.sse import SSEEmitter, EventType
|
||||
from .agents.coder import CoderAgent, create_coder_profile
|
||||
from .agents.collector import CollectorAgent, create_collector_profile
|
||||
@@ -181,6 +181,10 @@ class OrchestratorEngine:
|
||||
for artifact in step_result.get("artifacts", []):
|
||||
task.facts_extracted.extend(artifact.facts[:5])
|
||||
|
||||
# Decide if previous steps should be compacted
|
||||
if i > 0:
|
||||
self._maybe_compact_previous_steps(task, current_index=i)
|
||||
|
||||
except Exception as e:
|
||||
logger.error("Step %d failed: %s", i + 1, e)
|
||||
step.status = TaskStatus.FAILED
|
||||
@@ -323,6 +327,35 @@ class OrchestratorEngine:
|
||||
task.task_id, len(task.facts_extracted), len(tools_used), len(task_artifacts),
|
||||
)
|
||||
|
||||
def _maybe_compact_previous_steps(
|
||||
self, task: TaskState, current_index: int
|
||||
) -> None:
|
||||
"""Decide if previous steps should be compacted. Deterministic rules."""
|
||||
current_step = task.plan[current_index]
|
||||
|
||||
for i in range(current_index):
|
||||
prev = task.plan[i]
|
||||
if prev.compacted or prev.status != TaskStatus.COMPLETED:
|
||||
continue
|
||||
|
||||
# Rule 1: Change of agent role → previous steps are a different focus
|
||||
if prev.agent_role != current_step.agent_role:
|
||||
prev.compacted = True
|
||||
logger.info(
|
||||
"Compacted step %d (%s) — agent changed to %s",
|
||||
i + 1, prev.agent_role, current_step.agent_role,
|
||||
)
|
||||
continue
|
||||
|
||||
# Rule 2: More than 3 completed non-compacted steps → compact oldest
|
||||
non_compacted = [
|
||||
s for s in task.plan[:current_index]
|
||||
if s.status == TaskStatus.COMPLETED and not s.compacted
|
||||
]
|
||||
if len(non_compacted) > 3:
|
||||
non_compacted[0].compacted = True
|
||||
logger.info("Compacted oldest step to stay within budget")
|
||||
|
||||
def _create_agent(self, role: AgentRole) -> PlannerAgent | CoderAgent | CollectorAgent | ReviewerAgent:
|
||||
"""Instantiate a subagent for the given role."""
|
||||
profile = self._profiles[role]
|
||||
|
||||
Reference in New Issue
Block a user