{ "meta": { "instanceId": "workflow-db880691", "versionId": "1.0.0", "createdAt": "2025-09-29T07:07:44.657337", "updatedAt": "2025-09-29T07:07:44.657353", "owner": "n8n-user", "license": "MIT", "category": "automation", "status": "active", "priority": "high", "environment": "production" }, "nodes": [ { "id": "b6cd232e-e82e-457b-9f03-c010b3eba148", "name": "When clicking 'Test workflow'", "type": "n8n-nodes-base.manualTrigger", "position": [ -40, 0 ], "parameters": {}, "typeVersion": 1, "notes": "This manualTrigger node performs automated tasks as part of the workflow." }, { "id": "2b734806-e3c0-4552-a491-54ca846ed3ac", "name": "Extract from File", "type": "n8n-nodes-base.extractFromFile", "position": [ 620, 0 ], "parameters": { "options": {}, "operation": "binaryToPropery" }, "typeVersion": 1, "notes": "This extractFromFile node performs automated tasks as part of the workflow." }, { "id": "2c199499-cc4f-405c-8560-765500b7acba", "name": "Google Drive", "type": "n8n-nodes-base.googleDrive", "position": [ 420, 0 ], "parameters": { "fileId": { "__rl": true, "mode": "list", "value": "18Ac2xorxirIBm9FNFDDB5aVUSPBCCg1U", "cachedResultUrl": "{{ $env.WEBHOOK_URL }}", "cachedResultName": "Invoice-798FE2FA-0004.pdf" }, "options": {}, "operation": "download" }, "credentials": { "googleDriveOAuth2Api": { "id": "AUEpxwlqBJghNMtb", "name": "Google Drive account" } }, "typeVersion": 3, "notes": "This googleDrive node performs automated tasks as part of the workflow." }, { "id": "e3031c0c-f059-4f30-9684-10014a277d55", "name": "Call Gemini 2.0 Flash with PDF Capabilities", "type": "n8n-nodes-base.httpRequest", "position": [ 880, 220 ], "parameters": { "url": "{{ $env.API_BASE_URL }}", "method": "POST", "options": {}, "jsonBody": "={\n \"contents\": [\n {\n \"parts\": [\n {\n \"inline_data\": {\n \"mime_type\": \"application/pdf\",\n \"data\": \"{{ $json.data }}\"\n }\n },\n {\n \"text\": \"{{ $('Define Prompt').item.json.prompt }}\"\n }\n ]\n }\n ]\n}", "sendBody": true, "specifyBody": "json", "authentication": "{{ $credentials.predefinedCredentialType }}", "nodeCredentialType": "YOUR_CREDENTIAL_HERE" }, "credentials": { "anthropicApi": { "id": "eOt6Ois0jSizRFMJ", "name": "Anthropic Mira Account" }, "googlePalmApi": { "id": "IQrjvfoUd5LUft3b", "name": "Google Gemini(PaLM) Api account" } }, "typeVersion": 4.2, "notes": "This httpRequest node performs automated tasks as part of the workflow." }, { "id": "135df716-32a1-47e8-9ed8-30c830b803d6", "name": "Call Claude 3.5 Sonnet with PDF Capabilities", "type": "n8n-nodes-base.httpRequest", "position": [ 880, -140 ], "parameters": { "url": "{{ $env.API_BASE_URL }}", "method": "POST", "options": {}, "jsonBody": "={\n \"model\": \"claude-3-5-sonnet-20241022\",\n \"max_tokens\": 1024,\n \"messages\": [{\n \"role\": \"user\",\n \"content\": [{\n \"type\": \"document\",\n \"source\": {\n \"type\": \"base64\",\n \"media_type\": \"application/pdf\",\n \"data\": \"{{$json.data}}\"\n }\n },\n {\n \"type\": \"text\",\n \"text\": \"{{ $('Define Prompt').item.json.prompt }}\"\n }]\n }]\n}", "sendBody": true, "sendHeaders": true, "specifyBody": "json", "authentication": "{{ $credentials.predefinedCredentialType }}", "headerParameters": { "parameters": [ { "name": "anthropic-version", "value": "2023-06-01" }, { "name": "content-type", "value": "application/json" } ] }, "nodeCredentialType": "YOUR_CREDENTIAL_HERE" }, "credentials": { "anthropicApi": { "id": "eOt6Ois0jSizRFMJ", "name": "Anthropic Mira Account" } }, "typeVersion": 4.2, "notes": "This httpRequest node performs automated tasks as part of the workflow." }, { "id": "5b8994d1-4bfd-4776-84ac-b3141aca6378", "name": "Sticky Note1", "type": "n8n-nodes-base.stickyNote", "position": [ -700, -280 ], "parameters": { "color": 7, "width": 601, "height": 585, "content": "## Workflow: Extract data from PDF with Claude 3.5 Sonnet or Gemini 2.0 Flash\n\n**Overview**\n- This workflow helps you compare Claude 3.5 Sonnet and Gemini 2.0 Flash when extracting data from a PDF\n- This workflow extracts and processes the data within a PDF in **one single step**, **instead of calling an OCR and then an LLM”**\n\n\n**How it works**\n- The initial 2 steps download the PDF and convert it to base64.\n- This base64 string is then sent to both Claude 3.5 Sonnet and Gemini 2.0 Flash to extract information.\n- This workflow is made to let you compare results, latency, and cost (in their dedicated dashboard).\n\n\n**How to use it**\n- Set up your Google Drive if not already done\n- Select a document on your Google Drive\n- Modify the prompt in \"Define Prompt\" to extract the information you need and transform it as wanted.\n- Get a [Claude API key]({{ $env.WEBHOOK_URL }} and/or [Gemini API key]({{ $env.API_BASE_URL }}\n- Note that you can deactivate one of the 2 API calls if you don't want to try both\n- Test the Workflow\n" }, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow." }, { "id": "616241a9-6199-406b-88dc-0afc7d974250", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [ 820, 60 ], "parameters": { "color": 5, "width": 320, "height": 360, "content": "You can output the result as JSON by adding the following:\n```\n\"generationConfig\": {\n \"responseMimeType\": \"application/json\"\n```\nor even use a structured output.\n[Check the documentation]({{ $env.API_BASE_URL }}" }, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow." }, { "id": "bbac8d3d-d68f-4aa2-a41a-b06f7de2317b", "name": "Define Prompt", "type": "n8n-nodes-base.set", "position": [ 180, 0 ], "parameters": { "options": {}, "assignments": { "assignments": [ { "id": "dba23ef5-95df-496a-8e24-c7c1544533d2", "name": "prompt", "type": "string", "value": "Extract the VAT numbers for each country" } ] } }, "typeVersion": 3.4, "notes": "This set node performs automated tasks as part of the workflow." }, { "id": "3c2e7265-76e5-4911-a950-7e6b0c89ec5a", "name": "Sticky Note2", "type": "n8n-nodes-base.stickyNote", "position": [ 820, -200 ], "parameters": { "color": 5, "width": 320, "height": 240, "content": "You can force Claude to output JSON with [Prefill response format]({{ $env.WEBHOOK_URL }}" }, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow." }, { "id": "f2b46305-5200-486e-ad4d-ecc0d2a14314", "name": "Sticky Note3", "type": "n8n-nodes-base.stickyNote", "position": [ 380, -120 ], "parameters": { "color": 5, "width": 380, "height": 280, "content": "These 2 steps first download the PDF file, and then convert it to base64.\nThis is required by both APIs to process the file." }, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow." }, { "id": "e5dff70f-b55a-4c23-9025-765a7cf19c4a", "name": "Sticky Note4", "type": "n8n-nodes-base.stickyNote", "position": [ 120, -120 ], "parameters": { "color": 5, "width": 220, "height": 280, "content": "This prompt is used in both Gemini’s and Claude’s calls to define what information should be extracted and processed." }, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow." } ], "pinData": {}, "connections": { "e3031c0c-f059-4f30-9684-10014a277d55": { "main": [ [ { "node": "error-handler-e3031c0c-f059-4f30-9684-10014a277d55", "type": "main", "index": 0 } ], [ { "node": "error-handler-e3031c0c-f059-4f30-9684-10014a277d55-d15bb269", "type": "main", "index": 0 } ], [ { "node": "error-handler-e3031c0c-f059-4f30-9684-10014a277d55-202ae763", "type": "main", "index": 0 } ], [ { "node": "error-handler-e3031c0c-f059-4f30-9684-10014a277d55-a1fb1213", "type": "main", "index": 0 } ], [ { "node": "error-handler-e3031c0c-f059-4f30-9684-10014a277d55-05f76ef1", "type": "main", "index": 0 } ], [ { "node": "error-handler-e3031c0c-f059-4f30-9684-10014a277d55-1574373a", "type": "main", "index": 0 } ], [ { "node": "error-handler-e3031c0c-f059-4f30-9684-10014a277d55-edab5288", "type": "main", "index": 0 } ], [ { "node": "error-handler-e3031c0c-f059-4f30-9684-10014a277d55-1bf5abf5", "type": "main", "index": 0 } ], [ { "node": "error-handler-e3031c0c-f059-4f30-9684-10014a277d55-2a5af12b", "type": "main", "index": 0 } ] ] }, "135df716-32a1-47e8-9ed8-30c830b803d6": { "main": [ [ { "node": "error-handler-135df716-32a1-47e8-9ed8-30c830b803d6", "type": "main", "index": 0 } ], [ { "node": "error-handler-135df716-32a1-47e8-9ed8-30c830b803d6-14d89b54", "type": "main", "index": 0 } ], [ { "node": "error-handler-135df716-32a1-47e8-9ed8-30c830b803d6-f30ec53a", "type": "main", "index": 0 } ], [ { "node": "error-handler-135df716-32a1-47e8-9ed8-30c830b803d6-173d99d4", "type": "main", "index": 0 } ], [ { "node": "error-handler-135df716-32a1-47e8-9ed8-30c830b803d6-06859643", "type": "main", "index": 0 } ], [ { "node": "error-handler-135df716-32a1-47e8-9ed8-30c830b803d6-f9818a45", "type": "main", "index": 0 } ], [ { "node": "error-handler-135df716-32a1-47e8-9ed8-30c830b803d6-da34b2d4", "type": "main", "index": 0 } ], [ { "node": "error-handler-135df716-32a1-47e8-9ed8-30c830b803d6-29ef9108", "type": "main", "index": 0 } ], [ { "node": "error-handler-135df716-32a1-47e8-9ed8-30c830b803d6-5dfb3b79", "type": "main", "index": 0 } ] ] }, "2b734806-e3c0-4552-a491-54ca846ed3ac": { "main": [ [ { "node": "error-handler-2b734806-e3c0-4552-a491-54ca846ed3ac-40ea87b7", "type": "main", "index": 0 } ] ] }, "2c199499-cc4f-405c-8560-765500b7acba": { "main": [ [ { "node": "error-handler-2c199499-cc4f-405c-8560-765500b7acba-4e08d256", "type": "main", "index": 0 } ] ] } }, "name": "Manualtrigger Workflow", "settings": { "executionOrder": "v1", "saveManualExecutions": true, "callerPolicy": "workflowsFromSameOwner", "errorWorkflow": null, "timezone": "UTC", "executionTimeout": 3600, "maxExecutions": 1000, "retryOnFail": true, "retryCount": 3, "retryDelay": 1000 }, "description": "Automated workflow: Manualtrigger Workflow. This workflow integrates 7 different services: stickyNote, httpRequest, googleDrive, set, stopAndError. It contains 17 nodes and follows best practices for error handling and security.", "tags": [ "automation", "n8n", "production-ready", "excellent", "optimized" ], "notes": "Excellent quality workflow: Manualtrigger Workflow. This workflow has been optimized for production use with comprehensive error handling, security, and documentation." }