Skip to main content
OrbitPilot

OrbitPilot-Chat-Widget — Streaming, beweglich, mobil & Stimme

Was es ist

OrbitPilot ist jetzt ein globales schwebendes Chat-Widget für angemeldete Benutzer: ein 🛰️-Schaltfläche in der Ecke öffnet ein Panel, das Sie von jede Seite verwenden können. Das Panel ist nicht blockierend (stöbern Sie weiter, während es geöffnet ist), ziehbar, zusammenklappbar und merkt sich seinen Platz sowie Ihr offenes Gespräch, während Sie sich auf der Seite bewegen.

Neue Fähigkeiten

  • Streaming-Antworten — die Antwort erscheint Wort für Wort, anstatt nach einer Wartezeit.
  • Stop — stoppen Sie die KI mitten in der Antwort. Das Stoppen speichert alles, was bisher geschrieben wurde, und verbraucht kein Abfragen aus Ihrem monatlichen Kontingent.
  • Gesamten Chat kopieren / herunterladen — Schaltflächen oben und unten im Panel (Download ist ein .txt-Transkript).
  • Eine einzelne Nachricht kopieren — fahren Sie über jede Sprechblase für ein Kopiersymbol.
  • Maximieren des Fensters, stöbern Sie durch Ihre Chat-Historie und beginnen Sie ein neues Gespräch.
  • Sprachinput — tippen Sie auf das Mikrofon und sprechen Sie; Ihre Worte werden für Sie getippt.

Gäste (nicht angemeldet) behalten das ursprüngliche Chat-Popup auf der Startseite.

Auf Ihrem Telefon (mobil)

  • Das Panel docked am unteren Bildschirmrand und läuft nie über die Ränder hinaus, in jeder Orientierung — das Drehen des Telefons passt es automatisch an.
  • Es respektiert die Notch und die Home-Anzeige (sichere Bereiche) und verwendet die lebendige Bildschirmhöhe, sodass die Adressleiste des Browsers die Sendeschaltfläche nicht abschneiden kann.
  • Nachdem Sie gesprochen und gesendet haben, wird das Feld geleert für Ihre nächste Frage — tippen Sie erneut auf das Mikrofon, um für die nächste Runde zu sprechen.

Für Entwickler

Streaming erfordert eine asynchrone Ansicht unter ASGI (ein synchroner Generator puffert vor dem ersten Byte). orbitpilot.views.orbitpilot_ask_stream ist ein async def, das StreamingHttpResponse über einen asynchronen Generator zurückgibt, der Server-Sent Events (metatoken… → done) ausgibt. Alle ORM/Gating läuft in zwei SYNC-Helfern (_prepare_ask_stream / _finalize_ask_stream) über sync_to_async(thread_sensitive=True). Stop = der Client bricht den Abruf ab → der asynchrone Generator wird abgebrochen → die teilweise Antwort wird gespeichert und die Kontingentzeile wird NICHT geschrieben. Das Frontend befindet sich in templates/_orbitpilot_widget.html + static/css/orbitpilot-widget.css + static/js/orbitpilot-widget.js, nur für authentifizierte Benutzer in base.html enthalten.

Mobile Responsiveness (Workstream E): Das gesamte Widget ist box-sizing: border-box, sodass der 1px-Rand innerhalb der Breite zählt (das alte iPhone overflow war width:100vw + border). Die @media (max-width:575px)-Regel entfernt 100vw für left/right: env(safe-area-inset-*) + width:auto, Größen werden mit dvh (mit einem vh-Fallback) erstellt und der Composer wird mit env(safe-area-inset-bottom) gepolstert. In JS wird eine gespeicherte Desktop-Ziehposition nicht auf einem mobilen Viewport angewendet, und ein resize/orientationchange-Listener fixiert die Position über applyPos(). Voice-clear: Das Sprachmodul hält einen finalisierten saved Puffer getrennt vom Input; send() ruft nun einen gemeinsamen resetVoice() (erkenntnis stoppen, den Stille-Timer löschen, saved leeren) genau an der Stelle auf, an der es input.value löscht, sodass die nächste Runde leer beginnt.

Chat-Schriftgröße + mobiles Sendefix (2026-07-27)

  • A− / A+ im Widget-Kopf verkleinern/vergrößern den Chat-Text. Ihre Auswahl wird erinnert (im Browser über den localStorage-Schlüssel op_widget_font) über Seiten und Sitzungen. Die Größe ist auf 12–22px begrenzt.
  • Sendeschaltfläche auf Telefonen: Die Composer-Reihe zeigt nun die Sendeschaltflächen (und Mikros) sichtbar neben dem Textfeld auf engen Bildschirmen an — zuvor konnte das Textfeld die Sendeschaltfläche vom rechten Rand drücken.

Für Entwickler: Markup templates/_orbitpilot_widget.html, Verhalten static/js/orbitpilot-widget.js (applyFont()/bumpFont(), beim Start wiederhergestellt), Styling static/css/orbitpilot-widget.css. Die Schaltflächen erhöhen eine --op-chat-font-CSS-Variable, die vom Nachrichtentext + Input gelesen wird; der Composer verwendet min-width:0 auf der Textarea und flex:0 0 auto auf den Schaltflächen, sodass Send niemals vom Bildschirm gedrängt wird.

Hamburger-Menü + Vollbildmodus (2026-07-27)

Die Kopfzeile des Chat-Widgets hat jetzt ein ☰ Menü und einen ⤹ Vollbild-Button:

  • Ihre Anweisungen — stehende Notizen, die die KI immer berücksichtigt (wie benutzerdefinierte Anweisungen von ChatGPT). Gespeichert in OrbitPilotSettings.custom_user_prompt über orbitpilot_custom_instructions; plan-gesperrt durch die custom_prompt-Funktion (eine gesperrte Nachricht + Upgrade-Link erscheint, wenn der Plan dies nicht erlaubt; der Server zwingt dies auch mit einem 403).
  • Downloads — jetzt klar zwei Optionen: „Dieses Gespräch nur“ (orbitpilot_conversation_download) vs „Alle meine Chat-Historie“ (neu orbitpilot_history_download). Die Schaltfläche in der Werkzeugleiste wird umbenannt in „⤸ Dieses Gespräch“.
  • Speicher → Baue mein Gedächtnis jetzt neu auf — ein vollständiger Neuaufbau (orbitpilot_rebuild_memory) hinter einer Bestätigungs-Kostenwarnung (es liest alles neu und bettet neu ein, was KI-Credits verwendet); es wird keinen Neuaufbau stapeln, während bereits einer läuft.

Vollbildmodus (⤹) öffnet /orbitpilot/chat/ in einem neuen Tab, ein ChatGPT/Gemini-Style Vollbild-Chat, der DAS GLEICHE Widget wiederverwendet (über die Klassen-ID op-fullpage) — sodass der Wechsel zwischen dem kleinen Widget und der Vollseite dasselbe Gespräch beibehält (freigegebenes op_widget_conv localStorage + ein storage-Ereignis-Listener). Auch: A− / A+ ändern die Chat-Schriftart (erinnert), und auf einem Telefon bleibt die Sendeschaltfläche sichtbar neben dem Mikrofon.

Für Entwickler: Markup templates/_orbitpilot_widget.html, Verhalten static/js/orbitpilot-widget.js, Styling static/css/orbitpilot-widget.css; Vollbildansicht orbitpilot.views.orbitpilot_chatorbitpilot/templates/orbitpilot/chat_full.html.

Schnelles Update vs Voller Neuaufbau (weiche/harte Erinnerung, 2026-07-27)

Das 🧠 Gedächtnis-Menü des Widgets bietet jetzt zwei Neubauten:

  • ⚡ Schnelles Update (weich) — liest und bettet nur die Elemente ein, die Sie geändert haben seit dem letzten Aufbau; unveränderte Elemente behalten ihre bestehenden Einbettungen, entfernte Elemente werden entfernt. Viel günstiger, weil die Kosten für die Einbettung von OpenAI mit dem Delta und nicht mit dem gesamten Korpus skaliert.
  • 🔤 Voller Neuaufbau (hart) — liest und bettet alles von Grund auf neu ein (verwendet mehr KI-Credits). Verwenden Sie es nur, wenn etwas falsch aussieht.

Für Entwickler: run_memory_build(user, settings, build, incremental=True) vergleicht die neuen Chunks mit den gespeicherten gemäß dem (source_key, source_id, chunk_index, content_hash)-Schlüssel vor dem Aufruf von embed_chunks, sodass nur neue/geänderte Chunks eingebettet werden; veraltete Zeilen werden im selben atomaren Block gelöscht; unveränderte Zeilen bleiben unberührt. Der Modus wird in OrbitPilotMemoryBuild.incremental beibehalten (Migration orbitpilot/0025) und durch orbitpilot_rebuild_memory aus mode=soft|hard gesetzt. Wenn incremental weggelassen wird, run_memory_build liest es aus dem Aufbau-Datensatz. Der volle/harte Pfad behält das genaue vorherige atomare dl löschen + erneut einbetten Verhalten bei.

Chat-gesteuerte Fixes (2026-07-28)

Die Analyse echter (PII-redigierter) OrbitPilot-Gespräche brachte vier Fixes ans Licht:

  • Kaputte KI-Links (your-app-link): Das Modell erfand eine Domain, als es relative Pfade aus einem veralteten Heft erhielt. Jetzt (a) warnt eine Systemgesundheitsprüfung, wenn SITE_URL ein localhost in der Produktion ist, und (b) orbitpilot.services.heal_links() schreibt jeden Platzhalter/localhost Link-Basis bei jeder Antwort (Streaming/blockierend/Gäste) um — sodass Links sogar vor einem Neuaufbau funktionieren. Der permanente Fix (set SITE_URL + neu aufbauen) befindet sich auf der Admin-Setup-Checkliste.
  • „Meine Winks auflisten“ funktioniert jetzt: pipeline/retrieve.py add_list_intent_sources() injiziert ALLE Chunks eines Sources, wenn die Abfrage eine Aufzählungsanfrage ist ("Liste/zeige/alle meine Winks/Aufgaben/Ereignisse"), und der Arbeitsbereichs-Snapshot sammelt Wink-Titel — sodass die KI tatsächliche Elemente auflistet, nicht nur die Anzahl.
  • Klickbare nächste Aktionen: Aktionen sind jetzt {label, url}. Ein realer Navigationslink wird als klickbare Schaltfläche gerendert (öffnet in einem neuen Tab); andernfalls ist es ein Vorfüll-Chip. Überall im Widget, im Gästhome-Modal (das zuvor Aktionen droppen konnte) und im Vollseitenresultat behoben. Inline-Antwortlinks öffnen sich jetzt auch in einem neuen Tab.
  • Prompt-Politur: das Kernantwortprompt hört auf, das Hauptziel des Benutzers übermäßig zu wiederholen und behandelt "was hat sich seit gestern geändert" elegant (es funktioniert aus dem aktuellen Snapshot, nicht aus den Tageshistorien).

Für Entwickler: orbitpilot/services.py (heal_links, request_base, split_answer_actions jetzt dict-zurückgebend, Gästep next_actions-Ebene), pipeline/retrieve.py (add_list_intent_sources), adminapp/diagnostics.py (_check_site_url), Widget-JS + home.html (Aktion rendern + DOMPurify target=_blank-Hook), aihub/prompt_registry.py (Kern + nächste Aktionen Standardeinstellungen; aktualisiert auf unberührte gesäte Standardeinstellungen über aihub/0007).

This guide was translated automatically. Read the English original.

🪐 OrbitPilot