feat(config): Provider-Pin, Provider-Endpunkte und Voice-Mapping

config.toml bekommt provider = "…" (Pin, Env-Override TALK_PROVIDER),
[providers.<name>] endpoint/model (Endpoints fake-bar für Tests; Keys
bleiben ausschließlich Env) und voice.<provider>.<lang> = id. TOML-Key ist
bewusst providers (Mehrzahl), damit Pin ( Singular) und Einstellungs-
Tabelle koexistieren können. Env-Overrides der Endpunkte liest die
Provider-Schicht (TALK_ELEVENLABS_ENDPOINT etc.) — das config-Paket
bleibt frei von Provider-Namen.
This commit is contained in:
m3ta-chiron committed 2026-10-18 16:34:24 +02:00
1 parent 7a843ae441
commit 88eddc63d2
2 files changed
+118 -2

No files matched your search

+34 -2
View File
@@ -17,10 +17,28 @@ const (
)
// Config ist der effektiv geladene Konfigurations-Stand von talk. Task 02
// führt nur audio.sink; spätere Tasks ergänzen Felder (Provider-Endpunkte,
// Voice-Mapping, server, queue …), ohne die Auflösungsreihenfolge zu ändern.
// führt audio.sink; Task 03 ergänzt den Provider-Pin, Provider-Endpunkte
// und das Voice-Mapping; spätere Tasks ergänzen weitere Felder (server,
// queue …), ohne die Auflösungsreihenfolge zu ändern.
type Config struct {
Audio Audio `toml:"audio"`
// Provider pinnt die Kette auf genau einen Provider (z. B.
// `provider = "elevenlabs"`); leer = komplette Default-Kette
// (elevenlabs → openai → edge → osbuiltin). Das CLI-Flag --provider
// schlägt diesen Wert. Gültige Namen prüft die Provider-Schicht.
Provider string `toml:"provider"`
// Providers enthält per Provider-Einstellungen (Endpunkt, Modell) —
// TOML `[providers.elevenlabs] endpoint = "…"`. Key `providers`
// (Mehrzahl), damit der Pin ( singular `provider`) und die
// Einstellungs-Tabelle in TOML nebeneinander existieren können.
Providers map[string]ProviderSettings `toml:"providers"`
// Voice ist das Voice-Mapping `voice.<provider>.<lang> = id` — z. B.
// `[voice.elevenlabs] de = "21m00Tcm4TlvDq8ikWAM"`. Schlägt die
// eingebauten neutralen Defaults; das CLI-Flag --voice schlägt alles.
Voice map[string]map[string]string `toml:"voice"`
}
// Audio steuert die Audio-Ausgabe.
@@ -30,6 +48,17 @@ type Audio struct {
Sink string `toml:"sink"`
}
// ProviderSettings sind die per Provider konfigurierbaren Endpunkte und
// Modelle (TOML `[providers.<name>]`). Leer = eingebaute Defaults; die
// Env-Overrides TALK_ELEVENLABS_ENDPOINT / TALK_OPENAI_ENDPOINT /
// TALK_EDGE_ENDPOINT (ausgewertet in der Provider-Schicht) schlagen die
// Datei — Keys laufen ausschließlich über TALK_ELEVENLABS_KEY bzw.
// TALK_OPENAI_KEY und werden nie in die Datei geschrieben.
type ProviderSettings struct {
Endpoint string `toml:"endpoint"`
Model string `toml:"model"` // nur openai (Default "tts-1")
}
// Defaults liefert die eingebaute Default-Konfiguration (unterste Schicht
// der Auflösung).
func Defaults() Config {
@@ -84,6 +113,9 @@ func applyEnv(cfg Config, getenv func(string) string) (Config, error) {
if v := getenv("TALK_AUDIO_SINK"); v != "" {
cfg.Audio.Sink = v
}
if v := getenv("TALK_PROVIDER"); v != "" {
cfg.Provider = v
}
switch cfg.Audio.Sink {
case SinkOto, SinkNull:
return cfg, nil