{"record":{"id":"a1e3fa6c439c3c47","repo":"Tencent/WeKnora","slug":"failed-to-create-zhipu-request-w","errorCode":null,"errorMessage":"failed to create Zhipu request: %w","messagePattern":"failed to create Zhipu request: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/infrastructure/web_search/zhipu.go","lineNumber":137,"sourceCode":"\tif maxResults > maxZhipuResults {\n\t\tmaxResults = maxZhipuResults\n\t}\n\n\trequestBody := zhipuSearchRequest{\n\t\tSearchQuery:  preparedQuery,\n\t\tSearchEngine: p.searchEngine,\n\t\tSearchIntent: false,\n\t\tCount:        maxResults,\n\t\tContentSize:  p.contentSize,\n\t}\n\tbody, err := json.Marshal(requestBody)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to marshal Zhipu request: %w\", err)\n\t}\n\n\treq, err := http.NewRequestWithContext(ctx, http.MethodPost, p.baseURL, bytes.NewReader(body))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create Zhipu request: %w\", err)\n\t}\n\treq.Header.Set(\"Authorization\", \"Bearer \"+p.apiKey)\n\treq.Header.Set(\"Content-Type\", \"application/json\")\n\n\tlogger.Infof(ctx, \"[WebSearch][Zhipu] query=%q maxResults=%d engine=%s\", preparedQuery, maxResults, p.searchEngine)\n\tresp, err := p.client.Do(req)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to execute Zhipu request: %w\", err)\n\t}\n\tdefer resp.Body.Close()\n\n\trespBody, err := readZhipuResponseBody(resp.Body)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif resp.StatusCode != http.StatusOK {\n\t\treturn nil, zhipuHTTPError(resp.StatusCode, respBody)\n\t}","sourceCodeStart":119,"sourceCodeEnd":155,"githubUrl":"https://github.com/Tencent/WeKnora/blob/988cbb03305e055d8ebb7d46d9ac6cc0803cd074/internal/infrastructure/web_search/zhipu.go#L119-L155","documentation":"http.NewRequestWithContext failed while building the POST request to the Zhipu API. This occurs when the HTTP method or URL is invalid — with a constant valid method, this almost always means p.baseURL is malformed (unparseable or unsupported scheme).","triggerScenarios":"Calling provider.Search when p.baseURL is an invalid URL (missing scheme, control characters, unparseable host), so url.Parse fails inside http.NewRequestWithContext.","commonSituations":"Misconfigured base URL from config/env (e.g. empty string, missing https://, trailing garbage), user-supplied override URLs not validated at construction, or secrets interpolated incorrectly into the URL.","solutions":["Print/check p.baseURL and confirm it is a valid absolute URL like https://open.bigmodel.cn/api/paas/v4/web_search.","Ensure the URL includes the scheme (https://) and has no whitespace or control characters.","Validate the base URL at provider construction time (url.Parse) so bad config fails fast.","Fix the config source supplying the base URL (env var, config file, or constructor argument)."],"exampleFix":"// before\nprovider.baseURL = os.Getenv(\"ZHIPU_BASE_URL\") // may be empty/malformed\n// after\nbase := os.Getenv(\"ZHIPU_BASE_URL\")\nif base == \"\" { base = defaultZhipuBaseURL }\nif _, err := url.Parse(base); err != nil {\n    return nil, fmt.Errorf(\"invalid zhipu base URL: %w\", err)\n}\nprovider.baseURL = base","handlingStrategy":"validation","validationCode":"func validateBaseURL(raw string) error {\n    if raw == \"\" { return nil } // default applies\n    u, err := url.Parse(raw)\n    if err != nil || u.Scheme == \"\" || u.Host == \"\" {\n        return fmt.Errorf(\"invalid zhipu base URL: %q\", raw)\n    }\n    return nil\n}","typeGuard":"func isValidURL(raw string) bool {\n    u, err := url.Parse(raw)\n    return err == nil && u.Scheme != \"\" && u.Host != \"\"\n}","tryCatchPattern":"results, err := provider.Search(ctx, q, 5, false)\nif err != nil {\n    if strings.Contains(err.Error(), \"failed to create Zhipu request\") {\n        return fmt.Errorf(\"bad baseURL config for Zhipu provider: %w\", err)\n    }\n    return err\n}","preventionTips":["Validate the base URL with url.Parse at provider construction","Always include the https:// scheme in configured URLs","Trim whitespace/control chars from config values before use","Prefer the library default baseURL unless a custom endpoint is truly needed"],"tags":["http","configuration","url","zhipu"],"backgroundTag":"invalid-url","analyzedSha":"988cbb03305e055d8ebb7d46d9ac6cc0803cd074","analyzedAt":"2026-09-02T14:41:08.344Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}