n8n/packages/@n8n/instance-ai/evaluations/binaryChecks/checks/index.ts
José Braulio González Valido 700b32237f
feat(ai-builder): Surface WHAT-dimension binary checks per built workflow (no-changelog) (#30932)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 12:18:52 +01:00

95 lines
3.6 KiB
TypeScript

// ---------------------------------------------------------------------------
// Registry of all binary checks, grouped by WHAT-side rubric dimension.
// Each check declares its own `dimension` field; the per-dimension arrays
// here are the second backstop and the canonical iteration order.
// ---------------------------------------------------------------------------
import type { BinaryCheck } from '../types';
import { agentHasDynamicPrompt } from './agent-has-dynamic-prompt';
import { agentHasLanguageModel } from './agent-has-language-model';
import { allNodesConnected } from './all-nodes-connected';
import { correctNodeOperations } from './correct-node-operations';
import { descriptiveNodeNames } from './descriptive-node-names';
import { expressionsReferenceExistingNodes } from './expressions-reference-existing-nodes';
import { fulfillsUserRequest } from './fulfills-user-request';
import { handlesMultipleItems } from './handles-multiple-items';
import { hasNodes } from './has-nodes';
import { hasStartNode } from './has-start-node';
import { hasTrigger } from './has-trigger';
import { httpGenericAuthTypeMatchesPrompt } from './http-generic-auth-type-matches-prompt';
import { inboundTriggerAuthDefaults } from './inbound-trigger-auth-defaults';
import { memoryProperlyConnected } from './memory-properly-connected';
import { memorySessionKeyExpression } from './memory-session-key-expression';
import { noDisabledNodes } from './no-disabled-nodes';
import { noEmptySetNodes } from './no-empty-set-nodes';
import { noHardcodedCredentials } from './no-hardcoded-credentials';
import { noInvalidFromAi } from './no-invalid-from-ai';
import { noUnnecessaryCodeNodes } from './no-unnecessary-code-nodes';
import { noUnreachableNodes } from './no-unreachable-nodes';
import { responseMatchesWorkflowChanges } from './response-matches-workflow-changes';
import { switchFallbackOutputEnabled } from './switch-fallback-output-enabled';
import { toolsHaveParameters } from './tools-have-parameters';
import { validDataFlow } from './valid-data-flow';
import { validFieldReferences } from './valid-field-references';
import { validNodeConfig } from './valid-node-config';
import { vectorStoreHasEmbeddings } from './vector-store-has-embeddings';
export const STRUCTURE_CHECKS: BinaryCheck[] = [
hasNodes,
hasTrigger,
hasStartNode,
noDisabledNodes,
];
export const CONNECTION_TOPOLOGY_CHECKS: BinaryCheck[] = [
allNodesConnected,
noUnreachableNodes,
switchFallbackOutputEnabled,
handlesMultipleItems,
];
export const PARAMETER_CORRECTNESS_CHECKS: BinaryCheck[] = [
expressionsReferenceExistingNodes,
validFieldReferences,
validNodeConfig,
noEmptySetNodes,
noInvalidFromAi,
httpGenericAuthTypeMatchesPrompt,
correctNodeOperations,
validDataFlow,
];
export const INTENT_MATCH_CHECKS: BinaryCheck[] = [fulfillsUserRequest];
export const AI_NODES_CHECKS: BinaryCheck[] = [
agentHasDynamicPrompt,
agentHasLanguageModel,
memoryProperlyConnected,
memorySessionKeyExpression,
vectorStoreHasEmbeddings,
toolsHaveParameters,
];
export const NODES_CRAFTSMANSHIP_CHECKS: BinaryCheck[] = [
noUnnecessaryCodeNodes,
descriptiveNodeNames,
responseMatchesWorkflowChanges,
];
export const SECURITY_CHECKS: BinaryCheck[] = [noHardcodedCredentials, inboundTriggerAuthDefaults];
export const ALL_CHECKS: BinaryCheck[] = [
...STRUCTURE_CHECKS,
...CONNECTION_TOPOLOGY_CHECKS,
...PARAMETER_CORRECTNESS_CHECKS,
...INTENT_MATCH_CHECKS,
...AI_NODES_CHECKS,
...NODES_CRAFTSMANSHIP_CHECKS,
...SECURITY_CHECKS,
];
export const DETERMINISTIC_CHECKS: BinaryCheck[] = ALL_CHECKS.filter(
(c) => c.kind === 'deterministic',
);
export const LLM_CHECKS: BinaryCheck[] = ALL_CHECKS.filter((c) => c.kind === 'llm');