Nodes:
name: Get Message Contents
type: n8n-nodes-base.gmail
parameters: simple: no
messageId: ={{ $json.id }}
operation: get
name: Simplify Emails
type: n8n-nodes-base.set
parameters: assignments: assignments: name: date
type: string
value: ={{ $json.date }}
name: subject
type: string
value: ={{ $json.subject }}
name: text
type: string
value: ={{ $json.text }}
name: from
type: string
value: ={{ $json.from.value[0].name }} ({{ $json.from.value[0].address }})
name: to
type: string
value: ={{ $json.to.value[0].name }} ({{ $json.to.value[0].address }})
name: Check For Upcoming Meetings
type: n8n-nodes-base.googleCalendar
parameters: limit: 1
options: orderBy: startTime
timeMax: ={{ $now.toUTC().plus(1, 'hour') }}
timeMin: ={{ $now.toUTC() }}
singleEvents: yes
calendar: __rl: yes
mode: list
value: c_5792bdf04bc395cbcbc6f7b754268245a33779d36640cc80a357711aa2f09a0a@group.calendar.google.com
cachedResultName: n8n-events
operation: getAll
name: OpenAI Chat Model2
type: @n8n/n8n-nodes-langchain.lmChatOpenAi
parameters: model: gpt-4o-2024-08-06
name: Extract Attendee Information
type: @n8n/n8n-nodes-langchain.informationExtractor
parameters: text: =start: {{ $json.start.dateTime }}
meeting url: {{ $json.hangoutLink }}
summary: {{ $json.summary }}
description: {{ $json.description }}
organiser: {{ $json.organizer.displayName }} ({{ $json.organizer.email }})
attendees: {{ $json.attendees.filter(item => !item.organizer).map(item => item.email).join(',') }}
options: systemPromptTemplate: You are an expert extraction algorithm. Try to link any information found in the description to help fill in the attendee details.
If you do not know the value of an attribute asked to extract, you may omit the attribute's value.
schemaType: manual
inputSchema: {
	"type": "object",
	"properties": {
		"attendees": {
          "type": "array",
          "description": "list of attendees excluding the meeting organiser",
          "items": {
			"type": "object",
			"properties": {
			  "name": { "type": "string" },
              "email": { "type": "string" },
              "linkedin_url": { "type": "string" }
			}
          }
		}
	}
}
name: Execute Workflow Trigger
type: n8n-nodes-base.executeWorkflowTrigger
name: OpenAI Chat Model
type: @n8n/n8n-nodes-langchain.lmChatOpenAi
parameters: model: gpt-4o-2024-08-06
name: Get Last Correspondence
type: n8n-nodes-base.gmail
parameters: limit: 1
filters: sender: ={{ $json.email }}
operation: getAll
alwaysOutputData: yes
name: OpenAI Chat Model1
type: @n8n/n8n-nodes-langchain.lmChatOpenAi
parameters: model: gpt-4o-2024-08-06
name: OpenAI Chat Model3
type: @n8n/n8n-nodes-langchain.lmChatOpenAi
parameters: model: gpt-4o-2024-08-06
name: WhatsApp Business Cloud
type: n8n-nodes-base.whatsApp
parameters: textBody: ={{ $json.text }}
operation: send
phoneNumberId: 477115632141067
recipientPhoneNumber: 44123456789
name: Sticky Note
type: n8n-nodes-base.stickyNote
parameters: color: 7
width: 616.7897454470152
height: 449.1424626006906
content: ## 1. Periodically Search For Upcoming Meetings
[Read about the Scheduled Trigger](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger)

Let's use the Scheduled Trigger node to trigger our Assistant to notify about upcoming meetings. Here, we'll set it for 1 hour intervals to check for meetings scheduled in our Google Calendar. You may need to play with the intervals and frequency depending on how many meetings you typically have.
name: Schedule Trigger
type: n8n-nodes-base.scheduleTrigger
parameters: rule: interval: hours
name: Sticky Note1
type: n8n-nodes-base.stickyNote
parameters: color: 7
width: 655.5654775604146
height: 670.4114154200236
content: ## 2. Extract Attendee Details From Invite
[Learn more about the Information Extractor node](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.information-extractor/)

Once we have our upcoming meeting, it'll be nice to prepare for it by reminding the user what the meeting is about and some context with the attendees. This will be the goal this template and of our assistant! However, first we'll need to extract some contact information of the attendees to do so.

For this demonstration, we'll assume that attendee's email and LinkedIn profile URLs are included in the meeting invite. We'll extract this information for each attendee using the Information Extractor node. This convenient node uses AI to parse and extract which saves us from writing complex pattern matching code otherwise.

In your own scenario, feel free to use your CRM to get this information instead.
name: Sticky Note2
type: n8n-nodes-base.stickyNote
parameters: color: 7
width: 1020.0959898041108
height: 670.8210817031078
content: ## 3. Fetch Recent Correspondance & LinkedIn Activity
[Learn more about the Execute Workflow node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.executeworkflow)

As both email fetching and LinkedIn scraping actions are quite complex, we'll split them out as subworkflow executions. Doing so (in my honest opinion), helps with development and maintainability of the template. Here, we'll make perform the research for all applicable attendees by making 2 calls to the subworkflow and merging them back into a single node at the end.

Head over to the subworkflow (see below - step 3a) to see how we pull the summaries from Gmail and LinkedIn.
name: Sticky Note3
type: n8n-nodes-base.stickyNote
parameters: color: 7
width: 610.3630186140072
height: 582.1201380897592
content: ## 4. Generate Pre-Meeting Notification
[Read more about the Basic LLM node](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.chainllm)

Now that we have (1) our upcoming meeting details and (2) recent email and/or Linkedin summaries about our attendee, let's feed them into our LLM node to generate the best pre-meeting notification ever seen! Of course, we'll need to keep it short as we intend to send this notification via WhatsApp message but should you choose to use another channel such as email, feel free to adjust the length of the message which suits.
name: Sticky Note4
type: n8n-nodes-base.stickyNote
parameters: color: 7
width: 466.8967433831988
height: 454.24485615650235
content: ## 5. Send Notification via WhatsApp
[Learn more about the WhatsApp node](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.whatsapp)

The WhatsApp node is a super convenient way to send messages to WhatsApp which is one of the many messaging apps supported by n8n out of the box. Not using WhatsApp? Simply swap this our for Twilio, Telegram, Slack and others.
name: Sticky Note5
type: n8n-nodes-base.stickyNote
parameters: color: 7
width: 519.1145893777881
height: 190.5042226526524
content: ## 3.2: Fetch Last Email Correspondance
[Learn more about Gmail node](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.gmail)

Fetching our attendee's last email will definitely help the user "pick up" from when they last last off. To do this, we'll assume a Gmail user and use the Gmail node to filter messages by the attendee's email address.
name: Sticky Note6
type: n8n-nodes-base.stickyNote
parameters: color: 7
width: 667.8619481635637
height: 259.7914017217902
content: ## 3.4 Scraping LinkedIn With [Apify.com](https://www.apify.com?fpr=414q6)
[Learn more about Apify.com for Web Scraping](https://www.apify.com?fpr=414q6)

To get the attendee's recent LinkedIn activity, we'll need a webscraper capable of rendering the user's LinkedIn profile. We'll use [Apify.com](https://www.apify.com?fpr=414q6) which is a commercial web scraping service but has a very generous monthly free tier ($5/mo).

While Apify offers a number of dedicated LinkedIn scrapers, we'll build our own which works by impersonating our own LinkedIn account using our login cookie - this can be obtained by inspecting network requests when logged into Linkedin. **Add your LinkedIn Cookie to the node below!**
name: Sticky Note7
type: n8n-nodes-base.stickyNote
parameters: color: 7
width: 572.0305871208889
height: 231.49547088049098
content: ## 3.1 Attendee Researcher SubWorkflow
[Learn more about using Execute Workflow Trigger](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.executeworkflowtrigger/)

The Attendee Researcher SubWorkflow's aims to collect and summarize both an attendee's last correspondance  with the user (if applicable) and the attendee's LinkedIn profile (if available). It uses the router pattern to handle both branches allowing for shorter execution chains. Using the Switch node, this subworkflow is either triggered to fetch emails or scrape LinkedIn but never both simultaneously.
name: Return LinkedIn Success
type: n8n-nodes-base.set
parameters: assignments: assignments: name: linkedin_summary
type: string
value: ={{ $json.text }}
name: Return LinkedIn Error
type: n8n-nodes-base.set
parameters: assignments: assignments: name: linkedin_summary
type: string
value: No activities found.
name: Return Email Error
type: n8n-nodes-base.set
parameters: assignments: assignments: name: email_summary
type: string
value: No correspondance found.
name: Return Email Success
type: n8n-nodes-base.set
parameters: assignments: assignments: name: email_summary
type: object
value: ={{ $json.text }}
name: Set Route Email
type: n8n-nodes-base.set
parameters: mode: raw
jsonOutput: ={{ Object.assign({ "route": "email" }, $json) }}
name: Set Route Linkedin
type: n8n-nodes-base.set
parameters: mode: raw
jsonOutput: ={{ Object.assign({ "route": "linkedin" }, $json) }}
name: Router
type: n8n-nodes-base.switch
parameters: rules: values: outputKey: email
conditions: options: version: 2
caseSensitive: yes
typeValidation: strict
combinator: and
conditions: operator: type: string
operation: equals
leftValue: ={{ $json.route }}
rightValue: email
renameOutput: yes
outputKey: linkedin
conditions: options: version: 2
caseSensitive: yes
typeValidation: strict
combinator: and
conditions: operator: type: string
operation: equals
leftValue: ={{ $json.route }}
rightValue: linkedin
renameOutput: yes
name: Return LinkedIn Error1
type: n8n-nodes-base.set
parameters: assignments: assignments: name: linkedin_summary
type: string
value: No activities found.
name: Has Emails?
type: n8n-nodes-base.if
parameters: conditions: options: version: 2
caseSensitive: yes
typeValidation: strict
combinator: and
conditions: operator: type: object
operation: empty
singleValue: yes
leftValue: ={{ $json }}
name: Return Email Error1
type: n8n-nodes-base.set
parameters: assignments: assignments: name: email_summary
type: string
value: No correspondance found.
name: Sticky Note9
type: n8n-nodes-base.stickyNote
parameters: color: 7
width: 682.7350931085596
height: 219.59936012669806
content: ## 3.5: Extract LinkedIn Profile & Recent Activity
[Learn more about the HTML node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.html)

Once we have our scraped LinkedIn profile, it's just a simple case of parsing and extracting the relevant sections from the page.
For the purpose of our workflow, we'll only need the "About" and "Activity" sections which we'll pull out of the page using a series of HTML nodes. Feel free to extract other sections to suit your needs! Once extracted, we'll combine the about and activities data in preparation of sending it to our LLM.
name: Sections To List
type: n8n-nodes-base.splitOut
parameters: options: destinationFieldName: data
fieldToSplitOut: sections
name: Set LinkedIn Cookie
type: n8n-nodes-base.set
parameters: assignments: assignments: name: linkedin_profile_url
type: string
value: ={{ $json.linkedin_url }}
name: linkedin_cookies
type: string
value: <COPY_YOUR_LINKEDIN_COOKIES_HERE>
name: Sticky Note8
type: n8n-nodes-base.stickyNote
parameters: color: 3
width: 308.16846950517856
height: 110.18457997698513
content: ### Be aware of LinkedIn T&Cs!
For production, you may want to consider not using your main Linkedin account if you can help it!
name: Sticky Note10
type: n8n-nodes-base.stickyNote
parameters: width: 209.84856156501735
height: 301.5806674338321
content: 













### 🚨 Input Required!
You need to add your cuurent linkedIn Cookies here to continue.
name: Attendees to List
type: n8n-nodes-base.splitOut
parameters: fieldToSplitOut: output.attendees
name: Merge Attendee with Summaries
type: n8n-nodes-base.set
parameters: mode: raw
jsonOutput: ={{ Object.assign({}, $('Attendees to List').item.json, $json) }}
name: Has Email Address?
type: n8n-nodes-base.if
parameters: conditions: options: version: 2
caseSensitive: yes
typeValidation: strict
combinator: and
conditions: operator: type: string
operation: exists
singleValue: yes
leftValue: ={{ $json.email }}
name: Has LinkedIn URL?
type: n8n-nodes-base.if
parameters: conditions: options: version: 2
caseSensitive: yes
typeValidation: strict
combinator: and
conditions: operator: type: string
operation: exists
singleValue: yes
leftValue: ={{ $json.linkedin_url }}
name: Get Correspondance
type: n8n-nodes-base.executeWorkflow
onError: continueRegularOutput
parameters: mode: each
options: waitForSubWorkflow: yes
workflowId: __rl: yes
mode: id
value: ={{ $workflow.id }}
name: Merge
type: n8n-nodes-base.merge
parameters: mode: combine
combineBy: combineByPosition
name: Aggregate Attendees
type: n8n-nodes-base.aggregate
parameters: aggregate: aggregateAllItemData
destinationFieldName: attendees
name: Activities To Array
type: n8n-nodes-base.aggregate
parameters: aggregate: aggregateAllItemData
destinationFieldName: activity
name: Extract Profile Metadata
type: n8n-nodes-base.html
parameters: operation: extractHtmlContent
dataPropertyName: body
extractionValues: values: key: name
cssSelector: h1
key: tagline
cssSelector: .pv-text-details__left-panel--full-width .text-body-medium
key: location
cssSelector: .pv-text-details__left-panel--full-width + div .text-body-small
key: num_connections
cssSelector: a[href="/mynetwork/invite-connect/connections/"]
key: num_followers
cssSelector: a[href="https://www.linkedin.com/feed/followers/"]
key: sections
cssSelector: section[data-view-name]
returnArray: yes
returnValue: html
name: Activities To List
type: n8n-nodes-base.splitOut
parameters: fieldToSplitOut: activity
name: APIFY Web Scraper
type: n8n-nodes-base.httpRequest
parameters: url: https://api.apify.com/v2/acts/apify~web-scraper/run-sync-get-dataset-items
jsonBody: ={
  "startUrls": [
    {
      "url": "{{ $json.linkedin_profile_url }}",
      "method": "GET"
    }
  ],
  "initialCookies": [
    {
      "name": "li_at",
      "value": "{{ $json.linkedin_cookies.match(/li_at=([^;]+)/)[1] }}",
      "domain": ".www.linkedin.com"
    }
  ],
  "breakpointLocation": "NONE",
  "browserLog": false,
  "closeCookieModals": false,
  "debugLog": false,
  "downloadCss": false,
  "downloadMedia": false,
  "excludes": [
    {
      "glob": "/**/*.{png,jpg,jpeg,pdf}"
    }
  ],
  "headless": true,
  "ignoreCorsAndCsp": false,
  "ignoreSslErrors": false,
  
  "injectJQuery": true,
  "keepUrlFragments": false,
  "linkSelector": "a[href]",
  "maxCrawlingDepth": 1,
  "maxPagesPerCrawl": 1,
  "maxRequestRetries": 1,
  "maxResultsPerCrawl": 1,
  "pageFunction": "// The function accepts a single argument: the \"context\" object.\n// For a complete list of its properties and functions,\n// see https://apify.com/apify/web-scraper#page-function \nasync function pageFunction(context) {\n\n    await new Promise(res => { setTimeout(res, 6000) });\n    // This statement works as a breakpoint when you're trying to debug your code. Works only with Run mode: DEVELOPMENT!\n    // debugger; \n\n    // jQuery is handy for finding DOM elements and extracting data from them.\n    // To use it, make sure to enable the \"Inject jQuery\" option.\n    const $ = context.jQuery;\n    const title = $('title').first().text();\n\n    // Clone the body to avoid modifying the original content\n    const bodyClone = $('body').clone();\n    bodyClone.find('iframe, img, script, style, object, embed, noscript, svg, video, audio').remove();\n    const body = bodyClone.html();\n\n    // Return an object with the data extracted from the page.\n    // It will be stored to the resulting dataset.\n    return {\n        url: context.request.url,\n        title,\n        body\n    };\n}",
  "postNavigationHooks": "// We need to return array of (possibly async) functions here.\n// The functions accept a single argument: the \"crawlingContext\" object.\n[\n    async (crawlingContext) => {\n        // ...\n    },\n]",
  "preNavigationHooks": "// We need to return array of (possibly async) functions here.\n// The functions accept two arguments: the \"crawlingContext\" object\n// and \"gotoOptions\".\n[\n    async (crawlingContext, gotoOptions) => {\n        // ...\n    },\n]\n",
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "runMode": "PRODUCTION",
  
  "useChrome": false,
  "waitUntil": [
    "domcontentloaded"
  ],
  "globs": [],
  "pseudoUrls": [],
  "proxyRotation": "RECOMMENDED",
  "maxConcurrency": 50,
  "pageLoadTimeoutSecs": 60,
  "pageFunctionTimeoutSecs": 60,
  "maxScrollHeightPixels": 5000,
  "customData": {}
}
sendBody: yes
specifyBody: json
authentication: genericCredentialType
genericAuthType: httpQueryAuth
name: Get Activity Details
type: n8n-nodes-base.html
parameters: operation: extractHtmlContent
dataPropertyName: activity
extractionValues: values: key: header
attribute: aria-label
cssSelector: .feed-mini-update-optional-navigation-context-wrapper
returnValue: attribute
key: url
attribute: href
cssSelector: .feed-mini-update-optional-navigation-context-wrapper
returnValue: attribute
key: content
cssSelector: .inline-show-more-text--is-collapsed
key: num_reactions
cssSelector: .social-details-social-counts__reactions-count
key: num_comments
cssSelector: .social-details-social-counts__comments
key: num_reposts
cssSelector: .social-details-social-counts__item--truncate-text
name: Get Sections
type: n8n-nodes-base.html
parameters: operation: extractHtmlContent
extractionValues: values: key: title
cssSelector: h2 [aria-hidden=true]
key: content
cssSelector: *
returnValue: html
name: Get About Section
type: n8n-nodes-base.set
parameters: assignments: assignments: name: html
type: string
value: ={{
$input.all()
  .find(input => input.json.title.toLowerCase().trim() === 'about')
  .json
  .content
}}
executeOnce: yes
name: Get Activity Section
type: n8n-nodes-base.set
parameters: assignments: assignments: name: html
type: string
value: ={{
$input.all()
  .find(input => input.json.title.toLowerCase().trim() === 'activity')
  .json
  .content
}}
executeOnce: yes
name: Extract Activities
type: n8n-nodes-base.html
parameters: operation: extractHtmlContent
dataPropertyName: html
extractionValues: values: key: activity
cssSelector: .profile-creator-shared-feed-update__mini-container
returnArray: yes
returnValue: html
name: Merge1
type: n8n-nodes-base.merge
parameters: mode: combine
combineBy: combineByPosition
name: Is Scrape Successful?
type: n8n-nodes-base.if
parameters: conditions: options: version: 2
caseSensitive: yes
typeValidation: strict
combinator: and
conditions: operator: type: string
operation: exists
singleValue: yes
leftValue: ={{ $json.body }}
name: Extract About
type: n8n-nodes-base.html
parameters: operation: extractHtmlContent
dataPropertyName: html
extractionValues: values: body
name: Sticky Note11
type: n8n-nodes-base.stickyNote
parameters: color: 7
width: 508.12647286359606
height: 212.26880753952497
content: ## 3.6 Summarize LinkedIn For Attendee
[Read more about the Basic LLM node](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.chainllm)

Finally, we'll use the Basic LLM node to summarize our attendee's LinkedIn profile and recent activity. Our goal here is to identify and send back interesting tidbits of information which may be relevant to the meeting as well as inform the user. Should you require different criteria, simply edit the summarizer to get the response you need.
name: Sticky Note12
type: n8n-nodes-base.stickyNote
parameters: color: 7
width: 593.8676556715506
height: 196.6490014749014
content: ## 3.3: Summarize Correspondance For Attendee
[Read more about the Basic LLM node](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.chainllm)

Next, we'll generate a shorter version of the email(s) using the Basic LLM node - useful if the email was part of a large chain. The goal here is, if applicable, to remind the user of the conversion with this attendee and highlight any expectations which might be set before going into the meeting.
name: Get LinkedIn Profile & Activity
type: n8n-nodes-base.executeWorkflow
onError: continueRegularOutput
parameters: mode: each
options: waitForSubWorkflow: yes
workflowId: __rl: yes
mode: id
value: ={{ $workflow.id }}
name: Sticky Note13
type: n8n-nodes-base.stickyNote
parameters: width: 453.4804561790962
height: 588.3011632094225
content: ## Try It Out!

### This workflow builds an AI meeting assistant who sends information-dense pre-meeting notifications for a user's upcoming meetings. This template is ideal for busy professional who is constantly on the move and wants to save time and make an impression.

### How It Works
* A scheduled trigger fires hourly and checks for upcoming meetings within the hour.
* When found, a search for last correspondence and LinkedIn profile + recent activity is performed for each attendee.
* Using both available correspondance and/or Linkedin profile, an AI/LLM is used to summarize this information and generate a short notification message which should help the user prepare for the meeting.
* The notification is finally sent to the user's WhatsApp.

### Need Help?
Join the [Discord](https://discord.com/invite/XPKeKXeB7d) or ask in the [Forum](https://community.n8n.io/)!

Happy Hacking!
name: Correspondance Recap Agent
type: @n8n/n8n-nodes-langchain.chainLlm
parameters: text: =from: {{ $json.from }}
to: {{ $json.to }}
date: {{ $json.date }}
subject: {{ $json.subject }}
text:
{{ $json.text }}
messages: messageValues: =You are helping the "to" user recap the last correspondance they had in this email thread. Summarize succiently what was discussed, changed or agreed to help the user prepare for their upcoming meeting.
promptType: define
name: Attendee Research Agent
type: @n8n/n8n-nodes-langchain.chainLlm
parameters: text: =meeting date: {{ $('Check For Upcoming Meetings').item.json.start.dateTime }}
meeting url: {{ $('Check For Upcoming Meetings').item.json.hangoutLink }}
meeting summary: {{ $('Check For Upcoming Meetings').first().json.summary }}
meeting description: {{ $('Check For Upcoming Meetings').item.json.description }}
meeting with: {{ $json.attendees.map(item => item.name).join(',') }}
---
{{
$json.attendees.map(item => {
  return
`attendee name: ${item.name}
${item.name}'s last correspondance: ${item.email_summary.replaceAll('\n', ' ') || `We have not had any correspondance with ${item.name}`}
${item.name}'s linkedin profile: ${item.linkedin_summary.replaceAll('\n', ' ') || `We were unable to find the linkedin profile for ${$json.name}`}
`
}).join('\n---\n')
}}
messages: messageValues: =You are a personal meeing assistant.
You are helping to remind user of an upcoming meeting with {{ $json.attendees.map(item => item.name).join(',') }} (aka "the attendee(s)"}. You will structure your notification using the following guidance:
1. Start by providing the meeting summary, mentioning the date, with whom and providing the meeting link.
2. For each attendee, give a short bullet point summary of their last correspondance. Assess if the correspondance has any relevance to the meeting and if so, identify any important todos or items which should be mentioned during the meeting. Additionally, give a short bullet point summary of attendee's recent activity which makes for good talking points. These need not be relevant to the meeting.

Write your response in a casual tone as if sending a SMS message to the user. USe bullet points where appropriate.
promptType: define
name: LinkedIn Summarizer Agent
type: @n8n/n8n-nodes-langchain.chainLlm
parameters: text: =### name
{{ $('Extract Profile Metadata').item.json.name }}
### about
"{{ $('Extract Profile Metadata').item.json.tagline }}"
{{ $json.about.replaceAll('\n', ' ')}}
### recent activity
{{
$json.activity.map((item, idx) => {
  return [
    item.header.replace('View full post.', ''),
    `(${item.url})`,
    ' - ',
    item.content.replaceAll('\n', ' ').replaceAll('…show more', '')
  ].join(' ')
}).join('\n---\n')
}}
messages: messageValues: =Summarize briefly the person and their recent activities as seen in the given feed and highlight noteworthy awards or achievements which make for good talking points.
promptType: define

Connections:
Merge: main: node: Merge Attendee with Summaries
type: main
Merge1: main: node: LinkedIn Summarizer Agent
type: main
Router: main: node: Has Email Address?
type: main
node: Has LinkedIn URL?
type: main
Has Emails?: main: node: Get Message Contents
type: main
node: Return Email Error
type: main
Get Sections: main: node: Get About Section
type: main
node: Get Activity Section
type: main
Extract About: main: node: Merge1
type: main
Set Route Email: main: node: Get Correspondance
type: main
Simplify Emails: main: node: Correspondance Recap Agent
type: main
Schedule Trigger: main: node: Check For Upcoming Meetings
type: main
Sections To List: main: node: Get Sections
type: main
APIFY Web Scraper: main: node: Is Scrape Successful?
type: main
Attendees to List: main: node: Set Route Email
type: main
node: Set Route Linkedin
type: main
Get About Section: main: node: Extract About
type: main
Has LinkedIn URL?: main: node: Set LinkedIn Cookie
type: main
node: Return LinkedIn Error1
type: main
OpenAI Chat Model: ai_languageModel: node: Correspondance Recap Agent
type: ai_languageModel
Activities To List: main: node: Get Activity Details
type: main
Extract Activities: main: node: Activities To List
type: main
Get Correspondance: main: node: Merge
type: main
Has Email Address?: main: node: Get Last Correspondence
type: main
node: Return Email Error1
type: main
OpenAI Chat Model1: ai_languageModel: node: LinkedIn Summarizer Agent
type: ai_languageModel
OpenAI Chat Model2: ai_languageModel: node: Extract Attendee Information
type: ai_languageModel
OpenAI Chat Model3: ai_languageModel: node: Attendee Research Agent
type: ai_languageModel
Set Route Linkedin: main: node: Get LinkedIn Profile & Activity
type: main
Activities To Array: main: node: Merge1
type: main
Aggregate Attendees: main: node: Attendee Research Agent
type: main
Set LinkedIn Cookie: main: node: APIFY Web Scraper
type: main
Get Activity Details: main: node: Activities To Array
type: main
Get Activity Section: main: node: Extract Activities
type: main
Get Message Contents: main: node: Simplify Emails
type: main
Is Scrape Successful?: main: node: Extract Profile Metadata
type: main
node: Return LinkedIn Error
type: main
Attendee Research Agent: main: node: WhatsApp Business Cloud
type: main
Get Last Correspondence: main: node: Has Emails?
type: main
Execute Workflow Trigger: main: node: Router
type: main
Extract Profile Metadata: main: node: Sections To List
type: main
LinkedIn Summarizer Agent: main: node: Return LinkedIn Success
type: main
Correspondance Recap Agent: main: node: Return Email Success
type: main
Check For Upcoming Meetings: main: node: Extract Attendee Information
type: main
Extract Attendee Information: main: node: Attendees to List
type: main
Merge Attendee with Summaries: main: node: Aggregate Attendees
type: main
Get LinkedIn Profile & Activity: main: node: Merge
type: main