recognition: глобальный переключатель языка вывода [general].language

- новое поле [general].language (ru|en, дефолт en) — единый источник языка
  локализованного title детектора и локали запросов к метабазам; original_title
  всегда на языке оригинала
- локаль TMDB (поиск + credits) выводится из него, [metadata.tmdb].language убран
- промпт LLM явно задаёт язык title с fallback на оригинал
This commit is contained in:
av
2026-07-24 14:09:04 +03:00
parent 8309ce0664
commit a2d8140e22
18 changed files with 556 additions and 48 deletions
+14 -1
View File
@@ -142,12 +142,16 @@ type Config struct {
MaxTokens int // лимит ответа модели (0 — дефолт)
MaxFiles int // усечение списка файлов в промпте (0 — дефолт)
AutoThreshold float64 // порог уверенности для авто (0 — дефолт 0.85)
// Language — язык локализованного `title` в промпте ("ru" | "en"); пусто →
// "en". `original_title` от него не зависит (см. prompt.go).
Language string
}
const (
defaultMaxTokens = 4000
defaultMaxFiles = 100
defaultAutoThreshold = 0.85
defaultLanguage = "en"
)
// Recognizer — реализация распознавания.
@@ -158,6 +162,7 @@ type Recognizer struct {
maxTokens int
maxFiles int
threshold float64
language string
log *slog.Logger
}
@@ -180,6 +185,13 @@ func New(provider LLM, providers []metadata.Provider, cfg Config, log *slog.Logg
if threshold <= 0 {
threshold = defaultAutoThreshold
}
// Канонический дефолт языка — config.ContentLanguage() (единственный питатель
// на проде). Здесь defensive-нормализация для прямых вызовов конструктора
// (тесты); держать равным этому дефолту.
language := cfg.Language
if language == "" {
language = defaultLanguage
}
return &Recognizer{
llm: provider,
providers: providers,
@@ -187,6 +199,7 @@ func New(provider LLM, providers []metadata.Provider, cfg Config, log *slog.Logg
maxTokens: maxTokens,
maxFiles: maxFiles,
threshold: threshold,
language: language,
log: log,
}
}
@@ -197,7 +210,7 @@ func New(provider LLM, providers []metadata.Provider, cfg Config, log *slog.Logg
func (r *Recognizer) Recognize(ctx context.Context, in Input) (Result, error) {
log := logctx.FromOr(ctx, r.log)
pre := preParse(in.Name)
msgs := buildMessages(in, pre, r.maxFiles)
msgs := buildMessages(in, pre, r.maxFiles, r.language)
temp := 0.0
var raw string