feat(config): Daemon-Port server.port mit Env-Override TALK_PORT (Default 7800)

This commit is contained in:
m3ta-chiron committed 2026-10-18 17:10:26 +02:00
1 parent 3b44605234
commit 716f6b2fc9
2 files changed
+94 -3

No files matched your search

+30 -3
View File
@@ -5,6 +5,7 @@ import (
"fmt"
"os"
"path/filepath"
"strconv"
"github.com/BurntSushi/toml"
)
@@ -16,13 +17,21 @@ const (
SinkNull = "null"
)
// DefaultServerPort ist der Default-Port des Daemon-HTTP-Servers auf
// 127.0.0.1 (Task-04-Brief: „Port Default 7800").
const DefaultServerPort = 7800
// Config ist der effektiv geladene Konfigurations-Stand von talk. Task 02
// 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.
// und das Voice-Mapping; Task 04 den Daemon-Port (server.port, TALK_PORT);
// spätere Tasks ergänzen weitere Felder (queue …), ohne die Auflösungs-
// reihenfolge zu ändern.
type Config struct {
Audio Audio `toml:"audio"`
// Server steuert den Daemon-HTTP-Server (talkd) auf 127.0.0.1.
Server Server `toml:"server"`
// Provider pinnt die Kette auf genau einen Provider (z. B.
// `provider = "elevenlabs"`); leer = komplette Default-Kette
// (elevenlabs → openai → edge → osbuiltin). Das CLI-Flag --provider
@@ -48,6 +57,14 @@ type Audio struct {
Sink string `toml:"sink"`
}
// Server sind die Netz-Einstellungen des Daemons (nur Loopback; Binding
// auf 127.0.0.1 macht cmd/talkd, die Config liefert nur den Port).
type Server struct {
// Port des Daemon-HTTP-Servers auf 127.0.0.1 — config
// `[server] port = 7800`, Env-Override TALK_PORT, Default 7800.
Port int `toml:"port"`
}
// ProviderSettings sind die per Provider konfigurierbaren Endpunkte und
// Modelle (TOML `[providers.<name>]`). Leer = eingebaute Defaults; die
// Env-Overrides TALK_ELEVENLABS_ENDPOINT / TALK_OPENAI_ENDPOINT /
@@ -62,7 +79,10 @@ type ProviderSettings struct {
// Defaults liefert die eingebaute Default-Konfiguration (unterste Schicht
// der Auflösung).
func Defaults() Config {
return Config{Audio: Audio{Sink: SinkOto}}
return Config{
Audio: Audio{Sink: SinkOto},
Server: Server{Port: DefaultServerPort},
}
}
// Options steuert Load. Alle Felder sind injizierbar, damit die Unit-Tests
@@ -116,6 +136,13 @@ func applyEnv(cfg Config, getenv func(string) string) (Config, error) {
if v := getenv("TALK_PROVIDER"); v != "" {
cfg.Provider = v
}
if v := getenv("TALK_PORT"); v != "" {
port, err := strconv.Atoi(v)
if err != nil || port < 1 || port > 65535 {
return cfg, fmt.Errorf("TALK_PORT: ungültiger Wert %q (1–65535)", v)
}
cfg.Server.Port = port
}
switch cfg.Audio.Sink {
case SinkOto, SinkNull:
return cfg, nil