DeerFlow
Detector de bucles de DeerFlow: normalización, huellas y estado acotado
Examina funciones Python verificadas, intervalos de lectura de 200 líneas, huellas independientes del orden y la diferencia entre expulsión por inserción y LRU.
Qué aprenderás
- Normaliza el transporte antes de comparar llamadas
- Conserva diferencias relevantes, elimina orden incidental
- Comprueba un límite pequeño sin arrancar el agente
Antes de empezar
- Conceptos básicos de Python, HTTP y contenedores
- Una tarea propia con criterios de aceptación
Explica el límite de implementación y aplica la lista o el ejercicio aislado del capítulo.
Conclusiones clave
- La normalización conecta formatos de transporte distintos.
- La huella ignora permutaciones, pero conserva multiplicidad.
- Expulsión por inserción no equivale a LRU.
Normaliza el transporte antes de comparar llamadas
_normalize_tool_call_args acepta diccionarios y analiza defensivamente argumentos serializados como JSON. Un diccionario analizado se convierte en argumentos normales; otro valor JSON conserva una cadena alternativa estable. El JSON inválido también se mantiene como alternativa sin derribar el detector. Esto importa porque dos proveedores pueden representar la misma llamada con formas de transporte distintas.
_stable_tool_key trata read_file de forma especial: convierte y ordena las líneas inicial y final, las limita a uno como mínimo y las agrupa en intervalos de 200 líneas. Leer 1–199 y 200–1 en la misma ruta produce el intervalo 0–0; empezar en 201 produce 1–1. Pequeñas variaciones de líneas no se consideran automáticamente progreso nuevo.
Conserva diferencias relevantes, elimina orden incidental
write_file y str_replace incluyen todos los argumentos porque modificar contenido en una misma ruta puede ser progreso legítimo. Otras herramientas priorizan campos como ruta, URL, consulta y comando. Son aproximaciones, no pruebas semánticas: un campo ignorado puede importar a una herramienta personalizada, y agrupar lecturas puede unir peticiones útiles diferentes.
_hash_tool_calls ordena las entradas normalizadas de nombre y clave, las serializa y conserva doce caracteres hexadecimales de MD5. Reordenar un lote mantiene la huella, pero añadir un duplicado cambia el multiconjunto y su huella. Este identificador corto sirve para seguimiento de repetición; no es un token de autorización ni una garantía sin colisiones.
Comprueba un límite pequeño sin arrancar el agente
Nuestro sondeo de solo lectura verifica los hashes exactos del código descargado, extrae únicamente las tres funciones inspeccionadas mediante el AST de Python y las ejecuta con biblioteca estándar. Confirmó normalización JSON, intervalos, sensibilidad al contenido escrito, invariancia de permutación y multiplicidad. También ejecutó BoundedDict: actualizar una clave no renovó el orden de inserción, por lo que añadir c expulsó a y no b.
BoundedDict almacena motivos de parada y no utiliza la misma política que el historial LRU de conversaciones del detector. El ejemplo JavaScript siguiente modela únicamente intervalos de líneas enteras y funciona sin DeerFlow. Ni ese ejemplo ni el sondeo Python ejecutan el ciclo completo de middleware, aislamiento, proveedor de modelo o integración original.
Pasos de implementación
- 1
Lee las tres funciones en el commit fijado.
- 2
Compara lecturas a ambos lados del límite de 200 líneas.
- 3
Prueba contenido modificado, reordenación y duplicados por separado.
- 4
Distingue funciones verificadas y ejecución completa.
Ejemplo para copiar
// Modelo independiente para líneas enteras, no el runtime Python original.
function readBucket(path, start = 1, end = start) {
const [lo, hi] = [start, end].sort((a, b) => a - b);
return `${path}:${Math.floor((Math.max(lo, 1) - 1) / 200)}-${Math.floor((Math.max(hi, 1) - 1) / 200)}`;
}
console.log([readBucket("a", 1, 199), readBucket("a", 200, 1), readBucket("a", 201)]);Preguntas frecuentes
¿El ejemplo JavaScript es la implementación real?
No. Es un modelo limitado a líneas enteras. El sondeo Python separado ejecutó las funciones originales inspeccionadas con comprobación de hashes.
¿La huella demuestra equivalencia semántica?
No. Los campos relevantes y los intervalos aproximan la repetición, y el digest truncado puede tener colisiones.
Fuentes
- README.mdFuente verificada 2026-09-08
- LICENSEFuente verificada 2026-09-08
- backend/README.mdFuente verificada 2026-09-08
- backend/pyproject.tomlFuente verificada 2026-09-08
- backend/docs/middleware-execution-flow.mdFuente verificada 2026-09-08
- backend/packages/harness/deerflow/agents/lead_agent/agent.pyFuente verificada 2026-09-08
- backend/packages/harness/deerflow/agents/middlewares/loop_detection_middleware.pyFuente verificada 2026-09-08
- backend/packages/harness/deerflow/agents/middlewares/_bounded_dict.pyFuente verificada 2026-09-08
- backend/packages/harness/deerflow/config/loop_detection_config.pyFuente verificada 2026-09-08
- backend/packages/harness/deerflow/sandbox/local/local_sandbox_provider.pyFuente verificada 2026-09-08
- backend/app/gateway/auth_middleware.pyFuente verificada 2026-09-08
- backend/app/gateway/csrf_middleware.pyFuente verificada 2026-09-08
- docker/docker-compose.yamlFuente verificada 2026-09-08