{"record":{"id":"928b0e3b3635e96f","repo":"Tencent/WeKnora","slug":"web-search-provider-type-s-not-registered","errorCode":null,"errorMessage":"web search provider type %s not registered","messagePattern":"web search provider type (.+?) not registered","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/infrastructure/web_search/registry.go","lineNumber":42,"sourceCode":"\treturn &Registry{\n\t\tfactories: make(map[string]ProviderFactory),\n\t}\n}\n\n// Register registers a provider type factory by ID\nfunc (r *Registry) Register(id string, factory ProviderFactory) {\n\tr.mu.Lock()\n\tdefer r.mu.Unlock()\n\tr.factories[id] = factory\n}\n\n// CreateProvider creates a provider instance by type with the given parameters.\nfunc (r *Registry) CreateProvider(providerType string, params types.WebSearchProviderParameters) (interfaces.WebSearchProvider, error) {\n\tr.mu.RLock()\n\tfactory, ok := r.factories[providerType]\n\tr.mu.RUnlock()\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"web search provider type %s not registered\", providerType)\n\t}\n\treturn factory(params)\n}\n","sourceCodeStart":24,"sourceCodeEnd":46,"githubUrl":"https://github.com/Tencent/WeKnora/blob/988cbb03305e055d8ebb7d46d9ac6cc0803cd074/internal/infrastructure/web_search/registry.go#L24-L46","documentation":"The web-search Registry has no factory registered under the requested provider type string. CreateProvider looks up r.factories[providerType]; when absent it returns this error naming the unknown type.","triggerScenarios":"resolveProvider or doTestSearch invoked with a providerType that was never registered, e.g. \"searxng\" before RegisterSearxng runs, a renamed type string, or a typo like \"googlee\".","commonSituations":"Configuration saved with a provider type from a different/older version, missing init() registration in a new binary, user-edited config with a typo, plugin not loaded.","solutions":["Check the exact providerType string in config against registered types","Ensure the provider's Register/Init function runs at startup before CreateProvider","List registered factories (or log them) to compare against the configured value","Fix typos and update configs after provider renames"],"exampleFix":"// before\nproviderType := \"searx\" // not registered\n// after\nproviderType := \"searxng\" // matches registered factory key","handlingStrategy":"validation","validationCode":"func knownProviderTypes() map[string]bool { return map[string]bool{\n    \"baidu\": true, \"bing\": true, \"duckduckgo\": true, \"exa\": true,\n    \"google\": true, \"keenable\": true, \"searxng\": true,\n} }\nif !knownProviderTypes()[cfg.Type] {\n    return fmt.Errorf(\"unknown provider type %q\", cfg.Type)\n}","typeGuard":null,"tryCatchPattern":"provider, err := registry.CreateProvider(providerType, params)\nif err != nil {\n    if strings.Contains(err.Error(), \"not registered\") {\n        log.Printf(\"provider type %q unavailable; falling back to default\", providerType)\n        return registry.CreateProvider(defaultType, params)\n    }\n    return err\n}","preventionTips":["Ensure all provider Register calls run in init() before use","Validate provider type strings against an enum/whitelist at config load","Log registered factory keys when lookup fails","Migrate old type names in config on upgrades"],"tags":["registry","configuration","provider","lookup-failed"],"backgroundTag":"provider-not-registered","analyzedSha":"988cbb03305e055d8ebb7d46d9ac6cc0803cd074","analyzedAt":"2026-09-02T14:41:08.344Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}