{"record":{"id":"a967b98df84da096","repo":"siyuan-note/siyuan","slug":"rerank-returned-duplicate-index-d","errorCode":null,"errorMessage":"rerank returned duplicate index %d","messagePattern":"rerank returned duplicate index (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"kernel/util/openai.go","lineNumber":611,"sourceCode":"\treturn document\n}\n\n// TestRerankModel 测试重排模型可用性，用极简 query+documents 发一次重排请求验证连通性与鉴权。\n// 返回值：matched 表示是否连通成功，err 为请求错误（鉴权失败、网络异常、模型不存在等，原样返回便于调用方展示原因）。\nfunc TestRerankModel(apiKey, apiBaseURL, model string, timeout int) (matched bool, err error) {\n\tdocuments := []string{\"a\", \"b\"}\n\tindices, _, err := Rerank(\"1\", documents, apiKey, apiBaseURL, model, len(documents), timeout)\n\tif nil != err {\n\t\treturn\n\t}\n\tif len(indices) != len(documents) {\n\t\terr = fmt.Errorf(\"rerank returned %d indices for %d documents\", len(indices), len(documents))\n\t\treturn\n\t}\n\tseen := make(map[int]bool, len(indices))\n\tfor _, index := range indices {\n\t\tif seen[index] {\n\t\t\terr = fmt.Errorf(\"rerank returned duplicate index %d\", index)\n\t\t\treturn\n\t\t}\n\t\tseen[index] = true\n\t}\n\tmatched = true\n\treturn\n}\n\n// PrepareModelImage 校验并按需缩放图片，尽量保留多模态模型支持的原始格式和图片质量。\nfunc PrepareModelImage(data []byte, maxBytes, maxPixels, maxEdge int) (PreparedImage, error) {\n\tif len(data) == 0 {\n\t\treturn PreparedImage{}, errors.New(\"image data is empty\")\n\t}\n\tif maxBytes > 0 && len(data) > maxBytes {\n\t\treturn PreparedImage{}, fmt.Errorf(\"image exceeds size limit: %d bytes\", maxBytes)\n\t}\n\tmimeType := mimetype.Detect(data).String()\n\tif strings.Contains(mimeType, \"svg\") || bytes.Contains(bytes.ToLower(data[:min(len(data), 512)]), []byte(\"<svg\")) {","sourceCodeStart":593,"sourceCodeEnd":629,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/251596fc0de2f9528c00c224252fd073a99973f4/kernel/util/openai.go#L593-L629","documentation":"TestRerankModel's dedup check requires every returned index to be unique. A repeated index means the rerank response is malformed/non-conformant, so the probe rejects the provider.","triggerScenarios":"Rerank provider returning the same index for multiple results (e.g. always 0, or echoing the query index); a custom rerank shim with an off-by-one bug.","commonSituations":"Broken or alpha-stage rerank services; providers that return a single repeated result; middleware that flattens results incorrectly.","solutions":["Use a standards-conformant rerank provider (Jina, Cohere).","If you wrote a shim/wrapper, ensure unique 0-based indices.","Fall back to no reranking in search when the probe fails."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"if _, err := util.TestRerankModel(key, endpoint, model, 30); err != nil {\n    log.Warnf(\"rerank provider rejected: %s; disabling rerank\", err)\n    disableRerank()\n}","preventionTips":["Use mainstream rerank providers","Treat rerank as an optional enhancement"],"tags":["ai","rerank","go","validation"],"backgroundTag":null,"analyzedSha":"251596fc0de2f9528c00c224252fd073a99973f4","analyzedAt":"2026-08-12T21:18:37.123Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}