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
@@ -41,6 +41,10 @@ type SpeakResponse struct {
|
||||
|
||||
// Toast meldet die Ersetzung durch eine Benachrichtigung.
|
||||
Toast bool `json:"toast,omitempty"`
|
||||
|
||||
// Truncated meldet, dass der Text auf queue.max_text gekürzt und so
|
||||
// aufgenommen wurde (Gesetz gegen vorgelesene Langantworten).
|
||||
Truncated bool `json:"truncated,omitempty"`
|
||||
}
|
||||
|
||||
// CurrentItem beschreibt das laufende Item in GET /status.
|
||||
@@ -66,6 +70,7 @@ type StatusResponse struct {
|
||||
Provider string `json:"provider"`
|
||||
RateLimit *RateLimitState `json:"rate_limit,omitempty"`
|
||||
QuietHours *QuietHoursState `json:"quiet_hours,omitempty"`
|
||||
Limits *LimitsState `json:"limits,omitempty"`
|
||||
|
||||
// MCP meldet, dass der Daemon den MCP-Endpoint anbietet (immer true;
|
||||
// Feld existiert für additive Compat-Sicht von Clients/Browsern).
|
||||
@@ -90,6 +95,16 @@ type RateLimitState struct {
|
||||
NextSlot *string `json:"next_slot"`
|
||||
}
|
||||
|
||||
// LimitsState sind die Längen- und Alters-Gesetze in GET /status.
|
||||
type LimitsState struct {
|
||||
// MaxText ist die Obergrenze der Ansage-Länge in Zeichen (0 = unbegrenzt).
|
||||
MaxText int `json:"max_text"`
|
||||
|
||||
// MaxAge ist die längste Wartezeit in der Queue als Dauer-String
|
||||
// ("2m0s"; "0s" = unbegrenzt).
|
||||
MaxAge string `json:"max_age"`
|
||||
}
|
||||
|
||||
// QuietHoursState ist der Ruhezeit-State in GET /status (Task 05).
|
||||
type QuietHoursState struct {
|
||||
// Window ist das konfigurierte Fenster ("18:00-08:00"; "" = deaktiviert).
|
||||
|
||||
Reference in new issue
Block a user