// 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. Without a supported GPU, pick OpenAI or Anthropic above instead. Check your machine
Try it now

Requires an API key and an AgentOp account.

84 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.

What this agent can do

Meeting Minutes is built from the Meeting Minutes template. Runs fully on your own device: llama.cpp compiled to WebAssembly, GPU-accelerated through WebGPU, with no API key and no server. After the one-time model download it works offline. Can run on OpenAI models with your own API key, encrypted in your browser. Can run on Anthropic Claude models with your own API key, encrypted in your browser.

Runs in the browser

  • Speech to text. Transcribes speech in the browser with Whisper, from an uploaded recording or straight from the microphone.

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

Receipt & Invoice Extractor

Based on the Receipt & Invoice Extractor template.

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…