aboutsummaryrefslogtreecommitdiffstats
path: root/README.md
diff options
context:
space:
mode:
authorelvis <elvis@claros.ar>2026-09-06 22:05:14 -0300
committerelvis <elvis@claros.ar>2026-09-06 22:05:14 -0300
commit71764752f28d31028b9c2ca486c0fc1bcea1cf95 (patch)
treeffd463969826157819f5a3319e1895c3f51deb22 /README.md
parentf8f98e83481e7376a235fb305a095552433f79ab (diff)
downloadasist-p-71764752f28d31028b9c2ca486c0fc1bcea1cf95.tar.gz
asist-p-71764752f28d31028b9c2ca486c0fc1bcea1cf95.zip
Web search and camera vision
Dos capacidades nuevas en un crate aparte, asist-tools, registradas desde asist-app: son el ejemplo de que el punto de extensión documentado funciona sin tocar el orquestador. Buscar admite tres buscadores intercambiables. Tavily devuelve una respuesta ya redactada, que es lo que se puede leer en voz alta sin gastar otra vuelta del modelo en resumir (0,54 s para «capital de Australia»); ddgs no necesita clave y devuelve fragmentos que el modelo sintetiza (2,24 s). El tercero es un backend de comando genérico: ejecuta un programa y lee JSON de su salida, así que añadir otro buscador —o un puente a un servidor MCP— es escribir un guion. Sobre DuckDuckGo, comprobado y no supuesto: curl contra html.duckduckgo.com devuelve HTTP 202 con una página anti-bot y ni un resultado, y la API sin clave api.duckduckgo.com devuelve vacío para casi todo lo que no sea una entidad de enciclopedia. La librería ddgs —la misma que hay bajo duckduckgo-mcp— sí funciona porque rota buscadores y cabeceras, y es la que usa scripts/buscar-ddgs.sh. Mirar aprovecha que el servidor ya carga el proyector multimodal: el mismo modelo que conversa describe lo que capta la cámara. La pregunta del usuario viaja hasta ahí, porque «¿de qué color es mi camiseta?» y «¿cuánta gente hay?» necesitan la misma imagen y descripciones distintas. La imagen no entra en el historial —cientos de tokens por turno para algo ya descrito— ni toca el disco. Tres cosas más que salieron de medir, en docs/RENDIMIENTO.md: - La resolución de captura manda en la latencia: 7,8 s a 1280x720 frente a 2,9 s a 640x480, con la misma descripción útil. 640x480 pasa a ser el valor por defecto. - Una herramienta ejecutándose en silencio deja el turno seis segundos mudo y parece un cuelgue. Tool::acknowledgement pronuncia una frase antes de ejecutar y baja el primer audio de ~8,4 s a 4,1 s. - Con la instrucción de voz a secas en la pasada de redacción, el modelo anunciaba lo que acababa de hacer en vez de contar lo que averiguó, ignorando el resultado que tenía delante. general.tool_result_prompt lo corrige; ahí sí se puede añadir estilo sin riesgo, porque la llamada ya ocurrió. Con tres herramientas declaradas el modelo elige bien entre ellas (15 de 16 medido), pero le cuesta abstenerse y busca cosas que ya sabe. Intentar corregirlo con instrucciones empeora los aciertos sin reducir los falsos positivos, coherente con la fragilidad ya documentada. Corregido además un fallo que dejaba mudo al asistente tras la primera respuesta: el anillo de reproducción no bajaba nunca su bandera de actividad, así que el segmentador mantenía el micrófono cerrado creyendo que seguía hablando. El segmentador se guía ahora por la cola, que no puede desfasarse, y hay pruebas del anillo con un mando sin dispositivo detrás. Claude-Session: https://claude.ai/code/session_01FNxz5cSdQSscJH9H7b8uGU
Diffstat (limited to 'README.md')
-rw-r--r--README.md30
1 files changed, 28 insertions, 2 deletions
diff --git a/README.md b/README.md
index deeef3c..90d108e 100644
--- a/README.md
+++ b/README.md
@@ -63,6 +63,7 @@ cargo run --release -- run --no-manage
| `asist-asr` | Canary en ONNX: ventana deslizante y transcripción final |
| `asist-llm` | llama-server: streaming SSE, historial, llamadas a herramientas |
| `asist-tts` | qwentts: síntesis en streaming y voces clonadas |
+| `asist-tools` | Buscar en internet y mirar por la cámara |
| `asist-app` | Supervisor de procesos, orquestador y binario `asistente` |
Los tres motores viven en `vendor/` como submódulos fijados a un commit
@@ -120,14 +121,37 @@ de configuración valieron más que cualquier cambio de código:
- La plantilla del modelo dejaba `<think>` abierto: **8630 ms → 413 ms** al
primer token.
- El prompt de estilo anulaba las llamadas a herramientas: **0/8 → 8/8**.
+- La cámara capturaba a 720p: **7,8 s → 2,9 s** por imagen a 640x480.
+- Las herramientas se ejecutaban en silencio: **~8,4 s → 4,1 s** hasta oír algo.
Los tres, con el porqué y cómo se midieron, en
[docs/RENDIMIENTO.md](docs/RENDIMIENTO.md).
## Herramientas
-El asistente puede llamar a funciones. Viene con `hora_actual` y con
-`ejecutar_comando`, esta última **apagada**: darle una shell a un modelo que
+El asistente puede llamar a funciones. Vienen cuatro:
+
+| Herramienta | Qué hace | Coste medido |
+|---|---|---|
+| `hora_actual` | Fecha y hora del sistema | 0 ms |
+| `buscar_en_internet` | Busca y resume | 0,5–3,6 s |
+| `mirar_por_la_camara` | Hace una foto y responde sobre lo que ve | 4,2–5,2 s |
+| `ejecutar_comando` | Órdenes del sistema, **apagada** por defecto | — |
+
+Mientras una herramienta trabaja, el asistente dice «Déjame que lo busque» o
+«Voy a mirar». No es adorno: sin eso el turno pasa seis segundos en silencio y
+se lee como un cuelgue. Con el acuse, el primer audio llega en 3–4 s.
+
+**Buscar** admite tres buscadores: `tavily` (con clave, devuelve una respuesta
+ya redactada), `ddgs` (sin clave, la misma librería que hay bajo
+`duckduckgo-mcp`) y `searxng`. El de comando ejecuta un guion que escriba JSON,
+así que meter otro es escribir un guion, no tocar Rust.
+
+**Mirar** aprovecha que el servidor ya carga el proyector multimodal: el mismo
+modelo que conversa describe la imagen. La foto no se guarda en disco ni entra
+en el historial.
+
+`ejecutar_comando` está apagada a conciencia: darle una shell a un modelo que
obedece a lo que oye por el micrófono es un cambio de postura de seguridad.
Cuando se enciende, sólo pasan las órdenes de una lista blanca, sin shell que
interprete metacaracteres y con un plazo máximo.
@@ -160,4 +184,6 @@ frase y comprueba que el reconocedor la recupera.
- CUDA para los motores en C++ (funcionan en CPU, pero muy justos)
- PipeWire o ALSA
- ~6 GB de disco para los modelos
+- `ffmpeg` para la cámara
+- Para buscar: una clave de Tavily en `$TAVILY_API_KEY`, o `uv tool install ddgs`