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
(meta → token… → 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üsselop_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überorbitpilot_custom_instructions; plan-gesperrt durch diecustom_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“ (neuorbitpilot_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_chat → orbitpilot/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, wennSITE_URLein 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 (setSITE_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.