fixes
This commit is contained in:
@@ -11,7 +11,12 @@ import (
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
)
|
||||
|
||||
// LangPromptAny is the wildcard key for a single shared prompt used for every
|
||||
// content language (avoid duplicating the same text per lang).
|
||||
const LangPromptAny = "*"
|
||||
|
||||
// LangPromptMap is language-code → prompt text for category / template overrides.
|
||||
// Optional key LangPromptAny ("*") is a shared overlay for all languages.
|
||||
type LangPromptMap map[string]string
|
||||
|
||||
// LocalizedFields holds AI/output fields for one content language.
|
||||
@@ -27,15 +32,16 @@ type LocalizedFields struct {
|
||||
type LocalizedContent map[string]LocalizedFields
|
||||
|
||||
// SanitizeLangPromptMap validates language codes, sanitizes prompts, and drops empties.
|
||||
// Accepts LangPromptAny ("*") as a shared any-language prompt key.
|
||||
func SanitizeLangPromptMap(in map[string]string, maxRunes int) (LangPromptMap, error) {
|
||||
out := make(LangPromptMap)
|
||||
if len(in) == 0 {
|
||||
return out, nil
|
||||
}
|
||||
for lang, prompt := range in {
|
||||
code, err := ParseLanguage(lang, false)
|
||||
code, err := parseLangPromptKey(lang)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unsupported language %q", lang)
|
||||
return nil, err
|
||||
}
|
||||
p := strings.TrimSpace(security.SanitizePrompt(prompt, maxRunes))
|
||||
if p == "" {
|
||||
@@ -46,16 +52,46 @@ func SanitizeLangPromptMap(in map[string]string, maxRunes int) (LangPromptMap, e
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// PromptForLanguage returns the prompt for lang, or empty if unset.
|
||||
func PromptForLanguage(m LangPromptMap, lang string) string {
|
||||
func parseLangPromptKey(raw string) (string, error) {
|
||||
key := strings.TrimSpace(raw)
|
||||
if key == LangPromptAny {
|
||||
return LangPromptAny, nil
|
||||
}
|
||||
code, err := ParseLanguage(key, false)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("unsupported language %q", raw)
|
||||
}
|
||||
return code, nil
|
||||
}
|
||||
|
||||
// PromptForLanguage resolves a prompt with fallback:
|
||||
// requested lang → LangPromptAny ("*") → primary → "" (caller may then use built-in).
|
||||
// Empty primary skips the primary step. Does not invent cross-lang text beyond this chain.
|
||||
func PromptForLanguage(m LangPromptMap, lang, primary string) string {
|
||||
if len(m) == 0 {
|
||||
return ""
|
||||
}
|
||||
code, err := ParseLanguage(lang, true)
|
||||
if err != nil {
|
||||
code = DefaultLanguage
|
||||
try := func(code string) string {
|
||||
code = strings.TrimSpace(code)
|
||||
if code == "" {
|
||||
return ""
|
||||
}
|
||||
return strings.TrimSpace(m[code])
|
||||
}
|
||||
return strings.TrimSpace(m[code])
|
||||
if code, err := ParseLanguage(lang, true); err == nil {
|
||||
if p := try(code); p != "" {
|
||||
return p
|
||||
}
|
||||
}
|
||||
if p := try(LangPromptAny); p != "" {
|
||||
return p
|
||||
}
|
||||
if prim, err := ParseLanguage(primary, false); err == nil {
|
||||
if p := try(prim); p != "" {
|
||||
return p
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// HasAnyPrompt reports whether any language has a non-empty prompt.
|
||||
|
||||
Reference in New Issue
Block a user