| |
| |
| |
| |
| |
|
|
| export const WORKFLOW_PATTERNS = { |
|
|
| |
| retry: { |
| exponentialBackoff: { |
| name: 'Exponential Backoff Retry', |
| description: 'Retries with increasing delay to avoid overwhelming services', |
| n8nConfig: { retryOnFail: true, maxTries: 3, waitBetweenTries: 1000 }, |
| useWhen: 'External API calls, LLM requests, database writes', |
| }, |
| linearRetry: { |
| name: 'Linear Retry', |
| description: 'Fixed delay retries for idempotent operations', |
| n8nConfig: { retryOnFail: true, maxTries: 5, waitBetweenTries: 2000 }, |
| useWhen: 'File operations, simple CRUD, idempotent webhooks', |
| }, |
| }, |
|
|
| |
| webhookSafety: { |
| validateAndEnqueue: { |
| name: 'Validate β Enqueue β Acknowledge', |
| description: 'Webhook receives, validates, enqueues for async processing, returns 200 quickly', |
| steps: ['Webhook Trigger', 'Validate Signature', 'Validate Schema', 'Generate Idempotency Key', 'Check Processed', 'Enqueue Job', 'Return 200'], |
| avoids: 'Webhook timeout, duplicate processing, heavy sync processing', |
| }, |
| idempotencyGuard: { |
| name: 'Idempotency Guard', |
| description: 'Prevents duplicate processing using request fingerprinting', |
| steps: ['Hash request body+timestamp', 'Check KV/DB for existing hash', 'Skip if already processed', 'Store hash after processing'], |
| }, |
| }, |
|
|
| |
| aiWorkflow: { |
| validateAiOutput: { |
| name: 'AI Output Validation', |
| description: 'Validates AI output schema before using downstream', |
| steps: ['Call LLM', 'Check output is valid JSON', 'Validate against expected schema', 'Retry with different prompt if invalid', 'Fallback to safe default if all retries fail'], |
| }, |
| moderationGate: { |
| name: 'Content Moderation Gate', |
| description: 'Moderate AI output before sending to users', |
| steps: ['AI generates content', 'Run moderation API', 'Block if flagged', 'Log moderation events', 'Allow if safe'], |
| }, |
| }, |
|
|
| |
| errorHandling: { |
| deadLetterQueue: { |
| name: 'Dead Letter Queue', |
| description: 'Failed items are stored for manual review/reprocessing', |
| steps: ['Process item', 'On max retry exhaustion', 'Write to DLQ table/sheet', 'Alert on-call via notification', 'Dashboard shows DLQ items'], |
| }, |
| circuitBreaker: { |
| name: 'Circuit Breaker', |
| description: 'Stop hammering a failing service after threshold', |
| steps: ['Track failure count in KV', 'If count > threshold β open circuit', 'Return cached response or fallback', 'Probe service after timeout β half-open', 'Reset on success'], |
| }, |
| }, |
|
|
| |
| observability: { |
| structuredLogging: { |
| name: 'Structured Logging', |
| description: 'Every significant action logs jobId, nodeId, timestamp, status', |
| implementation: 'Code node at monitoring layer outputs structured log JSON to webhook/external log service', |
| }, |
| executionNotification: { |
| name: 'Execution Completion Notification', |
| description: 'Notify on workflow success/failure', |
| steps: ['After final node', 'Compose summary message', 'Send to Slack/Telegram channel'], |
| }, |
| }, |
|
|
| |
| approval: { |
| humanApproval: { |
| name: 'Human-In-The-Loop Approval', |
| description: 'Pause workflow and wait for human decision', |
| steps: ['Generate approval request', 'Send notification with approve/reject link', 'Wait for webhook callback', 'Route based on decision'], |
| }, |
| }, |
|
|
| |
| antiPatterns: [ |
| { |
| name: 'Monolithic Workflow', |
| description: '200+ nodes in one workflow with no separation of concerns', |
| fix: 'Split into subworkflows by responsibility domain', |
| }, |
| { |
| name: 'Silent Failure', |
| description: 'Workflow fails without any notification or logging', |
| fix: 'Add error notification nodes and error workflow setting', |
| }, |
| { |
| name: 'Direct Webhook Processing', |
| description: 'Heavy processing inside webhook request path causing timeouts', |
| fix: 'Use validate β enqueue β acknowledge pattern', |
| }, |
| { |
| name: 'Unsafe AI Trust', |
| description: 'Using AI output directly without validation', |
| fix: 'Always validate AI output schema before downstream use', |
| }, |
| { |
| name: 'Credential Hardcoding', |
| description: 'API keys in Code nodes or Set node values', |
| fix: 'Always use n8n credential system', |
| }, |
| { |
| name: 'No Retry Policy', |
| description: 'External API calls without retry configuration', |
| fix: 'Add retryOnFail: true to all external API nodes', |
| }, |
| ], |
| }; |
|
|