Chat y orquestación
La superficie de chat en /space es donde ocurre todo: conversaciones en streaming, delegación de agentes, integración con workspace de código, forks y artefactos. Esta página documenta el modelo de principio a fin.
¿Nuevo en el lado de IA? Lee primero Conceptos de IA desde cero — explica qué son los tokens, la ventana de contexto, el sampling y el streaming, sobre los que se apoya esta página.
El modelo de conversación
Sección titulada «El modelo de conversación»Una conversación es la unidad de estado del chat:
- Id estable —
crypto.randomUUID(), sincronizado con la URL como?c=<id>para que las sesiones sean enlazables y sobrevivan a recargas. - Proveedor + modelo — guardados por conversación, p. ej.
openai/gpt-4o. - Referencia de workspace (
workspaceRef) — JSONB opcional que apunta a un repositorio (github/gitlab/local) o ruta de carpeta. Las conversaciones con workspace se etiquetan como sesiones “code” en el historial. - Nivel de thinking —
off/low/medium/high(control de esfuerzo de razonamiento donde el proveedor lo soporta). - Árbol de forks —
parentId,rootId,childCount.
La conversación activa se persiste en synthhires:activeConvId y se difunde vía el CustomEvent synthhires:conv:focus para que sidebar, interfaz de chat e historial estén sincronizados.
Los conceptos detrás del chat
Sección titulada «Los conceptos detrás del chat»El chat es donde las piezas abstractas del glosario de IA se vuelven concretas. Cuatro ideas hacen el trabajo pesado:
- La conversación es un prompt que crece. El modelo no tiene memoria tras el entrenamiento; tu chat funciona porque el cliente reenvía el historial acumulado en cada turno, dentro de la ventana de contexto del proveedor. Por eso existe un límite
contextLimity por eso las sesiones largas acaban comprimiendo mensajes antiguos. - Los tokens son la unidad de coste y de contexto. Cada petición se factura y se dimensiona en tokens (input, completado, cacheados, razonamiento). Las cifras de uso que muestra el panel de ops salen directamente de la contabilidad de tokens por petición.
- El streaming gana a esperar. La respuesta se produce token a token y se vuelca en la UI según llega, así que la latencia percibida se mantiene baja incluso en respuestas largas (ver Streaming abajo).
- El sampling está detrás del “rollo”. La temperatura, el top-p y el resto viven en Ajustes globales y deciden lo centrada o creativa que es cada respuesta.
Para la explicación completa de cada uno, ver la página Conceptos de IA.
Enviar un mensaje
Sección titulada «Enviar un mensaje»- El input de chat lee el proveedor/modelo actuales y la clave cifrada del usuario del vault.
prepareChatSendMessagesRequest(chat-transport.ts) ensambla el payload — mensajes, snapshot de adjuntos multimedia, contexto de orquestación y el sobre de handoff.- El cliente hace POST a
/api/chat. El servidor controla conrequireResolvedAuth, desempaqueta el sobre y emite el stream constreamText. - La UI renderiza token a token. Al completarse el stream, se persisten el mensaje y las estadísticas de uso (
recordUsage).
Comportamiento de streaming
Sección titulada «Comportamiento de streaming»- El streaming está activado por defecto (
synthhires:streamResponse). La latencia percibida es un requisito de producto: la ruta nunca bufferiza la respuesta completa. maxRetries: 1a nivel SDK; el retry handler aplica backoff acotado para 429/5xx (máximo 3 intentos, nunca un bucle infinito).- Los errores se sanean a través del sumidero de redacción antes de mostrarse o registrarse.
Orquestación de agentes
Sección titulada «Orquestación de agentes»El chat no es un bucle de un solo modelo. El Lead Orchestrator puede planificar y delegar en agentes especializados:
- Pasos de ejecución — el panel de ops (
ops-panel.tsx) muestra cada paso con estado (pending→working→done/failed), qué agente lo gestionó, el modelo usado, conteo de tokens y coste. - Spawn de sub-agentes — desde el panel de jerarquía puedes crear sub-agentes con rol y modelo elegidos (
hierarchy-factory.ts). - Comparación de modelos — la vista de comparación (
model-comparison.tsx) ejecuta el mismo prompt en varios proveedores/modelos lado a lado, útil para elegir valores por defecto.
El extractor de plan
Sección titulada «El extractor de plan»Cuando el orquestador emite un plan en su respuesta de texto libre, el cliente lo extrae con extractPlanFromContent → safeParsePlan (output-schemas.ts): un escáner JSON tolerante más validación Zod estricta, robusto ante la ausencia de fences y el wrapping en prosa. El plan extraído alimenta el canvas del Pipeline studio (/space/studio).
Lo que ocurre conceptualmente es salida estructurada con parseo tolerante: se empuja al modelo a emitir un plan con forma de esquema conocido, y el cliente lo recupera de forma fiable incluso cuando el modelo lo envuelve en prosa u olvida los fences. Ver Conceptos de IA → Salida estructurada.
Forkear es la metáfora Git de las conversaciones:
- Desde cualquier mensaje del asistente puedes forkear: se crea una conversación nueva con
parentId= id fuente,rootId= la raíz original, y se copian todos los mensajes hasta el punto de fork (forkConversationenchat-persistence.ts). - El
childCountdel padre se incrementa; borrar un fork lo decrementa. - Los forks aparecen como sesiones separadas en el historial, compartiendo la raíz original para poder trazar el linaje.
Persistencia: local y servidor
Sección titulada «Persistencia: local y servidor»| Capa | Almacenamiento | Contenido |
|---|---|---|
| Navegador | IndexedDB (local-chat-store.ts) |
Mensajes completos, código, diffs — lecturas offline rápidas |
| Bridge (emparejado) | SQLite en el dispositivo | Espejo local completo vía sync.chat.push |
| Servidor | Postgres (chat-persistence.ts) |
Índice ligero de conversaciones + mensajes para sync entre dispositivos |
Borrar una sesión la elimina del almacén local y del servidor (/api/conversations DELETE), con diálogo de confirmación porque es permanente.
Historial de sesiones (/space/chats)
Sección titulada «Historial de sesiones (/space/chats)»La página de historial da control total sobre las sesiones:
- Búsqueda por título o repo; filtro por tipo (todas / código / chat / archivadas) y orden por última actividad, fecha de creación o título.
- Carpetas — con código de color, y drag & drop para mover sesiones dentro y fuera.
- Acciones masivas — multiselección, exportación masiva y borrado masivo.
- Archivar — archivado suave en
synthhires:archivedConvsmás la columnastatus, sin borrar. - Renombrar — edición inline con actualizaciones optimistas.
- Exportar / Importar — diálogo de exportación masiva (Markdown/JSON) y diálogo de importación para restaurar o transferir sesiones.
Artefactos
Sección titulada «Artefactos»El chat puede producir artefactos (HTML, código, documentos, imágenes). Se renderizan en un panel lateral (artifacts-panel.tsx) y se indexan en la galería de Artefactos (/space/artifacts), para que puedas encontrar el contenido generado sin recordar en qué conversación se creó — buscable por tipo y sesión de origen.
URL y atajos de teclado
Sección titulada «URL y atajos de teclado»?c=<conversationId>deep-link; el handler de popstate mantiene la UI sincronizada con atrás/adelante.⌘Ninicia una sesión nueva;⌘Kabre la paleta de comandos;⌘Balterna el sidebar.