> ## Documentation Index
> Fetch the complete documentation index at: https://praison.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Meeting Notes Agent

> Turn a meeting recording into structured notes and a Q&A agent

Turn a meeting recording into a concise summary, action items, and a follow-up Q\&A agent using three stock primitives.

```mermaid theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
graph LR
    Audio[🎙️ Audio] --> Transcript[📝 Transcript]
    Transcript --> Notes[🧠 Summary + Actions]
    Notes --> QA[💬 Q&A]

    classDef input fill:#8B0000,stroke:#7C90A0,color:#fff
    classDef process fill:#189AB4,stroke:#7C90A0,color:#fff
    classDef result fill:#10B981,stroke:#7C90A0,color:#fff

    class Audio input
    class Transcript,Notes process
    class QA result
```

## Quick Start

**1. Simple Usage**

Transcribe a recording, then produce notes.

```python theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
from praisonaiagents import Agent, AudioAgent

transcript = AudioAgent(llm="openai/whisper-1").transcribe("meeting.mp3")

notes = Agent(
    name="Meeting Notetaker",
    instructions="Produce a concise summary, key decisions, and action items with owners.",
).start(f"Transcript:\n\n{transcript}")

print(notes)
```

**2. Add Q\&A**

Save the transcript to disk and index it so an agent can answer follow-up questions.

```python theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
with open("meeting_transcript.txt", "w") as f:
    f.write(transcript)

qa = Agent(
    name="Meeting Q&A",
    instructions="Answer using only the indexed meeting transcript. Cite what was said.",
    knowledge=["meeting_transcript.txt"],
)
print(qa.start("What were the action items and who owns them?"))
```

***

## How It Works

Three primitives run in sequence: transcribe, summarise, then answer questions.

```mermaid theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
sequenceDiagram
    participant User
    participant AudioAgent
    participant Notetaker as Agent (Notetaker)
    participant QA as Agent (Q&A)

    User->>AudioAgent: transcribe("meeting.mp3")
    AudioAgent-->>User: transcript text
    User->>Notetaker: start(transcript)
    Notetaker-->>User: summary + action items
    User->>QA: start("Who owns each action?")
    QA-->>User: grounded answer
```

| Stage | Primitive | Purpose |
| - | - | - |
| Transcribe | `AudioAgent.transcribe()` | Convert audio to text (Whisper / any LiteLLM STT provider) |
| Summarise | `Agent(...).start()` | Extract summary, decisions, action items |
| Q\&A | `Agent(knowledge=[...])` | RAG over the transcript for follow-up questions |

***

## User Interaction Flow

Drop a recording into the folder, run the script, read the notes, then keep asking questions.

```python theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
from praisonaiagents import Agent, AudioAgent

transcript = AudioAgent(llm="openai/whisper-1").transcribe("meeting.mp3")

with open("meeting_transcript.txt", "w") as f:
    f.write(transcript)

qa = Agent(
    name="Meeting Q&A",
    instructions="Answer using only the indexed meeting transcript.",
    knowledge=["meeting_transcript.txt"],
)

while True:
    question = input("\nAsk about the meeting (or 'quit'): ")
    if question.strip().lower() in {"quit", "exit"}:
        break
    print(qa.start(question))
```

***

## Full Example

The complete script composes all three primitives end to end.

> [tab] Full script
>
> ```python theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
> from praisonaiagents import Agent, AudioAgent
>
> TRANSCRIPT_PATH = "meeting_transcript.txt"
>
>
> def transcribe_meeting(audio_path: str) -> str:
>     """Convert a meeting recording to text with Whisper."""
>     audio = AudioAgent(llm="openai/whisper-1")
>     return audio.transcribe(audio_path)
>
>
> def write_notes(transcript: str) -> str:
>     """Summarise the transcript into notes and action items."""
>     notetaker = Agent(
>         name="Meeting Notetaker",
>         instructions=(
>             "Produce a concise summary, key decisions, and action items with "
>             "owners and due dates. Only use what is in the transcript."
>         ),
>     )
>     return notetaker.start(f"Transcript:\n\n{transcript}")
>
>
> def build_qa_agent(transcript: str) -> Agent:
>     """Index the transcript so an agent can answer follow-up questions."""
>     with open(TRANSCRIPT_PATH, "w") as f:
>         f.write(transcript)
>
>     return Agent(
>         name="Meeting Q&A",
>         instructions="Answer using only the indexed meeting transcript. Cite what was said.",
>         knowledge=[TRANSCRIPT_PATH],
>     )
>
>
> def main():
>     transcript = transcribe_meeting("meeting.mp3")
>
>     print("=== Notes ===")
>     print(write_notes(transcript))
>
>     qa = build_qa_agent(transcript)
>     print("\n=== Q&A ===")
>     print(qa.start("What were the action items and who owns them?"))
>
>
> if __name__ == "__main__":
>     main()
> ```

> [tab] Shortened
>
> ```python theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
> from praisonaiagents import Agent, AudioAgent
>
> transcript = AudioAgent(llm="openai/whisper-1").transcribe("meeting.mp3")
>
> print(Agent(
>     name="Meeting Notetaker",
>     instructions="Summarise decisions and action items with owners.",
> ).start(f"Transcript:\n\n{transcript}"))
>
> with open("meeting_transcript.txt", "w") as f:
>     f.write(transcript)
>
> qa = Agent(name="Meeting Q&A", knowledge=["meeting_transcript.txt"])
> print(qa.start("What were the action items and who owns them?"))
> ```

***

## Choosing an STT Provider

Pass the provider string to `AudioAgent(llm=...)`. Start with Whisper, switch for speed or accuracy.

```mermaid theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
graph TB
    Start{Need?} -->|Default, accurate| Whisper[openai/whisper-1]
    Start -->|Fastest| Groq[groq/whisper-large-v3]
    Start -->|Real-time / diarization| Deepgram[deepgram/nova-2]

    classDef question fill:#F59E0B,stroke:#7C90A0,color:#fff
    classDef option fill:#189AB4,stroke:#7C90A0,color:#fff

    class Start question
    class Whisper,Groq,Deepgram option
```

See [Audio Overview](https://praison.ai/docs/audio/overview.md), [Groq](https://praison.ai/docs/audio/groq.md), and [Deepgram](https://praison.ai/docs/audio/deepgram.md) for setup and exact model strings.

***

## Common Patterns

Save notes, batch a folder, or persist memory across meetings.

> [tab] Save to Markdown
>
> ```python theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
> from praisonaiagents import Agent, AudioAgent
>
> transcript = AudioAgent(llm="openai/whisper-1").transcribe("meeting.mp3")
> notes = Agent(
>     name="Meeting Notetaker",
>     instructions="Summarise decisions and action items with owners.",
> ).start(f"Transcript:\n\n{transcript}")
>
> with open("notes.md", "w") as f:
>     f.write(notes)
> ```

> [tab] Batch a directory
>
> ```python theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
> import glob
> from praisonaiagents import Agent, AudioAgent
>
> audio = AudioAgent(llm="openai/whisper-1")
>
> for path in glob.glob("recordings/*.mp3"):
>     transcript = audio.transcribe(path)
>     transcript_file = path.replace(".mp3", ".txt")
>     with open(transcript_file, "w") as f:
>         f.write(transcript)
>
>     qa = Agent(name="Meeting Q&A", knowledge=[transcript_file])
>     print(path, "->", qa.start("Summarise the action items."))
> ```

> [tab] Persist with Memory
>
> ```python theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
> from praisonaiagents import Agent, AudioAgent
>
> transcript = AudioAgent(llm="openai/whisper-1").transcribe("meeting.mp3")
>
> with open("meeting_transcript.txt", "w") as f:
>     f.write(transcript)
>
> qa = Agent(
>     name="Meeting Q&A",
>     instructions="Answer from the transcript and remember past meetings.",
>     knowledge=["meeting_transcript.txt"],
>     memory=True,
> )
> print(qa.start("How does this meeting compare to last week's?"))
> ```

See [Memory](https://praison.ai/docs/concepts/memory.md) to persist context across meetings.

***

## Best Practices

> [accordion] Keep the transcript on disk
>
> `knowledge=[...]` indexes files by path, so write the transcript to disk before passing it.

> [accordion] Match the model to the task
>
> Use a cheaper LLM for summarising long transcripts and a stronger one for Q\&A accuracy.

> [accordion] Redact PII before persisting
>
> Meeting audio often contains personal data — strip sensitive details before saving transcripts.

> [accordion] Instruct the notetaker clearly
>
> Tell the notetaker to use only the transcript so it does not invent action items.

***

## Related

> [card] [Knowledge](https://praison.ai/docs/concepts/knowledge.md)
>
> Index files for retrieval-augmented Q\&A.

> [card] [Audio Overview](https://praison.ai/docs/audio/overview.md)
>
> Speech-to-text providers and setup.

> [card] [Meeting Minutes Action Items](https://praison.ai/docs/examples/recipe-examples/meeting-minutes-action-items.md)
>
> Text-transcript recipe variant.

> [card] [Memory](https://praison.ai/docs/concepts/memory.md)
>
> Persist context across meetings.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.