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
localStorageclé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_promptviaorbitpilot_custom_instructions; plan-ceinturé par la fonctioncustom_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 (nouveauorbitpilot_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 siSITE_URLest 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éfinirSITE_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.