// agent

Meeting Minutes

by ozzo · Jul 10, 2026 Public

Choose how to run this agent

Local runs on your GPU. For usable speed it needs a WebGPU-capable browser — Chrome or Edge on a machine with a graphics card, or an Apple Silicon Mac. This agent runs on-device only.
Try it now

Requires an API key and an AgentOp account.

41 downloads
0 forks
0.0 rating

Description

Turn a meeting recording into a summary, key decisions, and action items, then ask follow-up questions — private and in-browser.

Source Code

agent.py
# Accumulated transcript segments for this meeting: [{"source": name, "text": text}]
TRANSCRIPTS = []


async def _transcribe_audio(samples, name):
    """(JS-callable) Transcribe decoded audio samples and remember the result.

    Underscore-prefixed so it is never exposed to the LLM as a tool. ``samples``
    is a Float32Array of mono 16 kHz samples handed over by the page JS.
    """
    text = (await agentop_ml.transcribe(samples)).strip()
    TRANSCRIPTS.append({"source": name, "text": text})
    return text


def _transcript_context():
    return "\n\n".join(
        f"[{i + 1}] (from {t['source']}) {t['text']}"
        for i, t in enumerate(TRANSCRIPTS)
    )


async def _generate_minutes():
    """(JS-callable) Turn the transcript into structured minutes via wllama."""
    if not TRANSCRIPTS:
        return "Upload a meeting recording first, then generate the minutes."
    prompt = (
        "You are given the TRANSCRIPT of a meeting. Produce concise minutes with "
        "exactly these three sections, using this markdown:\n"
        "## Summary\n(2-4 sentences)\n\n"
        "## Key decisions\n(bullet list; write 'None recorded.' if none)\n\n"
        "## Action items\n(bullet list of 'owner - task'; 'None recorded.' if none)\n\n"
        "Use ONLY what is in the transcript; do not invent names or tasks.\n\n"
        f"TRANSCRIPT:\n{_transcript_context()}"
    )
    return await process_user_query_wllama(
        prompt, globals().get("TEMPLATE_SYSTEM_PROMPT", "")
    )


async def process_user_query(query):
    """Free follow-up Q&A grounded ONLY in the meeting transcript.

    Overrides the default router so context is deterministic (small local
    models are unreliable at deciding to call tools themselves).
    """
    if not TRANSCRIPTS:
        return "No meeting has been transcribed yet - upload a recording first."
    grounded_prompt = (
        "Answer the QUESTION using ONLY the meeting TRANSCRIPT below. "
        "If the answer is not in the transcript, say you could not find it. "
        "Cite segment numbers like [1] where relevant.\n\n"
        f"TRANSCRIPT:\n{_transcript_context()}\n\nQUESTION: {query}"
    )
    return await process_user_query_wllama(
        grounded_prompt, globals().get("TEMPLATE_SYSTEM_PROMPT", "")
    )

More by ozzo

New Hire Handbook Q&A

Based on the New Hire Handbook Q&A template.

Contract Plain-Language Explainer

Upload a contract and get it explained in plain language — obligations, fees, deadlines, exit claus…

WhatsApp Sales Copilot

Turn a raw WhatsApp chat export into a mini CRM — typed quotes, bookings, payments and boarding pas…

Private Quote & Material Estimator

Drop competing contractor quotes and compare them side by side — totals, inclusions, exclusions — t…

Messy Itinerary Travel Planner

Drop your messy pile of booking PDFs and trip notes and get a clean day-by-day itinerary — plus war…

Semantic Search

Search your own notes or documents by meaning, not keywords — instant results with no LLM download.