Skip to main content
OrbitPilot

Widget de chat OrbitPilot — en streaming, mobile, déplaçable & vocal

Ce que c'est

OrbitPilot est maintenant un widget de chat flottant mondial pour les utilisateurs connectés : un bouton  dans le coin ouvre un panneau que vous pouvez utiliser depuis n'importe quelle page. Le panneau est non-bloquant (continuez à naviguer pendant qu'il est ouvert), déplaçable, repliable, et il se souvient de sa place et de votre conversation ouverte lorsque vous vous déplacez sur le site.

Nouvelles capacités

  • Réponses en streaming — la réponse apparaît mot par mot au lieu d'après une attente.
  • Arrêter — interrompez l'IA en plein milieu de la réponse. Arrêter sauvegarde tout ce qui a été écrit jusqu'à présent et n'utilise pas une demande de votre quota mensuel.
  • Copier / Télécharger l'ensemble du chat — boutons en haut et en bas du panneau (le téléchargement est une transcription .txt).
  • Copier un seul message — survolez n'importe quelle bulle pour un icône de copie.
  • Maximiser la fenêtre, parcourir votre historique de chats, et commencer une Nouvelle conversation.
  • Entrée vocale — appuyez sur le microphone et parlez ; vos mots sont tapés pour vous.

Les invités (non connectés) conservent le pop-up de chat de la page d'accueil d'origine.

Sur votre téléphone (mobile)

  • Le panneau s'accroche au bas de l'écran et ne déborde jamais par les bords, dans n'importe quelle orientation — faire pivoter le téléphone le réajuste automatiquement.
  • Il respecte la encoche et l'indicateur d'accueil (zones sûres), et utilise la hauteur d'écran en direct afin que la barre d'adresse du navigateur ne puisse pas couper le bouton Envoyer.
  • Après que vous ayez parlé et envoyé, la boîte est vidée pour votre prochaine question — appuyez à nouveau sur le microphone pour parler pour le prochain tour.

Pour les développeurs

Le streaming nécessite une vue async sous ASGI (un générateur synchronisé tamponne avant le premier octet). orbitpilot.views.orbitpilot_ask_stream est un async def retournant StreamingHttpResponse sur un générateur async qui émet des événements envoyés par le serveur (meta  token done). Tout le fonctionnement ORM/gating est exécuté dans deux assistants SYNC (_prepare_ask_stream / _finalize_ask_stream) via sync_to_async(thread_sensitive=True). Arrêter = le client annule le fetch  le générateur async est annulé  la réponse partielle est sauvegardée et la ligne de quota n'est PAS écrite. Le frontend vit dans templates/_orbitpilot_widget.html + static/css/orbitpilot-widget.css + static/js/orbitpilot-widget.js, inclus dans base.html uniquement pour les utilisateurs authentifiés.

Adaptabilité mobile (Workstream E) : le widget entier est box-sizing: border-box donc la bordure de 1px compte dans la largeur (l'ancien iPhone débordement était width:100vw + border). La règle @media (max-width:575px) abandonne 100vw pour left/right: env(safe-area-inset-*) + width:auto, tailles avec dvh (avec un vh de secours), et espace le compositeur par env(safe-area-inset-bottom). En JS, une position de glissement de bureau enregistrée n'est pas appliquée sur un affichage mobile, et un resize/orientationchange écouteur re-clampe la position via applyPos(). Voix claire : le module de parole garde un tampon saved finalisé séparé de l'entrée ; send() appelle maintenant un resetVoice() partagé (arrêter la reconnaissance, effacer le minuteur de silence, remettre saved) juste là où il efface input.value, donc le prochain tour commence vide.

Taille de police du chat + correction mobile Envoyer (2026-07-27)

  • A / A+ dans l'en-tête du widget réduit/agrandit le texte du chat. Votre choix est mémorisé (sauvegardé dans le navigateur via localStorage clé op_widget_font) entre les pages et les sessions. La taille est limitée à 12 22px.
  • Bouton Envoyer sur les téléphones : la ligne du compositeur garde maintenant les boutons Envoyer (et microphone) visibles à côté de la zone de texte sur des écrans étroits — auparavant, la zone de texte pouvait pousser Envoyer hors du bord droit.

Pour les développeurs : balisage templates/_orbitpilot_widget.html, comportement static/js/orbitpilot-widget.js (applyFont()/bumpFont(), restauré lors de l'init), style static/css/orbitpilot-widget.css. Les boutons augmentent une --op-chat-font variable CSS lue par le corps du message + entrée ; le compositeur utilise min-width:0 sur le textarea et flex:0 0 auto sur les boutons de sorte que Envoyer ne soit jamais poussé hors écran.

Menu hamburger + mode plein écran (2026-07-27)

L'en-tête du widget de chat a maintenant un  menu et un  plein écran bouton :

  • Vos instructions — notes permanentes que l'IA considère toujours (comme les instructions personnalisées de ChatGPT). Sauvegardé dans OrbitPilotSettings.custom_user_prompt via orbitpilot_custom_instructions ; plan-ceinturé par la fonction custom_prompt (un message verrouillé + lien de mise à niveau apparaît si le plan ne le permet pas ; le serveur l'impose également avec un 403).
  • Téléchargements — maintenant clairement deux options : Cette conversation uniquement (orbitpilot_conversation_download) contre Tout mon historique de chat (nouveau orbitpilot_history_download). Le bouton de barre d'outils est réétiqueté  Cette conversation.
  • Mémoire  Reconstruire ma mémoire maintenant — une reconstruction complète (orbitpilot_rebuild_memory) derrière un avertissement de coût de confirmation (il lit tout à nouveau et le ré-embede, ce qui utilise des crédits AI) ; il ne stackera pas une reconstruction tandis qu'une est déjà en cours.

Le mode plein écran () ouvre /orbitpilot/chat/ dans un nouvel onglet, un chat plein écran de style ChatGPT/Gemini qui réutilise le MÊME widget (via la classe de corps op-fullpage) — donc passer entre le petit widget et la page complète maintient la même conversation (partagée op_widget_conv localStorage + un écouteur d'événement storage). Aussi : A / A+ change la police de chat (mémorisée), et sur un portable le bouton Envoyer reste visible à côté du micro.

Pour les développeurs : balisage templates/_orbitpilot_widget.html, comportement static/js/orbitpilot-widget.js, style static/css/orbitpilot-widget.css ; vue plein écran orbitpilot.views.orbitpilot_chat  orbitpilot/templates/orbitpilot/chat_full.html.

Mise à jour rapide vs reconstruction complète (mémoire douce/dure, 2026-07-27)

Le menu  mémoire du widget propose maintenant deux reconstructions :

  •  mise à jour rapide (douce) — relit et ré-embede uniquement les éléments que vous avez modifiés depuis la dernière construction ; les éléments inchangés conservent leurs embeddings existants, les éléments supprimés sont éliminés. Beaucoup moins cher, car le coût d'embedding de OpenAI évolue avec le delta, pas l'ensemble du corpus.
  •  reconstruction complète (dure) — relit et ré-embede tout à partir de zéro (utilise plus de crédits AI). Utilisez-le uniquement si quelque chose semble incorrect.

Pour les développeurs : run_memory_build(user, settings, build, incremental=True) diffère les nouveaux morceaux par rapport aux anciens stockés par le (source_key, source_id, chunk_index, content_hash) clé avant d'appeler embed_chunks, donc seuls les nouveaux/mis à jour morceaux sont intégrés ; les lignes obsolètes sont supprimées dans le même bloc atomique ; les lignes inchangées restent intactes. Le mode est porté sur OrbitPilotMemoryBuild.incremental (migration orbitpilot/0025) et défini par orbitpilot_rebuild_memory à partir de mode=soft|hard. Si incremental est omis, run_memory_build le lit à partir de l'enregistrement de construction. Le chemin plein/dur maintient le comportement exact de suppression et ré-embede atomique précédent.

Corrections pilotées par le chat (2026-07-28)

Analyser de réelles conversations OrbitPilot (rédigées sans PII) a mis en lumière quatre corrections :

  • Liens AI brisés (your-app-link) : le modèle a inventé un domaine lorsqu'il a été remis des chemins relatifs d'un livret obsolète. Maintenant (a) un contrôle de santé du système avertit si SITE_URL est localhost en production, et (b) orbitpilot.services.heal_links() réécrit toute base de lien placeholder/localhost vers le véritable hôte du site dans chaque réponse (stream/bloquant/invité) — donc les liens fonctionnent même avant une reconstruction. La correction permanente (définir SITE_URL + reconstruire) se trouve sur la Liste de contrôle de configuration Admin.
  • Lister mes Winks fonctionne maintenant : pipeline/retrieve.py add_list_intent_sources() injecte TOUS les morceaux d'une source lorsque la requête est une demande d'énumération ("lister/montrer/tous mes winks/tâches/événements"), et l'instantané de l'espace de travail échantillonne les titres Wink — donc l'IA liste des éléments réels, et non seulement le compte.
  • Actions à suivre cliquables : les actions sont maintenant {label, url}. Un véritable lien de navigation se rend sous form d'un bouton cliquable (s'ouvre dans un nouvel onglet) ; sinon, c'est une puce de pré-remplissage. Corrigé dans tout le widget, la modal d'accueil des invités (qui supprimait auparavant des actions), et le résultat en plein écran. Les liens de réponse en ligne s'ouvrent également dans un nouvel onglet maintenant.
  • Polissage des invites : l'invite de réponse principale cesse de répéter de façon excessive l'objectif principal de l'utilisateur et gère "qu'est-ce qui a changé depuis hier" avec grâce (elle fonctionne à partir de l'instantané actuel, et non d'historique jour par jour).

Pour les développeurs : orbitpilot/services.py (heal_links, request_base, split_answer_actions maintenant retournant un dict, couche next_actions invitée), pipeline/retrieve.py (add_list_intent_sources), adminapp/diagnostics.py (_check_site_url), JS du widget + home.html (rendu d'action + DOMPurify cible=_blank hook), aihub/prompt_registry.py (noyau + valeurs par défaut next_actions ; rafraîchi sur les valeurs par défaut semées non touchées via aihub/0007).

This guide was translated automatically. Read the English original.

🪐 OrbitPilot