· · 3 minutes read

Building an AI-Powered Conference App with .NET's Composable Stack

Microsoft built ConferencePulse — a live conference Blazor app — by composing Microsoft.Extensions.AI, DataIngestion, VectorData, MCP, and Agent Framework together. Here's how the pieces fit.

.NET AI Architecture Developer Productivity
This post is also available in:Català, Español, Deutsch, Français, Português, Italiano, 日本語, 中文, 한국어, Русский, हिन्दी, Polski, Türkçe, العربية, Bahasa Indonesia, Nederlands

Building an AI-Powered Conference App with .NET’s Composable Stack — Microsoft built ConferencePulse, a Blazor Server app for live conference sessions, by composing five .NET extension libraries together. They used it at MVP Summit.

What ConferencePulse does

ConferencePulse runs during live sessions and provides: AI-generated polls from session content, audience Q&A with a RAG pipeline pulling from a live knowledge base, auto-generated insights, and session summaries produced by multiple concurrent AI agents. The stack is .NET 10, Blazor Server, Aspire, split across five projects: Web, Core, Ingestion, Agents, Mcp, and AppHost.

Microsoft.Extensions.AI: one abstraction for everything

IChatClient is the unified abstraction — you wire it up once and the same interface works for Azure OpenAI, OpenAI, Anthropic, or any other provider. Six lines to get a fully configured client with function invocation, OpenTelemetry tracing, and logging middleware:

services.AddChatClient(new AzureOpenAIClient(...).GetChatClient("gpt-4o"))
    .UseFunctionInvocation()
    .UseOpenTelemetry()
    .UseLogging();

The same IChatClient is reused later for the data ingestion enrichment step — no separate client for that.

DataIngestion pipeline

Session content flows through a pipeline: MarkdownReaderHeaderChunker (500 tokens, 50 token overlap) → SummaryEnricher + KeywordEnricherVectorStoreWriter (Qdrant). The enrichers use the same IChatClient to generate summaries and extract keywords before indexing. Audience questions, Q&A pairs, and poll results are ingested in real-time as the session progresses — the knowledge base grows during the talk.

VectorStoreCollection.SearchAsync() works the same whether the backing store is Qdrant or Azure AI Search. Hybrid search (vector + full-text) is supported. The RAG pipeline for audience Q&A queries this collection and gets back relevant chunks to pass as context to the chat client.

MCP: session content as tools

The session content is exposed via MCP so any MCP-compatible client can access it. Both the server and client are implemented — the server exposes session knowledge as MCP tools, and the client allows calling those tools from within the agent pipeline.

Agent Framework: parallel multi-agent summary

The session summary is generated by three agents running concurrently — PollSummaryAgent, QuestionSummaryAgent, and InsightSummaryAgent — then merged. This uses the group chat or parallel execution pattern from Microsoft Agent Framework. Each agent handles one concern; the orchestrator merges the outputs.

The design principle

The post makes a point worth keeping: use the simplest tool that fits. Direct IChatClient calls for simple generation tasks. Tool/function calling for structured data extraction. Full agents only when you need autonomous multi-step reasoning. The library layering enforces this — you can pick up Microsoft.Extensions.AI without pulling in the full Agent Framework.

See the full post for the complete project structure and source links.

Share:
View source code for this post on GitHub ↗
← Microsoft Agent Framework Part 3: From Tools to Workflows — The Building Blocks Click Into Place
Combining API Versioning with OpenAPI in .NET 10 →