Internal product · unified communications managed service · 2026

Live AI voice agent demo for sales

A split-screen sales page where a salesperson types in a prospect's website and, about a minute later, demos a voice agent that speaks as that prospect's own virtual assistant.

  • Azure
  • Microsoft 365 & Teams
  • Code & DevOps
website to working voice agent (about 40 pages read, plus web research)
~55s
to the agent's first audio
0.6–0.8s
to start answering: inline knowledge vs a search tool
1–2s vs 6–9s
Architecture

How it fits together

  1. 01

    Page

    • Microsoft Entra ID sign-in
    • Browser mic, voice only
  2. 02

    API

    • Azure Functions (Node.js)
    • Managed identity voice tokens
  3. 03

    Build

    • Storage queue worker
    • Site crawler
    • Azure OpenAI web search
  4. 04

    Agent

    • Azure AI Foundry voice agents
    • Realtime speech model
  5. 05

    Ship

    • GitHub Actions (OIDC)
    • Bicep
Outcome

Live for the sales team, who can each turn any public website into a demo-ready voice agent in about a minute without help from engineering.

The problem

After an internal demo of a voice agent went well, the sales team wanted the same experience to be about the customer. A generic demo agent shows the technology. An agent that already knows the prospect’s services, locations and contact details shows what it would be like for them. Building one by hand before each meeting wasn’t practical. The salespeople needed to do it themselves, quickly, without being able to break each other’s demos.

What I did

  • Gathered requirements before building: agents per salesperson, ownership rules, knowledge depth, persona, access and behaviour inside a Teams meeting. Then I showed a local design mock-up connected to the real showcase agent before writing the backend.
  • Built the website-to-agent pipeline. The crawler reads the homepage, then the sitemap, then discovered links. It reads contact and about pages first and caps each section of a site so location or product pages can’t crowd out everything else. It also strips the menus and footers that repeat across pages. Web research runs in parallel and retries with a plainer prompt if the model declines, never passing a refusal on as knowledge.
  • Wrote the knowledge for listening, not reading. The condensing step produces a structured brief of 2,500–4,500 words with no URLs, a single main contact line and an explicit list of gaps, so the agent says what isn’t known instead of inventing it.
  • Measured retrieval through a search tool against placing the brief inline in the agent’s instructions. Inline started answering three to four times sooner, which matters in a live conversation, so that’s what ships.
  • Made it safe to hand to a team. Microsoft sign-in and a staff allow-list control access, and the browser gets short-lived voice tokens from the app’s managed identity, so staff need no Azure roles. Anyone can talk to any agent, but only its owner or an admin can rebuild or reset it. Admins manage the team from the page itself, with optimistic concurrency so two admins saving at once can’t overwrite each other.
  • Kept the footprint small: one Function App, one identity-only storage account, one model deployment, with infrastructure in Bicep. Deploys go through GitHub Actions with OIDC and a role scoped to the single app, and they fail unless every function is actually registered on the live app.

Result

It went from request to a live, signed-in tool for the sales team in about a day, with each salesperson owning their own agent. Test builds against real business websites in healthcare, chemicals, financial services, and against our own site, each finished in about a minute. The agents gave grounded answers and said when something like pricing wasn’t published rather than making it up.