feat(queue): Gesetze max_text und max_age — gekürzte Langtexte, verfallene Stau-Ansagen
Zwei Löcher im Anti-Spam-Gesetz, die ein Prompt trivial nutzt: Ein Agent
kann 64 KB Text einreichen (ElevenLabs stellt die Rechnung, die Ansage
dauert Minuten), und geparkte normal-Ansagen spielen unbegrenzt spät —
„Build fertig" zweieinhalb Minuten nach dem Build ist keine Nachricht.
- queue.max_text (Default 400 Zeichen, Env TALK_MAX_TEXT): längere Texte
werden beim Eintritt an einer Wortgrenze gekürzt und so gesprochen; die
/speak-Antwort meldet truncated, die CLI warnt auf stderr, das MCP-
Ergebnis sagt es im Text. Runen, nicht Bytes.
- queue.max_age (Default 2m, Env TALK_MAX_AGE): Items, die beim
Fälligwerden länger gewartet haben, werden verworfen (discarded
"expired", Protokoll nennt Wartezeit und Grenze). now:true ist
ausgenommen. Rang: now > veraltet > Ruhezeit > Rate-Limit.
- /status trägt "limits": {max_text, max_age}; `talk status` zeigt sie.
- Negative Werte sind Config-Fehler; 0 = unbegrenzt.
Tests: truncateText-Tabelle (Wortgrenze, Satzzeichen, Runen), Enqueue-
Kürzung, decide-Vorrang inkl. now-Ausnahme, geparktes Item verfällt;
Config-Schichten; Prozessgrenze: Provider bekommt die gekürzte Fassung,
dritte von drei Stau-Ansagen wird nie gesprochen.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
1 parent
79314dfb0f
commit
97650ad0ec
13 files changed
+430
-26
No files matched your search
@@ -146,6 +146,17 @@ func printLawState(stdout io.Writer, st *api.StatusResponse) {
|
||||
}
|
||||
fmt.Fprintf(stdout, "ruhezeit: %s (modus %s, %s)\n", window, st.QuietHours.Mode, state)
|
||||
}
|
||||
if st.Limits != nil {
|
||||
text := fmt.Sprintf("max. %d Zeichen", st.Limits.MaxText)
|
||||
if st.Limits.MaxText == 0 {
|
||||
text = "Länge unbegrenzt"
|
||||
}
|
||||
age := "max. Wartezeit " + st.Limits.MaxAge
|
||||
if st.Limits.MaxAge == "0s" {
|
||||
age = "Wartezeit unbegrenzt"
|
||||
}
|
||||
fmt.Fprintf(stdout, "limits: %s, %s\n", text, age)
|
||||
}
|
||||
}
|
||||
|
||||
// runCancel implementiert `talk cancel`: POST /cancel — bricht die laufende
|
||||
|
||||
@@ -158,6 +158,9 @@ func sayViaDaemon(client *api.Client, text string, opts *sayOptions, info, stder
|
||||
return exitOK, true
|
||||
}
|
||||
fmt.Fprintln(info, resp.ID)
|
||||
if resp.Truncated {
|
||||
fmt.Fprintln(stderr, "talk: Text war zu lang und wurde gekürzt (queue.max_text) — Ansagen sind 1–2 Sätze")
|
||||
}
|
||||
if !opts.wait {
|
||||
return exitOK, true
|
||||
}
|
||||
@@ -175,6 +178,8 @@ func discardHint(reason string, toast bool) string {
|
||||
return "Ruhezeit aktiv — Ansage verworfen (quiet_mode = discard; now bricht bewusst aus)"
|
||||
case queue.DiscardRateLimit:
|
||||
return "Rate-Limit — Ansage verworfen (Priorität low über dem Fenster-Budget)"
|
||||
case queue.DiscardExpired:
|
||||
return "Ansage verworfen — sie hat länger gewartet als queue.max_age erlaubt (veraltet)"
|
||||
default:
|
||||
return "Ansage verworfen (" + reason + ")"
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user