This workflow follows the Agent → Chainllm recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"active": true,
"activeVersion": {
"updatedAt": "2025-12-03T17:30:58.237Z",
"createdAt": "2025-12-03T17:30:58.237Z",
"versionId": "e96949e7-2c77-482a-974d-c77bb454270c",
"workflowId": "71hsjPmhK3mmIjWl",
"nodes": [
{
"parameters": {
"formTitle": " bookSummary",
"formDescription": "=Book Summary est un outil qui permet de cr\u00e9er le r\u00e9sum\u00e9 d'un lvire.\n\nComment l'utiliser ?\nFournissez le nom de l'auteur et le titre du livre.\n\nCe workflow est con\u00e7u pour s'ex\u00e9cuter de mani\u00e8re autonome. Une fois termin\u00e9, le r\u00e9sum\u00e9 est sauvegard\u00e9 dans une page Notion.",
"formFields": {
"values": [
{
"fieldType": "html"
}
]
},
"options": {
"buttonLabel": "Next",
"path": "bookSummary",
"ignoreBots": true
}
},
"id": "56220afd-3dc4-49df-827b-1289a0a75dfd",
"name": "On form submission",
"type": "n8n-nodes-base.formTrigger",
"position": [
-240,
32
],
"webhookId": "ce545434-e845-4fed-8d5b-bbdba30e40a7",
"typeVersion": 2.2
},
{
"parameters": {
"workflowInputs": {
"values": [
{
"name": "pageId"
},
{
"name": "data",
"type": "object"
},
{
"name": "jobType"
}
]
}
},
"id": "34ea5e4f-7fb7-44a9-b8e0-658f3e8c2432",
"name": "BookSummary Subworkflow",
"type": "n8n-nodes-base.executeWorkflowTrigger",
"position": [
-1088,
992
],
"typeVersion": 1.1
},
{
"parameters": {
"operation": "completion",
"completionTitle": "Merci d'utiliser BookSummary.",
"completionMessage": "Vous pouvez fermer la fen\u00eatre.",
"options": {}
},
"type": "n8n-nodes-base.form",
"typeVersion": 1,
"position": [
688,
32
],
"id": "abcb6f37-554d-473e-8ab7-58b084f0604b",
"name": "End Form",
"webhookId": "013ee839-a386-49fb-805e-23634f837908"
},
{
"parameters": {
"formFields": {
"values": [
{
"fieldLabel": "Titre",
"placeholder": "Titre du livre",
"requiredField": true
},
{
"fieldLabel": "Auteur",
"placeholder": "Nom de l'auteur",
"requiredField": true
}
]
},
"options": {
"formTitle": "BookSummary"
}
},
"type": "n8n-nodes-base.form",
"typeVersion": 1,
"position": [
-48,
32
],
"id": "b7a5219b-89b5-4973-a87e-0f66d5990705",
"name": "Research Request",
"webhookId": "e5cd24b3-9833-4d7c-ac4c-f2d6b53a959d"
},
{
"parameters": {
"pageId": {
"__rl": true,
"value": "https://www.notion.so/Ma-biblioth-que-1b582fe2640680f7bc10ea713f4e6aba",
"mode": "url"
},
"title": "={{ $json.title }} - {{ $json.author }}",
"options": {
"icon": "\ud83d\udcd8"
}
},
"type": "n8n-nodes-base.notion",
"typeVersion": 2.2,
"position": [
368,
32
],
"id": "491ba4cc-e2b8-41f0-8be1-030eb535f004",
"name": "Create Page",
"credentials": {
"notionApi": {
"id": "62MjEeirg4hzemTI",
"name": "Notion account"
}
}
},
{
"parameters": {
"dataToSave": {
"values": [
{
"key": "pageId",
"value": "={{ $json.pageId }}"
},
{
"key": "jobType",
"value": "={{ $json.jobType }}"
}
]
}
},
"type": "n8n-nodes-base.executionData",
"typeVersion": 1,
"position": [
-864,
992
],
"id": "5620a762-fc7d-4916-87cb-2a1bbb75dca3",
"name": "Execution Data"
},
{
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"leftValue": "={{ $json.jobType }}",
"rightValue": "initiate",
"operator": {
"type": "string",
"operation": "equals"
},
"id": "8b33c762-5b1c-41c1-829e-d8ef9c903e79"
}
],
"combinator": "and"
}
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "adebb414-35eb-4694-b494-c7a713c2572b",
"leftValue": "={{ $json.jobType }}",
"rightValue": "summaries",
"operator": {
"type": "string",
"operation": "equals",
"name": "filter.operator.equals"
}
}
],
"combinator": "and"
}
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "193fc70b-dd38-4fc7-be56-cafb5b3cf62e",
"leftValue": "={{ $json.jobType }}",
"rightValue": "report",
"operator": {
"type": "string",
"operation": "equals",
"name": "filter.operator.equals"
}
}
],
"combinator": "and"
}
}
]
},
"options": {}
},
"type": "n8n-nodes-base.switch",
"typeVersion": 3.2,
"position": [
-640,
992
],
"id": "a869f477-3e1b-4435-bff8-159ff50714e4",
"name": "JobType Router"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "acb41e93-70c6-41a3-be0f-e5a74ec3ec88",
"name": "query",
"type": "string",
"value": "={{ $('JobType Router').first().json.data.query }} 1"
},
{
"id": "7fc54063-b610-42bc-a250-b1e8847c4d1e",
"name": "summaries",
"type": "array",
"value": "={{ $('JobType Router').first().json.data.summaries }}"
}
]
},
"options": {}
},
"id": "4d36a391-d3f4-4a0c-91cf-bf38b39a1f93",
"name": "Set Initial Query",
"type": "n8n-nodes-base.set",
"position": [
-240,
400
],
"typeVersion": 3.4,
"alwaysOutputData": true
},
{
"parameters": {
"workflowId": {
"__rl": true,
"value": "={{ $workflow.id }}",
"mode": "id"
},
"workflowInputs": {
"mappingMode": "defineBelow",
"value": {
"data": "={{ \n {\n \"query\": `Titre: ${$('Set Variables').first().json.title} - Auteur: ${$('Set Variables').first().json.author}. Etape:`,\n \"summaries\": []\n }\n}}",
"pageId": "={{ $json.id }}",
"jobType": "initiate"
},
"matchingColumns": [],
"schema": [
{
"id": "pageId",
"displayName": "pageId",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string",
"removed": false
},
{
"id": "data",
"displayName": "data",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "object",
"removed": false
},
{
"id": "jobType",
"displayName": "jobType",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string",
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": true
},
"mode": "each",
"options": {}
},
"type": "n8n-nodes-base.executeWorkflow",
"typeVersion": 1.2,
"position": [
880,
32
],
"id": "42d6cdc6-a3f6-43e7-a33b-b29ff4900c68",
"name": "Initiate BookSummary"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "d88bfe95-9e73-4d25-b45c-9f164b940b0e",
"name": "query",
"type": "string",
"value": "={{ `${$('JobType Router').first().json.data.query} ${$json.currentStep + 1}` }}"
}
]
},
"options": {}
},
"id": "92dd3719-68f7-46e1-a51b-44a8d0fb7fde",
"name": "Set Next Queries",
"type": "n8n-nodes-base.set",
"position": [
688,
544
],
"typeVersion": 3.4
},
{
"parameters": {
"workflowId": {
"__rl": true,
"value": "={{ $workflow.id }}",
"mode": "id"
},
"workflowInputs": {
"mappingMode": "defineBelow",
"value": {
"pageId": "={{ $json.pageId }}",
"data": "={{ $json.data }}",
"jobType": "={{ $json.jobType }}"
},
"matchingColumns": [],
"schema": [
{
"id": "pageId",
"displayName": "pageId",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string",
"removed": false
},
{
"id": "data",
"displayName": "data",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "object",
"removed": false
},
{
"id": "jobType",
"displayName": "jobType",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string",
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": true
},
"options": {
"waitForSubWorkflow": false
}
},
"id": "fdf8fe83-96df-4579-8308-a83db1e17576",
"name": "Generate Report",
"type": "n8n-nodes-base.executeWorkflow",
"position": [
880,
304
],
"typeVersion": 1.2
},
{
"parameters": {
"workflowId": {
"__rl": true,
"value": "={{ $workflow.id }}",
"mode": "id"
},
"workflowInputs": {
"mappingMode": "defineBelow",
"value": {
"pageId": "={{ $('JobType Router').first().json.pageId }}",
"data": "={{ $json }}",
"jobType": "summaries"
},
"matchingColumns": [],
"schema": [
{
"id": "pageId",
"displayName": "pageId",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string"
},
{
"id": "data",
"displayName": "data",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "object"
},
{
"id": "jobType",
"displayName": "jobType",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string",
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": true
},
"mode": "each",
"options": {
"waitForSubWorkflow": true
}
},
"id": "74e5bafe-17c1-4f8a-b0fb-f6de22399829",
"name": "Generate Summaries",
"type": "n8n-nodes-base.executeWorkflow",
"position": [
-48,
400
],
"typeVersion": 1.2
},
{
"parameters": {
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"conditions": [
{
"id": "75d18d88-6ba6-43df-bef7-3e8ad99ad8bd",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.currentStep >= 7 }}",
"rightValue": ""
}
],
"combinator": "and"
},
"options": {}
},
"id": "d7d48a81-444f-4ee4-869c-07c0a772ae55",
"name": "Should Stop ?",
"type": "n8n-nodes-base.if",
"position": [
368,
400
],
"typeVersion": 2.2
},
{
"parameters": {
"promptType": "define",
"text": "=Etant donn\u00e9 la requ\u00eate suivante: <query>{{ $json.query }}</query>, g\u00e9nere le r\u00e9sum\u00e9 d\u00e9fini par l'\u00e9tape pour le livre mentionn\u00e9.\n\n** Tr\u00e8s important **\n- Assure toi de respecter scrupuleusement le format de sortie attendu.\n- Retourne moi uniquement la partie mentionn\u00e9 dans l'\u00e9tape et rien d'autre.\n\nPar exemple: Si tu vois \"Etape: 4\", retounre moi la partie sur \"# 4. M\u00e9thodologie et preuves\" en suivant les instructions tel que mentionn\u00e9 dans ton system prompt.\n\nFormat de sortie:\n<output>\nmodelName: indique \"gpt\"\ncontent: indique ici le r\u00e9sum\u00e9\n</output>",
"hasOutputParser": true,
"options": {
"systemMessage": "={{ $json.systemPrompt }}"
}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 1.7,
"position": [
32,
832
],
"id": "ed6c04c9-88e8-484e-a142-7178d5ed53c1",
"name": "AI Agent",
"retryOnFail": true,
"waitBetweenTries": 5000
},
{
"parameters": {
"jsonSchemaExample": "{\n \"modelName\": \"name\",\n \"content\": \"Le r\u00e9sum\u00e9 de l'\u00e9tape\"\n}"
},
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"typeVersion": 1.2,
"position": [
272,
992
],
"id": "aa1f03fc-791a-4474-be24-745817e75183",
"name": "Structured Output Parser"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "8329cf5f-9642-4de1-b0cf-9c10ab94e2fc",
"name": "systemPrompt",
"value": "=# \ud83d\udcd6 Prompt pour g\u00e9n\u00e9rer des fiches de lecture d\u00e9taill\u00e9es\n\n## \ud83c\udfaf Contexte \nTu vas r\u00e9diger une **fiche de lecture structur\u00e9e** sur un livre d'\u00e9conomie, de d\u00e9veloppement personnel ou un roman. \nL'objectif est d'analyser l'ouvrage en profondeur, en mettant en avant ses **id\u00e9es principales**, sa **m\u00e9thodologie**, son **impact** et une **r\u00e9flexion personnelle**. \n\nLe but est d'obtenir une fiche utile pour se rappeler des points essentiels, mais aussi pour partager avec d'autres personnes int\u00e9ress\u00e9es par le sujet. \n\n## \ud83d\udcdd Instructions pour g\u00e9n\u00e9rer la fiche \n\nR\u00e9dige une fiche de lecture compl\u00e8te en respectant les \u00e9tapes suivantes : \n\n---\n\n## 1. Informations g\u00e9n\u00e9rales \n\n- **Titre** : \n- **Auteur** : \n- **\u00c9diteur** : \n- **Ann\u00e9e de publication** : \n\n### \ud83d\udccc Contexte historique et intellectuel \n > Ex. *Le Cygne Noir* de Nassim Taleb s'inscrit dans la pens\u00e9e critique sur la gestion des risques et l'incertitude, en opposition aux mod\u00e8les pr\u00e9dictifs classiques utilis\u00e9s en finance.*\n\n---\n\n## 2. Th\u00e8se et objectifs \n\n### \u2753 Probl\u00e9matique centrale \n> Quelle question l\u2019auteur cherche-t-il \u00e0 r\u00e9soudre ? \n> *Ex. Taleb explore comment les \u00e9v\u00e9nements rares et impr\u00e9visibles ont un impact majeur sur nos vies et notre \u00e9conomie.*\n\n### \ud83c\udfaf Objectifs de l\u2019auteur \n- Quelle nouvelle perspective apporte l\u2019auteur ? \n- Quels changements de pens\u00e9e ou d\u2019action veut-il provoquer chez le lecteur ? \n > *Ex. Dans* La Semaine de 4 heures *, Tim Ferriss propose une approche r\u00e9volutionnaire du travail qui encourage \u00e0 automatiser ses revenus et \u00e0 r\u00e9duire le temps consacr\u00e9 au travail salari\u00e9.*\n\n---\n\n## 3. Structure et arguments \n\n### \ud83d\udcda Plan du livre \nR\u00e9sum\u00e9 rapide de l'organisation du livre : \n- **Nombre de chapitres / parties** \n- **Logique de progression** \n\n### \ud83d\udd11 Points cl\u00e9s \nIdentification des id\u00e9es majeures et concepts principaux : \n- **Ex. Le Cygne Noir** : le r\u00f4le des \u00e9v\u00e9nements impr\u00e9vus, la distinction entre M\u00e9diocristan et Extremistan. \n- **Ex. La Semaine de 4h** : la loi de Pareto (80/20), l'automatisation du revenu. \n\n---\n\n## 4. M\u00e9thodologie et preuves \n\n### \ud83d\udcd6 Sources et exemples utilis\u00e9s \nL\u2019auteur s\u2019appuie-t-il sur des \u00e9tudes de cas, des statistiques, des t\u00e9moignages ? \n> Ex. *Taleb illustre son propos avec des \u00e9v\u00e9nements historiques comme la crise financi\u00e8re de 2008, d\u00e9montrant comment les mod\u00e8les \u00e9conomiques classiques \u00e9chouent \u00e0 pr\u00e9voir les crises.*\n\n### \ud83d\udd0d Analyse critique \n- **Les arguments sont-ils convaincants ?** \n- **Y a-t-il des biais, des lacunes, des \u00e9l\u00e9ments contestables ?** \n> Ex. *Certains reprochent \u00e0 Taleb un manque de solutions concr\u00e8tes et une tendance \u00e0 l\u2019exag\u00e9ration.* \n\n---\n\n## 5. Implications et applications pratiques \n\n### \ud83c\udf0d Impact des id\u00e9es \nComment appliquer les concepts propos\u00e9s dans la vie r\u00e9elle ? \n> *Ex. Pour un entrepreneur, la gestion du risque selon Taleb peut inspirer une strat\u00e9gie d\u2019investissement prudente bas\u00e9e sur l\u2019anti-fragilit\u00e9.* \n\n### \ud83d\udd04 Comparaison avec d\u2019autres approches \n- Quelles th\u00e9ories ou auteurs proposent des id\u00e9es similaires ou oppos\u00e9es ? \n- Existe-t-il d\u2019autres moyens de r\u00e9pondre \u00e0 la probl\u00e9matique ? \n\n---\n\n## 6. R\u00e9flexion personnelle \n\n### \ud83d\udca1 Impressions et questionnements \nQu\u2019est-ce qui vous a marqu\u00e9 ? Trouvez-vous le livre pertinent, innovant, discutable ? \n\n### \ud83c\udfc6 Pertinence personnelle \n- En quoi cet ouvrage vous impacte-t-il ? \n- Change-t-il votre mani\u00e8re de penser ou d\u2019agir ? \n\n---\n\n## 7. Conclusion et synth\u00e8se \n\n### \ud83d\udd01 R\u00e9capitulatif des id\u00e9es essentielles \nSynth\u00e8se en quelques phrases des **id\u00e9es majeures**, **arguments cl\u00e9s**, et **impact** du livre. \n\n### \ud83c\udf1f Ouverture \n- Pourquoi ce livre est important dans son domaine ? \n- Quelle r\u00e9flexion plus large cela ouvre-t-il ? \n- Quelles autres lectures pourraient compl\u00e9ter cette analyse ? \n\n---\n\n## \ud83d\udccc Structuration et mise en forme recommand\u00e9es \n\n- **Sections principales (H1 `##`)** \u2192 Suivent les grandes \u00e9tapes de la fiche \n- **Sous-sections (H3 `###`)** \u2192 D\u00e9tail des \u00e9l\u00e9ments de chaque \u00e9tape \n- **Citations du livre** \u2192 Utiliser les blocs `>` pour mettre en valeur des extraits \n- **Listes \u00e0 puces** \u2192 Pour les id\u00e9es cl\u00e9s \n- **Exemples en italique** \u2192 Pour donner du contexte \n\n---\n\n\ud83c\udfaf **Objectif final** : Obtenir une fiche de lecture bien structur\u00e9e, synth\u00e9tique et facile \u00e0 relire.",
"type": "string"
},
{
"id": "8ec2711a-c778-4d2f-ab26-08d6696964a6",
"name": "query",
"value": "={{ $('JobType Router').first().json.data.query.trim() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
-240,
992
],
"id": "9abcf937-0f60-42bd-aa01-ead2b0839406",
"name": "Edit Fields"
},
{
"parameters": {
"promptType": "define",
"text": "=Etant donn\u00e9 la requ\u00eate suivante: <query>{{ $json.query }}</query>, g\u00e9nere le r\u00e9sum\u00e9 d\u00e9fini par l'\u00e9tape pour le livre mentionn\u00e9.\n\n** Tr\u00e8s important **\n- Assure toi de respecter scrupuleusement le format de sortie attendu.\n- Retourne moi uniquement la partie mentionn\u00e9 dans l'\u00e9tape et rien d'autre.\n\nPar exemple: Si tu vois \"Etape: 4\", retounre moi la partie sur \"# 4. M\u00e9thodologie et preuves\" en suivant les instructions tel que mentionn\u00e9 dans ton system prompt.\n\nFormat de sortie:\n<output>\nmodelName: indique \"claude\"\ncontent: indique ici le r\u00e9sum\u00e9\n</output>",
"hasOutputParser": true,
"options": {
"systemMessage": "={{ $json.systemPrompt }}"
}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 1.7,
"position": [
32,
1136
],
"id": "249cc318-438c-4734-a5b5-2bb42cde22b2",
"name": "AI Agent1",
"retryOnFail": true,
"waitBetweenTries": 5000
},
{
"parameters": {},
"type": "n8n-nodes-base.merge",
"typeVersion": 3,
"position": [
528,
976
],
"id": "cb666a8f-762f-4a41-b6b5-7ec7c3bb8362",
"name": "Merge"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "56340b31-7474-4542-8c90-7b00673767a0",
"name": "title",
"value": "={{ $json.Titre.trim() }}",
"type": "string"
},
{
"id": "41af239e-7d0f-4388-b87c-e9534dfc7401",
"name": "author",
"value": "={{ $json.Auteur.trim() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
160,
32
],
"id": "673f1477-d891-4a50-a8f7-20463439ee58",
"name": "Set Variables"
},
{
"parameters": {
"jsCode": "const maxStep = $('Set Current Step').first().json.currentStep;\nconst queryString = $('JobType Router').first().json.data.query;\nconst titleMatch = queryString.match(/Titre:\\s*(.*?)\\s*-\\s*Auteur:/i);\nconst title = titleMatch ? titleMatch[1].trim() : \"Titre inconnu\";\nconst authorMatch = queryString.match(/Auteur:\\s*(.*?)(?:\\.\\s*Etape:|\\s*$)/i);\nconst author = authorMatch ? authorMatch[1].trim() : \"Auteur inconnu\";\n\nreturn {\n pageId: $('JobType Router').first().json.pageId,\n jobType: \"report\",\n data: {\n query: `${title} - ${author}`,\n summaries: Array(maxStep)\n .fill(0)\n .flatMap((_, i) => {\n try {\n const results = $('Generate Summaries').all(0, i);\n if (results && results.length > 0) {\n return [{\n step: i + 1,\n summary: results.map(item => ({\n modelName: item.json.output.modelName,\n content: item.json.output.content\n }))\n }];\n }\n return [];\n } catch (e) {\n return [];\n }\n })\n }\n};"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
688,
304
],
"id": "758e4424-a5ab-4e83-b3a6-6eb0a3018251",
"name": "Format Result"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "8d1d3e13-452a-4bf5-8402-ee6450e2bfdb",
"name": "currentStep",
"value": "={{ $runIndex + 1 }}",
"type": "number"
}
]
},
"options": {}
},
"id": "4451917e-fc25-4e1b-810b-db1d2887c9b8",
"name": "Set Current Step",
"type": "n8n-nodes-base.set",
"position": [
160,
400
],
"executeOnce": true,
"typeVersion": 3.4,
"alwaysOutputData": false
},
{
"parameters": {
"promptType": "define",
"text": "=Liste des r\u00e9sum\u00e9s sur lesquels tu dois perform\u00e9 le contr\u00f4le et le formatage:\n{{\n $('JobType Router').first().json.data.summaries &&\n `<summaries>\n ${$('JobType Router').first().json.data.summaries.map(summaryItem => \n `<step>${summaryItem.step}</step>\n ${summaryItem.summary.map(item => \n `<summary>\n <model>${item.modelName}</model>\n <content>${item.content}</content>\n </summary>`\n ).join('\\n')}`\n ).join('\\n')}\n </summaries>`\n}}\n",
"messages": {
"messageValues": [
{
"message": "=# Agent de Contr\u00f4le et Formatage des R\u00e9sum\u00e9s de Livres\n\n## Contexte\nTu es un agent sp\u00e9cialis\u00e9 dans l'analyse, la fusion et le formatage des r\u00e9sum\u00e9s de livres g\u00e9n\u00e9r\u00e9s par deux mod\u00e8les d'IA diff\u00e9rents (GPT et Claude). Ces r\u00e9sum\u00e9s suivent une structure pr\u00e9d\u00e9finie en 7 parties pour cr\u00e9er une fiche de lecture compl\u00e8te.\n\n## Objectif\nCr\u00e9er une version unifi\u00e9e, non-redondante et correctement format\u00e9e du r\u00e9sum\u00e9 de livre en exploitant les meilleures contributions de chaque mod\u00e8le pour chaque section.\n\n## Don\u00e9es d'entr\u00e9e\nTu recevras une collection de r\u00e9sum\u00e9s structur\u00e9s comme suit:\n<summaries>\n <step>: Indique la partie dans laquelle on se trouve.\n <summary>\n <model>: Indique le mod\u00e8le LLM utilis\u00e9 pour cr\u00e9er la partie.\n <content>: Le contenu de la partie.\n </summary>\n</summaries>\n\n## Instructions\n\n### 1. Analyse et s\u00e9lection du contenu\nPour chaque section du r\u00e9sum\u00e9 (1 \u00e0 7):\n- Compare les versions fournies par gpt et claude\n- Identifie les informations uniques et pertinentes dans chaque version\n- S\u00e9lectionne les \u00e9l\u00e9ments les plus complets, pr\u00e9cis et bien formul\u00e9s\n- \u00c9vite toute redondance ou r\u00e9p\u00e9tition d'information\n\n### 2. Fusion intelligente\n- Ne te contente pas de concat\u00e9ner les informations, mais fusionne-les de mani\u00e8re coh\u00e9rente\n- Pr\u00e9serve les informations distinctives et compl\u00e9mentaires de chaque source\n- Assure une transition fluide entre les \u00e9l\u00e9ments de diff\u00e9rentes sources\n- Maintiens un ton et un style coh\u00e9rents dans l'ensemble du document\n\n### 3. V\u00e9rification de la structure\nAssure-toi que le r\u00e9sum\u00e9 final respecte rigoureusement la structure suivante:\n1. **Informations g\u00e9n\u00e9rales**\n - Donn\u00e9es bibliographiques\n - Contexte historique et intellectuel\n2. **Th\u00e8se et objectifs**\n - Probl\u00e9matique centrale\n - Objectifs de l'auteur\n3. **Structure et arguments**\n - Plan du livre\n - Points cl\u00e9s\n4. **M\u00e9thodologie et preuves**\n - Sources et exemples\n - Analyse critique\n5. **Implications et applications pratiques**\n - Impact des id\u00e9es\n - Comparaison avec d'autres approches\n6. **R\u00e9flexion personnelle**\n - Impressions et questionnements\n - Pertinence personnelle\n7. **Conclusion et synth\u00e8se**\n - R\u00e9capitulatif des id\u00e9es essentielles\n - Ouverture\n\n### 4. Formatage Markdown\n- Utilise le format Markdown de mani\u00e8re rigoureuse:\n - Sections principales (H1) avec `#` pour les 7 grandes parties\n - Sous-sections (H3) avec `###` pour les d\u00e9tails de chaque partie\n - Citations en blocs `>` pour les extraits du livre\n - Listes \u00e0 puces `-` pour les concepts et id\u00e9es cl\u00e9s\n - *Italique* pour les exemples et illustrations\n - **Gras** pour les concepts importants\n\nPour la partie Donn\u00e9es bibliographiques:\nFournir uniquement liste qui contient: titre, auteur, \u00e9diteur, ann\u00e9e.\nNe pas indiquer \"Donn\u00e9es bibliographiques\" comme titre, mais simplement la liste avec le champs en gras et la valeur normal (par exemple: **Titre** : Valeur). \n\n### 5. V\u00e9rification finale\n- Assure-toi que toutes les sections sont pr\u00e9sentes et substantielles\n- V\u00e9rifie que le formatage Markdown est correct et coh\u00e9rent\n- Garantis que le document final est bien structur\u00e9, informatif et agr\u00e9able \u00e0 lire\n- \u00c9limine toute redondance ou r\u00e9p\u00e9tition inutile\n\n## Format de sortie\nFournis uniquement le r\u00e9sum\u00e9 final en Markdown correctement format\u00e9, sans ajouter de commentaires ou d'explications sur le processus utilis\u00e9."
}
]
}
},
"id": "25684482-b0aa-4a74-a232-aafb0258f086",
"name": "BookSummary Control",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
-240,
1600
],
"typeVersion": 1.5
},
{
"parameters": {
"jsCode": "// Dans un n\u0153ud \"Code\" ou \"Function\"\nfunction formatSummaryWithColumns(html) {\n // 1. D'abord, corriger le HTML mal form\u00e9 o\u00f9 \"id=\" est directement coll\u00e9 \u00e0 \"</div>\"\n let correctedHtml = html.replace(/(<\\/div>)\\s*id=\"([^\"]+)\">(.*?<\\/h[1-6]>)/g, '$1\\n<h2 id=\"$2\">$3');\n \n // 2. Trouver la section \"1. Informations g\u00e9n\u00e9rales\" sans capturer les sections suivantes\n const section1Pattern = /<h1[^>]*>1\\.\\s*Informations g\u00e9n\u00e9rales[^>]*>([\\s\\S]*?)(?=<h1|$)/i;\n const section1Match = correctedHtml.match(section1Pattern);\n \n if (section1Match) {\n // 3. Cr\u00e9er la nouvelle mise en page \u00e0 deux colonnes pour cette section\n const imageUrl = $('Map imageUrl').first().json.imageUrl\n const originalContent = section1Match[0].replace(/<h1[^>]*>1\\.\\s*Informations g\u00e9n\u00e9rales[^>]*>/i, '');\n const newSection1 = `<h1 id=\"1informationsgnrales\">1. Informations g\u00e9n\u00e9rales</h1>\n <div>\n <div>\n <img src=\"${imageUrl}\">\n </div>\n <div>\n ${originalContent}\n </div>\n </div>`;\n \n // 4. Remplacer uniquement cette section, tout en pr\u00e9servant le reste du document\n correctedHtml = correctedHtml.replace(section1Pattern, newSection1);\n }\n \n return correctedHtml;\n}\n\n// Appliquer la fonction au HTML d'entr\u00e9e\nconst formattedHtml = formatSummaryWithColumns($input.first().json.data);\nreturn { data: formattedHtml };"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
400,
1824
],
"id": "aa9fae08-7e43-4377-9abb-85326548a154",
"name": "Insert image column"
},
{
"parameters": {
"jsCode": "const response = $input.first().json;\n\nconst imageUrl = (response && response.images_results && response.images_results.length > 0)\n ? response.images_results[0].original\n : \"https://st2.depositphotos.com/2769299/7314/i/450/depositphotos_73146775-stock-photo-a-stack-of-books-on.jpg\";\n\nreturn { imageUrl };"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
144,
1824
],
"id": "ecba5c20-57dd-4201-a0d2-8586ab262343",
"name": "Map imageUrl"
},
{
"parameters": {
"url": "https://serpapi.com/search",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "serpApi",
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "q",
"value": "={{ $('JobType Router').first().json.data.query }}"
},
{
"name": "engine",
"value": "google_images"
}
]
},
"options": {
"timeout": 10000
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
144,
1600
],
"id": "48d48d7d-acd0-4330-b088-1af6a9830a79",
"name": "Get book cover img",
"retryOnFail": true,
"credentials": {
"serpApi": {
"id": "cBTzRVPNlqxKCYDw",
"name": "SerpAPI account"
}
}
},
{
"parameters": {
"fieldToSplitOut": "tag",
"options": {}
},
"id": "a8ab1e71-a61e-4b84-a62c-f2cfa413f6e1",
"name": "Tags to Items1",
"type": "n8n-nodes-base.splitOut",
"position": [
672,
1824
],
"typeVersion": 1
},
{
"parameters": {
"mode": "markdownToHtml",
"markdown": "={{ $('BookSummary Control').item.json.text }}",
"options": {
"tables": true
}
},
"id": "24606314-ad4f-46fb-90b4-ea56bb033468",
"name": "Convert to HTML1",
"type": "n8n-nodes-base.markdown",
"position": [
400,
1600
],
"typeVersion": 1
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "851b8a3f-c2d3-41ad-bf60-4e0e667f6c58",
"name": "tag",
"type": "array",
"value": "={{ $json.data.match(/<div style=\"display: flex[^>]*>[\\s\\S]*?<\\/div>|<h[1-3][^>]*>[\\s\\S]*?(?=<h[1-3]|$)/g) }}"
}
]
},
"options": {}
},
"id": "7fbddf6a-7f80-4e65-b550-b9057667fca5",
"name": "HTML to Array1",
"type": "n8n-nodes-base.set",
"position": [
672,
1600
],
"typeVersion": 3.4
},
{
"parameters": {
"promptType": "define",
"text": "={{ $json.tag.trim() }}",
"messages": {
"messageValues": [
{
"message": "=Convertis le HTML suivant en son \u00e9quivalent de Bloc Notion selon le sch\u00e9ma API de Notion.\n* Assure-toi que le contenu est toujours inclus et reste le m\u00eame.\n* Renvoie uniquement une r\u00e9ponse JSON.\n* G\u00e9n\u00e8re des blocs de niveau enfant. Ne d\u00e9finis pas de propri\u00e9t\u00e9 \"parent\" ou \"children\".\n* Privil\u00e9gie fortement les titres, paragraphes, tableaux et des blocs de listes.\n* Les titres disponibles sont heading_1, heading_2 et heading_3 - h4, h5, h6 doivent utiliser le type heading_3 \u00e0 la place. Assure-toi que les titres utilisent la d\u00e9finition de texte enrichi.\n* Assure-toi que les blocs de listes incluent tous les \u00e9l\u00e9ments de la liste.\n\n## Exemples\n\n1. Titres\n```\n<h3 id=\"references\">References</h3>\n```\nse convertirait en\n```\n{\"object\": \"block\", \"type\": \"heading_3\", \"heading_3\": { \"rich_text\": [{\"type\": \"text\",\"text\": {\"content\": \"References\"}}]}}\n```\n\n2. Listes\n```\n<ul><li>hello</li><li>world</li></ul>\n```\nse convertirait en\n```\n[\n{\n \"object\": \"block\",\n \"type\": \"bulleted_list_item\",\n \"bulleted_list_item\": {\"rich_text\": [{\"type\": \"text\",\"text\": {\"content\": \"hello\"}}]}\n},\n{\n \"object\": \"block\",\n \"type\": \"bulleted_list_item\",\n \"bulleted_list_item\": {\"rich_text\": [{\"type\": \"text\",\"text\": {\"content\": \"world\"}}]}\n}\n]\n```\n\n3. Tableaux\n```\n<table>\n <thead>\n <tr><th>Technology</th><th>Potential Impact</th></tr>\n </thead>\n <tbody>\n <tr>\n <td>5G Connectivity</td><td>Enables faster data speeds and advanced apps</td>\n </tr>\n </tbody>\n</table>\n```\nse convertirait en\n```\n{\n \"object\": \"block\",\n \"type\": \"table\",\n \"table\": {\n \"table_width\": 2,\n \"has_column_header\": true,\n \"has_row_header\": false,\n \"children\": [\n {\n \"object\": \"block\",\n \"type\": \"table_row\",\n \"table_row\": {\n \"cells\": [\n [\n {\n \"type\": \"text\",\n \"text\": {\n \"content\": \"Technology\",\n \"link\": null\n }\n },\n {\n \"type\": \"text\",\n \"text\": {\n \"content\": \"Potential Impact\",\n \"link\": null\n }\n }\n ],\n [\n {\n \"type\": \"text\",\n \"text\": {\n \"content\": \"5G Connectivity\",\n \"link\": null\n }\n },\n {\n \"type\": \"text\",\n \"text\": {\n \"content\": \"Enables faster data speeds and advanced apps\",\n \"link\": null\n }\n }\n ]\n ]\n }\n }\n ]\n }\n}\n```\n\n4. Liens d'ancrage\nPuisque Notion ne prend pas en charge les liens d'ancrage, convertis-les simplement en blocs de texte enrichi \u00e0 la place.\n```\n<a href=\"#module-0-pre-course-setup-and-learning-principles\">Module 0: Pre-Course Setup and Learning Principles</a>\n```\nse convertit en\n```\n{\n \"object\": \"block\",\n \"type\": \"paragraph\",\n \"paragraph\": {\n \"rich_text\": [\n {\n \"type\": \"text\",\n \"text\": {\n \"content\": \"Module 0: Pre-Course Setup and Learning Principles\"\n }\n }\n ]\n }\n}\n```\n\n5. Parties HTML invalides\nLorsque le HTML n'est pas syntaxiquement valide, par ex. des balises de fermeture orphelines, ignore simplement la conversion et utilise un bloc de texte enrichi vide.\n```\n</li>\\n</ol>\n```\npeut \u00eatre remplac\u00e9 par\n```\n{\n \"object\": \"block\",\n \"type\": \"paragraph\",\n \"paragraph\": {\n \"rich_text\": [\n {\n \"type\": \"text\",\n \"text\": {\n \"content\": \" \"\n }\n }\n ]\n }\n}\n```\n\n6. Div et images\nPour les mises en page flexibles comme <div style=\"display: flex\">, transforme-les en une s\u00e9quence de blocs, d'abord un bloc image puis des paragraphes/listes pour maintenir le contenu dans l'ordre correct.\nPour les balises <img>, cr\u00e9e un bloc de type \"image\" et utilise l'URL dans l'attribut \"src\" comme source externe.\n```\n<div style=\"display: flex; align-items: flex-start;\">\n <div style=\"width: 20%;\">\n <img src=\"https://example.com/image.jpg\" alt=\"Description\" style=\"width: 100%;\">\n </div>\n <div style=\"width: 80%\">\n <ul><li>Item 1</li><li>Item 2</li></ul>\n </div>\n</div>\n```\nse convertirait en\n```\n{\n \"object\": \"block\",\n \"type\": \"column_list\",\n \"column_list\": {\n \"children\": [\n {\n \"object\": \"block\",\n \"type\": \"column\",\n \"column\": {\n \"children\": [\n {\n \"object\": \"block\",\n \"type\": \"image\",\n \"image\": {\n \"type\": \"external\",\n \"external\": {\n \"url\": \"https://example.com/image.jpg\"\n }\n }\n }\n ]\n }\n },\n {\n \"object\": \"block\",\n \"type\": \"column\",\n \"column\": {\n \"children\": [\n {\n \"object\": \"block\",\n \"type\": \"bulleted_list_item\",\n \"bulleted_list_item\": {\n \"rich_text\": [\n {\n \"type\": \"text\",\n \"text\": {\n \"content\": \"Item 1\"\n }\n }\n ]\n }\n },\n {\n \"object\": \"block\",\n \"type\": \"bulleted_list_item\",\n \"bulleted_list_item\": {\n \"rich_text\": [\n {\n \"type\": \"text\",\n \"text\": {\n \"content\": \"Item 2\"\n }\n }\n ]\n }\n }\n ]\n }\n }\n ]\n }\n}\n```\n\n7. Images simples\nPour les balises <img> ind\u00e9pendantes, cr\u00e9e un bloc image:\n```\n<img src=\"https://example.com/photo.jpg\" alt=\"Photo\" width=\"500\">\n```\nse convertirait en\n```\n{\n \"object\": \"block\",\n \"type\": \"image\",\n \"image\": {\n \"type\": \"external\",\n \"external\": {\n \"url\": \"https://example.com/photo.jpg\"\n },\n \"caption\": [\n {\n \"type\": \"text\",\n \"text\": {\n \"content\": \"Photo\"\n }\n }\n ]\n }\n}\n```\n"
}
]
}
},
"id": "d6330d6a-0bc8-4bce-bf48-8604cb1014e7",
"name": "Notion Block Generator1",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
944,
1600
],
"typeVersion": 1.5
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "73fcb8a0-2672-4bd5-86de-8075e1e02baf",
"name": "=block",
"type": "array",
"value": "={{\n(function(){\n // Nettoyage complet du texte JSON\n const cleanedJson = $json.text\n .replace(/```json/g, '')\n .replace(/```/g, '')\n .replace(/\\n\\s*/g, ' ')\n .trim();\n \n // Parse le JSON nettoy\u00e9\n let blocks = cleanedJson.parseJson();\n blocks = Array.isArray(blocks) ? blocks : [blocks];\n \n // Filtrer tout bloc vide potentiel ou paragraphe contenant uniquement des espaces\n blocks = blocks.filter(block => {\n if (block.type === 'paragraph' && \n block.paragraph.rich_text.length === 1 && \n block.paragraph.rich_text[0].text.content.trim() === '') {\n return false;\n }\n return true;\n });\n \n return blocks;\n})()\n}}"
}
]
},
"options": {}
},
"id": "ce6ec046-c707-4086-9509-baa56b2ba693",
"name": "Parse JSON blocks1",
"type": "n8n-nodes-base.set",
"position": [
1264,
1600
],
"executeOnce": false,
"typeVersion": 3.4,
"onError": "continueRegularOutput"
},
{
"parameters": {
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "f68cefe0-e109-4d41-9aa3-043f3bc6c449",
"operator": {
"type": "string",
"operation": "notExists",
"singleValue": true
},
"leftValue": "={{ $json.error }}",
"rightValue": ""
}
]
},
"options": {}
},
"id": "7e5b6f96-9488-47e1-9f16-1c26bb6d041c",
"name": "Valid Blocks1",
"type": "n8n-nodes-base.filter",
"position": [
1264,
1824
],
"typeVersion": 2.2
},
{
"parameters": {
"options": {}
},
"id": "b2e76439-828d-4f2c-9a6f-54a60d7ec8e5",
"name": "For Each Block...1",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1552,
1600
],
"typeVersion": 3
},
{
"parameters": {
"method": "PATCH",
"url": "=https://api.notion.com/v1/blocks/{{ $('JobType Router').first().json.pageId }}/children",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "notionApi",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Notion-Version",
"value": "2022-06-28"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{\n {\n \"children\": $json.block\n }\n}}",
"options": {
"timeout": "={{ 1000 * 60 }}"
}
},
"id": "6d859a6e-5e88-4fdf-b948-f90fa0ba3d17",
"name": "Add blocks to Notion Page1",
"type": "n8n-nodes-base.httpRequest",
"maxTries": 3,
"position": [
2000,
1760
],
"retryOnFail": true,
"typeVersion": 4.2,
"waitBetweenTries": 5000,
"credentials": {
"notionApi": {
"id": "62MjEeirg4hzemTI",
"name": "Notion account"
}
},
"onError": "continueRegularOutput"
},
{
"parameters": {
"method": "PATCH",
"url": "=https://api.notion.com/v1/pages/{{ $('JobType Router').first().json.pageId }}",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "notionApi",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Notion-Version",
"value": "2022-06-28"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{\n {\n \"cover\":{\n \"type\": \"external\",\n \"external\": {\n \"url\": \"https://images.unsplash.com/photo-1526243741027-444d633d7365?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=6000\"\n }\n }\n }\n}}",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
2000,
1584
],
"id": "87a0e319-784d-41ab-8e47-1391611be720",
"name": "Add page cover image1",
"retryOnFail": false,
"maxTries": 3,
"credentials": {
"notionApi": {
"id": "62MjEeirg4hzemTI",
"name": "Notion account"
}
}
},
{
"parameters": {
"content": "Erreur 409 mais ca update quand meme"
},
"type": "n8n-nodes-base.stickyNote",
"position": [
2192,
1536
],
"typeVersion": 1,
"id": "5f8736e2-5fa8-4cf2-bfb2-428a4d3d4350",
"name": "Sticky Note1"
},
{
"parameters": {
"model": "google/gemini-2.5-flash",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"typeVersion": 1,
"position": [
944,
1760
],
"id": "0c072612-2761-4397-96d7-02befa6d3c4f",
"name": "Gemini 2.5 flash",
"credentials": {
"openRouterApi": {
"id": "zb2293xtkSB2aBnr",
"name": "OpenRouter account"
}
}
},
{
"parameters": {
"model": "openai/o4-mini-high",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"typeVersion": 1,
"position": [
-240,
1744
],
"id": "4e6f5c67-de7c-49a5-8a1e-39380ff841db",
"name": "O4 mini",
"credentials": {
"openRouterApi": {
"id": "zb2293xtkSB2aBnr",
"name": "OpenRouter account"
}
}
},
{
"parameters": {
"model": "anthropic/claude-sonnet-4.5",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"typeVersion": 1,
"position": [
32,
1280
],
"id": "ee038ad5-8cc2-480e-9f89-468e115a2f6d",
"name": "Claude 4.5 Sonnet",
"credentials": {
"openRouterApi": {
"id": "zb2293xtkSB2aBnr",
"name": "OpenRouter account"
}
}
},
{
"parameters": {
"model": "openai/gpt-5-mini",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"typeVersion": 1,
"position": [
32,
992
],
"id": "e6b6eafb-ec30-427a-8311-b5362e599786",
"name": "5 mini",
"credentials": {
"openRouterApi": {
"id": "zb2293xtkSB2aBnr",
"name": "OpenRouter account"
}
}
}
],
"connections": {
"On form submission": {
"main": [
[
{
"node": "Research Request",
"type": "main",
"index": 0
}
]
]
},
"BookSummary Subworkflow": {
"main": [
[
{
"node": "Execution Data",
"type": "main",
"index": 0
}
]
]
},
"End Form": {
"main": [
[
{
"node": "Initiate BookSummary",
"type": "main",
"index": 0
}
]
]
},
"Research Request": {
"main": [
[
{
"node": "Set Variables",
"type": "main",
"index": 0
}
]
]
},
"Create Page": {
"main": [
[
{
"node": "End Form",
"type": "main",
"index": 0
}
]
]
},
"Execution Data": {
"main": [
[
{
"node": "JobType Router",
"type": "main",
"index": 0
}
]
]
},
"JobType Router": {
"main": [
[
{
"node": "Set Initial Query",
"type": "main",
"index": 0
}
],
[
{
"node": "Edit Fields",
"type": "main",
"index": 0
}
],
[
{
"node": "BookSummary Control",
"type": "main",
"index": 0
}
]
]
},
"Set Initial Query": {
"main": [
[
{
"node": "Generate Summaries",
"type": "main",
"index": 0
}
]
]
},
"Set Next Queries": {
"main": [
[
{
"node": "Generate Summaries",
"type": "main",
"index": 0
}
]
]
},
"Generate Summaries": {
"main": [
[
{
"node": "Set Current Step",
"type": "main",
"index": 0
}
]
]
},
"Should Stop ?": {
"main": [
[
{
"node": "Format Result",
"type": "main",
"index": 0
}
],
[
{
"node": "Set Next Queries",
"type": "main",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "AI Agent",
"type": "ai_outputParser",
"index": 0
},
{
"node": "AI Agent1",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Edit Fields": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
},
{
"node": "AI Agent1",
"type": "main",
"index": 0
}
]
]
},
"AI Agent1": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Set Variables": {
"main": [
[
{
"node": "Create Page",
"type": "main",
"index": 0
}
]
]
},
"Format Result": {
"main": [
[
{
"node": "Generate Report",
"type": "main",
"index": 0
}
]
]
},
"Set Current Step": {
"main": [
[
{
"node": "Should Stop ?",
"type": "main",
"index": 0
}
]
]
},
"BookSummary Control": {
"main": [
[
{
"node": "Get book cover img",
"type": "main",
"index": 0
}
]
]
},
"Insert image column": {
"main": [
[
{
"node": "HTML to Array1",
"type": "main",
"index": 0
}
]
]
},
"Map imageUrl": {
"main": [
[
{
"node": "Convert to HTML1",
"type": "main",
"index": 0
}
]
]
},
"Get book cover img": {
"main": [
[
{
"node": "Map imageUrl",
"type": "main",
"index": 0
}
]
]
},
"Tags to Items1": {
"main": [
[
{
"node": "Notion Block Generator1",
"type": "main",
"index": 0
}
]
]
},
"Convert to HTML1": {
"main": [
[
{
"node": "Insert image column",
"type": "main",
"index": 0
}
]
]
},
"HTML to Array1": {
"main": [
[
{
"node": "Tags to Items1",
"type": "main",
"index": 0
}
]
]
},
"Notion Block Generator1": {
"main": [
[
{
"node": "Parse JSON blocks1",
"type": "main",
"index": 0
}
]
]
},
"Parse JSON blocks1": {
"main": [
[
{
"node": "Valid Blocks1",
"type": "main",
"index": 0
}
]
]
},
"Valid Blocks1": {
"main": [
[
{
"node": "For Each Block...1",
"type": "main",
"index": 0
}
]
]
},
"For Each Block...1": {
"main": [
[
{
"node": "Add page cover image1",
"type": "main",
"index": 0
}
],
[
{
"node": "Add blocks to Notion Page1",
"type": "main",
"index": 0
}
]
]
},
"Add blocks to Notion Page1": {
"main": [
[
{
"node": "For Each Block...1",
"type": "main",
"index": 0
}
]
]
},
"Gemini 2.5 flash":
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
notionApiopenRouterApiserpApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Book Summary. Uses formTrigger, executeWorkflowTrigger, form, notion. Event-driven trigger; 39 nodes.
Source: https://github.com/thibaud57/n8n-backups/blob/0b2c44384eab28add0604966d9663179e4bbd64a/workflows/notion/71hsjPmhK3mmIjWl.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
The AI-Powered Shopify SEO Content Automation is an enterprise-grade workflow that transforms product content creation for e-commerce stores. This sophisticated multi-agent system integrates GPT-4o, C
This template attempts to replicate OpenAI's DeepResearch feature which, at time of writing, is only available to their pro subscribers.
Deep Research new (fr). Uses outputParserStructured, formTrigger, chainLlm, form. Event-driven trigger; 82 nodes.
My workflow 53. Uses formTrigger, httpRequest, lmChatOpenAi, form. Event-driven trigger; 74 nodes.
Who is this for? Agencies, consultants, and service providers who conduct discovery calls and need to quickly turn conversations into professional proposals.