Extraction de tâches de réunions à partir de textes transcrits et synchronisation avec Trello
Ceci est unProject Management, AI Summarizationworkflow d'automatisation du domainecontenant 18 nœuds.Utilise principalement des nœuds comme Form, TrelloTool, FormTrigger, Agent, ExtractFromFile. Extraire des tâches de réunion à partir de transcriptions et les synchroniser avec Trello avec IA
- •Clé API OpenAI
Nœuds utilisés (18)
Catégorie
{
"id": "ZGNostTBUj8ot9yp",
"meta": {
"instanceId": "46f10f8f90bd424d08d7ec9e92bdd735f336873f2ca9f21d76cc7ac132eeaabd",
"templateCredsSetupCompleted": true
},
"name": "Extract meeting tasks from transcripts and sync with Trello",
"tags": [],
"nodes": [
{
"id": "70515f8f-edd6-4c52-947a-f79cbb7429ef",
"name": "Obtenir la transcription",
"type": "n8n-nodes-base.extractFromFile",
"position": [
480,
0
],
"parameters": {
"options": {},
"operation": "text",
"binaryPropertyName": "Transcript_archive"
},
"typeVersion": 1
},
{
"id": "203f05d3-7356-40b9-ad81-248760e72080",
"name": "Agent IA",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
944,
0
],
"parameters": {
"text": "=Transcript:\n\n{{ $json.data }}",
"options": {
"systemMessage": "=# Main Agent Instructions\n\nYou are an assistant specialized in meeting analysis.\nYour job is to (1) extract actionable tasks from a meeting transcript, (2) sync each task with Trello via the Trello Sub-Agent, and (3) produce a clear user-facing summary.\n\n## Workflow\n\n1. **Extract Tasks**\n - Identify only clear, actionable tasks.\n - For each task, produce:\n - **title** → short, concise (max ~6 words).\n - **description** → 1–2 sentences explaining the action.\n - **assignee** → person responsible, or `\"undefined\"`.\n - **deadline** → date/time if mentioned, or `\"undefined\"`.\n - **Deduplicate** (merge near-duplicates; keep one canonical task).\n\n2. **Sync with Trello (via Trello Sub-Agent)**\n - For each task, call the **Trello Sub-Agent** with `title`, `description`, `assignee`, `deadline`.\n - The Trello Sub-Agent will:\n - Use **Get Trello Cards** to check for an existing card (case-insensitive, tolerant to small wording changes).\n - If a match exists → return `{ \"status\": \"exists\", \"card_id\": \"<id>\" }`.\n - If no match → create with **Create Trello Card** and return `{ \"status\": \"created\", \"card_id\": \"<id>\" }`.\n\n3. **User-Facing Summary**\n - Write a brief summary (1–3 sentences) describing: total tasks found, how many already existed, how many were created, and any tasks without assignee or deadline.\n - The summary **must be in the user’s language** (if unknown, use English).\n - Keep it concise and non-technical.\n\n4. **Output Format**\n - Return a JSON object with two top-level keys: `summary` and `tasks`.\n\n### JSON Schema\n\n```json\n{\n \"summary\": {\n \"text\": \"string\",\n \"metrics\": {\n \"total_tasks\": \"number\",\n \"existing_cards\": \"number\",\n \"created_cards\": \"number\",\n \"without_assignee\": \"number\",\n \"without_deadline\": \"number\"\n }\n },\n \"tasks\": [\n {\n \"title\": \"string (≤ 6 words)\",\n \"description\": \"string (1–2 sentences)\",\n \"assignee\": \"string | \\\"undefined\\\"\",\n \"deadline\": \"string | \\\"undefined\\\"\",\n \"status\": \"exists | created\",\n \"card_id\": \"string\"\n }\n ]\n}\n````\n\nIf no tasks are found, return:\n\n```json\n{\n \"summary\": {\n \"text\": \"No tasks were found in the transcript.\",\n \"metrics\": {\n \"total_tasks\": 0,\n \"existing_cards\": 0,\n \"created_cards\": 0,\n \"without_assignee\": 0,\n \"without_deadline\": 0\n }\n },\n \"tasks\": []\n}\n```\n\n## Example\n\n**Transcript Excerpt**\n\n> John: I can prepare the financial report by Friday.\n> Maria: I’ll schedule the client meeting.\n\n**Expected Output**\n\n```json\n{\n \"summary\": {\n \"text\": \"Found 2 tasks in the transcript: 1 already existed in Trello and 1 was created. None are missing an assignee; 1 has no deadline.\",\n \"metrics\": {\n \"total_tasks\": 2,\n \"existing_cards\": 1,\n \"created_cards\": 1,\n \"without_assignee\": 0,\n \"without_deadline\": 1\n }\n },\n \"tasks\": [\n {\n \"title\": \"Prepare financial report\",\n \"description\": \"John will compile and deliver the financial report by Friday.\",\n \"assignee\": \"John\",\n \"deadline\": \"Friday\",\n \"status\": \"exists\",\n \"card_id\": \"abc123\"\n },\n {\n \"title\": \"Schedule client meeting\",\n \"description\": \"Maria will arrange a meeting with the client to align next steps.\",\n \"assignee\": \"Maria\",\n \"deadline\": \"undefined\",\n \"status\": \"created\",\n \"card_id\": \"xyz789\"\n }\n ]\n}\n```\n\n## Sub-Agents\n\n## Trello Sync\n\nFor each extracted task:\n1. Call the **Trello Sub-Agent** with `title`, `description`, `assignee`, `deadline`.\n2. Append the sub-agent result to the task:\n - `status`: \"exists\" | \"created\"\n - `card_id`: string\n - optionally `list_id` (when status = \"exists\")\n3. Use these results to build the user-facing `summary.metrics`:\n - `total_tasks`, `existing_cards`, `created_cards`,\n - `without_assignee`, `without_deadline`."
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "50775259-4478-4445-be0b-03da0b9f796b",
"name": "Analyseur de sortie structurée",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
1184,
208
],
"parameters": {
"jsonSchemaExample": "{\n \"summary\": {\n \"text\": \"Found 2 tasks in the transcript: 1 already existed in Trello and 1 was created. None are missing an assignee; 1 has no deadline.\",\n \"metrics\": {\n \"total_tasks\": 2,\n \"existing_cards\": 1,\n \"created_cards\": 1,\n \"without_assignee\": 0,\n \"without_deadline\": 1\n }\n },\n \"tasks\": [\n {\n \"title\": \"Prepare financial report\",\n \"description\": \"John will compile and deliver the financial report by Friday.\",\n \"assignee\": \"John\",\n \"deadline\": \"Friday\",\n \"status\": \"exists\",\n \"card_id\": \"abc123\"\n },\n {\n \"title\": \"Schedule client meeting\",\n \"description\": \"Maria will arrange a meeting with the client to align next steps.\",\n \"assignee\": \"Maria\",\n \"deadline\": \"undefined\",\n \"status\": \"created\",\n \"card_id\": \"xyz789\"\n }\n ]\n}"
},
"typeVersion": 1.3
},
{
"id": "d34e917d-9065-408e-a9ac-f66480118e6f",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
896,
208
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "zwivGqRORUgpjepY",
"name": "OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "35a227e0-41e5-4773-8628-a3863e09165b",
"name": "Recevoir le fichier de transcription",
"type": "n8n-nodes-base.formTrigger",
"position": [
0,
0
],
"webhookId": "c107cc74-88b8-4620-a825-4f26a4ae24b5",
"parameters": {
"options": {},
"formTitle": "Tasks from meeting",
"formFields": {
"values": [
{
"fieldType": "file",
"fieldLabel": "Transcript archive",
"multipleFiles": false,
"requiredField": true,
"acceptFileTypes": ".txt"
}
]
},
"responseMode": "lastNode",
"formDescription": "Create Trello tasks from a meeting transcript"
},
"typeVersion": 2.3
},
{
"id": "48c38412-ae7d-40cb-be25-dd6ff989938e",
"name": "Trello Agent",
"type": "@n8n/n8n-nodes-langchain.agentTool",
"position": [
1008,
448
],
"parameters": {
"text": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Prompt__User_Message_', `Trello task`, 'string') }}",
"options": {
"systemMessage": "=# Trello Sub-Agent Instructions\n\nYou manage Trello syncing for tasks.\nTools available:\n- **Get many lists in Trello**\n- **Get all cards in a list in Trello**\n- **Create a card in Trello** (targets a single preconfigured default list)\n\n## Input\nTask JSON:\n- `title` (string, required)\n- `description` (string, required)\n- `assignee` (string | \"undefined\")\n- `deadline` (string | \"undefined\")\n\n## Board-wide Duplicate Check (title AND description)\n1. Call **Get many lists in Trello** and collect all `list_id`s.\n2. For each list, call **Get all cards in a list in Trello**.\n3. For each card, compare:\n - Incoming `title` ↔ card `name`\n - Incoming `description` ↔ card `desc`\n\n### Normalization\n- Lowercase, trim, collapse multiple spaces.\n- Strip punctuation and emojis.\n- Normalize common accents/diacritics.\n- Optional: drop very common stopwords (e.g., “the”, “a”, “of”, “para”, “de”).\n\n### Match Criteria (declare duplicate if ANY holds)\n- **Exact title match** (normalized) **AND** description **highly similar** (≥ 0.80 token overlap or near-exact).\n- **High title similarity** (≥ 0.90) **AND** **high description similarity** (≥ 0.80).\n- **Exact description match** (normalized) **AND** title **highly similar** (≥ 0.90).\n\n> If multiple candidates match, choose the **highest combined similarity** (title_sim * 0.6 + desc_sim * 0.4).\n\n4. If a duplicate is found **anywhere on the board**, **do not create** a card. Return:\n```json\n{ \"status\": \"exists\", \"card_id\": \"<existing_card_id>\", \"list_id\": \"<existing_list_id>\" }\n````\n\n## Create (only if NO duplicate found)\n\n* Call **Create a card in Trello** with:\n\n * `name` = `title`\n * `desc` = `description`\n * Add `assignee` / `deadline` if the tool supports these fields.\n* Return:\n\n```json\n{ \"status\": \"created\", \"card_id\": \"<new_card_id>\", \"created_in_default_list\": true }\n```\n\n## Output (always one object)\n\n* Duplicate:\n\n```json\n{ \"status\": \"exists\", \"card_id\": \"<id>\", \"list_id\": \"<list_id>\" }\n```\n\n* Created:\n\n```json\n{ \"status\": \"created\", \"card_id\": \"<id>\", \"created_in_default_list\": true }\n```\n\n* Error:\n\n```json\n{ \"status\": \"error\", \"message\": \"Reason...\" }\n```\n\n## Notes\n\n* Be conservative: one card per unique task.\n* Prefer NOT creating when in doubt (high similarity)."
},
"hasOutputParser": true,
"toolDescription": "Responsible for syncing tasks with Trello. It checks if a card already exists for a given task and creates one if it doesn’t, ensuring no duplicates are added"
},
"typeVersion": 2.2
},
{
"id": "40527286-8a51-4ac0-ba33-b41a6da83cf9",
"name": "Analyseur de sortie structurée1",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
1696,
656
],
"parameters": {
"schemaType": "manual",
"inputSchema": "{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"title\": \"Trello Sub-Agent Output\",\n \"type\": \"object\",\n \"properties\": {\n \"status\": {\n \"type\": \"string\",\n \"enum\": [\"exists\", \"created\", \"error\"],\n \"description\": \"Result of the Trello sync check.\"\n },\n \"card_id\": {\n \"type\": \"string\",\n \"description\": \"ID of the Trello card (if exists or created).\"\n },\n \"list_id\": {\n \"type\": \"string\",\n \"description\": \"ID of the list where the card already exists (only when status = 'exists').\"\n },\n \"created_in_default_list\": {\n \"type\": \"boolean\",\n \"description\": \"True if a new card was created in the default list (only when status = 'created').\"\n },\n \"message\": {\n \"type\": \"string\",\n \"description\": \"Error message if status = 'error'.\"\n }\n },\n \"required\": [\"status\"],\n \"additionalProperties\": false\n}"
},
"typeVersion": 1.3
},
{
"id": "b3f6f705-03f8-4aca-a320-e2a2d6f969a3",
"name": "OpenAI Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
976,
656
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "zwivGqRORUgpjepY",
"name": "OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "4b687b0d-c314-4bed-801e-81ab8d77927c",
"name": "Créer une carte dans Trello",
"type": "n8n-nodes-base.trelloTool",
"position": [
1136,
656
],
"parameters": {
"name": "={{ $fromAI('taskTitle') }}",
"listId": "Specific List ID",
"description": "={{ $fromAI('taskDescription') }}",
"additionalFields": {}
},
"credentials": {
"trelloApi": {
"id": "vOKxrsBgkMdaWH6Q",
"name": "Trello account"
}
},
"typeVersion": 1
},
{
"id": "f6e13596-4b3d-4fa5-a2d7-f5bf15656e97",
"name": "Obtenir plusieurs listes dans Trello",
"type": "n8n-nodes-base.trelloTool",
"position": [
1312,
656
],
"parameters": {
"id": "Your Board ID",
"resource": "list",
"operation": "getAll",
"returnAll": true,
"additionalFields": {}
},
"credentials": {
"trelloApi": {
"id": "vOKxrsBgkMdaWH6Q",
"name": "Trello account"
}
},
"typeVersion": 1
},
{
"id": "e031ecda-c0d0-4668-afcc-bd2268ac65c8",
"name": "Obtenir toutes les cartes d'une liste dans Trello",
"type": "n8n-nodes-base.trelloTool",
"position": [
1488,
656
],
"parameters": {
"id": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('List_ID', ``, 'string') }}",
"resource": "list",
"operation": "getCards",
"returnAll": true,
"additionalFields": {
"fields": "name, desc"
}
},
"credentials": {
"trelloApi": {
"id": "vOKxrsBgkMdaWH6Q",
"name": "Trello account"
}
},
"typeVersion": 1
},
{
"id": "cd442a7c-0f53-4993-aa9c-139ccdf0d183",
"name": "Répondre au formulaire",
"type": "n8n-nodes-base.form",
"position": [
1632,
0
],
"webhookId": "e1dd99fd-57e6-4699-a6d9-bd83191fc864",
"parameters": {
"options": {},
"operation": "completion",
"completionTitle": "Graded transcripts and tasks created in Trello",
"completionMessage": "={{ $json.output.summary.text }}"
},
"typeVersion": 2.3
},
{
"id": "d667ead8-0892-4e2d-8662-06bd7f55e24b",
"name": "Note adhésive",
"type": "n8n-nodes-base.stickyNote",
"position": [
-96,
-688
],
"parameters": {
"color": 6,
"width": 1920,
"height": 496,
"content": "## Extract meeting tasks and sync with Trello\n\nThis workflow processes a meeting transcript (uploaded as a .txt file), extracts actionable tasks using AI, and syncs them with Trello.\n\n### What it does\n- Receive a transcript file from a form\n- Extract clear tasks with title, description, assignee, and deadline\n- Check Trello for duplicates (by title + description across all lists)\n- If duplicate exists → return existing card ID\n- If not → create a new card in the default Trello list\n- Generate a user-friendly summary of the results\n\n### Who is it for\nTeams who want to turn meeting notes into actionable Trello tasks automatically.\n\n### Requirements\n- Trello account with credentials set up\n- OpenAI (or other LLM) credentials"
},
"typeVersion": 1
},
{
"id": "f7c2888b-dbda-4e5a-bde0-2948016216a5",
"name": "Note adhésive2",
"type": "n8n-nodes-base.stickyNote",
"position": [
384,
-144
],
"parameters": {
"width": 304,
"height": 304,
"content": "**Get Transcription node**\n\n> Extracts raw text from the uploaded transcript file.\n"
},
"typeVersion": 1
},
{
"id": "6753c318-fef9-4558-bc3b-63e50dedfc17",
"name": "Note adhésive3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-96,
-144
],
"parameters": {
"width": 304,
"height": 304,
"content": "**Form Trigger node**\n\n> Receives the transcript file (.txt) from the user."
},
"typeVersion": 1
},
{
"id": "6ba8dc96-1c09-4874-a8ce-d74b9f94d749",
"name": "Note adhésive1",
"type": "n8n-nodes-base.stickyNote",
"position": [
784,
-144
],
"parameters": {
"color": 3,
"width": 560,
"height": 496,
"content": "**AI Agent node**\n\n> Main agent that extracts tasks, checks duplicates via Trello Sub-Agent, and builds the JSON output (summary + tasks).\n"
},
"typeVersion": 1
},
{
"id": "a63d8b4f-8077-402e-9a52-acb167af2298",
"name": "Note adhésive4",
"type": "n8n-nodes-base.stickyNote",
"position": [
368,
384
],
"parameters": {
"color": 5,
"width": 1456,
"height": 432,
"content": "**Trello Agent node**\n\n> Sub-agent responsible for Trello sync.\n> Uses “Get many lists” + “Get all cards in a list” to check duplicates (title + description).\n> Creates a new card only if no duplicate exists.\n\n**Create card / Get lists / Get cards nodes**\n\n> Trello API tools used by the sub-agent:\n\n* **Get many lists** → get all list IDs in the board\n* **Get all cards in a list** → fetch existing cards with `name` + `desc`\n* **Create a card** → add a task card in the preconfigured default list\n\n**Structured Output Parser nodes**\n\n> Parse the AI agent outputs into structured JSON (tasks, summary, Trello status)."
},
"typeVersion": 1
},
{
"id": "fdb32427-0adc-4d40-a616-93b32981aae0",
"name": "Note adhésive5",
"type": "n8n-nodes-base.stickyNote",
"position": [
1520,
-144
],
"parameters": {
"width": 304,
"height": 304,
"content": "**Respond to Form node**\n\n> Returns a final confirmation message to the user with the summary (tasks created vs. already existing)."
},
"typeVersion": 1
}
],
"active": true,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "3bc1df01-1881-41f8-92ff-6de105bfc690",
"connections": {
"203f05d3-7356-40b9-ad81-248760e72080": {
"main": [
[
{
"node": "cd442a7c-0f53-4993-aa9c-139ccdf0d183",
"type": "main",
"index": 0
}
]
]
},
"48c38412-ae7d-40cb-be25-dd6ff989938e": {
"ai_tool": [
[
{
"node": "203f05d3-7356-40b9-ad81-248760e72080",
"type": "ai_tool",
"index": 0
}
]
]
},
"70515f8f-edd6-4c52-947a-f79cbb7429ef": {
"main": [
[
{
"node": "203f05d3-7356-40b9-ad81-248760e72080",
"type": "main",
"index": 0
}
]
]
},
"d34e917d-9065-408e-a9ac-f66480118e6f": {
"ai_languageModel": [
[
{
"node": "203f05d3-7356-40b9-ad81-248760e72080",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"b3f6f705-03f8-4aca-a320-e2a2d6f969a3": {
"ai_languageModel": [
[
{
"node": "48c38412-ae7d-40cb-be25-dd6ff989938e",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"4b687b0d-c314-4bed-801e-81ab8d77927c": {
"ai_tool": [
[
{
"node": "48c38412-ae7d-40cb-be25-dd6ff989938e",
"type": "ai_tool",
"index": 0
}
]
]
},
"35a227e0-41e5-4773-8628-a3863e09165b": {
"main": [
[
{
"node": "70515f8f-edd6-4c52-947a-f79cbb7429ef",
"type": "main",
"index": 0
}
]
]
},
"f6e13596-4b3d-4fa5-a2d7-f5bf15656e97": {
"ai_tool": [
[
{
"node": "48c38412-ae7d-40cb-be25-dd6ff989938e",
"type": "ai_tool",
"index": 0
}
]
]
},
"50775259-4478-4445-be0b-03da0b9f796b": {
"ai_outputParser": [
[
{
"node": "203f05d3-7356-40b9-ad81-248760e72080",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"40527286-8a51-4ac0-ba33-b41a6da83cf9": {
"ai_outputParser": [
[
{
"node": "48c38412-ae7d-40cb-be25-dd6ff989938e",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"e031ecda-c0d0-4668-afcc-bd2268ac65c8": {
"ai_tool": [
[
{
"node": "48c38412-ae7d-40cb-be25-dd6ff989938e",
"type": "ai_tool",
"index": 0
}
]
]
}
}
}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é - Gestion de projet, 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.
Workflows recommandés
Gabriel Santos
@gabrielhmsantosEnthusiastic developer passionate about automation and system integration. I work mainly with Python, RPA, and N8N, building workflows and custom solutions to optimize processes and connect platforms. Always learning, sharing, and exploring new ways to automate smarter.
Partager ce workflow