KAI Voice · Architektur Gespräch
Architektur · KAI Voice

KAI hört zu.
Und antwortet.

Wie aus einem Chatbot ein Gesprächspartner wurde: Architektur, Ideen und Umsetzung des Sprachgesprächs mit KAI, vom Mikrofon bis Gemini Live und zurück.

Gemini Live 3.8KIRAVertex AI FastAPI · asyncioAngular · Web Audio
Bedingungen · Vertiefte Recherche · Allgemeine KI · LAS-Kundenkontext
KAI
← → blätternO InhaltF VollbildP Drucken / PDF
Die Vision

Ein Kollege am Telefon,
der alle Bedingungen kennt.

Natürlich

Sprechen statt tippen. Nachfragen, ins Wort fallen, Rückbezüge wie „und bei Sturm?“. KAI verhält sich wie ein Mensch am Telefon und überbrückt Wartezeit hörbar.

Verlässlich

Jede fachliche Aussage stammt aus der KAI-Recherche über freigegebene Quellen. Dieselbe Pipeline, derselbe Kundenkontext und dieselbe Abnahme wie im Textchat. Das Sprachmodell erfindet nichts.

Nachvollziehbar

Der Chat schreibt mit: Fragen, entstehende Antworten, Quellen. Nach dem Auflegen bleibt ein normaler, gespeicherter Chatverlauf zum Nachlesen und Weiterarbeiten.

Funktioniert in allen Modi: Bedingungen · SchnellBedingungen · VertieftAllgemeine KILAS-Kundenkontext
Erleben

So fühlt es sich an, und das passiert dahinter.

Das Problem

Am Telefon ist Stille der Feind.

bis 60 Sek.

So lange dauert eine Recherche. Schnell: einige Sekunden. Vertieft: oft bis zu einer Minute. Schon drei Sekunden Stille wirken am Telefon wie ein Verbindungsabbruch.

… Stille …
Nutzer fragtModell wartet stumm auf das Werkzeug
Gemini Live API (AI Studio)

„Non-blocking“ Toolcalls

Die Live API dokumentiert behavior: NON_BLOCKING. Das Modell spricht weiter, während ein Werkzeug arbeitet. Genau das, was man braucht.

Vertex AI über KIRA

Gibt es dort nicht.

Die FunctionDeclaration in Vertex kennt das Feld nicht und ignoriert es. Toolcalls blockieren: Das Modell schweigt, bis die Antwort da ist. Die Google-Dokumentation widerspricht sich hier.

Die Kernidee

Sofort reden. Parallel suchen.

BlockierendModell wartet stumm
Frage
Stille 6,3 s
Antwort
6,3 sStille
Erst reden, dann suchennaheliegend, aber langsam
Frage
„Moment …“
Stille 6 s
Antwort
11,5 sbis Antwort
KAIsofort bestätigen, parallel
Frage
„Moment, ich schaue nach …“
2,5 s
Antwort
2,5 sgefühlte Stille
0 s3 s6 s9 s12 s15 s
▬ Recherche läuftBeispielwerte zur Veranschaulichung. Die Recherche dauert in allen drei Fällen gleich lang.
① Tool zuerstDas Modell ruft KAI(Frage) auf, bevor es spricht.
② Sofort quittierenKAI sendet toolResponse {status} ohne Wartezeit. Das Modell ist frei.
③ Überbrücken„Moment, ich schaue nach …“, während die Recherche schon läuft.
④ NachreichenErgebnis als clientContent „KAI-Ergebnis: …“, löst einen neuen Turn aus.
Die Kernidee

Zwei Rollen, klar getrennt.

Gemini Live: die Stimme

  • hört zu, erkennt Sprechpausen
  • spricht natürlich, überbrückt Wartezeit
  • lässt sich unterbrechen
  • versteht Rückbezüge aus dem Chatverlauf
  • hat kein Fachwissen
ein einziges Werkzeug
KAI(Frage)

KAI: das Wissen

  • dieselbe Pipeline wie der Textchat
  • Schnell (RAG), Vertieft (agentisch), Allgemein
  • freigegebene Quellen, LAS-Kundenkontext
  • Speicherung, Quellenanzeige, Abnahme
  • spricht nicht selbst
„Antworte niemals irgendetwas Fachliches ohne bei KAI nachzufragen. Ignoriere alles, was du weißt, und frage immer KAI.“ System-Prompt des Live-Modells · voice_session_constants.py
Architektur

Vier Systeme, zwei WebSockets, ein Gespräch. Klicken Sie auf eine Komponente.

Browser · KAI-Client kai-api KIRA Google Vertex AI Daten · Identität WSS · PCM binär + JSON WSS JSON HTTPS Mikrofon · Worklet16 kHz · Int16 · 40 ms Wiedergabe24 kHz · lückenlos · Stopp Chat-AnzeigeFrage · Live-Text · Quellen VoiceConversation-ServiceWebSocket · Status · Events VoiceConnectionAuth · Protokoll · Send-Lock VoiceSession3 Schleifen · ZustandsmaschineToolcall-StrategieZwischenstände · Metriken VoiceResearchStream → Chat · Ergebnis → Modell KaiChatServicevoice=True · SchnellpfadSchnell · Vertieft · Allgemein Live-Gateway/live/{model_id}OAuth von KAI LLM-APIStreaming · ToolsEmbeddings Gemini Live 3.8Audio ⇄ AudioTool: KAI Gemini TextAntwortenAgentic PostgreSQLChatsQuellen ElasticSucheVektoren KeycloakTokenOIDC
Ablauf

Eine Frage, Schritt für Schritt.

0

Bereit

Mit „Weiter“ oder „Abspielen“ läuft eine fachliche Frage im Modus Schnell durch alle beteiligten Komponenten.

Gesprächslogik

Die Höflichkeitsregel: Unterbrechen darf nur der Nutzer.

Modell sprichtmodel_speaking
Nutzer hat das Wortuser_has_turn
Ergebnis wartetpending_result
Gespräch ruhig: Ergebnis darf kommen
    Warum?Ein Ergebnis als clientContent mit turnComplete startet sofort eine neue Modellantwort. Mitten in der Überbrückung würde es das Modell abschneiden, mitten im Satz den Nutzer. Deshalb hält VoiceConversationState das Ergebnis zurück und stellt es beim nächsten ruhigen turnComplete zu.
    Gesprächslogik

    Echte Gespräche sind unordentlich.

    Ins Wort fallen

    Gemini erkennt den Barge-in und meldet interrupted. Der Browser stoppt alle geplanten Audioquellen sofort und verwirft nachlaufendes Audio. Echo-Unterdrückung verhindert, dass das Modell sich selbst hört.

    Neue Frage schlägt alte

    Fragt der Nutzer während der Recherche etwas Neues, bekommt das Modell nur noch das neue Ergebnis. Die alte Recherche läuft für den Chat zu Ende. Keine veralteten Antworten im Ohr.

    Doppelter Aufruf

    Ruft das Modell KAI ohne neue Nutzereingabe ein zweites Mal auf, startet keine zweite Recherche. KAI beantwortet genau diesen Call mit dem laufenden Ergebnis, sobald es da ist.

    Modell bricht ab

    Sendet Gemini toolCallCancellation, erscheint das Ergebnis nur im Chat. Das Modell bekommt nichts mehr, das Gespräch bleibt konsistent.

    Auflegen mitten drin

    Die Antwortgenerierung läuft im Backend entkoppelt weiter und wird gespeichert. Der Chat lädt neu und holt offene Antworten über den vorhandenen Resume-Mechanismus.

    Fehler

    Scheitert eine Recherche, sagt das Modell nur „Die Bedingungen konnten gerade nicht abgefragt werden.“ Interna bleiben im Log, damit nichts davon vorgelesen wird. Verbindungsabbrüche enden mit klarer Meldung.

    Vertiefte Recherche

    Bis zu einer Minute recherchieren, ohne Funkstille.

    Gesprächwas der Nutzer hört
    Frage
    Ansage
    Antwort
    KAI-Rechercheagentischer Harness
    mehrere Suchrunden · Statusmeldungen im Chat: „Ich prüfe weitere relevante Regelungen …“
    0 s10 s20 s30 s40 s
    Ansage zu BeginnDie Tool-Bestätigung ist eine Regieanweisung: „Sie dauert länger als sonst, oft bis zu einer Minute. Sage dem Nutzer, dass du gründlich nachschaust.“
    Taktung_progress_loop prüft jede Sekunde. Ein Zwischenstand kommt frühestens 4 s nach Ende der letzten Ansage, nie während jemand spricht.
    Wiedergabe mitrechnenDer Server kennt das Abspielende im Browser nicht und schätzt es aus den Audio-Bytes: 24 000 Hz × 2 Byte pro Sekunde.
    ▬ „Ich bin noch dran.“Schematisch · Quellenmarker der vertieften Recherche werden vor dem Vorlesen entfernt, bleiben im Chat aber erhalten.
    Allgemeine KI

    „Schreib mir eben eine Mail.“ Die Stimme sagt es, der Chat schreibt es.

    Allgemeine KI

    Vier Takte, mehrere Iterationen bis es rund war.

    TAKT 1Still das Werkzeug rufenVor dem Toolcall sagt das Modell nichts. Das Schreiben beginnt sofort.
    TAKT 2„Ja, ich schreibe das gerade.“Erst nach der Bestätigung durch KAI. Die Ansage ist damit wahr.
    TAKT 3Text entsteht im ChatDie allgemeine KI streamt die Mail sichtbar, Wort für Wort.
    TAKT 4„Fertig, steht im Chat.“Kurze mündliche Zusammenfassung statt Vorlesen, Verweis auf den Chat.

    Was ohne klare Regeln passiert

    • Das Modell kündigt erst an und ruft das Werkzeug danach. Das Schreiben startet spät.
    • Das Modell behauptet „steht im Chat“, bevor etwas da ist.
    • Lange Texte werden komplett vorgelesen.

    Wie es gelöst ist

    • Eigener System-Prompt für die allgemeine KI mit klarer Reihenfolge
    • Tool-Bestätigung als Regieanweisung: „Bestätige nur, dass du die Aufgabe jetzt bearbeitest.“
    • Das Live-Modell erhält den vollständigen Text, fasst aber nur zusammen und kann Rückfragen beantworten
    • Abgesichert durch einen eigenen Prompt-Test
    Zweiter Ausgabekanal

    Gesprochenes ist flüchtig. Der Chat bleibt.

    kai_questionFrage erscheint, Antwort „in Arbeit“
    kai_statusRechercheschritt in der Statuszeile
    kai_chunkAntwort entsteht Wort für Wort
    kai_answerfertige Antwort, gespeichert
    kai_answerzweites Mal: Quellen nachgetragen
    kai_failedfalls etwas schiefgeht: Fehlermeldung an der Nachricht
    • Eine ID für alles. VoiceResearch erzeugt die Message-ID, die Datenbank speichert unter ihr, der Chat zeigt unter ihr an.
    • Gespeichert wie getippt. Frage, Antwort, Quellen und Kundenkontext landen wie bei einer Textfrage in PostgreSQL. Feedback und Chathistorie funktionieren normal.
    • Kein doppelter Stream. Gesprächsnachrichten sind als „direkt gestreamt“ markiert, damit der Chat keinen zusätzlichen Resume-Stream öffnet.
    • Robust beim Auflegen. Die Generierung läuft im Backend als eigener Task weiter. Danach lädt der Chat neu und übernimmt offene Antworten.
    • Gleiches DTO. kai_answer nutzt denselben Mapper wie der Textchat, inklusive Quellen und Kundenkontext-Aufbereitung.
    Ein Gespräch, zwei KanäleDie Stimme trägt die Interaktion, der Chat den Inhalt. Darum kann das Modell lange Texte zusammenfassen statt sie vorzulesen.
    Performance

    Jede Sekunde in der Pipeline ist hörbar.

    SchrittTextchatVoiceWarum
    Frage umformulieren (Rewriter)jaentfälltDas Live-Modell stellt bereits eine eigenständige Frage.
    Folgefragen-VorschlägejaentfälltIm Gespräch fragt man einfach nach.
    Quellenfilter (Schnell)vor der Antwortnach der AntwortAntwort sofort ans Modell, gefilterte Quellen kommen als zweites Ergebnis nach.
    Hinweis „Antworte möglichst kurz“neinals KontextWird vorgelesen; der Hinweis wird nicht als Teil der Frage gespeichert.
    Speicherung, Quellen, KundenkontextjajaGleiche fachliche Qualität und Nachvollziehbarkeit.
    sofort
    geht die Tool-Bestätigung raus, ohne auf die Recherche zu warten
    ab 0 s
    Sprechen sofort möglich, Audio wird gepuffert, während das Backend zu KIRA verbindet
    TLS
    vorab aufgewärmt, bevor der WebSocket-Handshake startet
    2 Results
    Antwort zuerst, gefilterte Quellen danach (Modus Schnell)
    Audio

    Die Audio-Strecke: binär, schlank, unterbrechbar.

    BROWSERMikrofonEcho- und Rauschunterdrückung, Pegelregelung
    AUDIOCONTEXT16 kHz monoBrowser resampelt nativ
    AUDIOWORKLETInt16 · 40 ms640 Samples = 1 280 Byte, im Audio-Thread
    WEBSOCKETbinärer Framekein Base64, kein JSON
    KAI-APIBase64 erst hieran der Grenze zum JSON-Live-Protokoll
    BARGE-INSofort-Stoppalle Quellen stoppen, Nachläufer verwerfen
    BROWSERAudioBufferlückenlos hintereinander geplant
    KAI-APIBase64 → binärWiedergabeende wird mitgerechnet
    GEMINI LIVEPCM 24 kHzStimme Charon, ohne affektive Färbung
    BandbreiteBase64 vergrößert Audio um ein Drittel. Zwischen Browser und KAI entfällt dieser Aufschlag komplett.
    ValidierungNur mono audio/pcm; Blöcke nicht leer, gerade Länge, höchstens 64 KiB.
    NebenläufigkeitAudio und Events teilen einen Socket; ein Send-Lock serialisiert die Frames im Backend.
    Sicherheit und Datenschutz

    Gebaut für den Konzernbetrieb.

    Token nie in der URL

    Browser können beim WebSocket keine Header setzen. Das Keycloak-Token reist als Subprotocol bearer.<jwt>. Der Server bestätigt nur kai.voice.v1, nie das Token.

    Prüfung vor dem Accept

    Token-Validierung wie bei REST, bevor die Verbindung angenommen wird. Ein Gespräch ist nur im eigenen Chat möglich, sonst Close 1008.

    Geheimnisse bleiben am Server

    Das KIRA-Token, System-Prompts und die Gesprächslogik liegen im Backend. Der Browser spricht nie direkt mit KIRA oder Google.

    Keine Inhalte im Log

    Transkripte werden weder geloggt noch im Tracing erfasst. Audio wird nicht gespeichert. Ein Test sichert das ab.

    Kundenkontext-Filter

    Ohne aktiven Kundenkontext gelangen keine Vertragsdaten aus früheren Chatnachrichten in den Prompt des Live-Modells.

    Fehler bleiben generisch

    Feste Meldungen an Nutzer und Modell. Die Startnachricht ist vor Validierungs-Logs geschützt (hide_input_in_errors).

    Betrieb

    Messbar: wie viel Wartezeit überbrückt wurde.

    voice.sessionganzes Gespräch
    voice.researchje Frage ein eigener Kind-Span
    kai_chat.process_questionwie im Textchat
    RAG · LLM-Aufrufebestehende Spans
    research_output_audio_seconds
    Wie viele Sekunden das Modell während der Recherche gesprochen hat: die überbrückte Wartezeit.
    research_duration_seconds
    Dauer jeder einzelnen Recherche, getrennt nach Modus und Kundenkontext.
    first_audio_latency_seconds
    Zeit von der Ergebnisübergabe bis zum ersten Antwort-Audio.

    OpenTelemetry → Jaeger. Logs enthalten Ablaufschritte und IDs, aber keine Inhalte. Matomo zählt „Gespräch gestartet“ und „beendet“.

    Für Architektinnen und Architekten

    14 Entscheidungen, die das System prägen.

    E1KAI als einziges ToolLive-Modell spricht, KAI weiß. Keine fachliche Eigenleistung.
    E2Sofort quittierenErsatz für NON_BLOCKING: Status-Antwort, Ergebnis als neuer Turn.
    E3Erst Tool, dann redenRecherche und Überbrückung laufen parallel.
    E4Zustellung in RuheZustandsmaschine hält Ergebnisse zurück. Nur der Nutzer unterbricht.
    E5Ersetzen statt stapelnNeue Frage verdrängt alte; Wiederholungen werden zusammengeführt.
    E6Getaktete ZwischenständeNur bei Vertieft, nach 4 s Ruhe, Wiedergabe mitgerechnet.
    E7Allgemeine KI: zeigen, nicht vorlesenEigener Prompt, Chat trägt den Inhalt.
    E8Sprach-SchnellpfadOhne Rewriter und Vorschläge, Quellenfilter danach.
    E9Chat als zweiter KanalGleiche Message-ID, gespeichert wie Text.
    E10Binäres AudioBase64 nur Richtung KIRA.
    E11Token als SubprotocolNie in URLs, nie zurückgespiegelt.
    E12Historie im Prompt10 Nachrichten, gekürzt, Kundenkontext gefiltert.
    E13Ruhiges Modell-SetupKein Affective Dialog, Kontextkompression, Stimme Charon.
    E14Generische FehlerNichts Internes für Nutzer oder Modell.
    MEHRDetailsdocs/kai/voice/
    architektur.md
    Stand und Ausblick

    Fertig gebaut. Bereit für den Fachtest.

    Localaktiv
    Taktiv
    Faktiv · Fachtest
    QFeature-Flag aus
    PFeature-Flag aus

    Ehrliche Grenzen

    • Prompttreue (nichts Fachliches ohne KAI) ist gesteuert, nicht technisch erzwungen.
    • Nach einem Verbindungsabbruch startet das Gespräch neu; die Chat-Antworten bleiben.
    • Modus ist pro Gespräch fest.
    • Zwischenstände sind noch allgemein, obwohl KAI den Rechercheschritt kennt.
    • Der Client hängt noch nicht in der Trace-Kette.

    Nächste Schritte

    • Fachliche Bewertung der gesprochenen Antworten auf F durch die Sparten
    • Datenschutzfreigabe und Lastbetrachtung für Q und P
    • Zwischenstände mit konkretem Rechercheschritt anreichern
    • Sitzungsfortsetzung nach Abbruch prüfen
    • Ende-zu-Ende-Latenz aus Nutzersicht messen
    Epilog

    Gespräch beendet.
    Der Chat bleibt.

    Drei Ideen tragen KAI Voice: Gesprächsführung und Wissen getrennt, sofort reden und parallel suchen, und ein Chat, der mitschreibt.

    Vollständigdocs/kai/voice/
    architektur.md
    Kompaktdocs/kai/voice/
    kurzfassung.md
    Diagrammedocs/kai/voice/
    voice-architektur.drawio
    KAI

    Inhalt