1. Objetivo y método
El objetivo del proyecto es que ZeroChat sea el único frontend de modelos locales servidos aparte con APIs compatibles con OpenAI (vLLM, llama.cpp, LM Studio, SGLang) u Ollama. La revisión recorre las capacidades de la versión 9.11.0 (commit 170ee03) en el código, no en la documentación.
Desde la 9.2.3 las novedades más relevantes son la ejecución desatendida (zerochat --prompt), los perfiles de configuración con sus servicios MCP y su navegador, Playwright MCP con motores propios o el navegador del usuario, el visor de diferencias, el estado vivo del servidor local con reconexión automática y la conexión remota con identificación por la cuenta del sistema.
Cada capacidad indica qué la protege: [test] prueba automatizada o [lectura] revisión del código.
2. Capacidades
| Área | Qué ofrece | Protección | Límite |
|---|---|---|---|
| Conexión con el modelo | Adaptadores OpenAI compatible, Ollama, OpenRouter, Claude, Gemini, WebLLM y Espejo; descubrimiento de modelos y diagnóstico de capacidades con el inspector. | [test] test_providers.js, test_inspector.js, browser_inspector.test.js | La visión y el razonamiento se deducen de lo que publica el servidor o del adaptador. |
| Contexto y caché | Lectura de la capacidad publicada (n_ctx, max_model_len…) o ajuste manual; compactación del historial y prefijo estable para la caché de contexto. | [test] test_context_manager.js, test_token_telemetry.js, test_context_cache_architecture.js | Una capacidad asumida se marca con * y ajusta los umbrales. |
| Razonamiento | Bloque plegable, niveles de Ninguno a Máximo, etiquetas <think> y reenvío del razonamiento entre pasos del agente. | [test] test_providers.js, test_agent_runtime.js, test_api_utils.js | El servidor debe separar el razonamiento en su respuesta para reenviarlo. |
| Herramientas y agente | 12 herramientas nativas, llamadas nativas o en texto (<tool_call>), agente sin tope de pasos con detección de bucles y subagentes de solo lectura (delegate_task). | [test] test_builtin_tools.js, test_text_tool_calls.js, test_agent_core.js, test_delegate_task.js | Un bucle con argumentos siempre distintos requiere pulsar Detener. |
| Documentos | Word, PowerPoint, Excel (lector XLSX nativo), OpenDocument, los binarios antiguos .doc y .xls, y PDF con extractor propio, como adjuntos y en RAG. | [test] test_office_parser.js, test_office_documents.js, test_file_parser.js, browser_documents.test.js | Topes por hoja y por archivo, con aviso de truncado. |
| Generación y exportación | Documentos HTML, SVG y CSV en el chat con visor aislado; exportación de la conversación (también en HTML tal como se ve). | [test] test_export.js, browser_conversation.test.js | Los documentos se abren en un Blob con noopener. |
| Web | Búsqueda en DuckDuckGo y lectura de páginas por el servidor local o, sin él, por Jina Reader; descarga de documentos e imágenes web para modelos con visión. | [test] test_web_tools.js, py/test_network.py | Sin servidor local, la lectura depende de un servicio externo. |
| Servidor local | Archivos, run_command y check_command con tarjeta viva y segundo plano, visor gráfico de diferencias con configuración guiada y servicios MCP externos gestionados. | [test] py/test_run_command.py, py/test_file_tools.py, py/test_diff_tool.py, py/test_mcp_services.py, test_local_server.js | En Android (Termux) no hay Playwright. |
| Estado vivo y reconexión | El servidor informa del directorio, los comandos en marcha, Playwright y los servicios externos; la página reconecta sola cuando el servidor vuelve, sin recargar. | [test] test_mcp.js, test_ui_mcp.js, browser_mcp_panel.test.js | Con --keep-server el estado se relee al volver a la pestaña, no cada 10 s. |
| Navegación del modelo | browser_action o Playwright MCP, con motores propios (Chromium, Firefox, WebKit) que se instalan y quitan desde Ajustes, o el Chrome, Edge o Chromium del usuario mediante la extensión. | [test] py/test_browser.py, py/test_browser_config.py, test_ui_browser.js | La extensión pide aceptar cada conexión salvo con su token. |
| Perfiles de configuración | Proveedor, modelo y comportamiento por perfil, con los servicios MCP que arranca y el navegador que exige; claves de API cifradas y exportación de perfiles. | [test] test_profiles.js, test_ui_profiles.js, browser_profiles_settings.test.js | Las claves de API se protegen con la contraseña de cifrado si se activa. |
| Ejecución desatendida | zerochat --prompt ejecuta un prompt en la interfaz y devuelve la respuesta en stdout, con perfil, exportación, ventana oculta y códigos de salida. | [test] test_backend_run_mode.js, browser_run_mode.test.js, test_run_mode.js | Necesita un navegador de escritorio; sin ventana es de mejor esfuerzo. |
| Conexión remota | Ajustes › Conexión con la URL del servidor, túnel SSH o proxy inverso con su clave, e identificación con la cuenta del sistema cuando falta el token o caduca. | [test] test_mcp.js, browser_connection.test.js, py/test_login.py, test_local_server.js | Una sola cuenta del sistema: la que ejecuta zerochat. |
| Modo proyecto | Memoria en .zerochat/ (plan, decisiones y estado) que el modelo mantiene con task.py. | [test] test_project_context.js, test_task_helper.js | Depende de que el modelo siga el protocolo. |
| RAG léxico | Índice Orama en IndexedDB con ramas, imágenes de documentos y búsqueda filtrada. | [test] test_rag_index.js, test_rag_service.js, test_ingestion_engine.js | Búsqueda léxica, sin embeddings. |
| Depuración | Interceptor que detiene cada petición al modelo para revisar o editar el JSON antes de enviarlo. | [test] test_api_utils.js | No intercepta el tráfico con el servidor local. |
| WebLLM | Inferencia en el navegador con WebGPU en un Web Worker. | [test] test_webllm.js | Para modelos compactos. |
3. Buenas prácticas con un servidor de modelos local
| Aspecto | Recomendación | Beneficio en ZeroChat |
|---|---|---|
| Capacidad de contexto | Publicar el contexto real (meta.n_ctx en llama.cpp, max_model_len en vLLM). | Los umbrales de compactación se calculan sobre el límite real y no sobre uno asumido. |
| Razonamiento | Activar el analizador de razonamiento del servidor. | El razonamiento va a su bloque y se reenvía entre pasos sin mezclarse con la respuesta. |
| Llamadas a herramientas | Activar la plantilla de herramientas del servidor (por ejemplo, --jinja). | Llamadas estructuradas; sin ella, ZeroChat extrae los bloques <tool_call> del texto. |
| Streaming | Respuestas en streaming. | Texto token a token y cancelación inmediata. |
| Acceso remoto | Túnel SSH o proxy inverso con HTTPS, nunca --host público. | El servidor sigue escuchando solo en el propio equipo y exige identificación. |
4. Coherencia con la ayuda
Se ha contrastado la ayuda con el código:
- Herramientas y agente: las 12 herramientas nativas, el agente sin tope de pasos y los subagentes.
- Servidor local y MCP: arranque, conexión, comandos, servicios externos y permisos.
- Navegación del modelo, perfiles y ejecución desatendida: coinciden con las opciones de la 9.11.0, sin
--print-url. - Túnel SSH desde Android y proxy inverso: Ajustes › Conexión e identificación con la cuenta del sistema.
- Compositor y documentos y razonamiento y telemetría.
test_help_pages.js comprueba que cada página tiene su traducción enlazada, la serie de versión 10.x, un título y una descripción únicos, y que el sitemap está al día.
5. Límites
- Monousuario: una sola cuenta del sistema, la que ejecuta zerochat; sin roles.
- Datos en el navegador: conversaciones, perfiles y RAG viven en IndexedDB y
localStorage; conviene exportarlos. - Origen compartido en GitHub Pages, riesgo aceptado.
- RAG léxico, sin similitud vectorial.
- Navegadores: Chromium y Firefox; WebKit (Safari y los navegadores de iPhone e iPad) no está soportado.
- Windows: funciona, pero sus rutas propias no se prueban de forma automática.
- Privacidad de la web: con un LLM local el chat no sale del equipo, pero las herramientas web consultan servicios externos.
6. Dictamen
Frontend maduro para modelos locales y ahora también para un servidor remoto. ZeroChat 9.11.0 cubre el trabajo técnico diario con un modelo local: agente con herramientas del equipo, documentos y PDF, navegación con Playwright, perfiles que preparan cada entorno y ejecución desatendida desde la terminal. La conexión remota unificada, con túnel o proxy inverso, permite usarlo desde el móvil o desde otro equipo sin exponer el servidor local.
Autoría
- Revisión y redacción: Claude Opus 5.5 en Claude Code, a partir del código en el commit
170ee03y la suite de pruebas.