recognition: глобальный переключатель языка вывода [general].language
- новое поле [general].language (ru|en, дефолт en) — единый источник языка локализованного title детектора и локали запросов к метабазам; original_title всегда на языке оригинала - локаль TMDB (поиск + credits) выводится из него, [metadata.tmdb].language убран - промпт LLM явно задаёт язык title с fallback на оригинал
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
package recognize
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// Промпт задаёт язык локализованного title и не трогает original_title.
|
||||
func TestSystemPrompt_LanguageDirective(t *testing.T) {
|
||||
en := systemPrompt("en")
|
||||
if !strings.Contains(en, "английском") {
|
||||
t.Errorf("en-промпт без директивы «английском»:\n%s", en)
|
||||
}
|
||||
ru := systemPrompt("ru")
|
||||
if !strings.Contains(ru, "русском") {
|
||||
t.Errorf("ru-промпт без директивы «русском»:\n%s", ru)
|
||||
}
|
||||
for _, p := range []string{en, ru} {
|
||||
// Директива касается только title; original_title остаётся на оригинале.
|
||||
if !strings.Contains(p, "\"original_title\" всегда на языке оригинала") {
|
||||
t.Errorf("промпт не оговаривает original_title:\n%s", p)
|
||||
}
|
||||
// Fallback на оригинал при отсутствии перевода (защита от ложного авто-матча).
|
||||
if !strings.Contains(p, "оригинальное название, не выдумывай") {
|
||||
t.Errorf("промпт не задаёт fallback на оригинал:\n%s", p)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Сквозной путь: язык из Config доезжает через New до системного сообщения LLM.
|
||||
// Ловит регресс проводки, который иначе тих (пустой язык → английский = дефолт).
|
||||
func TestRecognize_LanguageReachesSystemPrompt(t *testing.T) {
|
||||
const resp = `{"type":"movie","title":"X","files":[{"src":"a.mkv","role":"main"}]}`
|
||||
in := Input{Name: "X", Files: []File{{Path: "a.mkv", Size: 1 << 30}}}
|
||||
|
||||
cases := map[string]string{"ru": "русском", "en": "английском", "": "английском"}
|
||||
for lang, want := range cases {
|
||||
f := &fakeLLM{responses: []string{resp}}
|
||||
r := New(f, nil, Config{Language: lang}, testLogger())
|
||||
if _, err := r.Recognize(context.Background(), in); err != nil {
|
||||
t.Fatalf("Recognize(lang=%q): %v", lang, err)
|
||||
}
|
||||
sys := f.lastReq.Messages[0].Content
|
||||
if !strings.Contains(sys, want) {
|
||||
t.Errorf("lang=%q: системное сообщение без %q:\n%s", lang, want, sys)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Незаданный язык в сборке промпта → английская директива (дефолт en).
|
||||
func TestSystemPrompt_DefaultsToEnglish(t *testing.T) {
|
||||
def := systemPrompt("")
|
||||
if !strings.Contains(def, "английском") {
|
||||
t.Errorf("дефолтный промпт не английский:\n%s", def)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user