08/Documentation
Spracheingabe und Web-Push
Das Mikrofon im Eingabefeld und Benachrichtigungen, wenn ein Agent auf Sie wartet
Beide Funktionen sind standardmäßig deaktiviert. Sie können eine Mikrofon-Schaltfläche im Eingabefeld und Browser-Benachrichtigungen aktivieren, die ausgelöst werden, wenn ein Agent auf Eingabe wartet.
Spracheingabe (optional)
Eine Mikrofonschaltfläche im Eingabefeld und ein Freisprechschalter in den Einstellungen. Tippen Sie auf die Schaltfläche, sprechen Sie, und das Transkript erscheint im Nachrichtenfeld, damit Sie es prüfen und senden können. Bei aktiviertem Freisprechmodus wird es automatisch gesendet: über denselben abgesicherten Antwortpfad wie eine getippte Nachricht, niemals daran vorbei.
Das Mikrofon ersetzt die runde Schaltfläche am Ende der Zeile, solange das Feld leer ist; das erste eingegebene Zeichen verwandelt sie wieder in Senden. Sie diktieren eine Nachricht oder tippen sie, sodass es eine primäre Aktion gibt, anstatt zwei, die um die Breite des Felds konkurrieren.
Es existiert erst, wenn Sie collie stt setup ausführen. Es wird keine Schaltfläche gezeichnet, keine Audiodatei verlässt das Telefon, es werden keine Zugangsdaten vorgehalten, kein Kindprozess wird ausgeführt. Nicht vorhanden, nicht nur deaktiviert. Zwei Anbieter:
| Anbieter | Beschreibung |
|---|---|
openai-compatible | Jeder Endpunkt, der POST /audio/transcriptions spricht: die öffentliche OpenAI-API, ein Whisper-Klon in der Cloud oder eine lokale Engine auf derselben Maschine, was die Option ohne Datenabfluss ist (unten). |
codex | Nutzt die codex-Binärdatei, der Sie bereits vertrauen, für ein kurzlebiges Token. Kein neues Konto, kein neuer Schlüssel und ein privater, nicht unterstützter Endpunkt, der einen Zustimmungsschritt erfordert, bei dem Sie yes eingeben müssen (unten). |
Die Einrichtung ist aus demselben Grund ein CLI-Vorgang wie Koppeln: Diese Schnittstelle nimmt Zugangsdaten entgegen, gehört also an die Tastatur des Hosts. Es gibt kein Web-Einrichtungsformular.
$ bin/collie stt setup
Which speech-to-text provider?
openai-compatible any endpoint that speaks POST /audio/transcriptions —
the public OpenAI API, or a local whisper.cpp / parakeet.cpp
server, which is the zero-egress choice and the one to prefer.
codex borrow your own `codex` sign-in. No new key, no new account —
and a private endpoint that may break without notice.
provider [openai-compatible]:
The API base, INCLUDING its version prefix — the provider appends /audio/transcriptions.
local http://127.0.0.1:8080/v1 (whisper.cpp / parakeet.cpp — nothing leaves the host)
cloud https://api.openai.com/v1 (room audio leaves this machine)
base URL: http://127.0.0.1:8080/v1
The model the endpoint understands. Empty takes Collie's default, gpt-transcribe.
model [gpt-transcribe]: whisper-1
API key [none]:
The language you speak, as a two-letter ISO-639-1 code — en, de, tr, ja.
LEAVE IT EMPTY to let the model detect it, which is what you want if you mix languages in one
sentence. Name one only if short clips keep coming back in a language you did not speak: a few
seconds of accented audio is too little for the model to detect from, and it guesses.
spoken language [auto-detect]: en
✓ speech-to-text configured — /home/you/.local/state/collie/stt.json (owner-only)
Live immediately — no restart needed. The bridge re-reads this file per request.
Check it end to end with `collie stt test`.Jede obige Frage hat ein Flag (--provider · --url · --model · --key · --lang), sodass eine Bereitstellung kein Terminal benötigt. Den Schlüssel leer zu lassen, ist ein unterstützter Modus: Ein schlüsselloser Endpunkt wird ganz ohne Authorization-Header aufgerufen statt mit einem leeren.
Die gesprochene Sprache muss nur bei einem bestimmten Fehlerfall gesetzt werden. Bleibt das Feld leer (Standard), erkennt das Modell die Sprache selbst, was für gemischtsprachige Sätze erforderlich ist. Setzen Sie den Wert, wenn kurze Clips wiederholt in einer nicht gesprochenen Sprache zurückkommen: Wenige Sekunden Audio mit Akzent reichen für die Erkennung nicht aus, und das Modell rät. Ein zweistelliger Code oder ein regionaler Tag, den Collie für Sie einschränkt (en-GB → en). Dies gilt nur für den openai-compatible-Anbieter; der codex-Endpunkt akzeptiert keine Sprache, und collie stt status weist darauf hin, anstatt falsche Annahmen zuzulassen.
Eine lange Aufnahme erhält eine lange Frist. Das Browser-Zeitlimit für einen Clip hängt von dessen Größe ab, nicht von einem festen Wert: Es wird von einer kontinuierlichen Uplink-Rate von 256 kb/s ausgegangen und die provider-eigene Frist der Bridge addiert, sodass für das Maximum von 8 MiB knapp sechs Minuten eingeräumt werden. Einen Clip, den Collie aufzeichnet, wartet es auch ab. Während des Uploads stoppt Collie das Polling und unterdrückt Verbindungswarnungen: Wenn Ihr Audio den Uplink eines Telefons auslastet, ist das kein Ausfall und darf nicht als solcher gemeldet werden.
Hat es funktioniert? stt test sendet eine Fünftelsekunde generierter Stille durch den echten Anbieter, einmal pro Container, den ein Smartphone aufzeichnen kann:
$ bin/collie stt test
provider: openai-compatible (http://127.0.0.1:8080/v1, model whisper-1, language en)
sending: 0.2 s of generated silence as audio/wav (the setup probe) … ✓ 214 ms
transcript: (empty) — expected from silence, and the empty answer still proves the pipeline.
sending: 0.2 s of generated silence as audio/webm;codecs=opus (Chrome, Android, Firefox) … ✓ 198 ms
sending: 0.2 s of generated silence as audio/mp4 (Safari, iOS) … ✓ 190 msEin leeres Transkript gilt als bestanden: Stille wird zu nichts transkribiert, und der vollständige Durchlauf war der eigentliche Test. Schlägt er fehl, benennt der Fehler die Ursache (Authentifizierung, Endpunkt, Antwortstruktur). Laden Sie Collie danach auf dem Telefon neu: Neben dem Nachrichtenfeld erscheint ein Mikrofon. collie stt status zeigt an, was konfiguriert ist und woher jede Einstellung stammt (die Datei oder eine Umgebungsvariable mit höherer Priorität); collie stt off entfernt stt.json und die Schaltfläche verschwindet wieder, in beiden Fällen ohne Neustart.
Container-Unterstützung ist anbieterspezifisch
Das Smartphone nimmt niemals WAV auf. Es zeichnet Opus in einem WebM-Container unter Chrome, Android und Firefox auf, oder AAC in einem MP4-Container unter Safari und iOS, und sendet diese Bytes unverändert. Ein Anbieter, der WAV transkribiert, kann bei beiden dennoch mit 400 antworten. Jedes Diktat schlägt dann mit „refused“ fehl, während stt test fehlerfrei aussieht. Aus diesem Grund sendet stt test alle drei Clips: Die Verweigerung wird bei der Einrichtung erkannt, nicht erst auf dem Smartphone.
Ein Fall, verifiziert am 01.09.2026 gegen OpenRouters POST /v1/audio/transcriptions:
| Format | mistralai/voxtral-small-24b-2507-stt | openai/whisper-large-v3-turbo |
|---|---|---|
| wav | ja | ja |
| ogg/opus | ja | ja |
| webm/opus | nein, 400 | ja |
| mp4/m4a AAC | nein, 400 | ja |
Die Umgehung liegt im Modell, nicht im Schlüssel: Richten Sie denselben OpenRouter-Schlüssel auf openai/whisper-large-v3-turbo aus, das alle vier akzeptiert.
bin/collie stt setup --provider openai-compatible \
--url https://openrouter.ai/api/v1 --model openai/whisper-large-v3-turbo --key <key>Eine verweigerte Transkription nennt nun den Upstream-Status und den Container, als der sie gesendet wurde. Der Fehler auf dem Smartphone gibt somit an, welches Format der Anbieter abgelehnt hat. (#148, danke @drewbitt)
Ohne Datenabfluss: auf die eigene Engine verweisen
Warum openai-compatible die bevorzugte Wahl ist: Geben Sie eine lokale Basis-URL an und kein Raumton verlässt jemals den Host. Zwei Engines stellen einen OpenAI-kompatiblen Transkriptionsendpunkt bereit: das in whisper.cpp enthaltene server sowie mudler/parakeet.cpp (MIT). Bauen oder installieren Sie eine der beiden nach deren Anleitung, führen Sie sie auf Loopback aus und verweisen Sie mit --url darauf:
bin/collie stt setup --provider openai-compatible --url http://127.0.0.1:8080/v1Das ist die gesamte Integration: Collie gibt nicht vor, welche Engine antwortet.
Mistrals Voxtral erfordert keine eigene Unterstützung, und das gilt auch für alles andere, was diesen Vertrag erfüllt; das ist der Sinn der Schnittstelle. vLLM stellt die Open-Weights-Voxtral-Modelle auf /v1/audio/transcriptions bereit, daher ist eine lokale Instanz dasselbe --url wie jede andere Engine. Die gehosteten Modelle verwenden dieselbe Anfrage an der Basisadresse von Mistral:
bin/collie stt setup --provider openai-compatible \
--url https://api.mistral.ai/v1 --model voxtral-mini-latest --key <key> --lang enVoxtral Mini Transcribe deckt 13 Sprachen ab und akzeptiert dasselbe ISO-639-1-language-Feld, das Collie bereits sendet. Überprüfen Sie es mit collie stt test, bevor Sie sich darauf verlassen: „OpenAI-kompatibel“ ist eine Behauptung, die jeder Endpunkt selbst aufstellt, und dieses Verb dient dazu, sie zu überprüfen.
Der Codex-Provider: Was Sie akzeptieren
collie stt setup --provider codex gibt einen Einwilligungstext aus und stoppt, bis Sie yes eingeben, denn die ehrliche Formulierung lautet: Aufnahmen werden an einen Undokumentierter, nicht unterstützter ChatGPT-Endpunkt gesendet, der durch die Anmeldung via Ihren autorisiert ist. Ihr ChatGPT-Konto trägt also das Risiko von Ratenbegrenzungen und Sperren, und der Dienst kann ohne Vorankündigung ausfallen.
Collie fragt diesen Endpunkt zuerst unter eigenem Namen an. Nur wenn die eigene Identität abgelehnt wird, greift es auf die Header der Codex-CLI zurück; dieses Fallback wird in die Konfiguration geschrieben, in einem Begriff, den collie stt status Ihnen zurückmeldet. Collie liest oder speichert ~/.codex/auth.json zu keinem Zeitpunkt; die Binärdatei, der Sie bereits vertrauen, bleibt die einzige Komponente, die darauf zugreift.
Die Begründung für all das oben Genannte – warum dies zweimal abgelehnt wurde, was sich geändert hat und warum die Schnittstelle so aufgebaut ist – finden Sie in ADR 0029.
Web-Push (optional)
Standardmäßig deaktiviert. Die Einrichtung erfordert drei Schritte. Die Sender-Bibliothek (web-push) ist während des Builds als optionale Abhängigkeit enthalten:
collie push-keys # 1. generate + write the VAPID keys
collie restart # 2. Collie reads them at start
# 3. on your phone: Settings → notificationsDer Befehl push-keys generiert das Schlüsselpaar und schreibt COLLIE_VAPID_PUBLIC sowie COLLIE_VAPID_PRIVATE mit Dateimodus 600 in das aktive .env, welches bei einer Binärinstallation ~/.config/collie/.env ist oder das Plugin-Konfigurationsverzeichnis von Herdr bei einer Herdr-Installation.
Übergeben Sie eine Kontakt-URI als Argument, um den Subject-Claim nach RFC 8292 zu setzen:
collie push-keys mailto:you@example.comBei von Herdr verwalteten Installationen sind beide Schritte als Aktionen verfügbar (herdr plugin action invoke push-keys --plugin herdr.collie und restart). Herdr-Aktionen akzeptieren keine Positionsargumente, daher erfordert das Setzen eines Subjects die direkte Ausführung des Befehls in der Shell.
Details zur Schlüsselverwaltung:
Der Befehl verweigert das Überschreiben vorhandener Schlüssel, es sei denn, Sie übergeben --force. Das Ersetzen von Schlüsseln macht alle aktuellen Abonnements ungültig, sodass sich jedes Gerät erneut anmelden muss, bevor es wieder Benachrichtigungen empfangen kann. Wenn Sie bei einer bestehenden Konfiguration ein Subject-Argument angeben, wird nur die Kontaktadresse aktualisiert und die aktuellen Schlüssel bleiben erhalten.
Hinweis. Bei Herdr-Versionen vor 0.8.0 bleiben Aktionen auf den Satz festgelegt, der während der ersten Plugin-Installation zwischengespeichert wurde (ADR 0006). Die Aktionenpush-keysundpush-testwerden erst angezeigt, wenn Sieherdr plugin installausführen. Führen Sie stattdessen direktbash scripts/collie-ctl.sh push-keysaus. Das Wrapper-Skript übergibt den Befehl direkt an die Binärdatei.
Testen Sie den Zustellpfad über alle abonnierten Geräte hinweg:
collie push-test # or: push-test "Title" "Body"Die Zustellung dauert ein bis zwei Sekunden. Wenn der Befehl meldet, dass Push deaktiviert ist, starten Sie den Dienst neu, damit er die generierten Schlüssel lädt. Wenn er meldet, dass keine Geräte abonniert sind, schließen Sie Schritt 3 im Browser des Telefons ab.
Web-Push erfordert einen sicheren Kontext (HTTPS). Dieser wird durch tailscale serve (MagicDNS-Zertifikate) oder einen externen Reverse-Proxy bereitgestellt, der TLS terminiert (Variante C). Reine HTTP-Setups (COLLIE_SERVE_MODE=http) bieten keinen sicheren Kontext, und der Browser deaktiviert die Abonnement-Steuerelemente in den Einstellungen.
Collie sendet Benachrichtigungen, wenn ein Agent in den Zustand blockiert oder fertig wechselt, und fügt die Nachricht des Agenten in den Textkörper ein. Durch Auswählen der Benachrichtigung navigieren Sie in der Web-Oberfläche direkt zu diesem Agenten.
Veraltete Abonnements können sich mit der Zeit ansammeln, da Neuinstallationen auf dem Startbildschirm und Service-Worker-Resets neue Endpunkte erstellen, ohne immer ein HTTP 410 zurückzugeben. Collie aktualisiert den Datensatz, wenn sich ein Gerät erneut registriert. Sie können gespeicherte Endpunkte direkt anzeigen und löschen:
# one line per device: service, since, user agent, endpoint tail
bin/collie push list
bin/collie push forget <substring> # or: push forget --allDiese Seite auf GitHub bearbeiten