mirror of
https://github.com/MervinPraison/PraisonAI.git
synced 2026-11-07 12:47:55 -10:00
* docs(examples): add meeting-notes agent example composed from existing primitives (#4622) Demonstrates the AI meeting-notes pipeline (transcribe -> summarize -> index for Q&A) using existing AudioAgent, Agent, and knowledge= RAG. No new SDK surface added; keeps core lightweight per AGENTS.md. Co-authored-by: Mervin Praison <[email protected]> * fix(examples): print final Q&A result in meeting-notes agent Greptile P1: qa.start() return was discarded so non-interactive/redirected runs omitted the advertised Q&A output. Now printed explicitly. Co-authored-by: Mervin Praison <[email protected]> --------- Co-authored-by: praisonai-triage-agent[bot] <272766704+praisonai-triage-agent[bot]@users.noreply.github.com> Co-authored-by: Mervin Praison <[email protected]>
74 lines
2.2 KiB
Python
74 lines
2.2 KiB
Python
"""
|
|
Meeting Notes Agent
|
|
|
|
An AI meeting-notes pipeline composed entirely from existing PraisonAI
|
|
primitives — no new SDK surface required:
|
|
|
|
1. AudioAgent.transcribe() -> Whisper speech-to-text
|
|
2. Agent (summary) -> structured summary + action items
|
|
3. Agent (knowledge=[...]) -> index transcript for cross-meeting Q&A
|
|
|
|
Usage:
|
|
python meeting-notes-agent.py path/to/recording.mp3
|
|
|
|
Requires: OPENAI_API_KEY (or any LiteLLM-supported STT/LLM provider).
|
|
"""
|
|
|
|
import sys
|
|
from praisonaiagents import Agent, AudioAgent
|
|
|
|
|
|
def transcribe_meeting(audio_path: str) -> str:
|
|
"""Speech-to-text using the built-in Whisper AudioAgent."""
|
|
stt = AudioAgent(llm="openai/whisper-1")
|
|
return stt.transcribe(audio_path)
|
|
|
|
|
|
def summarize_meeting(transcript: str) -> str:
|
|
"""Summarize decisions, topics, and action items."""
|
|
notetaker = Agent(
|
|
name="Meeting Notetaker",
|
|
instructions=(
|
|
"You are an expert meeting notetaker. Given a raw transcript, produce:\n"
|
|
"1. A concise summary (3-5 sentences).\n"
|
|
"2. Key decisions made.\n"
|
|
"3. Action items as a checklist with owners when mentioned.\n"
|
|
"Only include action items that were actually spoken."
|
|
),
|
|
)
|
|
return notetaker.start(f"Transcript:\n\n{transcript}")
|
|
|
|
|
|
def build_qa_agent(transcript_path: str) -> Agent:
|
|
"""Index the transcript for semantic search and cross-meeting Q&A."""
|
|
return Agent(
|
|
name="Meeting Q&A",
|
|
instructions="Answer questions using only the indexed meeting transcripts. Cite what was said.",
|
|
knowledge=[transcript_path],
|
|
)
|
|
|
|
|
|
def main() -> None:
|
|
if len(sys.argv) < 2:
|
|
print("Usage: python meeting-notes-agent.py <audio_file>")
|
|
sys.exit(1)
|
|
|
|
audio_path = sys.argv[1]
|
|
|
|
transcript = transcribe_meeting(audio_path)
|
|
transcript_path = "meeting_transcript.txt"
|
|
with open(transcript_path, "w", encoding="utf-8") as f:
|
|
f.write(transcript)
|
|
|
|
notes = summarize_meeting(transcript)
|
|
print("\n=== Meeting Notes ===\n")
|
|
print(notes)
|
|
|
|
qa = build_qa_agent(transcript_path)
|
|
print("\n=== Q&A ===\n")
|
|
print(qa.start("What were the main action items and who owns them?"))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|