- новое поле [general].language (ru|en, дефолт en) — единый источник языка локализованного title детектора и локали запросов к метабазам; original_title всегда на языке оригинала - локаль TMDB (поиск + credits) выводится из него, [metadata.tmdb].language убран - промпт LLM явно задаёт язык title с fallback на оригинал
58 lines
2.6 KiB
Go
58 lines
2.6 KiB
Go
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)
|
|
}
|
|
}
|