-
Notifications
You must be signed in to change notification settings - Fork 125
feat: Meeting Intelligence Agent — Transform messy notes into action items #149
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: old-main
Are you sure you want to change the base?
Changes from all commits
ae95874
bedd1bd
8c28948
853bac7
bb02f1d
2380af5
8867c6c
f049ce6
213eb49
a7737fe
d6a54a8
78b5f56
22bb3d2
549c9fc
543d9cb
9d17091
2df5b81
e6525d1
745b251
def3648
55678c7
4dd69b0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| node_modules/ | ||
| .env | ||
| .env.local | ||
| .next/ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,193 @@ | ||
| # 🧠 Meeting Intelligence Agent | ||
|
|
||
| > Stop losing action items after meetings. Paste your raw notes — get a structured report delivered to your inbox in seconds. | ||
|
|
||
| [](https://vercel.com/new/clone?repository-url=https://github.com/AnuragDubey007/meeting-intelligence) | ||
|
|
||
| ## 🔴 Live Demo | ||
|
|
||
| **[https://meeting-intelligence-tau.vercel.app/]** | ||
|
|
||
| --- | ||
|
|
||
| ## The Problem | ||
|
|
||
| Every team has this problem. | ||
|
|
||
| Someone takes notes during a meeting — messy, unstructured, full of half sentences. After the meeting ends, nobody knows exactly who owns what task or what deadline was agreed on. Action items get lost in a wall of text. Follow ups never happen. The meeting was a waste of time. | ||
|
|
||
| Existing tools like Zoom AI require you to be inside their ecosystem and cost money. This is open source, works with any text source, and runs entirely on Lamatic. | ||
|
|
||
| --- | ||
|
|
||
| ## The Solution | ||
|
|
||
| Paste any raw meeting notes. The agent: | ||
|
|
||
| - Writes a clean 2-3 sentence summary | ||
| - Extracts every action item with owner, deadline, and priority | ||
| - Lists all decisions that were made | ||
| - Identifies follow up questions that need answers | ||
| - Emails the full structured report to your team automatically | ||
|
|
||
| --- | ||
|
|
||
| ## How It Works | ||
| Raw Notes → Lamatic Flow → LLM Extraction → Code Parser → SMTP Email → Dashboard | ||
|
|
||
| 1. User pastes messy meeting notes and enters recipient email in the Next.js UI | ||
| 2. Frontend sends the data to Lamatic via GraphQL API | ||
| 3. **LLM Node** extracts structured JSON from the raw notes using Llama 3.3 70B | ||
| 4. **Code Node** parses the JSON and builds a formatted HTML email body | ||
| 5. **SMTP Node** sends the report directly to the recipient's inbox | ||
| 6. **API Response** returns the parsed data to the frontend dashboard | ||
|
|
||
| --- | ||
|
|
||
| ## Lamatic Flow Architecture | ||
|
|
||
| The entire intelligence pipeline runs inside Lamatic — 5 nodes, zero backend servers: | ||
|
|
||
| | Node | Purpose | | ||
| |------|---------| | ||
| | API Request | Accepts `meetingNotes` and `recipientEmail` from the frontend | | ||
| | Generate Text | Runs Llama 3.3 70B via Groq to extract structured JSON | | ||
| | Code Node | Parses JSON response and builds HTML email body | | ||
| | SMTP Node | Sends formatted report to recipient email automatically | | ||
| | API Response | Returns structured result back to the Next.js frontend | | ||
|
|
||
| --- | ||
|
|
||
| ## Features | ||
|
|
||
| - Works with any meeting notes — standups, client calls, brainstorms, retrospectives | ||
| - Automatically identifies task owners from natural language | ||
| - Color coded priority labels — High, Medium, Low | ||
| - Sends formatted HTML email report via Lamatic SMTP node | ||
| - Copy all results to clipboard in one click | ||
| - Clean dark UI built with Next.js and Tailwind CSS | ||
| - Fully open source and self hostable | ||
|
|
||
| --- | ||
|
|
||
| ## Tech Stack | ||
|
|
||
| | Layer | Technology | | ||
| |-------|-----------| | ||
| | Frontend | Next.js 16, TypeScript, Tailwind CSS | | ||
| | AI Orchestration | Lamatic.ai | | ||
| | LLM | Llama 3.3 70B via Groq | | ||
| | Email Delivery | Lamatic SMTP Node | | ||
| | Deployment | Vercel | | ||
|
|
||
| --- | ||
|
|
||
| ## Setup | ||
|
|
||
| ### Prerequisites | ||
|
|
||
| - Node.js 18+ | ||
| - Lamatic.ai account (free) | ||
| - Gmail or SMTP credentials configured in Lamatic Connections | ||
|
|
||
| ### 1. Clone and install | ||
|
|
||
|
|
||
| ### 2. Set up environment variables | ||
|
|
||
| Copy `.env.example` to `.env.local` and fill in your values: | ||
|
|
||
| ```bash | ||
| cp .env.example .env.local | ||
| ``` | ||
|
|
||
| ```env | ||
| LAMATIC_API_URL=your_lamatic_graphql_endpoint | ||
| LAMATIC_API_KEY=your_lamatic_api_key | ||
| LAMATIC_PROJECT_ID=your_project_id | ||
| LAMATIC_FLOW_ID=your_flow_id | ||
| ``` | ||
|
|
||
| Get these values from Lamatic Studio → your project → Connect → API tab. | ||
|
|
||
| ### 3. Import the Lamatic Flow | ||
|
|
||
| - Go to Lamatic Studio | ||
| - Create a new flow | ||
| - Set up the 5 nodes as described in the architecture section above | ||
| - Configure your SMTP credentials in Lamatic Connections | ||
| - Deploy the flow | ||
| - Copy your Flow ID and Project credentials to `.env.local` | ||
|
AnuragDubey007 marked this conversation as resolved.
|
||
|
|
||
| ### 4. Run locally | ||
|
|
||
| ```bash | ||
| npm run dev | ||
| ``` | ||
|
|
||
| Open `http://localhost:3000` | ||
|
|
||
| ### 5. Deploy to Vercel | ||
|
|
||
| Click the Deploy button at the top of this README or: | ||
|
|
||
| 1. Push to GitHub | ||
| 2. Import repo in Vercel | ||
| 3. Add all 4 environment variables in Vercel settings | ||
| 4. Deploy | ||
|
|
||
| --- | ||
|
|
||
| ## Example | ||
|
|
||
| **Input — raw messy notes:** | ||
| ok so we had our weekly sync. raj mentioned the API is still slow and | ||
| needs optimization before launch. priya will handle the database indexing | ||
| by thursday. john said the login page bug is critical and needs to be fixed | ||
| today. we decided to delay the launch by one week to april 28. need to | ||
| follow up with the design team about the new onboarding flow. | ||
|
|
||
| **Output — structured report:** | ||
|
|
||
| **Summary:** The team discussed pre-launch blockers including API performance and a critical login bug. The launch has been delayed by one week. Database optimization and bug fixes are the immediate priorities. | ||
|
|
||
| **Action Items:** | ||
|
|
||
| | Task | Owner | Deadline | Priority | | ||
| |------|-------|----------|----------| | ||
| | Optimize API performance | Raj | Before launch | 🔴 High | | ||
| | Database indexing | Priya | Thursday | 🔴 High | | ||
| | Fix login page bug | John | Today | 🔴 High | | ||
| | Follow up with design team | Unknown | Not specified | 🟡 Medium | | ||
|
|
||
| **Decisions:** Launch delayed to April 28 | ||
|
|
||
| **Follow Up:** What is the status of the new onboarding flow design? | ||
|
|
||
| --- | ||
|
|
||
| ## Project Structure | ||
|
|
||
| ``` | ||
| kits/automation/meeting-intelligence/ | ||
| ├── app/ | ||
| │ ├── api/ | ||
| │ │ └── analyze/ | ||
| │ │ └── route.ts | ||
| │ ├── page.tsx | ||
| │ └── layout.tsx | ||
| ├── .env.example | ||
| ├── package.json | ||
| └── README.md | ||
| ``` | ||
|
|
||
| --- | ||
|
|
||
| ## Contributing | ||
|
|
||
| This kit is part of [Lamatic AgentKit](https://github.com/Lamatic/AgentKit). | ||
| See [CONTRIBUTING.md](../../../CONTRIBUTING.md) for guidelines. | ||
|
|
||
| --- | ||
|
|
||
| Built with ❤️ for the Lamatic AgentKit Challenge | ||
| Original file line number | Diff line number | Diff line change | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,11 @@ | ||||||||||||
| "use server"; | ||||||||||||
| import { executeFlow } from "@/lib/lamatic-client"; | ||||||||||||
|
|
||||||||||||
| export async function analyzeMeeting(meetingNotes: string, recipientEmail: string) { | ||||||||||||
| // We use executeFlow from your lib folder instead of raw fetch | ||||||||||||
| const result = await executeFlow( | ||||||||||||
| process.env.LAMATIC_FLOW_ID!, | ||||||||||||
| { meetingNotes, recipientEmail } | ||||||||||||
| ); | ||||||||||||
|
Comment on lines
+6
to
+9
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
# Verify declaration and call-site arity for executeFlow.
ast-grep --lang ts --pattern 'export async function executeFlow($_) { $$$ }' kits/automation/meeting-intelligence/lib/lamatic-client.ts
ast-grep --lang ts --pattern 'executeFlow($_, $_)' kits/automation/meeting-intelligence/actions/orchestrate.ts
rg -nP -C2 'export\s+async\s+function\s+executeFlow\s*\(' kits/automation/meeting-intelligence/lib/lamatic-client.ts
rg -nP -C2 '\bexecuteFlow\s*\(' kits/automation/meeting-intelligence/actions/orchestrate.tsRepository: Lamatic/AgentKit Length of output: 3760 Your mission, should you choose to accept: fix this function contract before merging. The call at lines 6–9 passes two arguments to The implementation reads the flow ID from - const result = await executeFlow(
- process.env.LAMATIC_FLOW_ID!,
- { meetingNotes, recipientEmail }
- );
+ const result = await executeFlow({ meetingNotes, recipientEmail });📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||
| return result ?? { error: "No result" }; | ||||||||||||
| } | ||||||||||||
|
coderabbitai[bot] marked this conversation as resolved.
|
||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,41 @@ | ||
| import { NextRequest, NextResponse } from "next/server"; | ||
|
|
||
| export async function POST(req: NextRequest) { | ||
| const { meetingNotes, recipientEmail } = await req.json(); | ||
|
|
||
| const query = ` | ||
| query ExecuteWorkflow($workflowId: String!, $meetingNotes: String, $recipientEmail: String) { | ||
| executeWorkflow( | ||
| workflowId: $workflowId | ||
| payload: { meetingNotes: $meetingNotes, recipientEmail: $recipientEmail } | ||
| ) { | ||
| status | ||
| result | ||
| } | ||
| } | ||
| `; | ||
|
|
||
| const response = await fetch(process.env.LAMATIC_API_URL!, { | ||
| method: "POST", | ||
| headers: { | ||
| "Content-Type": "application/json", | ||
| "Authorization": `Bearer ${process.env.LAMATIC_API_KEY}`, | ||
| "x-project-id": process.env.LAMATIC_PROJECT_ID!, | ||
| }, | ||
| body: JSON.stringify({ | ||
| query, | ||
| variables: { | ||
| workflowId: process.env.LAMATIC_FLOW_ID, | ||
| meetingNotes, | ||
| recipientEmail, | ||
| }, | ||
| }), | ||
| }); | ||
|
|
||
| const data = await response.json(); | ||
|
|
||
|
|
||
| const result = data?.data?.executeWorkflow?.result?.result; | ||
|
|
||
| return NextResponse.json(result ?? { error: "No result" }); | ||
|
AnuragDubey007 marked this conversation as resolved.
Comment on lines
+6
to
+40
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion | 🟠 Major Mission cleanup: reuse the shared Lamatic flow client. This route duplicates the GraphQL query, headers, variables, and result extraction already present in ♻️ Proposed refactor import { NextRequest, NextResponse } from "next/server";
+import { executeFlow } from "@/lib/lamatic-client";
export async function POST(req: NextRequest) {
const { meetingNotes, recipientEmail } = await req.json();
-
- const query = `
- query ExecuteWorkflow($workflowId: String!, $meetingNotes: String, $recipientEmail: String) {
- executeWorkflow(
- workflowId: $workflowId
- payload: { meetingNotes: $meetingNotes, recipientEmail: $recipientEmail }
- ) {
- status
- result
- }
- }
- `;
-
- const response = await fetch(process.env.LAMATIC_API_URL!, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- "Authorization": `Bearer ${process.env.LAMATIC_API_KEY}`,
- "x-project-id": process.env.LAMATIC_PROJECT_ID!,
- },
- body: JSON.stringify({
- query,
- variables: {
- workflowId: process.env.LAMATIC_FLOW_ID,
- meetingNotes,
- recipientEmail,
- },
- }),
- });
-
- const data = await response.json();
-
-
- const result = data?.data?.executeWorkflow?.result?.result;
-
- return NextResponse.json(result ?? { error: "No result" });
+ const result = await executeFlow({ meetingNotes, recipientEmail });
+ return NextResponse.json(result);
}🤖 Prompt for AI Agents |
||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,26 @@ | ||
| @import "tailwindcss"; | ||
|
|
||
| :root { | ||
| --background: #ffffff; | ||
| --foreground: #171717; | ||
| } | ||
|
|
||
| @theme inline { | ||
| --color-background: var(--background); | ||
| --color-foreground: var(--foreground); | ||
| --font-sans: var(--font-geist-sans); | ||
| --font-mono: var(--font-geist-mono); | ||
| } | ||
|
|
||
| @media (prefers-color-scheme: dark) { | ||
| :root { | ||
| --background: #0a0a0a; | ||
| --foreground: #ededed; | ||
| } | ||
| } | ||
|
|
||
| body { | ||
| background: var(--background); | ||
| color: var(--foreground); | ||
| font-family: var(--font-sans), Arial, Helvetica, sans-serif; | ||
| } | ||
|
AnuragDubey007 marked this conversation as resolved.
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,34 @@ | ||
| import type { Metadata } from "next"; | ||
| import { Geist, Geist_Mono } from "next/font/google"; | ||
| import "./globals.css"; | ||
|
|
||
| const geistSans = Geist({ | ||
| variable: "--font-geist-sans", | ||
| subsets: ["latin"], | ||
| }); | ||
|
|
||
| const geistMono = Geist_Mono({ | ||
| variable: "--font-geist-mono", | ||
| subsets: ["latin"], | ||
| }); | ||
|
|
||
| export const metadata: Metadata = { | ||
| title: "Meeting Intelligence Agent", | ||
| description: | ||
| "Transform chaotic meeting notes into structured action items, decisions, and follow-ups — delivered straight to your inbox.", | ||
| }; | ||
|
AnuragDubey007 marked this conversation as resolved.
|
||
|
|
||
| export default function RootLayout({ | ||
| children, | ||
| }: Readonly<{ | ||
| children: React.ReactNode; | ||
| }>) { | ||
| return ( | ||
| <html | ||
| lang="en" | ||
| className={`${geistSans.variable} ${geistMono.variable} h-full antialiased`} | ||
| > | ||
| <body className="min-h-full flex flex-col">{children}</body> | ||
| </html> | ||
| ); | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Mission telemetry mismatch: request path description is inaccurate.
Line 39 says the frontend sends data directly to Lamatic GraphQL, but this kit structure includes
app/api/analyze/route.ts; the step should describe frontend →/api/analyze→ Lamatic.✏️ Suggested wording
🤖 Prompt for AI Agents