n8n-io/n8n · error · Error
No valid checks after filtering. Requested: ${options.checks
Error message
No valid checks after filtering. Requested: ${options.checks.join(', ')}. Available: ${allCheckNames.join(', ')} What it means
The binary-checks evaluator filters its catalog (`DETERMINISTIC_CHECKS` plus `LLM_CHECKS` when an LLM is supplied) by the `--checks` option. Unrecognized names only produce `console.warn`, but if NONE of the requested names match the available catalog, the evaluator refuses to build rather than silently run zero checks. The error lists both what you asked for and what is available.
Source
Thrown at packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/binary-checks/index.ts:44
): Evaluator<EvaluationContext> {
const allChecks: BinaryCheck[] = [...DETERMINISTIC_CHECKS, ...(options.llm ? LLM_CHECKS : [])];
const allCheckNames = allChecks.map((c) => c.name);
let selectedChecks: BinaryCheck[];
if (options.checks && options.checks.length > 0) {
const validNames = new Set(allCheckNames);
const unrecognized = options.checks.filter((name) => !validNames.has(name));
for (const name of unrecognized) {
console.warn(`Warning: unrecognized check name "${name}" in --checks filter`);
}
selectedChecks = allChecks.filter((c) => options.checks!.includes(c.name));
if (selectedChecks.length === 0) {
throw new Error(
`No valid checks after filtering. Requested: ${options.checks.join(', ')}. Available: ${allCheckNames.join(', ')}`,
);
}
} else {
selectedChecks = allChecks;
}
return {
name: EVALUATOR_NAME,
async evaluate(workflow: SimpleWorkflow, ctx: EvaluationContext): Promise<Feedback[]> {
const checkCtx: BinaryCheckContext = {
prompt: ctx.prompt,
nodeTypes: options.nodeTypes,
annotations: ctx.annotations,
llm: options.llm,
// Intentionally omit llmCallLimiter: binary-checks LLM judges are small,
// cheap calls that should run in parallel, not throttled by the shared limiter.View on GitHub (pinned to 5ac6606e81)
Solutions
- Re-run without `--checks` to see the full available set, or read the 'Available:' list in the error message and align your flags to it.
- If you requested an LLM check, ensure the judge LLM is configured so `LLM_CHECKS` are part of the catalog.
- If a check was renamed, update your script/CI to the new name.
Example fix
// before
createBinaryChecksEvaluator({ nodeTypes, checks: ['valid-json', 'no-unconnected-nodes'] }); // 'valid-json' not a real check
// after
createBinaryChecksEvaluator({ nodeTypes, checks: ['valid-connections', 'no-unconnected-nodes'] }); // names from allCheckNames Defensive patterns
Strategy: validation
Validate before calling
import { DETERMINISTIC_CHECKS, LLM_CHECKS } from './checks';
function selectChecks(requested: string[] | undefined, hasLlm: boolean): string[] {
const catalog = new Set([...DETERMINISTIC_CHECKS, ...(hasLlm ? LLM_CHECKS : [])].map((c) => c.name));
if (!requested || requested.length === 0) return [...catalog];
const unknown = requested.filter((r) => !catalog.has(r));
if (unknown.length) console.warn('unknown checks:', unknown.join(', '));
const selected = requested.filter((r) => catalog.has(r));
if (selected.length === 0) throw new Error(`no valid checks; available: ${[...catalog].join(', ')}`);
return selected;
}
// use selected instead of passing --checks blindly Prevention
- Before constructing the evaluator, intersect the requested names with the catalog and warn on unknowns.
- Keep the check-name list in one module so docs, CLI completion, and validation share a source of truth.
- Add a unit test that feeds a fully-unknown list and asserts the error.
When it happens
Trigger: Passing `--checks typo-name` or `--checks llm-only-check` while no `--judge-llm` / LLM is configured (LLM-only checks are not in the catalog without a model). Also: requesting a check that was renamed/removed in a newer version.
Common situations: Copy-pasting a checks list from docs that are out of sync with the installed version; enabling a check name from memory; or expecting an LLM-driven check to be available without supplying an LLM.
Related errors
- LangSmith mode requires `--dataset` and does not support `--
- No examples found in dataset "${datasetName}"
- Model ID is required
- Invalid delegate sub-agent tool name "${name}": must start w
- ${toolName} requires resumeSubAgent and cancelSubAgent to be
AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12).
Data as JSON: /api/errors/5152c621b9c58130.
Report an issue: GitHub.