docs(readme): Daemon talkd, HTTP-Endpunkte, Mute-Persistenz und Degraded Mode dokumentieren
This commit is contained in:
1 parent
1ae1f1262c
commit
dc94f45d11
2 files changed
+40
-6
No files matched your search
@@ -28,11 +28,42 @@ keine Runtime-Abhängigkeiten.
|
|||||||
Say-Flags (gelten auch für `talk "Text"`): `--wait`, `--now`, `--priority`,
|
Say-Flags (gelten auch für `talk "Text"`): `--wait`, `--now`, `--priority`,
|
||||||
`--voice`, `--lang`, `--provider`.
|
`--voice`, `--lang`, `--provider`.
|
||||||
|
|
||||||
**Hinweis:** In diesem Stand ist `say` (und der Default-Aufruf
|
**Hinweis:** In diesem Stand sind implementiert: `say` (und `talk "Text"`)
|
||||||
`talk "Text"`) implementiert — inklusive der kompletten Provider-Kette
|
mit der kompletten Provider-Kette und Daemon-Anbindung (non-blocking über
|
||||||
(ElevenLabs → OpenAI → Edge-TTS → OS-Stimme, blockierend;
|
`talkd`, siehe unten), `mute`, `unmute`, `status`, `cancel`. Die übrigen
|
||||||
Daemon-Anbindung folgt). Alle anderen Befehle sind Stubs und melden
|
Befehle sind Stubs und melden `not implemented yet` (Exit-Code ≠ 0).
|
||||||
`not implemented yet` (Exit-Code ≠ 0).
|
|
||||||
|
## Daemon talkd (Task 04)
|
||||||
|
|
||||||
|
`talkd` besitzt die Ansage-Queue und spricht seriell ab — genau eine Ansage
|
||||||
|
gleichzeitig, Reihenfolge `now` > `high` > `normal` > `low` (FIFO je
|
||||||
|
Level). Der HTTP-Server lauscht nur auf `127.0.0.1`; Port: Default `7800`,
|
||||||
|
config `[server] port`, Env `TALK_PORT` (schlagen den Default).
|
||||||
|
|
||||||
|
| Endpunkt | Wirkung |
|
||||||
|
| --- | --- |
|
||||||
|
| `POST /speak` | `{text, priority?, provider?, voice?, lang?, now?}` → `202 {"id":"…"}`; bei Mute: `202 {"id":"","muted":true}` (Ansage verworfen — dokumentiertes Verhalten) |
|
||||||
|
| `GET /status` | `{"version", "queue", "queue_ids", "current", "muted", "provider"}` |
|
||||||
|
| `POST /cancel` | bricht die laufende Ansage ab + leert die Queue → `200 {"cancelled":n}` |
|
||||||
|
| `POST /mute` / `POST /unmute` | persistenter Mute-State → `200 {"muted":bool}` |
|
||||||
|
|
||||||
|
- **CLI-Verhalten:** `talk say` (und `talk "Text"`) erkennt den Daemon via
|
||||||
|
`GET /status`. Läuft er: enqueue + sofortige Rückkehr (non-blocking,
|
||||||
|
stdout erhält die Item-ID); `--wait` pollt bis zur Fertigstellung;
|
||||||
|
`--now` springt vor die Warteschlange; bei Mute sagt die CLI `muted`.
|
||||||
|
`talk mute`/`unmute`/`status`/`cancel` sind Daemon-Aufrufe mit plain
|
||||||
|
Output.
|
||||||
|
- **Mute ist persistent** (Datei `mute` im Config-Dir, Inhalt `true`/
|
||||||
|
`false`) und überlebt Daemon-Restarts. `talk mute` ohne laufenden Daemon
|
||||||
|
schreibt die Datei direkt — der Daemon liest sie bei jeder Ansage neu,
|
||||||
|
der Zustand greift also auch offline.
|
||||||
|
- **Degraded Mode:** Antwortet kein Daemon, spielt `talk` lokal und
|
||||||
|
sequenziell weiter — serialisiert über die Lock-Datei `talk.lock` im
|
||||||
|
Config-Dir (Kollision = warten; verwaisste Locks gelten nach 60 s als
|
||||||
|
verfallen). Mute wird auch hier respektiert. Nichts bricht still.
|
||||||
|
- Rate-Limit und Ruhezeiten folgen in Task 05; die Rate-Limit-Struktur
|
||||||
|
existiert bereits (`internal/queue`), ist in diesem Stand aber bewusst
|
||||||
|
noch nicht angebunden (Default: unbegrenzt).
|
||||||
|
|
||||||
### Provider-Kette (Task 03)
|
### Provider-Kette (Task 03)
|
||||||
|
|
||||||
|
|||||||
+4
-1
@@ -43,7 +43,10 @@ func setMute(muted bool, stdout, stderr io.Writer) int {
|
|||||||
return exitOK
|
return exitOK
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Fprintf(stderr, "talk: Daemon nicht erreichbar (%v) — Mute-Datei wird direkt geschrieben\n", err)
|
// Daemon-Aufruf fehlgeschlagen (meist: nicht erreichbar): Datei direkt
|
||||||
|
// schreiben — der Daemon (und der Degraded Mode) liest sie bei jeder
|
||||||
|
// Ansage neu.
|
||||||
|
fmt.Fprintf(stderr, "talk: Daemon-Aufruf fehlgeschlagen (%v) — Mute-Datei wird direkt geschrieben\n", err)
|
||||||
dir, err := config.Dir(getenv)
|
dir, err := config.Dir(getenv)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(stderr, "talk: %v\n", err)
|
fmt.Fprintf(stderr, "talk: %v\n", err)
|
||||||
|
|||||||
Reference in new issue
Block a user