mirror of
https://github.com/sipeed/picoclaw.git
synced 2026-06-12 18:08:54 +00:00
Keep launcher locale changes from mutating shared web-search routing (#2573)
The launcher wired UI language changes into a process-global backend switch that changed auto web-search provider selection and the reported current service for every handler in the same process. This narrows the fix to the validated leak: remove backend sync from frontend locale changes, drop the now-unused UI endpoint, and make auto selection fall back to a stable default when the query itself does not contain a script hint. Constraint: Keep the patch small and mergeable without redesigning per-user preference storage Rejected: Add per-user backend language state | larger scope than the validated bug and unclear maintainer preference Rejected: Persist preferred language in config | still shares mutable state across clients of the same instance Confidence: high Scope-risk: narrow Reversibility: clean Directive: If locale-aware provider routing is reintroduced later, scope it to explicit config or request context instead of package-global state Tested: go test ./web/backend/api ./pkg/tools -count=1; pnpm lint; pnpm build Not-tested: Full make check; live multi-browser manual launcher run after the backend endpoint removal
This commit is contained in:
@@ -58,8 +58,6 @@ var (
|
||||
reSogouRealURL = regexp.MustCompile(`url=([^&]+)`)
|
||||
)
|
||||
|
||||
var preferredWebSearchLanguage atomic.Value
|
||||
|
||||
type APIKeyPool struct {
|
||||
keys []string
|
||||
current uint32
|
||||
@@ -250,27 +248,6 @@ func mapBaiduRecencyFilter(rangeCode string) string {
|
||||
}
|
||||
}
|
||||
|
||||
func normalizePreferredWebSearchLanguage(lang string) string {
|
||||
lang = strings.ToLower(strings.TrimSpace(lang))
|
||||
switch {
|
||||
case strings.HasPrefix(lang, "zh"), lang == "chinese":
|
||||
return "zh"
|
||||
case strings.HasPrefix(lang, "en"), lang == "english":
|
||||
return "en"
|
||||
default:
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
func SetPreferredWebSearchLanguage(lang string) {
|
||||
preferredWebSearchLanguage.Store(normalizePreferredWebSearchLanguage(lang))
|
||||
}
|
||||
|
||||
func GetPreferredWebSearchLanguage() string {
|
||||
lang, _ := preferredWebSearchLanguage.Load().(string)
|
||||
return lang
|
||||
}
|
||||
|
||||
type BraveSearchProvider struct {
|
||||
keyPool *APIKeyPool
|
||||
proxy string
|
||||
@@ -1420,7 +1397,7 @@ func containsLatinLetter(text string) bool {
|
||||
func prefersDuckDuckGoQuery(text string) bool {
|
||||
trimmed := strings.TrimSpace(text)
|
||||
if trimmed == "" {
|
||||
return GetPreferredWebSearchLanguage() == "en"
|
||||
return false
|
||||
}
|
||||
if containsHan(trimmed) {
|
||||
return false
|
||||
@@ -1428,7 +1405,7 @@ func prefersDuckDuckGoQuery(text string) bool {
|
||||
if containsLatinLetter(trimmed) {
|
||||
return true
|
||||
}
|
||||
return GetPreferredWebSearchLanguage() == "en"
|
||||
return false
|
||||
}
|
||||
|
||||
func (opts WebSearchToolOptions) buildProviderResolver() (func(query string) (SearchProvider, int), error) {
|
||||
|
||||
@@ -1778,11 +1778,6 @@ func TestApplySogouRangeHint(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestPrefersDuckDuckGoQuery(t *testing.T) {
|
||||
SetPreferredWebSearchLanguage("")
|
||||
t.Cleanup(func() {
|
||||
SetPreferredWebSearchLanguage("")
|
||||
})
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
query string
|
||||
@@ -1805,19 +1800,9 @@ func TestPrefersDuckDuckGoQuery(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestPrefersDuckDuckGoQuery_FallsBackToPreferredLanguage(t *testing.T) {
|
||||
SetPreferredWebSearchLanguage("en")
|
||||
t.Cleanup(func() {
|
||||
SetPreferredWebSearchLanguage("")
|
||||
})
|
||||
|
||||
if !prefersDuckDuckGoQuery("2026 04 15") {
|
||||
t.Fatal("numeric query should prefer DuckDuckGo when preferred language is English")
|
||||
}
|
||||
|
||||
SetPreferredWebSearchLanguage("zh")
|
||||
func TestPrefersDuckDuckGoQuery_DoesNotUseGlobalLanguageFallback(t *testing.T) {
|
||||
if prefersDuckDuckGoQuery("2026 04 15") {
|
||||
t.Fatal("numeric query should prefer Sogou when preferred language is Chinese")
|
||||
t.Fatal("numeric query should default to Sogou when no script-specific hint is present")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -65,14 +65,6 @@ func NewAPIKeyPool(keys []string) *APIKeyPool {
|
||||
return integrationtools.NewAPIKeyPool(keys)
|
||||
}
|
||||
|
||||
func SetPreferredWebSearchLanguage(lang string) {
|
||||
integrationtools.SetPreferredWebSearchLanguage(lang)
|
||||
}
|
||||
|
||||
func GetPreferredWebSearchLanguage() string {
|
||||
return integrationtools.GetPreferredWebSearchLanguage()
|
||||
}
|
||||
|
||||
func WebSearchToolOptionsFromConfig(cfg *config.Config) WebSearchToolOptions {
|
||||
return integrationtools.WebSearchToolOptionsFromConfig(cfg)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user