Assistant AI Google Meet

Avancé

Ceci est unContent Creation, Multimodal AIworkflow d'automatisation du domainecontenant 25 nœuds.Utilise principalement des nœuds comme If, Set, Code, Slack, Filter. Utiliser Google Meet, AssemblyAI et Claude AI pour automatiser le résumé des réunions et les actions à suivre

Prérequis
  • Token Bot Slack ou URL Webhook
  • Clé API Notion
  • Informations d'identification Google Drive API
  • Peut nécessiter les informations d'identification d'authentification de l'API cible
  • Clé API Anthropic
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
{
  "id": "HwyNECzMAzk3eVUe",
  "meta": {
    "instanceId": "44b5a59a33562e784f2dc2302170b2503b4b272b919680cc66f4c1a5627bed28"
  },
  "name": "Google Meet AI Assistant",
  "tags": [],
  "nodes": [
    {
      "id": "be749770-d9c1-4707-8c05-58207dd4c75f",
      "name": "whenClickingTestWorkflow",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        96,
        192
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "dae33e76-da7b-43ba-905d-af14763b5db6",
      "name": "getRecentMeetings",
      "type": "n8n-nodes-base.googleCalendar",
      "position": [
        320,
        192
      ],
      "parameters": {
        "limit": 10,
        "options": {
          "timeMax": "={{ $now.toISO() }}",
          "timeMin": "={{ $now.minus({ hours: 24 }).toISO() }}"
        },
        "calendar": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "operation": "getAll"
      },
      "typeVersion": 1
    },
    {
      "id": "907a8f8d-f947-44fd-a262-e5aa7d9d4191",
      "name": "filterGoogleMeetEvents",
      "type": "n8n-nodes-base.filter",
      "position": [
        528,
        192
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "combinator": "and",
          "conditions": [
            {
              "id": "condition1",
              "operator": {
                "type": "object",
                "operation": "exists"
              },
              "leftValue": "={{ $json.conferenceData }}",
              "rightValue": ""
            },
            {
              "id": "condition2",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.conferenceData.conferenceSolution.name }}",
              "rightValue": "Google Meet"
            },
            {
              "id": "condition3",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "confirmed"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "39cb30a1-cf8e-467c-bd54-7b440664753f",
      "name": "extractMeetingData",
      "type": "n8n-nodes-base.set",
      "position": [
        720,
        192
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "assign1",
              "name": "meetingId",
              "type": "string",
              "value": "={{ $json.id }}"
            },
            {
              "id": "assign2",
              "name": "meetingTitle",
              "type": "string",
              "value": "={{ $json.summary }}"
            },
            {
              "id": "assign3",
              "name": "meetingStart",
              "type": "string",
              "value": "={{ $json.start.dateTime }}"
            },
            {
              "id": "assign4",
              "name": "participants",
              "type": "string",
              "value": "={{ $json.attendees ? $json.attendees.map(a => a.email).join(', ') : 'No attendees' }}"
            },
            {
              "id": "assign5",
              "name": "recordingUrl",
              "type": "string",
              "value": "={{ $json.conferenceData?.entryPoints?.[0]?.uri || '' }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "e6e628bf-774a-4575-aeb9-44f95f352205",
      "name": "findRecordingInDrive",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        928,
        192
      ],
      "parameters": {
        "operation": "search"
      },
      "typeVersion": 3
    },
    {
      "id": "7bef5275-9b55-4096-bbf2-e9571bd3f3c2",
      "name": "hasRecording",
      "type": "n8n-nodes-base.if",
      "position": [
        1120,
        192
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "combinator": "and",
          "conditions": [
            {
              "id": "cond1",
              "operator": {
                "type": "string",
                "operation": "exists"
              },
              "leftValue": "={{ $json.id }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "e678555f-ab47-4c90-89be-003425443df8",
      "name": "noRecordingError",
      "type": "n8n-nodes-base.stopAndError",
      "position": [
        1344,
        384
      ],
      "parameters": {
        "errorMessage": "No recording found for this meeting. Please ensure the meeting was recorded and saved to Google Drive."
      },
      "typeVersion": 1
    },
    {
      "id": "64882cca-e12d-4ee7-a921-5998e61a2b82",
      "name": "downloadRecording",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        1344,
        192
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "options": {
          "googleFileConversion": {}
        },
        "operation": "download"
      },
      "typeVersion": 3
    },
    {
      "id": "c58ac16d-cdfd-45b4-ae7b-2f56edb967d9",
      "name": "uploadToAssemblyAI",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1568,
        192
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "05301b4a-8de3-4cd1-902e-e1f39a75f7c1",
      "name": "requestTranscription",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1760,
        192
      ],
      "parameters": {
        "url": "https://api.assemblyai.com/v2/transcript",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"audio_url\": \"{{ $json.upload_url }}\",\n  \"speaker_labels\": true,\n  \"auto_highlights\": true,\n  \"sentiment_analysis\": true\n}",
        "sendBody": true,
        "specifyBody": "json"
      },
      "typeVersion": 4.2
    },
    {
      "id": "378e9268-d441-49c1-84db-62116d6d70bc",
      "name": "pollTranscriptionStatus",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1952,
        192
      ],
      "parameters": {
        "url": "=https://api.assemblyai.com/v2/transcript/{{ $json.id }}",
        "options": {
          "timeout": 300000
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "ca5eee30-718e-43d5-be40-a02b12d2e26d",
      "name": "formatTranscript",
      "type": "n8n-nodes-base.set",
      "position": [
        2128,
        192
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "assign1",
              "name": "transcript",
              "type": "string",
              "value": "={{ $json.text }}"
            },
            {
              "id": "assign2",
              "name": "speakers",
              "type": "string",
              "value": "={{ $json.utterances ? $json.utterances.map(u => `Speaker ${u.speaker}: ${u.text}`).join('\\n') : $json.text }}"
            },
            {
              "id": "assign3",
              "name": "highlights",
              "type": "string",
              "value": "={{ $json.auto_highlights_result ? $json.auto_highlights_result.results.map(h => h.text).join(', ') : '' }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "78024c86-9c1a-451d-9305-2f59498a095d",
      "name": "claudeChatModel",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "position": [
        2384,
        400
      ],
      "parameters": {
        "model": "claude-3-5-sonnet-20241022",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "36b8070d-686d-4cac-935a-661e6b2ce4e4",
      "name": "analyzeMeetingWithAI",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2352,
        192
      ],
      "parameters": {
        "text": "=## Meeting Analysis Task\n\nYou are an AI meeting assistant analyzing a Google Meet recording.\n\n### Meeting Details:\n- **Title**: {{ $('extractMeetingData').item.json.meetingTitle }}\n- **Date**: {{ $('extractMeetingData').item.json.meetingStart }}\n- **Participants**: {{ $('extractMeetingData').item.json.participants }}\n\n### Transcript:\n{{ $json.speakers }}\n\n### Your Tasks:\n1. Create a concise meeting summary (2-3 paragraphs)\n2. Extract all action items with responsible parties\n3. Identify any mentioned dates or deadlines\n4. Determine overall meeting sentiment\n\nFormat your response as:\n\n**Meeting Summary:**\n[Summary here]\n\n**Action Items:**\n- [Item] (Assigned to: [Person], Due: [Date])\n\n**Key Dates:**\n- [Date]: [Context]\n\n**Sentiment:** [Positive/Neutral/Negative]",
        "agent": "conversationalAgent",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "b05f988b-a06b-47a4-a301-e5416755cd4a",
      "name": "parseAIOutput",
      "type": "n8n-nodes-base.code",
      "position": [
        2656,
        192
      ],
      "parameters": {
        "jsCode": "const input = $input.first().json.output;\nconst meetingData = $('extractMeetingData').first().json;\n\n// Parse the AI output to extract structured data\nconst sections = input.split('**');\nlet summary = '';\nlet actionItems = [];\nlet keyDates = [];\nlet sentiment = 'Neutral';\n\nfor (let i = 0; i < sections.length; i++) {\n  if (sections[i].includes('Meeting Summary:')) {\n    summary = sections[i + 1].trim();\n  }\n  if (sections[i].includes('Action Items:')) {\n    const items = sections[i + 1].trim().split('\\n').filter(line => line.startsWith('-'));\n    actionItems = items.map(item => {\n      const match = item.match(/- (.+?) \\(Assigned to: (.+?), Due: (.+?)\\)/);\n      if (match) {\n        return {\n          task: match[1],\n          assignee: match[2],\n          dueDate: match[3]\n        };\n      }\n      return { task: item.replace('- ', ''), assignee: 'Unassigned', dueDate: 'No date' };\n    });\n  }\n  if (sections[i].includes('Key Dates:')) {\n    const dates = sections[i + 1].trim().split('\\n').filter(line => line.startsWith('-'));\n    keyDates = dates.map(d => d.replace('- ', ''));\n  }\n  if (sections[i].includes('Sentiment:')) {\n    sentiment = sections[i + 1].trim();\n  }\n}\n\nreturn {\n  json: {\n    meetingTitle: meetingData.meetingTitle,\n    meetingDate: meetingData.meetingStart,\n    participants: meetingData.participants,\n    summary: summary,\n    actionItems: actionItems,\n    keyDates: keyDates,\n    sentiment: sentiment,\n    rawOutput: input\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "770cdc0c-c73e-461e-ace1-55ac5f95ad9f",
      "name": "postToSlack",
      "type": "n8n-nodes-base.slack",
      "position": [
        2912,
        0
      ],
      "webhookId": "857ed2ac-a71a-493e-9567-cb1d309f8450",
      "parameters": {
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "CHANNEL_ID",
          "cachedResultName": "general"
        },
        "otherOptions": {}
      },
      "typeVersion": 2.2
    },
    {
      "id": "b64a05d1-8d9d-4f33-b568-a3de7bfd582c",
      "name": "splitActionItems",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        3152,
        176
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1,
      "fieldToSplitOut": "actionItems"
    },
    {
      "id": "c7b881cd-6e8c-4ec2-8ced-7175218f003a",
      "name": "hasActionItems",
      "type": "n8n-nodes-base.if",
      "position": [
        2912,
        192
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "combinator": "and",
          "conditions": [
            {
              "id": "cond1",
              "operator": {
                "type": "array",
                "operation": "notEmpty"
              },
              "leftValue": "={{ $json.actionItems }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "99e2b222-dd3d-4583-ab9a-880a564c01fb",
      "name": "createNotionTask",
      "type": "n8n-nodes-base.notion",
      "position": [
        3344,
        176
      ],
      "parameters": {
        "title": "={{ $json.task }}",
        "pageId": {
          "__rl": true,
          "mode": "url",
          "value": ""
        },
        "options": {}
      },
      "credentials": {
        "notionApi": {
          "id": "2RokZhJ5BCVDXV6L",
          "name": "Notion - eightkraft"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "393d7712-467d-4886-9bb9-05cded6ac745",
      "name": "stickyNoteOverview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -448,
        -224
      ],
      "parameters": {
        "color": 6,
        "width": 700,
        "height": 636,
        "content": "## 🎯 Workflow Overview\n\n### Google Meet AI Assistant\n\nThis workflow provides intelligent meeting analysis using:\n\n**Data Sources:**\n- Google Calendar (meeting data)\n- Google Drive (recordings)\n- AssemblyAI (transcription)\n\n**AI Analysis:**\n- Anthropic Claude for summarization\n- Action item extraction\n- Sentiment analysis\n\n**Outputs:**\n- Slack notifications\n- Notion task creation\n- Structured meeting insights\n\n\n**Further help**\n\nFor any questions or support, please contact:\nLinkedIn: https://www.linkedin.com/in/dominicsaraum/"
      },
      "typeVersion": 1
    },
    {
      "id": "c5203d08-2866-4955-a86e-01e22e6efba3",
      "name": "stickyNoteStep1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        272,
        0
      ],
      "parameters": {
        "width": 596,
        "height": 416,
        "content": "## 📥 Step 1: Fetch Meetings\n\nRetrieves Google Calendar events from the last 24 hours and filters for confirmed Google Meet events."
      },
      "typeVersion": 1
    },
    {
      "id": "754ded78-9eca-477a-8268-7b2c170738f7",
      "name": "stickyNoteStep2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        896,
        0
      ],
      "parameters": {
        "width": 600,
        "height": 564,
        "content": "## 🎥 Step 2: Get Recording\n\nSearches Google Drive for the meeting recording and downloads it for transcription."
      },
      "typeVersion": 1
    },
    {
      "id": "67c148a4-e36c-4396-97f1-b15f1fde0834",
      "name": "stickyNoteStep3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1520,
        0
      ],
      "parameters": {
        "width": 756,
        "height": 452,
        "content": "## 🎤 Step 3: Transcribe\n\nUses AssemblyAI to transcribe the recording with speaker labels, highlights, and sentiment analysis."
      },
      "typeVersion": 1
    },
    {
      "id": "0c7752e4-573b-4d69-a24f-a426d95ae608",
      "name": "stickyNoteStep4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2304,
        0
      ],
      "parameters": {
        "width": 516,
        "height": 548,
        "content": "## 🤖 Step 4: AI Analysis\n\nClaude analyzes the transcript to extract summary, action items, key dates, and sentiment."
      },
      "typeVersion": 1
    },
    {
      "id": "83adb253-08e9-4533-8bca-5a8d16be3744",
      "name": "stickyNoteStep5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2848,
        -128
      ],
      "parameters": {
        "width": 692,
        "height": 564,
        "content": "## 📤 Step 5: Distribute\n\nPosts summary to Slack and creates tasks in Notion for all action items."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "dd8606ee-6368-46ef-a222-b74ec8d367e3",
  "connections": {
    "7bef5275-9b55-4096-bbf2-e9571bd3f3c2": {
      "main": [
        [
          {
            "node": "64882cca-e12d-4ee7-a921-5998e61a2b82",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "e678555f-ab47-4c90-89be-003425443df8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b05f988b-a06b-47a4-a301-e5416755cd4a": {
      "main": [
        [
          {
            "node": "770cdc0c-c73e-461e-ace1-55ac5f95ad9f",
            "type": "main",
            "index": 0
          },
          {
            "node": "c7b881cd-6e8c-4ec2-8ced-7175218f003a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "c7b881cd-6e8c-4ec2-8ced-7175218f003a": {
      "main": [
        [
          {
            "node": "b64a05d1-8d9d-4f33-b568-a3de7bfd582c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "78024c86-9c1a-451d-9305-2f59498a095d": {
      "ai_languageModel": [
        [
          {
            "node": "36b8070d-686d-4cac-935a-661e6b2ce4e4",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "ca5eee30-718e-43d5-be40-a02b12d2e26d": {
      "main": [
        [
          {
            "node": "36b8070d-686d-4cac-935a-661e6b2ce4e4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b64a05d1-8d9d-4f33-b568-a3de7bfd582c": {
      "main": [
        [
          {
            "node": "99e2b222-dd3d-4583-ab9a-880a564c01fb",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "64882cca-e12d-4ee7-a921-5998e61a2b82": {
      "main": [
        [
          {
            "node": "c58ac16d-cdfd-45b4-ae7b-2f56edb967d9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "dae33e76-da7b-43ba-905d-af14763b5db6": {
      "main": [
        [
          {
            "node": "907a8f8d-f947-44fd-a262-e5aa7d9d4191",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "39cb30a1-cf8e-467c-bd54-7b440664753f": {
      "main": [
        [
          {
            "node": "e6e628bf-774a-4575-aeb9-44f95f352205",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "c58ac16d-cdfd-45b4-ae7b-2f56edb967d9": {
      "main": [
        [
          {
            "node": "05301b4a-8de3-4cd1-902e-e1f39a75f7c1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "36b8070d-686d-4cac-935a-661e6b2ce4e4": {
      "main": [
        [
          {
            "node": "b05f988b-a06b-47a4-a301-e5416755cd4a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "e6e628bf-774a-4575-aeb9-44f95f352205": {
      "main": [
        [
          {
            "node": "7bef5275-9b55-4096-bbf2-e9571bd3f3c2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "05301b4a-8de3-4cd1-902e-e1f39a75f7c1": {
      "main": [
        [
          {
            "node": "378e9268-d441-49c1-84db-62116d6d70bc",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "907a8f8d-f947-44fd-a262-e5aa7d9d4191": {
      "main": [
        [
          {
            "node": "39cb30a1-cf8e-467c-bd54-7b440664753f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "378e9268-d441-49c1-84db-62116d6d70bc": {
      "main": [
        [
          {
            "node": "ca5eee30-718e-43d5-be40-a02b12d2e26d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "be749770-d9c1-4707-8c05-58207dd4c75f": {
      "main": [
        [
          {
            "node": "dae33e76-da7b-43ba-905d-af14763b5db6",
            "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é - Création de contenu, IA Multimodale

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œuds25
Catégorie2
Types de nœuds15
Description de la difficulté

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

Auteur
Dominic

Dominic

@dominicgs

I turn chaotic manual processes into reliable automated systems, helping teams focus on strategy while complex workflows run flawlessly in the background.

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34