{"record":{"id":"ecc48cb7937d20a6","repo":"chroma-core/chroma","slug":"min-requires-a-list-got-type-ranks-data-name","errorCode":null,"errorMessage":"$min requires a list, got {type(ranks_data).__name__}","messagePattern":"\\$min requires a list, got (.+?)","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"chromadb/execution/expression/operator.py","lineNumber":855,"sourceCode":"            if not isinstance(ranks_data, (list, tuple)):\n                raise TypeError(\n                    f\"$max requires a list, got {type(ranks_data).__name__}\"\n                )\n            if len(ranks_data) < 2:\n                raise ValueError(\n                    f\"$max requires at least 2 ranks, got {len(ranks_data)}\"\n                )\n\n            ranks = [Rank.from_dict(r) for r in ranks_data]\n            result = ranks[0]\n            for r in ranks[1:]:\n                result = result.max(r)\n            return result\n\n        elif op == \"$min\":\n            ranks_data = data[\"$min\"]\n            if not isinstance(ranks_data, (list, tuple)):\n                raise TypeError(\n                    f\"$min requires a list, got {type(ranks_data).__name__}\"\n                )\n            if len(ranks_data) < 2:\n                raise ValueError(\n                    f\"$min requires at least 2 ranks, got {len(ranks_data)}\"\n                )\n\n            ranks = [Rank.from_dict(r) for r in ranks_data]\n            result = ranks[0]\n            for r in ranks[1:]:\n                result = result.min(r)\n            return result\n\n        else:\n            raise ValueError(f\"Unknown rank operator: {op}\")\n\n    # Arithmetic operators\n    def __add__(self, other: Union[\"Rank\", float, int]) -> \"Sum\":","sourceCodeStart":837,"sourceCodeEnd":873,"githubUrl":"https://github.com/chroma-core/chroma/blob/aecdd12c8a891610db8653630b066b32ceb678b5/chromadb/execution/expression/operator.py#L837-L873","documentation":"$min folds a chain of pairwise minimums over rank expressions (the counterpart of $max, used e.g. to cap scores) and expects its payload to be a list of operand dicts. Rank.from_dict raises this TypeError when the $min payload is not a list/tuple — commonly a {'left','right'} dict in the $sub/$div style.","triggerScenarios":"Rank.from_dict({'$min': {'left': a, 'right': b}}) or {'$min': 1.0} anywhere in a rank expression being deserialized.","commonSituations":"Hand-written cap expressions where the author alternates payload conventions; generators that emit the dict shape for every binary operator; JSON adapted from a $div example.","solutions":["Use the list form: {\"$min\": [rank_a, {\"$val\": 1.0}]}","Convert pair dicts: {'$min': [pair['left'], pair['right']]}","Build in Python as rank.min(1.0).to_dict()","Guard: isinstance(expr['$min'], (list, tuple)) before Rank.from_dict"],"exampleFix":"# before\nexpr = {\"$min\": {\"left\": knn_rank, \"right\": {\"$val\": 1.0}}}\n\n# after\nexpr = {\"$min\": [knn_rank, {\"$val\": 1.0}]}","handlingStrategy":"validation","validationCode":"def valid_min_expr(expr):\n    return (\n        isinstance(expr, dict) and set(expr) == {\"$min\"}\n        and isinstance(expr[\"$min\"], (list, tuple))\n    )\n\nif not valid_min_expr(rank_expr):\n    raise ValueError(f\"$min payload must be a list: {rank_expr!r}\")","typeGuard":"def is_min_expr(d) -> bool:\n    return (isinstance(d, dict) and set(d) == {\"$min\"}\n            and isinstance(d[\"$min\"], (list, tuple)))","tryCatchPattern":"try:\n    rank = Rank.from_dict(rank_expr)\nexcept (TypeError, ValueError) as e:\n    raise ValueError(f\"invalid rank expression {rank_expr!r}: {e}\") from e","preventionTips":["$min takes an operand list, not a left/right dict","Emit caps from Python: rank.min(1.0).to_dict()","Keep the payload-shape cheat sheet ($sum/$mul/$max/$min = list; $sub/$div = dict) near expression-building code"],"tags":["chromadb","rank-expression","validation","deserialization","type-error"],"backgroundTag":"query-expression-validation","analyzedSha":"aecdd12c8a891610db8653630b066b32ceb678b5","analyzedAt":"2026-08-16T21:53:27.228Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}