{"record":{"id":"9b11337e01b6b45b","repo":"chroma-core/chroma","slug":"knn-default-must-be-a-finite-number","errorCode":null,"errorMessage":"Knn default must be a finite number","messagePattern":"Knn default must be a finite number","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"clients/new-js/packages/chromadb/src/execution/expression/rank.ts","lineNumber":419,"sourceCode":"      values: sparse.values.slice(),\n    };\n  } else {\n    query = normalizeDenseVector(queryInput as IterableInput<number>);\n  }\n\n  const key =\n    options.key instanceof Key ? options.key.name : options.key ?? \"#embedding\";\n  if (typeof key !== \"string\") {\n    throw new TypeError(\"Knn key must be a string or Key instance\");\n  }\n\n  const defaultValue =\n    options.default === null || options.default === undefined\n      ? undefined\n      : requireNumber(options.default, \"Knn default must be a number\");\n\n  if (defaultValue !== undefined && !Number.isFinite(defaultValue)) {\n    throw new TypeError(\"Knn default must be a finite number\");\n  }\n\n  return {\n    query:\n      Array.isArray(query) || typeof query === \"string\"\n        ? query\n        : deepClone(query),\n    key,\n    limit,\n    defaultValue,\n    returnRank: options.returnRank ?? false,\n  };\n};\n\nconst requireRank = (input: RankInput, context: string): RankExpression => {\n  const result = RankExpression.from(input);\n  if (!result) {\n    throw new TypeError(`${context} must be a rank expression`);","sourceCodeStart":401,"sourceCodeEnd":437,"githubUrl":"https://github.com/chroma-core/chroma/blob/aecdd12c8a891610db8653630b066b32ceb678b5/clients/new-js/packages/chromadb/src/execution/expression/rank.ts#L401-L437","documentation":"Guard in normalizeKnnOptions (rank.ts:419) requiring Knn()'s `default` option — the score substituted for documents that lack an embedding — to be a finite number. In the current code this branch is effectively unreachable: the preceding requireNumber call (rank.ts:417, message 'Knn default must be a number') already rejects non-numbers, NaN, and Infinity before this check runs. If you pass NaN or Infinity you will actually see the sibling 'must be a number' message; this message exists as defensive redundancy.","triggerScenarios":"Intended trigger: Knn({ query, default: NaN }), default: Infinity, or default: -Infinity. In practice those raise 'Knn default must be a number' (requireNumber, rank.ts:417) first, so you should never observe this exact message from the shipped code. null/undefined are legal and mean 'no default'.","commonSituations":"Defaults computed from user input via parseFloat that yield NaN (parseFloat('abc')); scoring defaults sourced from config that contain Infinity after division by zero upstream; passing 0 or a negative number is fine — only NaN/Infinity class values are rejected.","solutions":["Pass a finite number as default (0 and negatives are allowed)","Omit default, or pass null/undefined, if you do not want a fallback score","Fix the upstream computation producing NaN/Infinity (e.g. guard a division with Number.isFinite before assigning)"],"exampleFix":"// before\nconst rank = Knn({ query: vec, default: someRatio }); // someRatio may be NaN/Infinity\n\n// after\nconst rank = Knn({\n  query: vec,\n  default: Number.isFinite(someRatio) ? someRatio : 0,\n});","handlingStrategy":"validation","validationCode":"const rank = Knn({\n  query: vec,\n  default: Number.isFinite(cfg.defaultScore) ? cfg.defaultScore : undefined,\n});","typeGuard":"const isFiniteNumber = (v: unknown): v is number =>\n  typeof v === 'number' && Number.isFinite(v);","tryCatchPattern":"try {\n  const rank = Knn({ query: vec, default: d });\n} catch (e) {\n  if (e instanceof TypeError && e.message.includes('Knn default')) {\n    return Knn({ query: vec }); // no default score\n  }\n  throw e;\n}","preventionTips":["null/undefined omit the default; 0 and negatives are legal values","Check Number.isFinite on computed scores (ratios, parseFloat results) before passing them as default","If you see this exact message, note the sibling 'must be a number' check normally fires first"],"tags":["knn","default","nan","infinity","input-validation"],"backgroundTag":"nan-input","analyzedSha":"aecdd12c8a891610db8653630b066b32ceb678b5","analyzedAt":"2026-08-16T21:53:27.228Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}