From de60cc94555eb22f64397d6a257d2bc8a7530889 Mon Sep 17 00:00:00 2001 From: "praisonai-triage-agent[bot]" <272766704+praisonai-triage-agent[bot]@users.noreply.github.com> Date: Wed, 2 Sep 2026 21:45:39 +0100 Subject: [PATCH] docs(examples): meeting-notes agent from existing primitives (#4683) * 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 * 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 --------- Co-authored-by: praisonai-triage-agent[bot] <272766704+praisonai-triage-agent[bot]@users.noreply.github.com> Co-authored-by: Mervin Praison --- examples/python/agents/meeting-notes-agent.py | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 examples/python/agents/meeting-notes-agent.py diff --git a/examples/python/agents/meeting-notes-agent.py b/examples/python/agents/meeting-notes-agent.py new file mode 100644 index 000000000..34b971c6a --- /dev/null +++ b/examples/python/agents/meeting-notes-agent.py @@ -0,0 +1,73 @@ +""" +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 ") + 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()