Ajustes de estructura
This commit is contained in:
@@ -64,8 +64,6 @@ class BaseAgent:
|
||||
total_output_tokens = 0
|
||||
# Real conversation history: assistant messages + tool results
|
||||
conversation: list[dict[str, Any]] = []
|
||||
tool_fingerprints: dict[str, ToolExecution] = {}
|
||||
all_duplicates_streak = 0 # consecutive steps where ALL calls are duplicates
|
||||
|
||||
for step in range(max_steps):
|
||||
# Build context with real conversation
|
||||
@@ -205,14 +203,19 @@ class BaseAgent:
|
||||
]
|
||||
conversation.append(assistant_msg)
|
||||
|
||||
# Execute tool calls and add COMPLETE results to conversation
|
||||
duplicates_this_step = 0
|
||||
# Execute tool calls and add COMPLETE results to conversation.
|
||||
# Antes habia dos capas anti-duplicado: (a) cachear resultado y
|
||||
# devolver "[DUPLICADO]" en lugar de re-ejecutar y (b) cortar el
|
||||
# step si TODAS las llamadas del paso eran duplicadas. Las quitamos
|
||||
# porque en conversaciones largas el agente puede LEGITIMAMENTE
|
||||
# repetir una llamada (p.ej. re-leer un fichero tras editarlo) y
|
||||
# las heuristicas bloqueaban acciones validas. El usuario prefiere
|
||||
# libertad — runaway loops se mitigan con limit de steps externo.
|
||||
for tc in tool_calls:
|
||||
# Si los args no se pudieron parsear (p.ej. truncados por max_tokens),
|
||||
# NO ejecutamos la tool. En su lugar devolvemos un mensaje al modelo
|
||||
# explicando el problema para que pueda ajustar el siguiente intento
|
||||
# (dividir el contenido, acortar, etc.). Fingerprint incluye el hash
|
||||
# del raw para distinguir fallos distintos.
|
||||
# (dividir el contenido, acortar, etc.).
|
||||
if tc.get("parse_error"):
|
||||
pe = tc["parse_error"]
|
||||
conversation.append({
|
||||
@@ -229,24 +232,6 @@ class BaseAgent:
|
||||
),
|
||||
})
|
||||
continue
|
||||
fp_raw = f"{tc['name']}:{json.dumps(tc.get('parsed_arguments', {}), sort_keys=True)}"
|
||||
fp = hashlib.md5(fp_raw.encode()).hexdigest()
|
||||
|
||||
if fp in tool_fingerprints:
|
||||
prev_exec = tool_fingerprints[fp]
|
||||
tool_executions.append(prev_exec)
|
||||
duplicates_this_step += 1
|
||||
# Return cached result as tool message
|
||||
conversation.append({
|
||||
"role": "tool",
|
||||
"tool_call_id": tc["id"],
|
||||
"content": (
|
||||
"[DUPLICADO] Ya ejecutada con mismos argumentos. Resultado: "
|
||||
f"{prev_exec.raw_output[:settings.tool_raw_output_max_chars]}"
|
||||
),
|
||||
})
|
||||
logger.warning("Duplicate tool call skipped: %s (fingerprint: %s)", tc["name"], fp[:8])
|
||||
continue
|
||||
|
||||
tool_exec = await self._execute_tool(
|
||||
session=session,
|
||||
@@ -255,7 +240,6 @@ class BaseAgent:
|
||||
artifacts=artifacts,
|
||||
tool_call_id=tc["id"],
|
||||
)
|
||||
tool_fingerprints[fp] = tool_exec
|
||||
tool_executions.append(tool_exec)
|
||||
|
||||
# COMPLETE result in conversation (truncated to safe limit)
|
||||
@@ -269,32 +253,6 @@ class BaseAgent:
|
||||
),
|
||||
})
|
||||
|
||||
# Loop detection: if ALL tool calls in this step were duplicates
|
||||
if duplicates_this_step == len(tool_calls):
|
||||
all_duplicates_streak += 1
|
||||
if all_duplicates_streak >= 2:
|
||||
logger.warning("Loop detected: %d consecutive steps with all duplicate calls. Breaking.", all_duplicates_streak)
|
||||
conversation.append({
|
||||
"role": "user",
|
||||
"content": "[SISTEMA] Se detectaron llamadas repetidas. Ya tienes toda la información necesaria. Genera tu respuesta final ahora.",
|
||||
})
|
||||
# One more chance to generate a final response
|
||||
ctx = await self.context.build_context(
|
||||
session=session, agent=self.profile,
|
||||
artifacts=artifacts, conversation=conversation,
|
||||
)
|
||||
async for chunk in self.model.stream(
|
||||
messages=ctx.to_messages(),
|
||||
config=config,
|
||||
):
|
||||
if chunk.delta:
|
||||
accumulated_content += chunk.delta
|
||||
if chunk.finish_reason:
|
||||
break
|
||||
break
|
||||
else:
|
||||
all_duplicates_streak = 0
|
||||
|
||||
return {
|
||||
"content": accumulated_content,
|
||||
"artifacts": artifacts,
|
||||
|
||||
Reference in New Issue
Block a user