Ir al contenido

La búsqueda solo está disponible en las versiones de producción. Intenta construir y previsualizar el sitio para probarlo localmente.

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.

Una conversación es la unidad de estado del chat:

  • Id establecrypto.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 thinkingoff / low / medium / high (control de esfuerzo de razonamiento donde el proveedor lo soporta).
  • Árbol de forksparentId, 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.

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 contextLimit y 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.

  1. El input de chat lee el proveedor/modelo actuales y la clave cifrada del usuario del vault.
  2. prepareChatSendMessagesRequest (chat-transport.ts) ensambla el payload — mensajes, snapshot de adjuntos multimedia, contexto de orquestación y el sobre de handoff.
  3. El cliente hace POST a /api/chat. El servidor controla con requireResolvedAuth, desempaqueta el sobre y emite el stream con streamText.
  4. La UI renderiza token a token. Al completarse el stream, se persisten el mensaje y las estadísticas de uso (recordUsage).
  • El streaming está activado por defecto (synthhires:streamResponse). La latencia percibida es un requisito de producto: la ruta nunca bufferiza la respuesta completa.
  • maxRetries: 1 a 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.

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 (pendingworkingdone/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.

Cuando el orquestador emite un plan en su respuesta de texto libre, el cliente lo extrae con extractPlanFromContentsafeParsePlan (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 IASalida 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 (forkConversation en chat-persistence.ts).
  • El childCount del 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.
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.

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:archivedConvs más la columna status, 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.

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.

  • ?c=<conversationId> deep-link; el handler de popstate mantiene la UI sincronizada con atrás/adelante.
  • ⌘N inicia una sesión nueva; ⌘K abre la paleta de comandos; ⌘B alterna el sidebar.