DEV Community

Cover image for Meeting Minutes Made Easy: Summarize Key Points and Send Emails using Lyzr-Automata
Rasswanth Shankar
Rasswanth Shankar

Posted on

Meeting Minutes Made Easy: Summarize Key Points and Send Emails using Lyzr-Automata

After every single meeting, capturing action items, summarizing key decisions, and keeping everyone in the loop with follow-up emails can be a time-consuming hassle. In this blog post, we’ll delve into the innovative workflow using Lyzr-Automata designed to summarize meetings and send email reports seamlessly.

Before We Begin

Before we start, we need to get an Access Token to call Microsoft Graph API. Graph API is what we’ll be using to retrieve content and emails.

Steps to get Access Token and basic python setup template — LINK

Documentation of Graph API — LINK

We will be mainly using 2 APIs from Microsoft Graph

  1. Get callTranscript — To get the transcript of a particular meeting
  2. List attendanceRecords — To list all the attendees in a meeting

Now let’s look at how to automate the process using Lyzr-Automata, given that we have retrieved results from these 2 APIs.

Setup

Create a folder, set up a virtual environment and activate it

virtualenv my_env
source my_env/bin/activate
Enter fullscreen mode Exit fullscreen mode

Install the following packages

lyzr-automata==0.1.2
python-dotenv==1.0.1
Enter fullscreen mode Exit fullscreen mode

Setup .env file

OPENAI_API_KEY = "YOUR OPENAI API KEY"
EMAIL = "YOUR EMAIL ID"
PASSWORD = "YOUR APP PASSWORD"
Enter fullscreen mode Exit fullscreen mode

Note: To get your App Password, follow these steps here

Get Started

1.APIs to fetch data (token is the Microsoft Access Token)

# Transcript API
def get_transcript_content(meeting_ID, transcript_ID, token):
    endpoint = "https://graph.microsoft.com/v1.0/me/onlineMeetings/{meeting}/transcripts/{transcript}/content?$format=text/vtt".format(meeting = meeting_ID, transcript = transcript_ID)
    api_result = requests.get(
        endpoint,
        headers={'Authorization': 'Bearer ' + token['access_token']},
        timeout=30,
    ).text
    return api_result

# Attendees API
def get_attendees_list(meeting_ID, report_ID, token):
    endpoint = "https://graph.microsoft.com/v1.0/me/onlineMeetings/{meeting}/attendanceReports/{report}/attendanceRecords".format(meeting = meeting_ID, report = report_ID)
    api_result = requests.get(
        endpoint,
        headers={'Authorization': 'Bearer ' + token['access_token']},
        timeout=30,
    ).json()

    attendance_values = api_result["value"]
    email_list = []
    for attendee in attendance_values:
        if attendee["emailAddress"]:
            email_list.append(attendee["emailAddress"])
    return email_list
Enter fullscreen mode Exit fullscreen mode

2.Load .env variables

from dotenv import load_dotenv
import os
from lyzr_automata.ai_models.openai import OpenAIModel
from lyzr_automata import Agent
from lyzr_automata import Task
from lyzr_automata.tasks.task_literals import InputType, OutputType
from lyzr_automata.tools.prebuilt_tools import send_email_by_smtp_tool

load_dotenv()

OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
EMAIL = os.getenv("EMAIL") # Email ID to send emails from
PASSWORD = os.getenv("PASSWORD") # App password of the email
Enter fullscreen mode Exit fullscreen mode

3.Initialize Text Model

# GPT 4 Text Model
open_ai_model_text = OpenAIModel(
    api_key= OPENAI_API_KEY,
    parameters={
        "model": "gpt-4-turbo-preview",
        "temperature": 0.2,
        "max_tokens": 1500,
    },
)

Enter fullscreen mode Exit fullscreen mode

4.Create our Summarizer

# Intructions for our Agent
summarizer_agent = Agent(
        prompt_persona="You are an intelligent agent that can summarize WebVTT content into a meaninful summary",
        role="WebVTT summarizer",
    )

input_transcript = get_transcript_content(meeting_ID, transcript_ID, token)

def email_draft_function(input_transcript):
    # Draft a summary Task
    summarize_content_task = Task(
        name="Transcript summarizer",
        agent=summarizer_agent,
        output_type=OutputType.TEXT,
        input_type=InputType.TEXT,
        model=open_ai_model_text,
        instructions="Summarize the WebVTT input into a meaningful Minutes of Meeting that captures immportant details and speakers. Return only the speaker name and their corresponding suammary [!IMPORTANT] Use HTML table to revise the email and beautify it", # Prompt Engineering
        log_output=True,
        enhance_prompt=False,
        default_input=input_transcript # Input for the task
    ).execute()

    return summarize_content_task # Return Output
Enter fullscreen mode Exit fullscreen mode

5.Send Email Task

input_email_list = get_attendees_list(meeting_ID, report_ID, token)

# Email config
def email_sender_function(summarize_content_task, input_email_list):
    email_sender = send_email_by_smtp_tool(
        username=EMAIL,
        password=PASSWORD,
        host="smtp.gmail.com",
        port=587,
        sender_email=EMAIL
    )

    # Send email Task
    send_email_task = Task(
        name = "Send Email Task",
        tool = email_sender,
        instructions="Send Email",
        model=open_ai_model_text,
        input_tasks = [summarize_content_task],
        default_input = input_email_list,
        previous_output = summarize_content_task
    ).execute()
Enter fullscreen mode Exit fullscreen mode

6. Setup your flask server and run!

FLOW Diagram

Flow diagram

Want to create more of such amazing AI Workflows? Visit our website at GitHub to learn more about Lyzr-Automata!

Lyzr Website: https://www.lyzr.ai/
Lyzr Community Channel: Discord

Top comments (0)