Dinoer

Arquitectura

Cómo se desarrolla una campaña de investigación y qué sale de su máquina y por qué puerta, con el archivo de código detrás de cada línea.

Cómo se desarrolla una campaña de investigación

manifiesto.json
     │  campagne.py
     ▼
SearXNG  ── consultas
     ▼
recopilación HTTP ligera  ──►  navegador real (solo si la página no basta)
     ▼
collecte.jsonl  +  operations.jsonl
     ▼
OpenCode  ── clasificación, después el informe
     ▼
rapport_<marca_de_tiempo>.md
  1. El manifiesto es un archivo JSON de objetivos: una query para SearXNG, una url fija, un produit (encontrar la página que de verdad es la del producto) o una table_reference (una lista de dominios de confianza para un tema). Solo son obligatorios el identificador de la campaña y los objetivos.
  2. La búsqueda. Un objetivo query va a la instancia de SearXNG que usted configuró, que a su vez consulta otros buscadores sobre los que Dinoer no tiene control.
  3. La recopilación. Cada página se obtiene con una simple solicitud HTTP, tras leer su robots.txt. Solo una página cuyo texto no puede leerse así pasa a un navegador real, un proceso de Playwright por página. Un objetivo que falla no detiene a los demás.
  4. El corpus. Un collecte.jsonl por campaña, una línea por página conservada, y operations.jsonl, que registra cada intento, fallido o no.
  5. El informe. Las páginas se reordenan (por periodo y por embeddings locales, si el manifiesto lo pide), se recortan a un presupuesto de tamaño y se entregan a OpenCode, que redacta el cuerpo de rapport_<marca_de_tiempo>.md. Dinoer añade él mismo la lista de fuentes; el modelo nunca la escribe.

shot.py y rpa.py funcionan de otro modo: cada llamada es un proceso propio, que termina en cuanto ha respondido. Por qué →

Qué sale de su máquina, y por qué puerta

QuéAdónde vaQuién decideEn el código
Las consultas de búsquedala instancia de SearXNG que usted configuró, que a su vez consulta otros buscadoresusted, con DINOER_SEARXNG_URLlib/searxng.py
Las solicitudes de páginascada sitio directamente, tras leer su robots.txtlos objetivos de su manifiestolib/fetch_leger.py, rpa.py
El texto recopiladoel modelo de OpenCode que usted indique: para el informe, para la extracción dirigida y para elegir una página de producto (los primeros 1500 caracteres de cada candidata)usted, con DINOER_OPENCODE_MODELlib/modeles.py, lib/synthese.py, lib/extraction.py, lib/selection_candidats.py
Un tema, para una tabla de referenciael mismo modelo de OpenCode, solo el tema, cuando aún no existe tabla para élel objetivo table_referencelib/tables_reference.py
Los embeddingssu Ollama local, http://localhost:11434: el texto se queda en la máquina, salvo que dirija DINOER_OLLAMA_URL a otro sitioustedlib/vector.py
Una notificaciónun servidor ntfy, https://ntfy.sh si no indica otro: el identificador de la campaña y el número de fuentes. Solo si hay un topic de ntfy definidousted, con ntfy_topic, DINOER_NTFY_TOPIC, DINOER_NTFY_URLcampagne.py, lib/ntfy.py
Sus credencialesa ninguna parte: se resuelven dentro del proceso de Playwright, desde el directorio cifrado—lib/repertoire_chiffre.py

Fuente: el código de la versión 1.0.1, leído el 27 de septiembre de 2026. Los modelos agrupados bajo opencode/ los aloja su proveedor (opencode.ai/zen, según opencode models --verbose, OpenCode 1.18.32). Lo que el modelo puede hacer en la web figura en la página sobre la confianza.

En detalle