chroma-core/chroma · error · Error
Max requires at least one rank expression
Error message
Max requires at least one rank expression
What it means
Thrown by the Max rank factory (rank.ts:546) when called with zero arguments. Max builds {$max: [...]} and requires at least one rank expression. The method form expr.max() with no arguments returns expr; only the bare factory Max() with no operands throws.
Source
Thrown at clients/new-js/packages/chromadb/src/execution/expression/rank.ts:546
export const Div = (left: RankInput, right: RankInput): RankExpression =>
new DivRankExpression(
requireRank(left, "Div left"),
requireRank(right, "Div right"),
);
export const Abs = (input: RankInput): RankExpression =>
requireRank(input, "Abs").abs();
export const Exp = (input: RankInput): RankExpression =>
requireRank(input, "Exp").exp();
export const Log = (input: RankInput): RankExpression =>
requireRank(input, "Log").log();
export const Max = (...inputs: RankInput[]): RankExpression => {
if (inputs.length === 0) {
throw new Error("Max requires at least one rank expression");
}
const expressions = inputs.map((rank, index) =>
requireRank(rank, `Max operand ${index}`),
);
return MaxRankExpression.create(expressions);
};
export const Min = (...inputs: RankInput[]): RankExpression => {
if (inputs.length === 0) {
throw new Error("Min requires at least one rank expression");
}
const expressions = inputs.map((rank, index) =>
requireRank(rank, `Min operand ${index}`),
);
return MinRankExpression.create(expressions);
};
View on GitHub (pinned to aecdd12c8a)
Solutions
- Pass at least one operand: Max(a, b)
- Include a baseline for the empty case: Max(...(signals.length ? signals : [0]))
- Skip building the expression when the list is empty
Example fix
// before const rank = Max(...signals); // throws when signals is [] // after const rank = signals.length ? Max(...signals) : Val(0);
Defensive patterns
Strategy: validation
Validate before calling
const rank = signals.length ? Max(...signals) : Val(0);
Try / catch
try {
const rank = Max(...signals);
} catch (e) {
if (e instanceof Error && e.message.includes('Max requires')) {
return Val(0);
}
throw e;
} Prevention
- Always include a baseline signal in max-of-signals pipelines
- Gate the expression on signals.length before spreading
When it happens
Trigger: Calling Max(); spreading a dynamic list Max(...candidates) where candidates is empty — e.g. a 'best of selected signals' expression where no signal was selected.
Common situations: Max-over-optional-scorers UIs (pick best of enabled signals); empty candidate sets from upstream filters; conditional assembly that forgot a guaranteed baseline operand.
Related errors
- Sum requires at least one rank expression
- Mul requires at least one rank expression
- Min requires at least one rank expression
- Knn limit must be a positive integer
- ${context} must be a rank expression
AI-assisted analysis of chroma-core/chroma@aecdd12c8a (2026-08-16).
Data as JSON: /api/errors/7ef6bdb0d33a8981.
Report an issue: GitHub.