Skip to main content
OrbitPilot

Widget de chat de OrbitPilot — streaming, móvil, móvil y voz

Qué es

OrbitPilot es ahora un widget de chat flotante global para usuarios registrados: un botón de  en la esquina abre un panel que puedes usar desde cualquier página. El panel es no bloqueante (sigue navegando mientras está abierto), arrastrable, colapsable, y recuerda su lugar y tu conversación abierta a medida que te mueves por el sitio.

Nuevas habilidades

  • Respuestas en streaming — la respuesta aparece palabra por palabra en lugar de después de una espera.
  • Detener — detén la IA a mitad de respuesta. Detener guarda lo que se ha escrito hasta ahora y no usa un pedido de tu asignación mensual.
  • Copiar / Descargar todo el chat — botones en la parte superior e inferior del panel (la descarga es un archivo .txt).
  • Copiar un solo mensaje — pasa el cursor sobre cualquier burbuja para un icono de copiar.
  • Maximizar la ventana, navegar por tu historial de chat, y empezar una Nueva conversación.
  • Entrada por voz — toca el micrófono y habla; tus palabras se escriben por ti.

Los invitados (no registrados) mantienen el pop-up de chat de la página principal original.

En tu teléfono (móvil)

  • El panel se acopla a la parte inferior de la pantalla y nunca se desborda más allá de los bordes, en cualquier orientación — girar el teléfono lo ajusta automáticamente.
  • Respeta el notch y el indicador de inicio (áreas seguras), y utiliza la altura de pantalla en vivo para que la barra de direcciones del navegador no pueda cortar el botón de Enviar.
  • Después de que hables y envíes, el cuadro se vacía para tu próxima pregunta — toca el micrófono nuevamente para hablar en la siguiente ronda.

Para desarrolladores

El streaming requiere una vista async bajo ASGI (un generador sync se almacena en búfer antes del primer byte). orbitpilot.views.orbitpilot_ask_stream es un async def que devuelve StreamingHttpResponse a través de un generador async que emite Eventos Enviados por el Servidor (meta  token  done). Todo el ORM/gating se ejecuta en dos ayudantes SYNC (_prepare_ask_stream / _finalize_ask_stream) a través de sync_to_async(thread_sensitive=True). Detener = el cliente aborta la extracción  el generador async se cancela  la respuesta parcial se guarda y la fila de cuota NO se escribe. El frontend reside en templates/_orbitpilot_widget.html + static/css/orbitpilot-widget.css + static/js/orbitpilot-widget.js, incluido en base.html solo para usuarios autenticados.

Responsividad móvil (Workstream E): todo el widget es box-sizing: border-box por lo que el borde de 1px cuenta dentro del ancho (el antiguo iPhone overflow era width:100vw + border). La regla @media (max-width:575px) elimina 100vw para left/right: env(safe-area-inset-*) + width:auto, tamaños con dvh (con un vh como respaldo), y le da margen al compositor por env(safe-area-inset-bottom). En JS, una posición de arrastre guardada de escritorio no se aplica en un viewport móvil, y un oyente de resize/orientationchange vuelve a ajustar la posición a través de applyPos(). Limpieza por voz: el módulo de voz mantiene un buffer finalizado separado de la entrada; send() ahora llama a un resetVoice() compartido (detener el reconocimiento, limpiar el temporizador de silencio, vacío saved) justo donde limpia input.value, así que la siguiente ronda comienza vacía.

Tamaño de fuente del chat + arreglo de Enviar en móvil (2026-07-27)

  • A / A+ en el encabezado del widget disminuyen/aumentan el texto del chat. Tu elección se recuerda (guardada en el navegador a través de la clave localStorage op_widget_font) a través de páginas y sesiones. El tamaño está limitado a 12 px.
  • Botón Enviar en teléfonos: la fila del compositor ahora mantiene visibles los botones de Enviar (y micrófono) junto a la caja de texto en pantallas estrechas — anteriormente la caja de texto podría empujar el botón Enviar hacia el borde derecho.

Para desarrolladores: marcado templates/_orbitpilot_widget.html, comportamiento static/js/orbitpilot-widget.js (applyFont()/bumpFont(), restaurados en la inicialización), estilo static/css/orbitpilot-widget.css. Los botones aumentan una variable CSS --op-chat-font leída por el cuerpo del mensaje + entrada; el compositor usa min-width:0 en el textarea y flex:0 0 auto en los botones para que Enviar nunca se empuje fuera de la pantalla.

Menú hamburguesa + modo de página completa (2026-07-27)

El encabezado del widget de chat ahora tiene un  menú y un  botón de página completa:

  • Tus instrucciones — notas permanentes que la IA siempre considera (como instrucciones personalizadas de ChatGPT). Guardadas en OrbitPilotSettings.custom_user_prompt a través de orbitpilot_custom_instructions; planificado por la función custom_prompt (un mensaje bloqueado + un enlace de actualización aparece si el plan no lo permite; el servidor también impone esto con un 403).
  • Descargas — ahora claramente dos opciones: Esta conversación solamente (orbitpilot_conversation_download) vs Todo mi historial de chat (nuevo orbitpilot_history_download). El botón de la barra de herramientas se vuelve a etiquetar como  Esta charla.
  • Memoria  Reconstruir mi memoria ahora — una reconstrucción completa (orbitpilot_rebuild_memory) detrás de una advertencia de confirmación de costo (lee todo de nuevo y re-embebe, lo que usa créditos de IA); no se acumulará una reconstrucción mientras ya haya una en curso.

Modo de página completa () abre /orbitpilot/chat/ en una nueva pestaña, un chat de pantalla completa al estilo ChatGPT/Gemini que reutiliza el MISMO widget (a través de la clase del cuerpo op-fullpage) — así que cambiar entre el pequeño widget y la página completa mantiene la misma conversación (almacenada localmente op_widget_conv + a storage event listener). También: A / A+ cambian la fuente del chat (recordada), y en un teléfono, el botón Enviar permanece visible junto al micrófono.

Para desarrolladores: marcado templates/_orbitpilot_widget.html, comportamiento static/js/orbitpilot-widget.js, estilo static/css/orbitpilot-widget.css; vista de página completa orbitpilot.views.orbitpilot_chat  orbitpilot/templates/orbitpilot/chat_full.html.

Actualización rápida vs Reconstrucción completa (memoria suave/dura, 2026-07-27)

El menú de  Memoria del widget ahora ofrece dos reconstrucciones:

  • Esclavo de actualización rápida (suave) — vuelve a leer y re-embebe sólo los elementos que has cambiado desde la última construcción; los elementos que no han cambiado mantienen sus embeddings existentes, se eliminan los elementos eliminados. Mucho más barato, porque el costo de embedding de OpenAI escala con el delta, no con todo el corpus.
  • Reconstrucción completa (dura) — vuelve a leer y re-embebe todo desde cero (usa más créditos de IA). Utiliza esto únicamente si algo parece estar mal.

Para desarrolladores: run_memory_build(user, settings, build, incremental=True) difunde los nuevos fragmentos contra los almacenados por la clave (source_key, source_id, chunk_index, content_hash) antes de llamar a embed_chunks, así que solo se embeben nuevos/cambiados fragmentos; las filas obsoletas se eliminan en el mismo bloque atómico; las filas sin cambios se dejan sin tocar. El modo se lleva en OrbitPilotMemoryBuild.incremental (migración orbitpilot/0025) y se establece por orbitpilot_rebuild_memory de mode=soft|hard. Si se omite incremental, run_memory_build lo lee del registro de construcción. La ruta completa/dura mantiene el comportamiento exacto del anterior borrado atómico de todo + re-embebe.

Correcciones impulsadas por chat (2026-07-28)

Analizando conversaciones reales (con PII redactada) de OrbitPilot aparecieron cuatro correcciones:

  • Enlaces de IA rotos (your-app-link): el modelo inventó un dominio cuando se le dieron rutas relativas de un folleto obsoleto. Ahora (a) una verificación de salud del sistema advierte si SITE_URL es localhost en producción, y (b) orbitpilot.services.heal_links() reescribe cualquier enlace de marcador de posición/localhost base al host real del sitio en cada respuesta (stream/blocking/guest) — por lo que los enlaces funcionan incluso antes de una reconstrucción. La solución permanente (establecer SITE_URL + reconstruir) está en la Lista de verificación de configuración del administrador.
  • Listar mis Winks ahora funciona: pipeline/retrieve.py add_list_intent_sources() inyecta TODOS los fragmentos de una fuente cuando la consulta es una solicitud de enumeración ("listar/mostrar/todos mis winks/tareas/eventos"), y la instantánea del espacio de trabajo muestra los títulos de Wink — por lo tanto, la IA lista elementos reales, no solo el recuento.
  • Acciones siguientes clicables: las acciones ahora son {label, url}. Un enlace de navegación real se renderiza como un botón clicable (se abre en una nueva pestaña); de lo contrario, es un chip de prellenado. Corregido en todo el widget, la ventana modal de inicio de invitados (que anteriormente eliminaba acciones), y el resultado de página completa. Los enlaces de respuesta en línea también se abren ahora en una nueva pestaña.
  • Pulido del aviso: el aviso de respuesta central deja de repetir en exceso el objetivo de encabezado del usuario y maneja "¿qué cambió desde ayer?" de manera fluida (funciona desde la instantánea actual, no de la historia de día a día).

Para desarrolladores: orbitpilot/services.py (heal_links, request_base, split_answer_actions ahora devuelve diccionarios, capa guest next_actions), pipeline/retrieve.py (add_list_intent_sources), adminapp/diagnostics.py (_check_site_url), JS del widget + home.html (renderizado de acción + gancho DOMPurify target=_blank), aihub/prompt_registry.py (predeterminados de núcleo + next_actions; actualizado en Defaults sembrados no tocados a través de aihub/0007).

This guide was translated automatically. Read the English original.

🪐 OrbitPilot