feat: sync message translation support
This commit is contained in:
parent
cbccd6a8d9
commit
ea6cc72886
26 changed files with 1189 additions and 0 deletions
|
|
@ -169,6 +169,14 @@ type Config struct {
|
|||
AIRateWindow time.Duration
|
||||
// AIPrivacyLogContent 为 false 时日志只写长度/provider/状态,不写用户输入和生成文本。
|
||||
AIPrivacyLogContent bool
|
||||
// Translation* controls messages.translateText. Remote provider credentials
|
||||
// are reused from AIProviders; TranslationProviders optionally selects names
|
||||
// from that list. The deterministic local provider is never used.
|
||||
TranslationEnabled bool
|
||||
TranslationProviders []string
|
||||
TranslationTimeout time.Duration
|
||||
TranslationRateLimit int
|
||||
TranslationRateWindow time.Duration
|
||||
// TempKeyResolveCacheMaxEntries 是 Router temp→perm 解析缓存容量。
|
||||
TempKeyResolveCacheMaxEntries int
|
||||
// TempKeyResolveCacheTTL 是 temp→perm 绑定的进程内复核周期。绑定/revoke 有精确
|
||||
|
|
@ -461,6 +469,11 @@ func Load() (Config, error) {
|
|||
AIRateLimit: envIntOr("TELESRV_AI_RATE_LIMIT", 20),
|
||||
AIRateWindow: envDurationOr("TELESRV_AI_RATE_WINDOW", time.Minute),
|
||||
AIPrivacyLogContent: envBoolOr("TELESRV_AI_LOG_CONTENT", false),
|
||||
TranslationEnabled: envBoolOr("TELESRV_TRANSLATION_ENABLED", true),
|
||||
TranslationProviders: envListOr("TELESRV_TRANSLATION_PROVIDERS", []string{}),
|
||||
TranslationTimeout: envDurationOr("TELESRV_TRANSLATION_TIMEOUT", 15*time.Second),
|
||||
TranslationRateLimit: envIntOr("TELESRV_TRANSLATION_RATE_LIMIT", 60),
|
||||
TranslationRateWindow: envDurationOr("TELESRV_TRANSLATION_RATE_WINDOW", time.Minute),
|
||||
TempKeyResolveCacheMaxEntries: envIntOr("TELESRV_TEMP_KEY_CACHE_MAX_ENTRIES", 262144),
|
||||
TempKeyResolveCacheTTL: envDurationOr("TELESRV_TEMP_KEY_CACHE_TTL", 30*time.Minute),
|
||||
ChannelRowCacheMaxEntries: envIntOr("TELESRV_CHANNEL_ROW_CACHE_MAX", 50000),
|
||||
|
|
|
|||
|
|
@ -249,6 +249,25 @@ func TestLoadAIProviders(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestLoadTranslationConfig(t *testing.T) {
|
||||
t.Setenv("TELESRV_CONFIG", "")
|
||||
t.Setenv("TELESRV_TRANSLATION_ENABLED", "true")
|
||||
t.Setenv("TELESRV_TRANSLATION_PROVIDERS", "openai,gemini")
|
||||
t.Setenv("TELESRV_TRANSLATION_TIMEOUT", "9s")
|
||||
t.Setenv("TELESRV_TRANSLATION_RATE_LIMIT", "17")
|
||||
t.Setenv("TELESRV_TRANSLATION_RATE_WINDOW", "2m")
|
||||
cfg, err := Load()
|
||||
if err != nil {
|
||||
t.Fatalf("Load: %v", err)
|
||||
}
|
||||
if !cfg.TranslationEnabled || len(cfg.TranslationProviders) != 2 || cfg.TranslationProviders[0] != "openai" || cfg.TranslationProviders[1] != "gemini" {
|
||||
t.Fatalf("translation providers = %#v", cfg.TranslationProviders)
|
||||
}
|
||||
if cfg.TranslationTimeout != 9*time.Second || cfg.TranslationRateLimit != 17 || cfg.TranslationRateWindow != 2*time.Minute {
|
||||
t.Fatalf("translation limits = %v/%d/%v", cfg.TranslationTimeout, cfg.TranslationRateLimit, cfg.TranslationRateWindow)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadReadsEnvStyleConfigFile(t *testing.T) {
|
||||
path := filepath.Join(t.TempDir(), "telesrv.env")
|
||||
writeConfigFile(t, path, `
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue