Qué vamos a construir
La implementación de referencia es un pequeño proyecto en Python con varias partes claras:| Parte | Qué hace |
|---|---|
| CLI | Acepta un tema de investigación, modelo, proveedores, ajustes de profundidad, ruta de salida y directorio de artefactos |
| Cliente de Venice | Llama a chat completions, chat completions con streaming y POST /augment/scrape |
| Capa de búsqueda | Busca en DuckDuckGo por defecto, con descubrimiento opcional de artículos en arXiv |
| Modelos de datos | Realiza un seguimiento de URL de fuentes, URL canónicas, fragmentos, evidencias, notas, errores e informes |
| Agente de investigación | Planifica búsquedas, lee fuentes, extrae evidencias, analiza lagunas, genera consultas de seguimiento y escribe el informe final |
| Escritor de artefactos | Almacena registros JSONL auditables de consultas, lagunas de investigación, resultados, descargas, fragmentos, notas de fuentes, borradores de informe, errores e informes |
- Pide a Venice que genere consultas de búsqueda diversas para el tema.
- Busca en la web con uno o más proveedores.
- Elimina URL duplicadas antes de leerlas.
- Usa el endpoint de scrape de Venice para convertir cada página fuente pública en Markdown.
- Divide las páginas largas en fragmentos.
- Pide a Venice que extraiga evidencias de cada fragmento.
- Pide a Venice que convierta las evidencias de los fragmentos en notas de la fuente.
- Identifica lagunas de investigación y problemas de equilibrio entre fuentes antes de generar consultas de seguimiento.
- Pide a Venice que sintetice el informe final con citas estilo notas al pie.
Configurando el proyecto
El proyecto de referencia usa Python 3.13 yuv, pero el mismo código funciona con un entorno virtual normal.
Crea un nuevo proyecto:
pip, crea un entorno virtual e instala los mismos paquetes:
.env para el desarrollo local:
VENICE_MODEL para que puedas cambiar el modelo sin editar el código. La implementación de referencia actualmente usa openai-gpt-55 por defecto, pero puedes cambiarlo por otro modelo de chat disponible en tu cuenta de Venice.
Creando los modelos de datos
Antes de escribir la lógica del agente, definiremos los objetos que viajan por la tubería. Estos modelos hacen que el resto del código sea más fácil de razonar porque cada fuente lleva su procedencia: de dónde proviene, qué consulta la encontró, cuándo se recuperó y cómo se fragmentó. Crearesearch_agent/models.py:
canonical_url, content_hash y chunks.
canonical_url permite al agente evitar leer la misma fuente repetidamente cuando los resultados de búsqueda solo difieren en parámetros de seguimiento o fragmentos. content_hash ayuda a detectar páginas duplicadas aunque vivan en URL distintas. chunks permite resumir páginas largas en piezas más pequeñas en lugar de perder evidencias útiles por los límites de contexto.
Añade las funciones auxiliares debajo de los dataclasses:
Construyendo el cliente de Venice
A continuación, crearemos un pequeño cliente de Venice. Podrías utilizar el SDK de Python de OpenAI para las chat completions porque Venice es compatible con OpenAI, pero la implementación de referencia usahttpx directamente para que el mismo cliente pueda llamar al endpoint POST /augment/scrape de Venice.
Crea research_agent/venice.py:
from_env() mantiene los secretos fuera del código fuente. También resulta cómodo para el desarrollo local porque python-dotenv puede cargar VENICE_API_KEY y VENICE_MODEL desde .env.
Ahora añade las chat completions:
_post_chat_stream() que lee server-sent events de las chat completions en streaming. Puedes empezar sin streaming y añadirlo una vez que funcione el resto del flujo de investigación.
Añadiendo proveedores de búsqueda
La capa de búsqueda tiene dos tareas: encontrar URL de fuentes y obtener esas URL a través del scraper de Venice. La implementación de referencia usa el endpoint HTML de DuckDuckGo para búsquedas web generales y la API Atom de arXiv para artículos. Crearesearch_agent/web.py:
WebSearch coordina los proveedores y obtiene las páginas:
Escribiendo artefactos locales
Para los flujos de investigación, la auditabilidad importa. Si el informe final dice algo sorprendente, deberías poder inspeccionar qué fuente llevó a ello. Crearesearch_agent/artifacts.py:
Construyendo el agente de investigación
Ahora que tenemos Venice, búsqueda, modelos y artefactos, podemos construir el agente propiamente dicho. Crearesearch_agent/agent.py:
models.py si todavía no las has añadido:
ResearchAgent:
run() coordina los pases de investigación:
seen_* son los que impiden que el agente pierda tiempo con fuentes duplicadas. La deduplicación por URL detecta enlaces repetidos. La deduplicación por hash de contenido detecta mirrors, publicaciones sindicadas y páginas que redirigen al mismo contenido final.
Planificando búsquedas iniciales y de seguimiento
La primera llamada al modelo convierte el tema en consultas de búsqueda:_gap_follow_up_queries(), que pide a Venice que devuelva tanto los registros de lagunas como las consultas:
--artifacts está habilitado, estos registros se escriben en research_gaps.jsonl. Esto te da una pista de auditoría útil sobre por qué el agente buscó una consulta concreta en el segundo pase.
El parser debería ser tolerante. Si el modelo devuelve JSON mal formado, el agente recurre al tema original como respaldo:
Lectura y resumen de fuentes
Ahora recopilamos notas de fuente. El agente busca cada consulta, obtiene cada resultado a través de Venice scrape, fragmenta el Markdown y resume las evidencias útiles.Escribiendo el informe final
Una vez que el agente tiene las notas de las fuentes, puede escribir el informe. Empieza con un escritor de informes de una sola pasada:Añadiendo la CLI
Ahora necesitamos un punto de entrada por línea de comandos. Creamain.py:
| Opción | Qué controla |
|---|---|
--iterations | Número de pases de investigación |
--queries | Consultas de búsqueda generadas por pase |
--results | Resultados leídos por proveedor para cada consulta |
--providers | Proveedores de búsqueda, como duckduckgo o duckduckgo,arxiv |
--max-sources | Máximo de fuentes utilizables a recopilar |
--chunk-chars | Tamaño aproximado de fragmento antes de la extracción de evidencias |
--max-chunks-per-source | Número de fragmentos resumidos por fuente |
--report-style | Profundidad del informe final: brief, standard o deep |
--artifacts | Directorio para los registros JSONL de auditoría |
--output | Ruta para el informe Markdown final |
Ejecutando el agente
Ejecuta un pase de investigación rápido:brief para un informe conciso respaldado por fuentes, standard para un panorama más completo y deep para el flujo por etapas de esquema/sección/editor.
Guarda artefactos auditables:
source_notes.jsonl muestra la evidencia resumida de la fuente, research_gaps.jsonl muestra por qué se generaron las búsquedas de seguimiento, y errors.jsonl muestra las páginas que fallaron durante la búsqueda, el scraping o el resumen.
Notas sobre privacidad y fiabilidad
Un agente de investigación toca varios sistemas, por lo que conviene ser preciso sobre qué información va a dónde:| Capa | Qué ve los datos |
|---|---|
| CLI local | El tema, la configuración, las notas de fuente, los artefactos y los informes finales permanecen en tu máquina |
| Proveedor de búsqueda | Las consultas de búsqueda se envían al proveedor que elijas, como DuckDuckGo o arXiv |
| Venice scrape | Las URL públicas de las fuentes se envían al endpoint de scrape de Venice |
| Venice chat completions | Los prompts, los fragmentos de fuente, las notas de fuente y las instrucciones de generación del informe se envían a Venice |
| Archivos de salida | Los informes Markdown y los artefactos JSONL se escriben localmente |
POST /augment/search de Venice en lugar de consultar directamente a DuckDuckGo. La implementación de referencia utiliza proveedores públicos ligeros para que la demo siga siendo fácil de ejecutar y comprender.
Por motivos de fiabilidad, mantén estos valores predeterminados conservadores:
- Usa reintentos para las llamadas a Venice y las solicitudes web.
- Añade un pequeño
--request-delaysi vas a leer muchas páginas del mismo host. - Limita
--max-sourcespara que los temas amplios no se ejecuten indefinidamente. - Guarda
--artifactspara los informes importantes y poder auditar la salida final. - Considera el informe como una nota informativa, no como verdad absoluta. Sigue las citas hasta la fuente original cuando la precisión importe.
Probando las piezas
No necesitas solicitudes web en vivo ni llamadas a Venice para probar la mayor parte del sistema. El repositorio de referencia usa clases falsas de Venice y de web para probar el bucle de investigación, el comportamiento de deduplicación, los artefactos y los prompts del informe. Una primera prueba útil es la canonicalización de URL:Benchmarking
Muchos proveedores de IA ahora tienen sus propios flujos de deep research, así que el repositorio de referencia incluye un sencillo benchmark frente a la herramienta Deep Research de Perplexity. Se pidió a ambos agentes que escribieran un informe sobre la arquitectura de frameworks de agentes de IA, y los informes generados se han subido al repositorio de GitHub. No pretende ser un benchmark formal. Es una forma práctica de inspeccionar la estructura del informe, la cobertura de fuentes, la calidad de las citas y si el agente se centra demasiado en un cluster de fuentes. Esa es también la razón por la que la implementación actualizada hace seguimiento deresearch_gaps.jsonl y del equilibrio entre fuentes antes de las búsquedas de seguimiento.
Extendiendo este ejemplo
Una vez que el agente base funciona, aquí tienes formas prácticas de mejorarlo:- Añadir un proveedor de búsqueda de Venice utilizando
POST /augment/search. - Almacenar los informes y artefactos en una pequeña base de datos SQLite en lugar de archivos JSONL.
- Añadir allowlists o blocklists de fuentes para dominios de investigación de confianza.
- Añadir soporte de PDF combinando Venice scrape con el parseo de documentos para fuentes que no expongan HTML limpio.
- Añadir un conjunto de evaluación de temas y tipos de fuente esperados para poder comparar la calidad de la investigación tras cambios en los prompts.
- Añadir un paso de revisión que pida a Venice encontrar afirmaciones sin respaldo en el informe final antes de guardarlo.