# Project export: MeetAI

This document was generated by HackStack to give an AI agent context about a hackathon project. Sections are labeled with their provenance; content marked as truncated was cut to keep this document small.

## Project metadata

- Hackathon: Cal Hacks 11.0
- Tagline: Revolutionize Your Meetings: Instant Insights, Vector-Powered.
- Devpost: https://devpost.com/software/meetai
- GitHub: https://github.com/jask1m/calhacks11
- Team: 3 GitHub contributor(s) — RonCodes88 (12 commits), jask1m (9 commits), JavierAguilarOchoa (1 commits)

## Devpost submission (written by the team)

### Inspiration

In today's fast-paced environment, video calls often lead to important discussions and decisions. However, for hosts, generating new ideas to engage the audience can be challenging at times, and taking notes during a presentation can be inconvenient. Manual summarization often misses critical details.

### What it does

MeetAI is an AI-powered video call platform that provides real-time feedback leveraging advanced technologies such as Fetch.AI's AI agents, Google's Gemini AI, SingleStore's vector databases, and Agora's real-time voice and video capabilities to transform how meetings are documented and actioned. MeetAI generates a concise summary of the key points discussed, and a detailed list of notes, including key decisions made, action items with assigned responsibilities, important deadlines, and any unresolved issues or next steps all while the video call is going on. This feedback-driven cycle allows the host to make assisted decisions on how to continue to go on with the meeting.

### How we built it

The front end of MeetAI is built using TypeScript and Tailwind.css to create a clean and minimalistic user interface. The backend is implemented using Python FastAPI to handle our API endpoints and SingleStoreDB for our vector database, allowing fast and accurate retrieval of information from large datasets. The Agora API is used to support our video streaming platform, which makes real-time communication easy. We also utilized the OpenAI API to generate text embeddings on our vector database and Fetch.AI agents simplify the process of generating notes and vector search. Frontend: TypeScript, TailwindCSS Backend: SingleStoreDB, Python, FastAPI APIs: Gemini, Agora, OpenAI, Fetch.AI

### Accomplishments we're proud of

We are happy to see that we have a beautiful landing page, providing a clean and smooth user experience. Combining so many new technologies in a short time was no easy feat, including the process of going through documentation and resources for vector databases.

### What we learned

We learned about implementing AI agents, building a vector database with vector search, and transcribing from speech to text.

### What's next

Support all channels for anyone to join.

## README (from the GitHub repository)

# MeetAI
In today's fast-paced environment, video calls often lead to important discussions and decisions. However, for hosts, generating new ideas to engage the audience can be challenging at times, and taking notes during a presentation can be inconvenient. Manual summarization often misses critical details.

MeetAI is an AI powered video call platform that provides real-time feedback leveraging advanced technologies such as Fetch.AI's AI agents, Google's Gemini AI, SingleStore's vector databases, and Agora's real time voice and video capabilities to transform how meetings are documented and actioned.

MeetAI generates a concise summary of the key points discussed, a detailed list of notes, including key decisions made, action items with assigned responsibilities, important deadlines, and any unresolved issues or next steps all while the video call is going on. This feedback-driven cycle allows the host to make assisted decisions on how to continue to go on with the meeting.

![Screenshot 2024-10-20 110257](https://github.com/user-attachments/assets/3ac8c4b2-250a-4031-8ec5-5b0360d028bd)


## Detected evidence (automated analysis)

Indexed codebase: 25 recognized source files, 34 KB.
- CSS (language) — detected in the code
- FastAPI (technology) — detected in the code
- HTML (language) — detected in the code
- JavaScript (language) — detected in the code
- OpenAI (technology) — detected in the code
- Python (language) — detected in the code
- React (technology) — detected in the code
- Tailwind CSS (technology) — detected in the code
- TypeScript (language) — detected in the code
- Google Gemini (technology) — claimed on Devpost, not found in the code

## Codebase structure (from repository index)

### Files (32 of 32)

```
backend/.gitignore
backend/meeting_agents.py
backend/requirements.txt
backend/server.py
backend/vectorDB.py
frontend/.gitignore
frontend/components.json
frontend/eslint.config.js
frontend/index.html
frontend/package.json
frontend/postcss.config.js
frontend/README.md
frontend/src/App.jsx
frontend/src/components/Basics.jsx
frontend/src/components/ui/navigation-menu.tsx
frontend/src/index.css
frontend/src/layouts/dashboard-layout.jsx
frontend/src/layouts/root-layout.jsx
frontend/src/lib/utils.ts
frontend/src/main.jsx
frontend/src/pages/Error.jsx
frontend/src/pages/Home.jsx
frontend/src/routes/Contact.jsx
frontend/src/routes/Dashboard.jsx
frontend/src/routes/Index.jsx
frontend/src/routes/Sign-in.jsx
frontend/src/routes/Sign-up.jsx
frontend/tailwind.config.js
frontend/tsconfig.json
frontend/tsconfig.node.json
frontend/vite.config.ts
README.md
```

### Dependencies

- backend/requirements.txt: fastapi@==0.115.2, fastapi-cors@==0.0.6, google-generativeai@==0.8.3, openai@==0.26.5, pydantic@==2.9.2, python-dotenv@1.0.1, requests@==2.32.3, singlestoredb@==0.5.1, tiktoken@==0.8.0, uagents@==0.16.2, uvicorn@==0.32.0
- frontend/package.json: @clerk/clerk-react@^5.12.0, @radix-ui/react-icons@^1.3.0, @radix-ui/react-navigation-menu@^1.2.1, @types/node@^20.16.13, @types/react@^18.2.0, @types/react-dom@^18.2.0, @vitejs/plugin-react@^4.3.2, agora-rtc-react@^2.3.0, agora-rtc-sdk-ng@^4.22.1, autoprefixer@^10.4.20, class-variance-authority@^0.7.0, clsx@^2.1.1, eslint@^8.56.0, eslint-plugin-react@^7.33.2, eslint-plugin-react-hooks@^4.6.0, eslint-plugin-react-refresh@^0.4.5, lucide-react@^0.453.0, postcss@^8.4.47, react@^18.2.0, react-dom@^18.2.0, react-router-dom@^6.27.0, tailwind-merge@^2.5.4, tailwindcss@^3.4.14, tailwindcss-animate@^1.0.7, vite@^5.0.12

### Recent commits (newest first)

- Update README.md
- Update README.md
- Update README.md
- Merge pull request #7 from jask1m/vector
- changes to vector
- Create README.md
- Merge pull request #6 from jask1m/vector
- fixed backend
- Added insert to meeting_agents
- Merge pull request #5 from jask1m/vector
- stuff
- Added some agents
- styles
- Merge pull request #4 from jask1m/dashboard
- styles + dashboard
- vector database
- Merge pull request #3 from jask1m/auth
- add styles
- update agora video
- add agora video calling

## Key source files (fetched from GitHub, selected and truncated for size)

### backend/requirements.txt

```
fastapi==0.115.2
uvicorn==0.32.0
fastapi-cors==0.0.6
uagents==0.16.2
google-generativeai==0.8.3
singlestoredb==0.5.1
requests==2.32.3
pydantic==2.9.2
openai==0.26.5
python-dotenv 1.0.1
tiktoken==0.8.0

```

### frontend/package.json

```
{
  "name": "frontend",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "lint": "eslint .",
    "preview": "vite preview"
  },
  "dependencies": {
    "@clerk/clerk-react": "^5.12.0",
    "@radix-ui/react-icons": "^1.3.0",
    "@radix-ui/react-navigation-menu": "^1.2.1",
    "agora-rtc-react": "^2.3.0",
    "agora-rtc-sdk-ng": "^4.22.1",
    "class-variance-authority": "^0.7.0",
    "clsx": "^2.1.1",
    "lucide-react": "^0.453.0",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-router-dom": "^6.27.0",
    "tailwind-merge": "^2.5.4",
    "tailwindcss-animate": "^1.0.7"
  },
  "devDependencies": {
    "@types/node": "^20.16.13",
    "@types/react": "^18.2.0",
    "@types/react-dom": "^18.2.0",
    "@vitejs/plugin-react": "^4.3.2",
    "autoprefixer": "^10.4.20",
    "eslint": "^8.56.0",
    "eslint-plugin-react": "^7.33.2",
    "eslint-plugin-react-hooks": "^4.6.0",
    "eslint-plugin-react-refresh": "^0.4.5",
    "postcss": "^8.4.47",
    "tailwindcss": "^3.4.14",
    "vite": "^5.0.12"
  }
}

```

### backend/server.py

```python
import json
from fastapi import FastAPI, HTTPException, Request
from fastapi.middleware.cors import CORSMiddleware
from uagents import Model
from uagents.query import query
from uagents.envelope import Envelope 
import singlestoredb as s2
from pydantic import BaseModel
import os
import uvicorn
from dotenv import load_dotenv

load_dotenv()

username = os.getenv('S2_USERNAME')
password = os.getenv('S2_PASSWORD')
host = os.getenv('S2_HOST')
port = os.getenv('S2_PORT')
database = os.getenv('S2_DATABASE')

connection_string = f"{username}:{password}@{host}:{port}/{database}"
conn = s2.connect(connection_string)

class User(BaseModel):
    user_id: int
    first_name: str
    last_name: str
    email_address: str

class Request(Model):
    message: str

app = FastAPI()

origins = ["*"]
app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

@app.get("/")
def read_root():
    return "Hello from the Agent controller"


@app.post("/query-agent")
async def make_agent_call(req: Request):
    try:
        res = await agent_query(req)
        return f"successful call - agent response: {res}"
    except Exception:
        return "unsuccessful agent call"

@app.post("/create-user")
async def create_user(user: User):
    try:
        with conn.cursor() as cur:
            cur.execute(
                'INSERT INTO users (user_id, first_name, last_name, email_address) VALUES (%s, %s, %s, %s)',
                (user.user_id, user.first_name, user.last_name, user.email_address)
            )
            conn.commit()
        return {"message": "User created successfully"}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))



if __name__ == "main":
    uvicorn.run("server:app", port=8000, reload=True)


```

### frontend/src/App.jsx

```javascript
import { Outlet } from 'react-router-dom';

function App() {
  return (
    <>
      <Outlet />
    </>
  )
}

export default App;
```

### frontend/src/main.jsx

```javascript
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import App from './App.jsx'
import ErrorPage from './pages/Error.jsx'
import Home from './pages/Home.jsx'
import {
  createBrowserRouter,
  RouterProvider,
} from "react-router-dom";
import AgoraRTC, { AgoraRTCProvider } from "agora-rtc-react";
import RootLayout from './layouts/root-layout'
import DashboardLayout from './layouts/dashboard-layout'
import IndexPage from './routes/Index'
import ContactPage from './routes/contact'
import SignInPage from './routes/sign-in'
import SignUpPage from './routes/sign-up'
import DashboardPage from './routes/Dashboard'
import './index.css'

const router = createBrowserRouter([
  {
    element: <RootLayout />,
    children: [
      { path: '/', element: <IndexPage /> },
      { path: '/contact', element: <ContactPage /> },
      { path: '/sign-in/*', element: <SignInPage /> },
      { path: '/sign-up/*', element: <SignUpPage /> },
      {
        element: <DashboardLayout />,
        path: 'dashboard',
        children: [
          { path: '/dashboard', element: <DashboardPage /> },
        ],
      },
    ],
  },
])

const client = AgoraRTC.createClient({ mode: "rtc", codec: "vp8" });

createRoot(document.getElementById('root')).render(
  <StrictMode>
    <AgoraRTCProvider client={client}>
      <RouterProvider router={router} />
    </AgoraRTCProvider>
  </StrictMode>,
)

```

### frontend/src/routes/Index.jsx

```javascript
import { Link } from 'react-router-dom'

export default function IndexPage() {
  return (
    <div className="h-full pt-20 bg-white flex flex-col items-center justify-center px-4 sm:px-6 lg:px-8">
      <div className="max-w-3xl w-full space-y-8 text-center">
        <h1 className="text-4xl sm:text-5xl md:text-6xl font-extrabold text-gray-900 tracking-tight">
          Video Calls <br /><i>AI Supercharged</i>
        </h1>
        <p className="mt-3 text-xl text-gray-500 sm:mt-4">
          Real-time context, notes, and reference for your meetings and conversations
        </p>
        <div className="mt-8">
          <Link
            to="/dashboard"
            className="inline-flex items-center justify-center px-8 py-3 border border-transparent text-base font-medium rounded-md text-white bg-black hover:bg-gray-800 transition duration-150 ease-in-out"
          >
            Get Started
          </Link>
        </div>
      </div>
    </div>
  )
}
```

### frontend/postcss.config.js

```javascript
export default {
  plugins: {
    tailwindcss: {},
    autoprefixer: {},
  },
}

```

### frontend/vite.config.ts

```typescript
import path from "path"
import react from "@vitejs/plugin-react"
import { defineConfig } from "vite"

export default defineConfig({
  plugins: [react()],
  resolve: {
    alias: {
      "@": path.resolve(__dirname, "./src"),
    },
  },
})

```

### frontend/index.html

```html
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Vite + React</title>
  </head>
  <body>
    <div id="root"></div>
    <script type="module" src="/src/main.jsx"></script>
  </body>
</html>

```

### frontend/eslint.config.js

```javascript
import js from '@eslint/js'
import globals from 'globals'
import react from 'eslint-plugin-react'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'

export default [
  { ignores: ['dist'] },
  {
    files: ['**/*.{js,jsx}'],
    languageOptions: {
      ecmaVersion: 2020,
      globals: globals.browser,
      parserOptions: {
        ecmaVersion: 'latest',
        ecmaFeatures: { jsx: true },
        sourceType: 'module',
      },
    },
    settings: { react: { version: '18.3' } },
    plugins: {
      react,
      'react-hooks': reactHooks,
      'react-refresh': reactRefresh,
    },
    rules: {
      ...js.configs.recommended.rules,
      ...react.configs.recommended.rules,
      ...react.configs['jsx-runtime'].rules,
      ...reactHooks.configs.recommended.rules,
      'react/jsx-no-target-blank': 'off',
      'react-refresh/only-export-components': [
        'warn',
        { allowConstantExport: true },
      ],
    },
  },
]

```

[15 more indexed source files omitted to keep this export small. The full file list is in the Codebase structure section above.]