{"record":{"id":"b425b05604f5b5a2","repo":"Tencent/WeKnora","slug":"api-key-is-required-for-zhipu-provider","errorCode":null,"errorMessage":"API key is required for Zhipu provider","messagePattern":"API key is required for Zhipu provider","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/infrastructure/web_search/zhipu.go","lineNumber":73,"sourceCode":"\t}\n\tclient, err := NewSearchHTTPClient(defaultZhipuTimeout, params.ProxyURL)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tsearchEngine, contentSize := zhipuOptions(params.ExtraConfig)\n\treturn &ZhipuProvider{\n\t\tclient:       client,\n\t\tbaseURL:      defaultZhipuSearchURL,\n\t\tapiKey:       strings.TrimSpace(params.APIKey),\n\t\tsearchEngine: searchEngine,\n\t\tcontentSize:  contentSize,\n\t}, nil\n}\n\n// ValidateZhipuParameters validates credentials and provider-specific options.\nfunc ValidateZhipuParameters(params types.WebSearchProviderParameters) error {\n\tif strings.TrimSpace(params.APIKey) == \"\" {\n\t\treturn fmt.Errorf(\"API key is required for Zhipu provider\")\n\t}\n\tsearchEngine, contentSize := zhipuOptions(params.ExtraConfig)\n\tif _, ok := validZhipuSearchEngines[searchEngine]; !ok {\n\t\treturn fmt.Errorf(\"invalid Zhipu search engine: %s\", searchEngine)\n\t}\n\tif _, ok := validZhipuContentSizes[contentSize]; !ok {\n\t\treturn fmt.Errorf(\"invalid Zhipu content size: %s\", contentSize)\n\t}\n\treturn nil\n}\n\nfunc zhipuOptions(extraConfig map[string]string) (searchEngine, contentSize string) {\n\tsearchEngine = defaultZhipuSearchEngine\n\tcontentSize = defaultZhipuContentSize\n\tif value := strings.TrimSpace(extraConfig[\"search_engine\"]); value != \"\" {\n\t\tsearchEngine = value\n\t}\n\tif value := strings.TrimSpace(extraConfig[\"content_size\"]); value != \"\" {","sourceCodeStart":55,"sourceCodeEnd":91,"githubUrl":"https://github.com/Tencent/WeKnora/blob/988cbb03305e055d8ebb7d46d9ac6cc0803cd074/internal/infrastructure/web_search/zhipu.go#L55-L91","documentation":"Configuration validation for the Zhipu web search provider fails when the APIKey parameter is empty or whitespace-only. ValidateZhipuParameters is called at provider construction (NewZhipuProvider), so this fails fast at startup rather than at search time.","triggerScenarios":"Constructing a Zhipu provider via NewZhipuProvider (or calling ValidateZhipuParameters directly) with types.WebSearchProviderParameters.APIKey unset, empty, or containing only whitespace.","commonSituations":"Missing ZHIPU_API_KEY env var, config file lacking the api-key field, environment variable not propagated into the container/deployment, or passing credentials under the wrong config key.","solutions":["Set the API key in the provider parameters before calling NewZhipuProvider.","Load the key from the correct env var or config path and confirm it is actually read (log length, not the value).","Trim whitespace and re-validate; strings.TrimSpace must yield a non-empty string.","Verify the deployment/CI environment injects the secret correctly."],"exampleFix":"// before\nprovider, err := NewZhipuProvider(types.WebSearchProviderParameters{ExtraConfig: cfg})\n// after\nprovider, err := NewZhipuProvider(types.WebSearchProviderParameters{\n    APIKey: os.Getenv(\"ZHIPU_API_KEY\"),\n    ExtraConfig: cfg,\n})","handlingStrategy":"validation","validationCode":"func validateZhipuConfig(p types.WebSearchProviderParameters) error {\n    if strings.TrimSpace(p.APIKey) == \"\" {\n        return errors.New(\"zhipu API key missing; set ZHIPU_API_KEY\")\n    }\n    return nil\n}\n// call before NewZhipuProvider","typeGuard":"func hasZhipuKey(p types.WebSearchProviderParameters) bool {\n    return strings.TrimSpace(p.APIKey) != \"\"\n}","tryCatchPattern":"provider, err := NewZhipuProvider(params)\nif err != nil {\n    if strings.Contains(err.Error(), \"API key is required\") {\n        return fmt.Errorf(\"startup failed: set ZHIPU_API_KEY env var (%w)\", err)\n    }\n    return err\n}","preventionTips":["Load the API key from a secret manager or env at startup","Fail fast with a clear message when the key is absent","Check that deployment/CI actually injects the secret","Never pass the key inline in code or commit it"],"tags":["configuration","validation","api-key","zhipu"],"backgroundTag":"missing-api-key","analyzedSha":"988cbb03305e055d8ebb7d46d9ac6cc0803cd074","analyzedAt":"2026-09-02T14:41:08.344Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}