Automatisation de l'extraction de métadonnées et de variables de papiers académiques, de Gemini vers Google Sheets

Avancé

Ceci est unDocument Extraction, AI Summarizationworkflow d'automatisation du domainecontenant 39 nœuds.Utilise principalement des nœuds comme Set, Code, Wait, Gmail, Switch. Automatisation de l'extraction de métadonnées et de variables d'articles académiques, de Gemini vers Google Sheets

Prérequis
  • Compte Google et informations d'identification Gmail API
  • Informations d'identification Google Sheets API
  • Clé API Google Gemini
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "meta": {
    "instanceId": "e4f10bef48753951b827b1628c136c25720855dd405c916d09e788211699198e",
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "06ff1131-994f-47de-be13-6136cf9ecb04",
      "name": "XLS Data Extractor",
      "type": "n8n-nodes-base.extractFromFile",
      "onError": "continueRegularOutput",
      "position": [
        -816,
        480
      ],
      "parameters": {
        "options": {},
        "operation": "xls",
        "binaryPropertyName": "={{ $('File Upload Trigger').item.binary.data0 }}"
      },
      "typeVersion": 1,
      "alwaysOutputData": true
    },
    {
      "id": "b053af46-c202-4217-8f06-a0e0c7a0f94b",
      "name": "CSV Data Extractor",
      "type": "n8n-nodes-base.extractFromFile",
      "onError": "continueRegularOutput",
      "position": [
        -816,
        336
      ],
      "parameters": {
        "options": {
          "encoding": "utf-8"
        },
        "binaryPropertyName": "={{ $('File Upload Trigger').item.binary.data0 }}"
      },
      "typeVersion": 1,
      "alwaysOutputData": true
    },
    {
      "id": "fe2a68e9-b162-445e-ae46-aed72fe9559c",
      "name": "Paper Metadata Extractor",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -336,
        464
      ],
      "parameters": {
        "text": "={{ $json?.toJsonString ? $json.toJsonString() : JSON.stringify($json) }}",
        "options": {
          "systemMessage": "=You are given an article or snippet of text. Extract the following fields and return **only** a single JSON object in the exact structure below:\n\nFields to extract:\n- \"title\"\n- \"abstract\"\n- \"publication_date\"\n- \"source\"\n- \"authors\" (as an array of objects with a single key \"name\")\n\nOutput format (replace `string|null` with actual strings or `null`):\n{\n  \"authors\": [\n    { \"name\": \"string|null\" }\n  ],\n  \"title\": \"string|null\",\n  \"abstract\": \"string|null\",\n  \"publication_date\": \"date|null\",\n  \"source\": \"string|null\"\n}\n\nRules:\n- If any field cannot be found, set it to `null`.\n- For \"authors\", include an array of `{ \"name\": \"<author name>\" }` objects in the order they appear; if no authors are found, return an empty array `[]`.\n- Return **only** the JSON object with no extra text, comments, or markdown.\n\nValidation:\n- Use the output parser tool to check your output against the specified structure.\n- If validation fails, fix the JSON and re-emit the corrected JSON only."
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "1a821473-3e90-4da7-817a-45916004c467",
      "name": "Boucler sur les éléments",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -560,
        368
      ],
      "parameters": {
        "options": {},
        "batchSize": 10
      },
      "typeVersion": 3
    },
    {
      "id": "5eaa37da-ba8f-413e-9965-4a0e5981fa3d",
      "name": "Create spreadsheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -1264,
        624
      ],
      "parameters": {
        "title": "={{ $json.chatInput }}",
        "options": {},
        "resource": "spreadsheet",
        "sheetsUi": {
          "sheetValues": [
            {
              "title": "Checkpoint"
            },
            {
              "title": "FinalResult"
            }
          ]
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "i2QQ5h70aiZ7H0s3",
          "name": "Google Sheets(owen)"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "9e79fe64-91f9-4a30-b684-af194ba194cf",
      "name": "Read Write in Data",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        0,
        336
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $('Create spreadsheet').item.json.sheets[0].properties.title }}"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Create spreadsheet').item.json.spreadsheetId }}"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "i2QQ5h70aiZ7H0s3",
          "name": "Google Sheets(owen)"
        }
      },
      "retryOnFail": true,
      "typeVersion": 4.7
    },
    {
      "id": "0dd1e54a-3a1a-4da5-ab2d-9f8db38da89e",
      "name": "Attendre for 3s.",
      "type": "n8n-nodes-base.wait",
      "position": [
        496,
        656
      ],
      "webhookId": "6606f055-dcfc-41a0-8c6b-4a3794d05969",
      "parameters": {
        "amount": 3
      },
      "typeVersion": 1.1
    },
    {
      "id": "2bc80873-54d9-400c-b6a4-762af5fe1fdf",
      "name": "Structured Output Parser1",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -208,
        832
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"authors\": [\n    { \"name\": \"string|null\" }\n  ],\n  \"title\": \"string|null\",\n  \"abstract\": \"string|null\",\n  \"publication_date\": \"date|null\",\n  \"source\": \"string|null\"\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "8acb6ded-253b-409b-9e8b-004f4290a2a9",
      "name": "Auto-fixing Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserAutofixing",
      "position": [
        -288,
        672
      ],
      "parameters": {
        "options": {
          "prompt": "Instructions:\n--------------\n{instructions}\n--------------\nCompletion:\n--------------\n{completion}\n--------------\n\nAbove, the Completion did not satisfy the constraints given in the Instructions.\nError:\n--------------\n{error}\n--------------\n\nPlease try again. Please only respond with an answer that satisfies the constraints laid out in the Instructions:"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "aa8da126-4765-480b-b1aa-94ad560cf6e3",
      "name": "Data Formatter",
      "type": "n8n-nodes-base.code",
      "position": [
        80,
        560
      ],
      "parameters": {
        "jsCode": "// 输入结构:items[i].json.output\n// 输出结构:[{ json: { authors: \"A; B; C\", title, abstract, publication_date, source } }]\n\nreturn items.map(item => {\n  const o = item.json?.output || {};\n  const authors = (o.authors || [])\n    .map(a => (typeof a === 'string' ? a : a?.name || ''))\n    .filter(a => a && a.trim())\n    .join('; ');\n\n  return {\n    json: {\n      authors: authors || null,\n      title: o.title || null,\n      abstract: o.abstract || null,\n      publication_date: o.publication_date || null,\n      source: o.source || null\n    }\n  };\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "8cc8c6ab-7f3a-4ddf-a146-d7db95c96896",
      "name": "Modèle de chat Google Gemini1",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        -400,
        832
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "id": "3nYhRpjFi2oGf30q",
          "name": "Gemini(owen)"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "3ea2219f-3ea4-4728-a055-4386d45e435e",
      "name": "Save to Checkpoint Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        288,
        560
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [
            {
              "id": "authors",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "authors",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "title",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "abstract",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "abstract",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "publication_date",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "publication_date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "source",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "source",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "autoMapInputData",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $('Create spreadsheet').item.json.sheets[0].properties.title }}"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Create spreadsheet').item.json.spreadsheetId }}"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "i2QQ5h70aiZ7H0s3",
          "name": "Google Sheets(owen)"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "14bc11af-a987-47e1-8bd5-a9f623cb208d",
      "name": "File Type Router",
      "type": "n8n-nodes-base.switch",
      "position": [
        -1040,
        592
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "csv",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "16407fe1-c30c-4a81-b43e-6cdb44adc616",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ ( $('File Upload Trigger').item.json.files?.[0]?.fileExtension || '' ).toLowerCase() }}",
                    "rightValue": "csv"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "xls",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "0f752545-ce9b-4906-8dce-6427a9b2cadd",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ ( $('File Upload Trigger').item.json.files?.[0]?.fileExtension || '' ).toLowerCase() }}",
                    "rightValue": "xls"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "xlsx",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "aab779cf-1bbf-4209-83b6-33d75f55cc86",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ ( $('File Upload Trigger').item.json.files?.[0]?.fileExtension || '' ).toLowerCase() }}",
                    "rightValue": "xlsx"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Error",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "60324888-4a08-4d20-988b-bc35176325be",
                    "operator": {
                      "type": "string",
                      "operation": "notExists",
                      "singleValue": true
                    },
                    "leftValue": "={{ ( $('File Upload Trigger').item.json.files?.[0]?.fileExtension || '' ).toLowerCase() }}",
                    "rightValue": "error"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.3
    },
    {
      "id": "3b6cea37-8cf0-45e3-b15b-716e2aeec3c8",
      "name": "XLSX Data Extractor",
      "type": "n8n-nodes-base.extractFromFile",
      "onError": "continueRegularOutput",
      "position": [
        -816,
        640
      ],
      "parameters": {
        "options": {},
        "operation": "xlsx",
        "binaryPropertyName": "={{ $('File Upload Trigger').item.binary.data0 }}"
      },
      "typeVersion": 1,
      "alwaysOutputData": true
    },
    {
      "id": "f1260b49-b8d7-4148-bac0-60010ae07c06",
      "name": "Error Message Handler",
      "type": "n8n-nodes-base.set",
      "position": [
        -816,
        784
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "78203b0f-a6cd-4bb9-a2bd-3b961a37428c",
              "name": "output",
              "type": "string",
              "value": "Pls attach a file"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "ca176a9b-ae02-4afd-a50e-b11d1c37c311",
      "name": "File Upload Trigger",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "position": [
        -1488,
        624
      ],
      "webhookId": "e083cca5-1d57-4dea-93a3-7a4f90c6f833",
      "parameters": {
        "options": {
          "allowFileUploads": true,
          "allowedFilesMimeTypes": "text/csv,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "716b6a67-b194-4ea6-b24f-5cf9002e78c1",
      "name": "When Executed by Another Workflow",
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "position": [
        -1200,
        1184
      ],
      "parameters": {
        "workflowInputs": {
          "values": [
            {
              "name": "GoogleSheetID"
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "52ab0f2d-272b-4e57-b4b1-b6fc08550e40",
      "name": "Academic Variables Extractor",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        128,
        1248
      ],
      "parameters": {
        "text": "=academic paper:\n- {{ $json.Title }}\n- {{ $json.Abstract }}",
        "options": {
          "systemMessage": "=You are an academic research variable-extraction expert.\n\n## Task\nFrom the provided paper **Title** and **Abstract**, extract the following fields and output ONLY a single JSON object:\n\n## Strict Rules\n- Return ONLY the JSON object; no extra explanations or markdown.\n- Follow the Structured Output Parser JSON schema EXACTLY.\n- If a category has no items, return an empty array [].\n- Use ONLY the given Title/Abstract; do NOT fabricate.\n- Validate your JSON against the Structured Output Parser.\n\n## Output JSON Schema\n{\n  \"Summary\": \"string\",\n  \"DV\": [\"string\"],\n  \"IV\": [\"string\"],\n  \"Mediator\": [\"string\"],\n  \"Moderator\": [\"string\"],\n  \"Overarching_theory\": [\"string\"]\n}\n\n## Input example\n- Title:You’ve got mail! How work e-mail activity helps anxious workers enhance performance Outcomes\n- Abstract:Despite workplace anxiety being a common experience of daily work life that is increasingly reliant on technology, we lack knowledge of technology-based job demands that prompt its occurrence. Drawing on theorization on workplace anxiety and integrating literature on information and communication technologies, we consider telepressure and normative response pressure as internal and external between-person sources of daily workplace anxiety. We further present a model of how employees adaptively (vs. maladaptively) respond to workplace anxiety on days they experience workplace anxiety, where anxiety prompts: (a) work e-mail activity, a self-regulatory behavior facilitating performance outcomes; and (b) non-work e-mail activity, a behavior that disengages employees from their work, debilitating performance outcomes. Utilizing a multilevel, time-lagged experience sampling field study across 10 workdays (Level 1 N = 809; Level 2 N = 96), we identify telepressure as a significant contributor of daily workplace anxiety. Further, we found support for an adaptive function of workplace anxiety. On days employees experienced workplace anxiety, their personal initiative and citizenship behaviors were enhanced through behavioral regulatory activity manifested in work e-mail activity. This indirect effect was strengthened for employees perceiving higher (vs. lower) work e-mail centrality. This research advances understanding of the adaptive function of workplace anxiety, such that employees are active drivers of their daily experiences of workplace anxiety. \n## Output example\n```json\n{\n  \"Summary\": \"This study finds that “workplace anxiety” isn’t always a bad thing. When employees feel anxious due to email pressure, they actually become more proactive in completing tasks. However, if they switch to handling personal emails, their performance declines.\n\",\n  \"DV\": [\"Workplace Anxiety\"],\n  \"IV\": [\"Personal Initiative\", \"Citizenship Behaviors\"],\n  \"Mediator\": [\"Work e-mail Activity\", \"Non-work e-mail Activity\"],\n  \"Moderator\": [\"Work e-mail Centrality\"],\n  \"Overaching_theory\": [\"workplace anxiety theory\"]\n}\n```"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "9ed01cca-b185-4e4f-9a86-99691152a70d",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        304,
        1680
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"Summary\": \"string\",\n  \"DV\": [\"string\"],\n  \"IV\": [\"string\"],\n  \"Mediator\": [\"string\"],\n  \"Moderator\": [\"string\"],\n  \"Overarching_theory\": [\"string\"]\n}\n"
      },
      "typeVersion": 1.3
    },
    {
      "id": "e3e332f7-0805-4527-b466-226bc98e7e16",
      "name": "Journal Rank Classifier",
      "type": "n8n-nodes-base.code",
      "notes": "Parses input JSON, uppercases Journal, flags UTD24/FT50, computes Rank.",
      "position": [
        -96,
        1248
      ],
      "parameters": {
        "jsCode": "// ===== UTD24 & FT50 journal lists (UPPERCASE for matching) =====\nconst utd24 = new Set([\n  \"MANAGEMENT SCIENCE\",\n  \"MIS QUARTERLY\",\n  \"INFORMATION SYSTEMS RESEARCH\",\n  \"JOURNAL OF MARKETING\",\n  \"JOURNAL OF FINANCE\",\n  \"JOURNAL OF ACCOUNTING RESEARCH\",\n  \"JOURNAL OF ACCOUNTING AND ECONOMICS\",\n  \"JOURNAL OF POLITICAL ECONOMY\",\n  \"MARKETING SCIENCE\",\n  \"OPERATIONS RESEARCH\",\n  \"ORGANIZATION SCIENCE\",\n  \"JOURNAL OF CONSUMER RESEARCH\",\n  \"JOURNAL OF FINANCIAL ECONOMICS\",\n  \"THE ACCOUNTING REVIEW\",\n  \"STRATEGIC MANAGEMENT JOURNAL\",\n  \"ADMINISTRATIVE SCIENCE QUARTERLY\",\n  \"ACADEMY OF MANAGEMENT JOURNAL\",\n  \"ACADEMY OF MANAGEMENT REVIEW\",\n  \"REVIEW OF FINANCIAL STUDIES\",\n  \"JOURNAL OF INTERNATIONAL BUSINESS STUDIES\",\n  \"JOURNAL OF BUSINESS VENTURING\",\n  \"MANUFACTURING & SERVICE OPERATIONS MANAGEMENT\",\n  \"PRODUCTION AND OPERATIONS MANAGEMENT\",\n  \"MANAGEMENT INFORMATION SYSTEMS QUARTERLY\"\n]);\n\nconst ft50 = new Set([\n  \"ACADEMY OF MANAGEMENT ANNALS\",\n  \"ACADEMY OF MANAGEMENT JOURNAL\",\n  \"ACADEMY OF MANAGEMENT REVIEW\",\n  \"ACCOUNTING, ORGANIZATIONS AND SOCIETY\",\n  \"ADMINISTRATIVE SCIENCE QUARTERLY\",\n  \"AMERICAN ECONOMIC REVIEW\",\n  \"CONTEMPORARY ACCOUNTING RESEARCH\",\n  \"ECONOMETRICA\",\n  \"ENTREPRENEURSHIP THEORY AND PRACTICE\",\n  \"HARVARD BUSINESS REVIEW\",\n  \"HUMAN RELATIONS\",\n  \"HUMAN RESOURCE MANAGEMENT\",\n  \"INFORMATION SYSTEMS RESEARCH\",\n  \"JOURNAL OF ACCOUNTING AND ECONOMICS\",\n  \"JOURNAL OF ACCOUNTING RESEARCH\",\n  \"JOURNAL OF APPLIED PSYCHOLOGY\",\n  \"JOURNAL OF BUSINESS ETHICS\",\n  \"JOURNAL OF CONSUMER PSYCHOLOGY\",\n  \"JOURNAL OF CONSUMER RESEARCH\",\n  \"JOURNAL OF FINANCE\",\n  \"JOURNAL OF FINANCIAL AND QUANTITATIVE ANALYSIS\",\n  \"JOURNAL OF FINANCIAL ECONOMICS\",\n  \"JOURNAL OF INTERNATIONAL BUSINESS STUDIES\",\n  \"JOURNAL OF MANAGEMENT\",\n  \"JOURNAL OF MANAGEMENT INFORMATION SYSTEMS\",\n  \"JOURNAL OF MANAGEMENT STUDIES\",\n  \"JOURNAL OF MARKETING\",\n  \"JOURNAL OF MARKETING RESEARCH\",\n  \"JOURNAL OF OPERATIONS MANAGEMENT\",\n  \"JOURNAL OF POLITICAL ECONOMY\",\n  \"JOURNAL OF THE ACADEMY OF MARKETING SCIENCE\",\n  \"MANAGEMENT SCIENCE\",\n  \"MANUFACTURING & SERVICE OPERATIONS MANAGEMENT\",\n  \"MARKETING SCIENCE\",\n  \"MIS QUARTERLY\",\n  \"OPERATIONS RESEARCH\",\n  \"ORGANIZATION SCIENCE\",\n  \"ORGANIZATION STUDIES\",\n  \"ORGANIZATIONAL BEHAVIOR AND HUMAN DECISION PROCESSES\",\n  \"PRODUCTION AND OPERATIONS MANAGEMENT\",\n  \"QUARTERLY JOURNAL OF ECONOMICS\",\n  \"RESEARCH POLICY\",\n  \"REVIEW OF ACCOUNTING STUDIES\",\n  \"REVIEW OF ECONOMIC STUDIES\",\n  \"REVIEW OF FINANCE\",\n  \"REVIEW OF FINANCIAL STUDIES\",\n  \"SLOAN MANAGEMENT REVIEW\",\n  \"STRATEGIC ENTREPRENEURSHIP JOURNAL\",\n  \"STRATEGIC MANAGEMENT JOURNAL\"\n]);\n\n// ===== MAIN =====\nconst items = $input.all();\n\nreturn items.map(item => {\n  const data = item.json;  // 直接取当前 item 的数据\n  const journalUpper = (data.Source || '').toUpperCase().trim();\n\n  const isUTD24 = utd24.has(journalUpper);\n  const isFT50  = ft50.has(journalUpper);\n\n  let Rank = 'Not listed';\n  if (isUTD24 && isFT50) Rank = 'UTD24 & FT50';\n  else if (isUTD24) Rank = 'UTD24';\n  else if (isFT50) Rank = 'FT50';\n\n  // 直接修改原数据\n  data.Rank = Rank;\n\n  return { json: data };\n});\n"
      },
      "notesInFlow": true,
      "typeVersion": 2
    },
    {
      "id": "6dffab19-fc4b-4cce-98e2-f3b3df75f018",
      "name": "Batch Processor",
      "type": "n8n-nodes-base.splitInBatches",
      "notes": "Process items in batches.",
      "position": [
        -320,
        1248
      ],
      "parameters": {
        "options": {},
        "batchSize": 10
      },
      "notesInFlow": true,
      "typeVersion": 3
    },
    {
      "id": "815ae6d3-d485-4c22-be41-613e2e40104f",
      "name": "WOS Field Mapper",
      "type": "n8n-nodes-base.set",
      "notes": "Map WOS fields to consistent keys for LLM.",
      "position": [
        -544,
        1248
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "1fe90882-f72f-44b0-9957-1972abbc0b99",
              "name": "Authors",
              "type": "string",
              "value": "={{ $json.authors }}"
            },
            {
              "id": "3dcc8233-678c-4902-8cf4-41d051c8619c",
              "name": "Title",
              "type": "string",
              "value": "={{ $json.title }}"
            },
            {
              "id": "82b3d148-7206-45e1-a98b-48c2f12110cf",
              "name": "Publication_date",
              "type": "string",
              "value": "={{ $json.publication_date }}"
            },
            {
              "id": "3557f70f-c27c-4880-81b8-661a3c6c490a",
              "name": "Source",
              "type": "string",
              "value": "={{ $json.source }}"
            },
            {
              "id": "c2978a5d-2583-4400-9556-a9967f07c535",
              "name": "Abstract",
              "type": "string",
              "value": "={{ $json.abstract }}"
            }
          ]
        }
      },
      "notesInFlow": true,
      "typeVersion": 3.4
    },
    {
      "id": "48078b19-e7e8-4ed5-91f6-2540df195daf",
      "name": "Final Data Mapper",
      "type": "n8n-nodes-base.set",
      "position": [
        576,
        1248
      ],
      "parameters": {
        "options": {
          "ignoreConversionErrors": true
        },
        "assignments": {
          "assignments": [
            {
              "id": "3d64232b-c602-4bfa-867d-e19e6d5ee934",
              "name": "Authors",
              "type": "string",
              "value": "={{ $('Journal Rank Classifier').item.json.Authors }}"
            },
            {
              "id": "f05c2476-96fc-4edf-a06c-5a0e45026673",
              "name": "Title",
              "type": "string",
              "value": "={{ $('Journal Rank Classifier').item.json.Title }}"
            },
            {
              "id": "8a5667b9-8274-49fa-85a6-73b5cd440bd5",
              "name": "Publication_date",
              "type": "string",
              "value": "={{ $('Batch Processor').item.json.Publication_date }}"
            },
            {
              "id": "82c7191f-86de-4e4c-a242-655021a97fa4",
              "name": "Source",
              "type": "string",
              "value": "={{ $('Journal Rank Classifier').item.json.Source }}"
            },
            {
              "id": "5541b0bf-dbef-4724-a526-870ad9f08005",
              "name": "JournalRank",
              "type": "string",
              "value": "={{ $('Journal Rank Classifier').item.json.Rank }}"
            },
            {
              "id": "31c89435-c6b7-46c7-ab8b-b471b2c48f9d",
              "name": "AiSummary",
              "type": "string",
              "value": "={{ $json.output.Summary }}"
            },
            {
              "id": "f62c5f71-8219-420d-87ab-aba347f7673d",
              "name": "IndependentVariable",
              "type": "string",
              "value": "={{ Array.isArray($json.output.IV) ? $json.output.IV.join('; ') : $json.output.IV }}"
            },
            {
              "id": "5df47e1a-9772-4f42-bc7f-f4210cfa50cd",
              "name": "DependentVariable",
              "type": "string",
              "value": "={{ Array.isArray($json.output.DV) ? $json.output.DV.join('; ') : $json.output.DV }}"
            },
            {
              "id": "23f93176-157e-4e71-8c5f-29debc575297",
              "name": "Mediator",
              "type": "string",
              "value": "={{ Array.isArray($json.output.Mediator) ? $json.output.Mediator.join('; ') : $json.output.Mediator }}"
            },
            {
              "id": "655b398a-a201-45a5-becd-05f05ccaa567",
              "name": "Moderator",
              "type": "string",
              "value": "={{ Array.isArray($json.output.Moderator) ? $json.output.Moderator.join('; ') : $json.output.Moderator }}"
            },
            {
              "id": "4eaf14e2-bb55-459a-a31e-01d53393c979",
              "name": "Overaching_theory",
              "type": "string",
              "value": "={{ ($json.output.Overarching_theory || $json.output.Overaching_theory || []).join('; ') }}"
            },
            {
              "id": "46490da9-11af-4450-845e-5035e729842a",
              "name": "Abstract",
              "type": "array",
              "value": "={{ $('Journal Rank Classifier').item.json.Abstract }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "27414957-4c91-4ceb-8a3f-c0c31446f99a",
      "name": "Read Checkpoint Data",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -768,
        1248
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Checkpoint"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Get Sheet id').item.json.ID }}"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "i2QQ5h70aiZ7H0s3",
          "name": "Google Sheets(owen)"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "8a66f6d9-8024-4f74-8e08-bc7ac8268671",
      "name": "Save Final Results",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        800,
        1248
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [],
          "mappingMode": "autoMapInputData",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {
          "cellFormat": "RAW"
        },
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "FinalResult"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Get Sheet id').item.json.ID }}"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "i2QQ5h70aiZ7H0s3",
          "name": "Google Sheets(owen)"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "1de00028-e39b-446d-9f18-db67380ce4d1",
      "name": "Auto-fixing Output Parser1",
      "type": "@n8n/n8n-nodes-langchain.outputParserAutofixing",
      "position": [
        208,
        1472
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "b7ec38b4-5666-4c57-988c-f24dcfbc4e4e",
      "name": "Attendre for 3s",
      "type": "n8n-nodes-base.wait",
      "position": [
        1024,
        1424
      ],
      "webhookId": "8d861ed5-69d4-480b-914c-1d312ad1ef37",
      "parameters": {
        "amount": 3
      },
      "typeVersion": 1.1
    },
    {
      "id": "faa63b27-907a-48e7-bb85-b30763f7827d",
      "name": "call",
      "type": "n8n-nodes-base.executeWorkflow",
      "position": [
        704,
        336
      ],
      "parameters": {
        "options": {
          "waitForSubWorkflow": false
        },
        "workflowId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $workflow.id}}",
          "cachedResultUrl": "/workflow/=%7B%7B%20$workflow.id%7D%7D"
        },
        "workflowInputs": {
          "value": {
            "GoogleSheetID": "={{ $('Create spreadsheet').item.json.spreadsheetId }}"
          },
          "schema": [
            {
              "id": "GoogleSheetID",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "GoogleSheetID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "GoogleSheetID"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": true
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "94cb61b6-0096-4820-aa67-c6939a3801e6",
      "name": "Note adhésive",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2848,
        208
      ],
      "parameters": {
        "width": 704,
        "height": 784,
        "content": "# 🚀 Quick start\n\n## 📋 Workflow Overview\nThis automated workflow helps you:\n- 📥 Ingest academic bibliographic files (CSV/XLS/XLSX) you upload in chat\n- 🧾 Normalize academic paper metadata (authors, title, abstract, date, - source) into a Checkpoint sheet and ✉️ send progress notifications via Gmail\n- 🧠 Use an LLM to extract study variables (IV/DV; optional mediator, moderator, overarching theory)\n- 🏷️ Classify journal rank (UTD24 / FT50) and merge with metadata\n- 📊 Append the finalized table to FinalResult in Google Sheets and ✉️ send completion notifications via Gmail\n\n## 🔑 Credentials\n- **Google Sheets OAuth2** (read/write)\n- **Gmail OAuth2** (send notifications)\n- **Google Gemini** (or any LLM you prefer)\n    \n\n## 🛠️ How to set up\n1. Connect **Google Sheets**, **Gmail**, and **Gemini (or your LLM)** credentials.\n2. Open `File Upload Trigger` → upload your **CSV/XLSX/XLS** file and type a **name** in chat (used as the Google Sheets spreadsheet title).\n3. Watch your inbox for status emails and open the Google Sheets spreadsheet to review **Checkpoint** and **FinalResult**.\n\n## 📝 Note\n- 📝 **Make sure your file includes abstracts.** If the academic paper data you upload doesn’t contain an abstract, the extracted results will be far less useful.\n- 🧩 **CSV yields no items?** Encoding mismatches can break the workflow. If this happens, convert the CSV to `.xls` or `.xlsx` and try again."
      },
      "typeVersion": 1
    },
    {
      "id": "3b5ee089-b1a8-4824-b9bb-4e3cf6ceba0a",
      "name": "Note adhésive1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1584,
        -192
      ],
      "parameters": {
        "color": 2,
        "width": 960,
        "height": 1168,
        "content": "## 1) File Intake & Type Routing\n\n### **Purpose:**\n- Receive academic files, parse them into structured records by file type, and create a Google Sheet named by message; prepares for subsequent **normalize academic paper metadata** and variable extraction.  \n### **Covers nodes:**\n`File Upload Trigger` → `Create spreadsheet` → `File Type Router (Switch)` → (`CSV Data Extractor` | `XLS Data Extractor` | `XLSX Data Extractor`)\n\n### **What it does:**\n- Supports uploading `.csv`, `.xls`, and `.xlsx` files and a **message** in chat (used as the Google Sheets spreadsheet title).\n- Creates a Google Sheets spreadsheet titled from the chat input, with two tabs: `Checkpoint` and `FinalResult`.\n- Routes processing by file extension (CSV/XLS/XLSX); unsupported types return “Pls attach a file”.   \n\n### **Inputs consumed:**\n- Uploaded file (binary)\n- `SpreadsheetTitle` (from chat input)\n### **Output produced:**\n- Parsed records array (JSON) for downstream per-item processing.\n- Target spreadsheet `spreadsheetId` (includes `Checkpoint` / `FinalResult`)."
      },
      "typeVersion": 1
    },
    {
      "id": "35cc183c-93f8-4b76-8fd6-b609c6dd53f0",
      "name": "Note adhésive2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -592,
        -192
      ],
      "parameters": {
        "color": 3,
        "width": 1264,
        "height": 1168,
        "content": "## 2) Per-Record Processing & Metadata Extraction\n\n### **Purpose:** \n- Batch the parsed results, **normalize academic paper metadata** for each record, write core fields to `Checkpoint`, and send progress notifications.\n### **Covers nodes:** \n`Loop Over Items` → `Paper Metadata Extractor` → `Data Formatter` → `Save to Checkpoint Sheet` → `Wait for 3s.` → `Read Write in Data` → `Send process notication`\n\n### **What it does:**\n- Uses `Loop Over Items` (batch size = 10) to process records efficiently.\n- Runs `Paper Metadata Extractor`(Gemini+Structured Output), to extract **authors, title, abstract, publication_date, source** from each raw JSON record into a strict schema.\n- Normalizes fields in `Data Formatter` (e.g., joins authors with semicolons) and appends them using `Save to Checkpoint Sheet`.\n- Pauses briefly with `Wait for 3s.` make api happy.\n- After finished loop,sends an email via `Send notication` (Gmail)\n\n### **Inputs consumed:**\n- Parsed record JSON\n### **Output produced:**\n- Five normalized columns in the `Checkpoint` sheet (result of organizing bibliographic metadata).\n- Stage notifications via Gmail.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "3d10bbf2-50c8-4ac8-82a3-6fa848770ca3",
      "name": "Note adhésive3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1968,
        1008
      ],
      "parameters": {
        "color": 5,
        "width": 720,
        "height": 832,
        "content": "## 3) Journal Ranking & Study Variable Extraction\n\n### **Purpose:**\n* Use `Checkpoint` metadata to assign journal ranks and run a second LLM pass to extract study variables (DV/IV/Mediator/Moderator/Overarching_theory) plus a brief summary, then write results to `FinalResult`.\n### **Covers nodes:**\n`Get Sheet id` → `Read Checkpoint Data` → `WOS Field Mapper` → `Batch Processor` → `Journal Rank Classifier (Code)` → `Academic Variables Extractor (LLM Agent)` → `Final Data Mapper (Set)` → `Save Final Results (Append/Update)` → `Wait 3s` → `Send done notication`\n\n### **What it does:**\n* Controls throughput with batched processing for stable API calls and sheet writes.\n* Classifies journals against built-in UTD24/FT50 lists and assigns `Rank ∈ {UTD24, FT50, UTD24 & FT50, Not listed}`.\n* Uses Title + Abstract to extract a strict-schema JSON payload: `AiSummary, DependentVariable, IndependentVariable, Mediator, Moderator, Overarching_theory`; validates with an auto-fixing parser and the chosen LLM.\n* Merges base metadata, journal rank, and AI-extracted variables, then appends/updates the `FinalResult` sheet.\n* Briefly waits (`Wait 3s`) to reduce the chance of rate limiting.\n\n### **Inputs consumed:**\n* `Checkpoint`-normalized metadata\n### **Output produced:**\n* `FinalResult`: an integrated table combining organized bibliographic metadata, journal ranking, and study variables.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "88ab6929-3801-4134-857a-4faaefa7586a",
      "name": "Note adhésive4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1264,
        1008
      ],
      "parameters": {
        "color": 5,
        "width": 2544,
        "height": 832,
        "content": ""
      },
      "typeVersion": 1
    },
    {
      "id": "b401df9b-f757-4c4c-91ec-2b4a27b74dcb",
      "name": "Send process notication",
      "type": "n8n-nodes-base.gmail",
      "position": [
        416,
        336
      ],
      "webhookId": "ec263e2e-8a0a-4e49-bb00-9e830b9ab59f",
      "parameters": {
        "sendTo": "your gmail",
        "message": "=🎉Metadata Normalization Workflow Done\n📖 write 【{{ $items('Read Write in Data').length ? Math.max(...$items('Read Write in Data').map(i => Number(i.json.row_number))) -1: null }}】 paper into checkpoint sheet\n🕓{{ new Date().toLocaleString(\"en-CA\", { timeZone: \"Asia/Singapore\", hour12: false }).replace(',', '') }}",
        "options": {},
        "subject": "🎉Metadata Normalization Workflow Done",
        "emailType": "text"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "jCTNCiXplqBJRbmj",
          "name": "Gmail(owen)"
        }
      },
      "executeOnce": true,
      "typeVersion": 2.1
    },
    {
      "id": "890dcae0-0417-4a2b-9267-7e1714a65f45",
      "name": "Send done notication",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -96,
        1072
      ],
      "webhookId": "ec263e2e-8a0a-4e49-bb00-9e830b9ab59f",
      "parameters": {
        "sendTo": "your gmail",
        "message": "=🎉Study Variable Extraction Workflow Done\n📖 Time to study\n🕓{{ new Date().toLocaleString(\"en-CA\", { timeZone: \"Asia/Singapore\", hour12: false }).replace(',', '') }}",
        "options": {},
        "subject": "🎉Study Variable Extraction Workflow Done",
        "emailType": "text"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "jCTNCiXplqBJRbmj",
          "name": "Gmail(owen)"
        }
      },
      "executeOnce": true,
      "typeVersion": 2.1
    },
    {
      "id": "07f67c54-ba3c-41c3-9133-649a9215bf48",
      "name": "Note adhésive5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2800,
        1168
      ],
      "parameters": {
        "color": 4,
        "width": 576,
        "height": 208,
        "content": "# Tips\nSince the workflow makes multiple LLM calls, to avoid unexpected interruptions that waste time and tokens, a `checkpoint` is used to temporarily store data. If Step 3 fails and the workflow stops, activate the `manual trigger`, disable `When Executed by Another Workflow`, and manually adjust `Read Checkpoint Data`(id) so it reads from the previously written `checkpoint` sheet and then continue the workflow.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "676d7e8c-d66a-4fb5-8c3d-6734e7604d26",
      "name": "manual trigger",
      "type": "n8n-nodes-base.manualTrigger",
      "disabled": true,
      "position": [
        -1200,
        1376
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "7b82e214-b931-4181-8018-63fdcc585c73",
      "name": "Get Sheet id",
      "type": "n8n-nodes-base.set",
      "position": [
        -992,
        1184
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "9f2449d6-1013-4aa2-97b9-2e086903301b",
              "name": "ID",
              "type": "string",
              "value": "={{ $json.GoogleSheetID }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "75945c08-8b83-4bc2-9281-977a603ac9a7",
      "name": "Modèle de chat Google Gemini",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        96,
        1680
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "id": "OBsJ1xTy5eLJvjhJ",
          "name": "Gemini(pixel)"
        }
      },
      "typeVersion": 1
    }
  ],
  "pinData": {},
  "connections": {
    "Wait for 3s": {
      "main": [
        [
          {
            "node": "6dffab19-fc4b-4cce-98e2-f3b3df75f018",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7b82e214-b931-4181-8018-63fdcc585c73": {
      "main": [
        [
          {
            "node": "27414957-4c91-4ceb-8a3f-c0c31446f99a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait for 3s.": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "aa8da126-4765-480b-b1aa-94ad560cf6e3": {
      "main": [
        [
          {
            "node": "3ea2219f-3ea4-4728-a055-4386d45e435e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "676d7e8c-d66a-4fb5-8c3d-6734e7604d26": {
      "main": [
        [
          {
            "node": "27414957-4c91-4ceb-8a3f-c0c31446f99a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6dffab19-fc4b-4cce-98e2-f3b3df75f018": {
      "main": [
        [
          {
            "node": "890dcae0-0417-4a2b-9267-7e1714a65f45",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "e3e332f7-0805-4527-b466-226bc98e7e16",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [
          {
            "node": "9e79fe64-91f9-4a30-b684-af194ba194cf",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "fe2a68e9-b162-445e-ae46-aed72fe9559c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "14bc11af-a987-47e1-8bd5-a9f623cb208d": {
      "main": [
        [
          {
            "node": "b053af46-c202-4217-8f06-a0e0c7a0f94b",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "06ff1131-994f-47de-be13-6136cf9ecb04",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "3b6cea37-8cf0-45e3-b15b-716e2aeec3c8",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "f1260b49-b8d7-4148-bac0-60010ae07c06",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "815ae6d3-d485-4c22-be41-613e2e40104f": {
      "main": [
        [
          {
            "node": "6dffab19-fc4b-4cce-98e2-f3b3df75f018",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "48078b19-e7e8-4ed5-91f6-2540df195daf": {
      "main": [
        [
          {
            "node": "8a66f6d9-8024-4f74-8e08-bc7ac8268671",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b053af46-c202-4217-8f06-a0e0c7a0f94b": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5eaa37da-ba8f-413e-9965-4a0e5981fa3d": {
      "main": [
        [
          {
            "node": "14bc11af-a987-47e1-8bd5-a9f623cb208d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9e79fe64-91f9-4a30-b684-af194ba194cf": {
      "main": [
        [
          {
            "node": "b401df9b-f757-4c4c-91ec-2b4a27b74dcb",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8a66f6d9-8024-4f74-8e08-bc7ac8268671": {
      "main": [
        [
          {
            "node": "Wait for 3s",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "06ff1131-994f-47de-be13-6136cf9ecb04": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ca176a9b-ae02-4afd-a50e-b11d1c37c311": {
      "main": [
        [
          {
            "node": "5eaa37da-ba8f-413e-9965-4a0e5981fa3d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3b6cea37-8cf0-45e3-b15b-716e2aeec3c8": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "27414957-4c91-4ceb-8a3f-c0c31446f99a": {
      "main": [
        [
          {
            "node": "815ae6d3-d485-4c22-be41-613e2e40104f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "e3e332f7-0805-4527-b466-226bc98e7e16": {
      "main": [
        [
          {
            "node": "52ab0f2d-272b-4e57-b4b1-b6fc08550e40",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b401df9b-f757-4c4c-91ec-2b4a27b74dcb": {
      "main": [
        [
          {
            "node": "faa63b27-907a-48e7-bb85-b30763f7827d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "52ab0f2d-272b-4e57-b4b1-b6fc08550e40",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "1de00028-e39b-446d-9f18-db67380ce4d1",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "fe2a68e9-b162-445e-ae46-aed72fe9559c": {
      "main": [
        [
          {
            "node": "aa8da126-4765-480b-b1aa-94ad560cf6e3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3ea2219f-3ea4-4728-a055-4386d45e435e": {
      "main": [
        [
          {
            "node": "Wait for 3s.",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9ed01cca-b185-4e4f-9a86-99691152a70d": {
      "ai_outputParser": [
        [
          {
            "node": "1de00028-e39b-446d-9f18-db67380ce4d1",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "8acb6ded-253b-409b-9e8b-004f4290a2a9": {
      "ai_outputParser": [
        [
          {
            "node": "fe2a68e9-b162-445e-ae46-aed72fe9559c",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "8acb6ded-253b-409b-9e8b-004f4290a2a9",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "fe2a68e9-b162-445e-ae46-aed72fe9559c",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "2bc80873-54d9-400c-b6a4-762af5fe1fdf": {
      "ai_outputParser": [
        [
          {
            "node": "8acb6ded-253b-409b-9e8b-004f4290a2a9",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "1de00028-e39b-446d-9f18-db67380ce4d1": {
      "ai_outputParser": [
        [
          {
            "node": "52ab0f2d-272b-4e57-b4b1-b6fc08550e40",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "52ab0f2d-272b-4e57-b4b1-b6fc08550e40": {
      "main": [
        [
          {
            "node": "48078b19-e7e8-4ed5-91f6-2540df195daf",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "716b6a67-b194-4ea6-b24f-5cf9002e78c1": {
      "main": [
        [
          {
            "node": "7b82e214-b931-4181-8018-63fdcc585c73",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Avancé - Extraction de documents, Résumé IA

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Informations sur le workflow
Niveau de difficulté
Avancé
Nombre de nœuds39
Catégorie2
Types de nœuds17
Description de la difficulté

Adapté aux utilisateurs avancés, avec des workflows complexes contenant 16+ nœuds

Auteur

A graduate student who is learning n8n

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34