{"record":{"id":"27e18bde8b5e4c45","repo":"infiniflow/ragflow","slug":"dataset-id-or-kb-id-knowledge-id-is-required-for","errorCode":null,"errorMessage":"dataset_id (or kb_id/knowledge_id) is required for retrievalTest","messagePattern":"dataset_id \\(or kb_id/knowledge_id\\) is required for retrievalTest","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"web/src/services/knowledge-service.ts","lineNumber":151,"sourceCode":"    payload.available ??\n    (payload.available_int === undefined\n      ? undefined\n      : payload.available_int === 1),\n  image_base64: payload.image_base64,\n});\n\nconst getAvailableParam = (available?: number) => {\n  if (available === undefined) {\n    return undefined;\n  }\n  return available === 1 ? 'true' : 'false';\n};\n\nconst chunkService = {\n  retrievalTest: async (params: Record<string, any>) => {\n    const datasetId = params.dataset_id || params.kb_id || params.knowledge_id;\n    if (!datasetId) {\n      throw new Error(\n        'dataset_id (or kb_id/knowledge_id) is required for retrievalTest',\n      );\n    }\n    const datasetIds = Array.isArray(datasetId) ? datasetId : [datasetId];\n    const rest = { ...params };\n    delete rest.dataset_id;\n    delete rest.kb_id;\n    delete rest.knowledge_id;\n    return request.post(api.retrievalTest, {\n      data: { ...rest, dataset_ids: datasetIds },\n    });\n  },\n  chunkList: async (params: Record<string, any>) => {\n    const datasetId = getDatasetId(params);\n    const documentId = getDocumentId(params);\n    const response = await request.get(api.chunkList(datasetId, documentId), {\n      params: {\n        page: params.page,","sourceCodeStart":133,"sourceCodeEnd":169,"githubUrl":"https://github.com/infiniflow/ragflow/blob/554fb1133ac3861732235ad9c377eb5e0a770665/web/src/services/knowledge-service.ts#L133-L169","documentation":"Thrown in web/src/services/knowledge-service.ts:151 by chunkService.retrievalTest when the params object contains none of dataset_id, kb_id, or knowledge_id. The service normalizes those legacy aliases into dataset_ids for the POST to api.retrievalTest; with no dataset identifier the request cannot be built, so it fails fast client-side before any network call.","triggerScenarios":"Calling retrievalTest({question, ...}) and forgetting the dataset key; using a renamed key the normalizer does not know (e.g. datasetId camelCase); the form/dropdown value bound to dataset_id is undefined because no knowledge base was selected; data flowing from a context where kb_id was dropped during a refactor.","commonSituations":"Testing retrieval before selecting a dataset in the UI. Key drift across API versions (kb_id → dataset_id) leaving some callers on the old name that was removed from the alias list. Optional-chaining somewhere upstream producing undefined silently.","solutions":["Pass dataset_id (the current canonical key) explicitly in the params object","Make the UI require a dataset selection before the test button is enabled","Type the params as { dataset_id: string; [k: string]: unknown } so TypeScript enforces the key","Extend the alias check if callers still legitimately use kb_id/knowledge_id"],"exampleFix":"// before\nawait chunkService.retrievalTest({\n  question: query,\n  page: 1,\n  page_size: 10,\n});\n\n// after\nawait chunkService.retrievalTest({\n  dataset_id: selectedKnowledgeBaseId,\n  question: query,\n  page: 1,\n  page_size: 10,\n});","handlingStrategy":"validation","validationCode":"const hasDatasetId = (p: Record<string, any>) =>\n  Boolean(p.dataset_id || p.kb_id || p.knowledge_id);","typeGuard":"const isRetrievalParams = (\n  p: unknown,\n): p is { dataset_id: string } & Record<string, unknown> =>\n  typeof p === 'object' && p !== null &&\n  typeof (p as any).dataset_id === 'string' && (p as any).dataset_id.length > 0;","tryCatchPattern":null,"preventionTips":["Type params as { dataset_id: string; ... } so the key is compiler-enforced","Require a knowledge-base selection in the retrieval-test UI before enabling the button"],"tags":["validation","api-contract","retrieval","knowledge-base"],"backgroundTag":null,"analyzedSha":"554fb1133ac3861732235ad9c377eb5e0a770665","analyzedAt":"2026-08-15T09:20:16.380Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}