serverless
47 TopicsIntegrating Azure DevOps with VS Code Agent using MCP (Model Context Protocol)
đ§ What is MCP (Model Context Protocol)? MCP is a standard interface that allows AI agents to securely interact with external systems such as Azure DevOps/ With MCP: Azure DevOps capabilities are exposed as tools GitHub Copilot can discover, reason, and execute actions All actions happen with user consent and authentication Want to learn more about MCP see https://github.com/microsoft/mcp-for-beginners â Prerequisites Before starting, ensure you have: Visual Studio Code installed GitHub Copilot extension enabled Node.js 20+ installed Azure CLI installed Access to an Azure DevOps organisation đźď¸ Solution Architecture Below is a high-level view of how the integration works: VS Code â Copilot Agent â MCP Server â Azure DevOps â Copilot acts as the orchestrator â MCP acts as the bridge â Azure DevOps is the system of record đš Step 1: Authenticate with Azure đš Step 2: Configure MCP in VS Code Create a configuration file: .vscode/mcp.json Add the following configuration: đ What You Can Do with MCP Integration Once connected, you can: Retrieve and update work items Query repositories and pull requests Trigger pipelines Access test plans and wiki Automate repetitive DevOps operation đĄ Benefits Faster review cycles Automated summarisation of large diffs Better consistency across reviews â ď¸ Security and Best Practices MCP provides direct access to enterprise systems, so follow best practices: Use trusted MCP servers only Apply least-privilege access Avoid exposing sensitive tokens Review tool permissions before execution đŽ Whatâs Next? Microsoft is evolving towards a Remote MCP Server (Preview): No local setup required Hosted integration with Azure DevOps Simplified onboarding for enterprise environments đ Conclusion We are moving from: đ§âđť Code-first workflows to đ¤ Agent-driven workflows With Azure DevOps MCP: â You reduce context switching â Improve developer productivity â Enable intelligent DevOps automation Enable AI assistance with the Azure DevOps MCP Server - Azure Boards | Microsoft LearnBuilding a Scalable Contract Data Extraction Pipeline with Microsoft Foundry and Python
Architecture Overview Alt text: Architecture diagram showing Blob Storage triggering Azure Function, calling Document Intelligence, transforming data, and storing in Cosmos DB Flow: Upload contract files (PDF or ZIP) to Azure Blob Storage Azure Function triggers automatically on file upload Azure AI Document Intelligence extracts layout and tables A transformation layer converts output into a canonical JSON format Data is stored in Azure Cosmos DB Step 1: Trigger Processing with Azure Functions An Azure Function with a Blob trigger enables automatic processing when a file is uploaded. import logging import azure.functions as func import zipfile import io def main(myblob: func.InputStream): logging.info(f"Processing blob: {myblob.name}") if myblob.name.endswith(".zip"): with zipfile.ZipFile(io.BytesIO(myblob.read())) as z: for file_name in z.namelist(): logging.info(f"Extracting {file_name}") file_data = z.read(file_name) # Pass file_data to extraction step Best Practices Keep functions stateless and idempotent Handle retries for transient failures Store configuration in environment variables Step 2: Extract Layout Using Document Intelligence The prebuilt layout model helps extract tables, text, and structure from documents. from azure.ai.documentintelligence import DocumentIntelligenceClient from azure.core.credentials import AzureKeyCredential client = DocumentIntelligenceClient( endpoint="<your-endpoint>", credential=AzureKeyCredential("<your-key>") ) poller = client.begin_analyze_document( "prebuilt-layout", document=file_data ) result = poller.result() Output Includes Structured tables Paragraphs and text blocks Bounding regions for layout context Step 3: Handle Multi-Page Table Continuity Contract documents often contain tables split across multiple pages. These need to be merged to preserve data integrity. def merge_tables(tables): merged = [] current = None for table in tables: headers = [cell.content for cell in table.cells if cell.row_index == 0] if current and headers == current["headers"]: current["rows"].extend(extract_rows(table)) else: if current: merged.append(current) current = { "headers": headers, "rows": extract_rows(table) } if current: merged.append(current) return merged Key Considerations Match headers to detect continuation Preserve row order Avoid duplicate headers Step 4: Transform to a Canonical JSON Schema A consistent schema ensures compatibility across downstream systems. { "id": "contract_123", "documentType": "contract", "vendorName": "ABC Corp", "invoiceDate": "2023-05-05", "tables": [ { "name": "Line Items", "headers": ["Item", "Qty", "Price"], "rows": [ ["Service A", "2", "100"] ] } ], "metadata": { "sourceFile": "contract.pdf", "processedAt": "2026-04-22T10:00:00Z" } } Design Tips Keep schema flexible and extensible Include metadata for traceability Avoid excessive nesting Step 5: Persist Data in Cosmos DB Store the transformed data in a scalable NoSQL database. from azure.cosmos import CosmosClient client = CosmosClient("<cosmos-uri>", "<key>") database = client.get_database_client("contracts-db") container = database.get_container_client("documents") container.upsert_item(canonical_json) Best Practices Choose an appropriate partition key (for example, documentType or vendorName) Optimize indexing policies Monitor request units (RU) usage Observability and Monitoring To ensure reliability: Enable logging with Application Insights Track processing time and failures Monitor document extraction accuracy Security Considerations Store secrets securely using Azure Key Vault Use Managed Identity for service authentication Apply role-based access control (RBAC) to storage resources Conclusion This approach provides a scalable and maintainable solution for contract data extraction: Event-driven processing with Azure Functions Accurate extraction using Document Intelligence Clean transformation into a reusable schema Efficient storage with Cosmos DB This foundation can be extended with validation layers, review workflows, or analytics dashboards depending on your business requirements. Resources Contract data extraction â Document Intelligence: Foundry Tools | Microsoft Learn microsoft/content-processing-solution-accelerator: Programmatically extract data and apply schemas to unstructured documents across text-based and multi-modal content using Azure AI Foundry, Azure OpenAI, Azure AI Content Understanding, and Cosmos DB.Stop Experimenting, Start Building: AI Apps & Agents Dev Days Has You Covered
The AI landscape has shifted. The question is no longer âCan we build AI applications?â itâs âCan we build AI applications that actually work in production?â Demos are easy. Reliable, scalable, resilient AI systems that handle real-world complexity? Thatâs where most teams struggle. If youâre an AI developer, software engineer, or solution architect whoâs ready to move beyond prototypes and into production-grade AI, thereâs a series built specifically for you. What Is AI Apps & Agents Dev Days? AI Apps & Agents Dev Days is a monthly technical series from Microsoft Reactor, delivered in partnership with Microsoft and NVIDIA. You can explore the full series at https://developer.microsoft.com/en-us/reactor/series/s-1590/ This isnât a slide deck marathon. The series tagline says it best: âItâs not about slides, itâs about building.â Each session tackles real-world challenges, shares patterns that actually work, and digs into whatâs next in AI-driven app and agent design. You bring your curiosity, your code, and your questions. You leave with something you can ship. The sessions are led by experienced engineers and advocates from both Microsoft and NVIDIA, people like Pamela Fox, Bruno Capuano, Anthony Shaw, Gwyneth PeĂąa-Siguenza, and solutions architects from NVIDIAâs Cloud AI team. These arenât theorists; theyâre practitioners who build and ship the tools you use every day. What Youâll Learn The series covers the full spectrum of building AI applications and agent-based systems. Here are the key themes: Building AI Applications with Azure, GitHub, and Modern Tooling Sessions walk through how to wire up AI capabilities using Azure services, GitHub workflows, and the latest SDKs. The focus is always on code-first learning, youâll see real implementations, not abstract architecture diagrams. Designing and Orchestrating AI Agents Agent development is one of the seriesâ strongest threads. Sessions cover how to build agents that orchestrate long-running workflows, persist state automatically, recover from failures, and pause for human-in-the-loop input, without losing progress. For example, the session âAI Agents That Donât Break Under Pressureâ demonstrates building durable, production-ready AI agents using the Microsoft Agent Framework, running on Azure Container Apps with NVIDIA serverless GPUs. Scaling LLM Inference and Deploying to Production Moving from a working prototype to a production deployment means grappling with inference performance, GPU infrastructure, and cost management. The series covers how to leverage NVIDIA GPU infrastructure alongside Azure services to scale inference effectively, including patterns for serverless GPU compute. Real-World Architecture Patterns Expect sessions on container-based deployments, distributed agent systems, and enterprise-grade architectures. Youâll learn how to use services like Azure Container Apps to host resilient AI workloads, how Foundry IQ fits into agent architectures as a trusted knowledge source, and how to make architectural decisions that balance performance, cost, and scalability. Why This Matters for Your Day Job Thereâs a critical gap between what most AI tutorials teach and what production systems actually require. This series bridges that gap: Production-ready patterns, not demos. Every session focuses on code and architecture you can take directly into your projects. Youâll learn patterns for state persistence, failure recovery, and durable execution â the things that break at 2 AM. Enterprise applicability. The scenarios covered â travel planning agents, multi-step workflows, GPU-accelerated inference â map directly to enterprise use cases. Whether youâre building internal tooling or customer-facing AI features, the patterns transfer. Honest trade-off discussions. The speakers donât shy away from the hard questions: When do you need serverless GPUs versus dedicated compute? How do you handle agent failures gracefully? What does it actually cost to run these systems at scale? Watch On-Demand, Build at Your Own Pace Every session is available on-demand. You can watch, pause, and build along at your own pace, no need to rearrange your schedule. The full playlist is available at This is particularly valuable for technical content. Pause a session while you replicate the architecture in your own environment. Rewind when you need to catch a configuration detail. Build alongside the presenters rather than just watching passively. What Youâll Walk Away Wit After working through the series, youâll have: Practical agent development skills â how to design, orchestrate, and deploy AI agents that handle real-world complexity, including state management, failure recovery, and human-in-the-loop patterns Production architecture patterns â battle-tested approaches for deploying AI workloads on Azure Container Apps, leveraging NVIDIA GPU infrastructure, and building resilient distributed systems Infrastructure decision-making confidence â a clearer understanding of when to use serverless GPUs, how to optimise inference costs, and how to choose the right compute strategy for your workload Working code and reference implementations â the sessions are built around live coding and sample applications (like the Travel Planner agent demo), giving you starting points you can adapt immediately A framework for continuous learning â with new sessions each month, youâll stay current as the AI platform evolves and new capabilities emerge Start Building The AI applications that will matter most arenât the ones with the flashiest demos â theyâre the ones that work reliably, scale gracefully, and solve real problems. Thatâs exactly what this series helps you build. Whether youâre designing your first AI agent system or hardening an existing one for production, the AI Apps & Agents Dev Days sessions give you the patterns, tools, and practical knowledge to move forward with confidence. Explore the series at https://developer.microsoft.com/en-us/reactor/series/s-1590/ and start watching the on-demand sessions at the link above. The best time to level up your AI engineering skills was yesterday. The second-best time is right now and these sessions make it easy to start.Hosted Containers and AI Agent Solutions
If you have built a proof-of-concept AI agent on your laptop and wondered how to turn it into something other people can actually use, you are not alone. The gap between a working prototype and a production-ready service is where most agent projects stall. Hosted containers close that gap faster than any other approach available today. This post walks through why containers and managed hosting platforms like Azure Container Apps are an ideal fit for multi-agent AI systems, what practical benefits they unlock, and how you can get started with minimal friction. The problem with "it works on my machine" Most AI agent projects begin the same way: a Python script, an API key, and a local terminal. That workflow is perfect for experimentation, but it creates a handful of problems the moment you try to share your work. First, your colleagues need the same Python version, the same dependencies, and the same environment variables. Second, long-running agent pipelines tie up your machine and compete with everything else you are doing. Third, there is no reliable URL anyone can visit to use the system, which means every demo involves a screen share or a recorded video. Containers solve all three problems in one step. A single Dockerfile captures the runtime, the dependencies, and the startup command. Once the image builds, it runs identically on any machine, any cloud, or any colleague's laptop. Why containers suit AI agents particularly well AI agents have characteristics that make them a better fit for containers than many traditional web applications. Long, unpredictable execution times A typical web request completes in milliseconds. An agent pipeline that retrieves context from a database, imports a codebase, runs four verification agents in sequence, and generates a report can take two to five minutes. Managed container platforms handle long-running requests gracefully, with configurable timeouts and automatic keep-alive, whereas many serverless platforms impose strict execution limits that agent workloads quickly exceed. Heavy, specialised dependencies Agent applications often depend on large packages: machine learning libraries, language model SDKs, database drivers, and Git tooling. A container image bundles all of these once at build time. There is no cold-start dependency resolution and no version conflict with other projects on the same server. Stateless by design Most agent pipelines are stateless. They receive a request, execute a sequence of steps, and return a result. This maps perfectly to the container model, where each instance handles requests independently and the platform can scale the number of instances up or down based on demand. Reproducible environments When an agent misbehaves in production, you need to reproduce the issue locally. With containers, the production environment and the local environment are the same image. There is no "works on my machine" ambiguity. A real example: multi-agent code verification To make this concrete, consider a system called Opustest, an open-source project that uses the Microsoft Agent Framework with Azure OpenAI to analyse Python codebases automatically. The system runs AI agents in a pipeline: A Code Example Retrieval Agent queries Azure Cosmos DB for curated examples of good and bad Python code, providing the quality standards for the review. A Codebase Import Agent reads all Python files from a Git repository cloned on the server. Four Verification Agents each score a different dimension of code quality (coding standards, functional correctness, known error handling, and unknown error handling) on a scale of 0 to 5. A Report Generation Agent compiles all scores and errors into an HTML report with fix prompts that can be exported and fed directly into a coding assistant. The entire pipeline is orchestrated by a FastAPI backend that streams progress updates to the browser via Server-Sent Events. Users paste a Git URL, watch each stage light up in real time, and receive a detailed report at the end. The app in action Landing page: the default Git URL mode, ready for a repository link. Local Path mode: toggling to analyse a codebase from a local directory. Repository URL entered: a GitHub repository ready for verification. Stage 1: the Code Example Retrieval Agent fetching standards from Cosmos DB. Stage 3: the four Verification Agents scoring the codebase. Stage 4: the Report Generation Agent compiling the final report. Verification complete: all stages finished with a success banner. Report detail: scores and the errors table with fix prompts. The Dockerfile The container definition for this system is remarkably simple: FROM python:3.12-slim RUN apt-get update && apt-get install -y --no-install-recommends git \ && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY backend/ backend/ COPY frontend/ frontend/ RUN adduser --disabled-password --gecos "" appuser USER appuser EXPOSE 8000 CMD ["uvicorn", "backend.app:app", "--host", "0.0.0.0", "--port", "8000"] Twenty lines. That is all it takes to package a six-agent AI system with a web frontend, a FastAPI backend, Git support, and all Python dependencies into a portable, production-ready image. Notice the security detail: the container runs as a non-root user. This is a best practice that many tutorials skip, but it matters when you are deploying to a shared platform. From image to production in one command With the Azure Developer CLI ( azd ), deploying this container to Azure Container Apps takes a single command: azd up Behind the scenes, azd reads an azure.yaml file that declares the project structure, provisions the infrastructure defined in Bicep templates (a Container Apps environment, an Azure Container Registry, and a Cosmos DB account), builds the Docker image, pushes it to the registry, deploys it to the container app, and even seeds the database with sample data via a post-provision hook. The result is a publicly accessible URL serving the full agent system, with automatic HTTPS, built-in scaling, and zero infrastructure to manage manually. Microsoft Hosted Agents vs Azure Container Apps: choosing the right home Microsoft offers two distinct approaches for running AI agent workloads in the cloud. Understanding the difference is important when deciding how to host your solution. Microsoft Foundry Hosted Agent Service (Microsoft Foundry) Microsoft Foundry provides a fully managed agent hosting service. You define your agent's behaviour declaratively, upload it to the platform, and Foundry handles execution, scaling, and lifecycle management. This is an excellent choice when your agents fit within the platform's conventions: single-purpose agents that respond to prompts, use built-in tool integrations, and do not require custom server-side logic or a bespoke frontend. Key characteristics of hosted agents in Foundry: Fully managed execution. You do not provision or maintain any infrastructure. The platform runs your agent and handles scaling automatically. Declarative configuration. Agents are defined through configuration and prompt templates rather than custom application code. Built-in tool ecosystem. Foundry provides pre-built connections to Azure services, knowledge stores, and evaluation tooling. Opinionated runtime. The platform controls the execution environment, request handling, and networking. Azure Container Apps Azure Container Apps is a managed container hosting platform. You package your entire application (agents, backend, frontend, and all dependencies) into a Docker image and deploy it. The platform handles scaling, HTTPS, and infrastructure, but you retain full control over what runs inside the container. Key characteristics of Container Apps: Full application control. You own the runtime, the web framework, the agent orchestration logic, and the frontend. Custom networking. You can serve a web UI, expose REST APIs, stream Server-Sent Events, or run WebSocket connections. Arbitrary dependencies. Your container can include any system package, any Python library, and any tooling (like Git for cloning repositories). Portable. The same Docker image runs locally, in CI, and in production without modification. Why Opustest uses Container Apps Opustest requires capabilities that go beyond what a managed agent hosting platform provides: Requirement Hosted Agents (Foundry) Container Apps Custom web UI with real-time progress Not supported natively Full control via FastAPI and SSE Multi-agent orchestration pipeline Platform-managed, limited customisation Custom orchestrator with arbitrary logic Git repository cloning on the server Not available Install Git in the container image Server-Sent Events streaming Not supported Full HTTP control Custom HTML report generation Limited to platform outputs Generate and serve any content Export button for Copilot prompts Not available Custom frontend with JavaScript RAG retrieval from Cosmos DB Possible via built-in connectors Direct SDK access with full query control The core reason is straightforward: Opustest is not just a set of agents. It is a complete web application that happens to use agents as its processing engine. It needs a custom frontend, real-time streaming, server-side Git operations, and full control over how the agent pipeline executes. Container Apps provides all of this while still offering managed infrastructure, automatic scaling, and zero server maintenance. When to choose which Choose Microsoft Hosted Agents when your use case is primarily conversational or prompt-driven, when you want the fastest path to a working agent with minimal code, and when the built-in tool ecosystem covers your integration needs. Choose Azure Container Apps when you need a custom frontend, custom orchestration logic, real-time streaming, server-side processing beyond prompt-response patterns, or when your agent system is part of a larger application with its own web server and API surface. Both approaches use the same underlying AI models via Azure OpenAI. The difference is in how much control you need over the surrounding application. Five practical benefits of hosted containers for agents 1. Consistent deployments across environments Whether you are running the container locally with docker run , in a CI pipeline, or on Azure Container Apps, the behaviour is identical. Configuration differences are handled through environment variables, not code changes. This eliminates an entire category of "it works locally but breaks in production" bugs. 2. Scaling without re-architecture Azure Container Apps can scale from zero instances (paying nothing when idle) to multiple instances under load. Because agent pipelines are stateless, each request is routed to whichever instance is available. You do not need to redesign your application to handle concurrency; the platform does it for you. 3. Isolation between services If your agent system grows to include multiple services (perhaps a separate service for document processing or a background worker for batch analysis), each service gets its own container. They can be deployed, scaled, and updated independently. A bug in one service does not bring down the others. 4. Built-in observability Managed container platforms provide logging, metrics, and health checks out of the box. When an agent pipeline fails after three minutes of execution, you can inspect the container logs to see exactly which stage failed and why, without adding custom logging infrastructure. 5. Infrastructure as code The entire deployment can be defined in code. Bicep templates, Terraform configurations, or Pulumi programmes describe every resource. This means deployments are repeatable, reviewable, and version-controlled alongside your application code. No clicking through portals, no undocumented manual steps. Common concerns addressed "Containers add complexity" For a single-file script, this is a fair point. But the moment your agent system has more than one dependency, a Dockerfile is simpler to maintain than a set of installation instructions. It is also self-documenting: anyone reading the Dockerfile knows exactly what the system needs to run. "Serverless is simpler" Serverless functions are excellent for short, event-driven tasks. But agent pipelines that run for minutes, require persistent connections (like SSE streaming), and depend on large packages are a poor fit for most serverless platforms. Containers give you the operational simplicity of managed hosting without the execution constraints. "I do not want to learn Docker" A basic Dockerfile for a Python application is fewer than ten lines. The core concepts are straightforward: start from a base image, install dependencies, copy your code, and specify the startup command. The learning investment is small relative to the deployment problems it solves. "What about cost?" Azure Container Apps supports scale-to-zero, meaning you pay nothing when the application is idle. For development and demonstration purposes, this makes hosted containers extremely cost-effective. You only pay for the compute time your agents actually use. Getting started: a practical checklist If you are ready to containerise your own agent solution, here is a step-by-step approach. Step 1: Write a Dockerfile. Start from an official Python base image. Install system-level dependencies (like Git, if your agents clone repositories), then your Python packages, then your application code. Run as a non-root user. Step 2: Test locally. Build and run the image on your machine: docker build -t my-agent-app . docker run -p 8000:8000 --env-file .env my-agent-app If it works locally, it will work in the cloud. Step 3: Define your infrastructure. Use Bicep, Terraform, or the Azure Developer CLI to declare the resources you need: a container app, a container registry, and any backing services (databases, key vaults, AI endpoints). Step 4: Deploy. Push your image to the registry and deploy to the container platform. With azd , this is a single command. With CI/CD, it is a pipeline that runs on every push to your main branch. Step 5: Iterate. Change your agent code, rebuild the image, and redeploy. The cycle is fast because Docker layer caching means only changed layers are rebuilt. The broader picture The AI agent ecosystem is maturing rapidly. Frameworks like Microsoft Agent Framework, LangChain, Semantic Kernel, and AutoGen make it straightforward to build sophisticated multi-agent systems. But building is only half the challenge. The other half is running these systems reliably, securely, and at scale. Hosted containers offer the best balance of flexibility and operational simplicity for agent workloads. They do not impose the execution limits of serverless platforms. They do not require the operational overhead of managing virtual machines. They give you a portable, reproducible unit of deployment that works the same everywhere. If you have an agent prototype sitting on your laptop, the path to making it available to your team, your organisation, or the world is shorter than you think. Write a Dockerfile, define your infrastructure, run azd up , and share the URL. Your agents deserve a proper home. Hosted containers are that home. Resources Azure Container Apps documentation Microsoft Foundry Hosted Agents Azure Developer CLI (azd) Microsoft Agent Framework Docker getting started guide Opustest: AI-powered code verification (source code)Microsoft Agent Framework, Microsoft Foundry, MCP, Aspire ă使ăŁăĺŽčˇľç㪠AI ă˘ăăŞăć§çŻăăăľăłăăŤăçťĺ ´
AI ă¨ăźă¸ă§ăłăăä˝ăăă¨čŞä˝ăŻă䝼ĺăăăç°ĄĺăŤăŞăŁăŚăăžăăăăăăăăăăăĺŽéăŽćŹçŞéç¨ăŽă˘ăăŞăąăźăˇă§ăłăŽä¸é¨ă¨ăăŚăăăă¤ăăă㨠(č¤ć°ăŽăľăźăăšăć°¸çśçăŞçść 玥çăćŹçŞĺăăŽă¤ăłăăŠăĺŤăă形ă§éç¨ăăăă¨) ăŤăŞăă¨ăé獯ăŤč¤éăŤăŞăăžăă .NET ăłăăĽăăăŁăŽéçşč ăăăăăăźăŤăŤç°ĺ˘ă§ăăŻăŠăŚăă§ăĺä˝ăăăăŻăŠăŚăăă¤ăăŁăăŞĺŽéç¨ăŹăăŤăŽăľăłăăŤăčŚăăă¨ăă声ăĺ¤ăĺŻăăăăŚăăžăăă ăăŽĺٰăŤĺżăăç§ăăĄăŻăŞăźăăłă˝ăźăšăŽăľăłăăŤă˘ăăŞăInterview Coach (é˘ćĽăłăźă)ăăä˝ăăžăăă樥ćŹĺ°ąčˇé˘ćĽăčĄă AI ăăŁăă web ă˘ăăŞă§ăă ăăŽăľăłăăŤă§ăŻăćŹçŞéç¨ăćłĺŽăăăľăźăăšăŤăăăŚă䝼ä¸ăŽćčĄăăŠăŽăăăŤçľăżĺăăăăŽăă示ăăŚăăžăďź Microsoft Agent Framework Microsoft Foundry Model Context Protocol (MCP) Aspire ăăŽă˘ăăŞăŻăĺŽéăŤĺä˝ăă é˘ćĽăˇăăĽăŹăźăżăź ă§ăăAI ăłăźăăăŚăźăśăźăŤĺŻžăăŚčĄĺé˘ăćčĄé˘ăŽčłŞĺăčĄăăćĺžăŤé˘ćĽăăăŠăźăăłăšăŽăžă¨ăăăăŁăźăăăăŻă¨ăăŚćäžăăžăă ăăŽč¨äşă§ăŻăăăŽă˘ăăŞă§ä˝żç¨ăăŚăăč¨č¨ăăżăźăłă¨ăăăăăăŠăŽăăăŞčŞ˛éĄăč§ŁćąşăăăŽăăç´šäťăăžăă ăăĄăăă Interview Coach ăă˘ă˘ă㪠ă芌ăăă¨ăă§ăăžăă ăŞă Microsoft Agent Framework ăŞăŽăďź ăăăăăžă§ .NET ă§ AI ă¨ăźă¸ă§ăłăăéçşăăŚăăăŞăăăăăă Semantic Kernel ă AutoGenăăăăăŻăăŽä¸Ąćšă使ăŁăăă¨ăăăă§ăăăă Microsoft Agent Framework ăŻăăăăăŽćŹĄăŽăšăăăăŤăăăăăŹăźă ăŻăźăŻă§ăă ăăŽăăŹăźă ăŻăźăŻăŻăĺăăăźă ăŤăăŁăŚéçşăăăŚăăă严ăăă¸ă§ăŻăăăăžăçľąĺăăŚă1ă¤ăŽăăŹăźă ăŻăźăŻăŤăžă¨ăăăăŽă§ăă ĺ ˇä˝çăŤăŻă AutoGen ăŽă¨ăźă¸ă§ăłăć˝čąĄĺ Semantic Kernel ăŽă¨ăłăżăźăăŠă¤ăşćŠč˝ ďźçść 玥çăĺĺŽĺ ¨ć§ăăăăŤăŚă§ă˘ăăăŹăĄăăŞăźăŞăŠďź ăçľąĺăăăăăŤăăŤăă¨ăźă¸ă§ăłăăŽăŞăźăąăšăăŹăźăˇă§ăłăŽăăăŽă°ăŠăăăźăšăŽăŻăźăŻăăăźăčż˝ĺ ăăŚăăžăă .NET éçşč ăŤă¨ăŁăŚăŽăĄăŞăăăŻćŹĄăŽă¨ăăă§ăďź ăăŹăźă ăŻăźăŻă1ă¤ăŤçľąĺďź Semantic Kernel 㨠AutoGen ăŽăŠăĄăă使ăăćŠăĺż čŚăăăăžăăă 錴ćăżăŽăăéçşăăżăźăłďź ă¨ăźă¸ă§ăłă㯠dependency injectionăIChatClientăăă㌠ASP.NET ă˘ăăŞă¨ĺăăăšăăŁăłă°ă˘ăăŤăĺŠç¨ăăžăă ćŹçŞéç¨ăĺćă¨ăăč¨č¨ďź OpenTelemetryăăăăŤăŚă§ă˘ăă¤ăăŠă¤ăłăAspire ă¨ăŽçľąĺăćĺăăç¨ćăăăŚăăžăă ăăŤăă¨ăźă¸ă§ăłăăŽăŞăźăąăšăăŹăźăˇă§ăłďź é揥ăŻăźăŻăăăźă丌ĺĺŽčĄăhandoff ăăżăźăłăă°ăŤăźăăăŁăăăŞăŠăăľăăźăăăžăă Interview Coach ăŻăăăăăŽćŠč˝ăĺăŞă Hello World ă§ăŻăŞăăĺŽéăŽă˘ăăŞăąăźăˇă§ăłă¨ăăŚăžă¨ăăăľăłăăŤă§ăă ăŞă Microsoft Foundry ăŞăŽăďź AI ă¨ăźă¸ă§ăłăăŤăŻăĺăŤă˘ăăŤăăăă°čŻăăăă§ăŻăăăžăăăă¤ăłăăŠăĺż čŚă§ăă Microsoft Foundry ăŻăAI ă˘ăăŞăąăźăˇă§ăłăć§çŻăťçŽĄçăăăă㎠Azure ăŽăăŠăăăăŠăźă ă§ăăăMicrosoft Agent Framework ăŽć¨ĺĽ¨ăăăŻă¨ăłăă§ăăăăžăă Foundry ă使ăă¨ă揥ăŽăăăŞćŠč˝ă1ă¤ăŽăăźăżăŤă§ĺŠç¨ă§ăăžăďź ă˘ăăŤă˘ăŻăťăšďź OpenAIăMetaăMistral ăŞăŠăŽă˘ăăŤă1ă¤ăŽă¨ăłăăă¤ăłăăăĺŠç¨ă§ăăăŤăżăă° Content safety (ĺŽĺ ¨ć§)ďź ă˘ăăŹăźăˇă§ăłăĺäşşć ĺ ąďźPIIďźć¤ĺşăçľăżčžźăžăăŚăăăă¨ăźă¸ă§ăłăăĺéĄăŽăăĺşĺăăăŞăăăăŤĺśĺžĄă ăłăšăćéŠĺăŤăźăăŁăłă°ďź ăŞăŻă¨ăšăăăżăšăŻăŤćéŠăŞă˘ăăŤă¸čŞĺçăŤăŤăźăăŁăłă°ăăă čŠäžĄă¨ăăĄă¤ăłăăĽăźăăłă°ďź ă¨ăźă¸ă§ăłăăŽĺ質ă渏ĺŽăăçśçśçăŤćšĺă§ăă ă¨ăłăżăźăăŠă¤ăşĺăăŹăăăłăšďź Entra ID ă Microsoft Defender ăŤăăčŞč¨źăă˘ăŻăťăšĺśĺžĄăăłăłăăŠă¤ă˘ăłăš Interview Coach ă§ăŻăFoundry ăă¨ăźă¸ă§ăłăăĺăăă˘ăăŤă¨ăłăăă¤ăłăăćäžăăŚăăžăă ă¨ăźă¸ă§ăłăăłăźă㯠IChatClient ă¤ăłăżăźăă§ăźăšăĺŠç¨ăăŚăăăăăFoundry ăŻăăăžă§č¨ĺŽăŽé¸ćč˘ăŽ 1 ă¤ă§ăăăćĺăăčąĺŻăŞăăźăŤăćăŁăŚăăçšă§ćăäžżĺŠăŞé¸ćč˘ă§ăă Interview Coach ăŻä˝ăăăă˘ăăŞăŞăŽăďź Interview Coach ăŻă樥ćŹĺ°ąčˇé˘ćĽăčĄă寞芹ĺ AI ă§ăă ăŚăźăśăźă 幼ć´ć¸ďźresumeďź ă¨ ĺżĺĺ ăŽčˇĺĺ 厚ďźjob descriptionďźăĺ Ľĺăăă¨ăăăăăĺ ăŻă¨ăźă¸ă§ăłăăé˘ćĽăăăťăšăé˛ăăŚăăăžăă ć ĺ ąĺéďźIntakeďźďź 幼ć´ć¸ă¨ĺżĺĺ ăŽčˇĺĺ 厚ăĺéăăžăă čĄĺé˘ćĽďźBehavioral interviewďźďź ăăŞăăŽçľé¨ăŤĺăăăŚă STAR ăĄă˝ăă (éĺťăŽčĄĺăć§é çăŤčŞŹćăăăăăŽĺçăăŹăźă ăŻăźăŻă§ăSituation, Task, Action, Result ăŽé ćĺăăćĽăŚăă) ăŤĺşăĽăă質ĺăčĄăăžăă ćčĄé˘ćĽďźTechnical interviewďźďź ĺżĺăăčˇç¨ŽăŤĺżăăćčĄçăŞčłŞĺăčĄăăžăă ăžă¨ăďźSummaryďźďź é˘ćĽăŽăăăŠăźăăłăš (ć縞) ăčŠäžĄăăĺ ˇä˝çăŞăăŁăźăăăăŻăĺŤăăŹăăĽăźăçćăăžăă ăŚăźăśăźăŻăăăŽăˇăšăă 㨠Blazor ㎠Web UI ăéăăŚĺŻžčŠąăăžăă AI ăŽĺç㯠ăŞă˘ăŤăżă¤ă ă§ăšăăŞăźăăłă°čĄ¨ç¤şăăăžăă ä˝čŤďź Behavioral Interview ă¨ăŻ Behavioral InterviewďźčĄĺé˘ćĽ/čĄĺäşäžé˘ćĽďźă¨ăŻăĺżĺč ăŽăéĺťăŽĺ ˇä˝çăŞčĄĺăă桹ćăăăăăŽäşşăŽčĄĺçšć§ăăšăăŤăčăćšăäźćĽăŽćąăăäşşćĺă¨éŠĺăăŚăăăăĺ¤ćăăé˘ćĽććłă§ăă ĺăŞăçĽčăĺżćĺćŠă§ăŻăŞăăăăšăăŹăšăćăăćăŠă寞ĺŚăăăăăŞăŠéĺťăŽäşĺŽăŤĺşăĽăăĺ°ćĽăŽăăăŠăźăăłăšăäşć¸Źăăžăă ă˘ăźăăăŻăăŁćŚčŚ ăăŽă˘ăăŞăąăźăˇă§ăłăŻăč¤ć°ăŽăľăźăăšăŤĺĺ˛ăăăŚăăăăăšăŚ Aspire ăŤăăŁăŚăŞăźăąăšăăŹăźăˇă§ăłăăăŚăăžăďź LLM Providerďź Microsoft Foundryďźć¨ĺĽ¨ďźăĺŠç¨ăăăăžăăžăŞă˘ăăŤă¸ă˘ăŻăťăšăăžăă WebUIďź é˘ćĽăŽĺŻžčŠąăčĄăăă㎠Blazor ăăźăšăŽăăŁăăă¤ăłăżăźăă§ăźăšă§ăă Agentďź é˘ćĽăŽăă¸ăăŻăć ăăłăłăăźăăłăă§ăMicrosoft Agent Framework ä¸ă§ć§çŻăăăŚăăžăă MarkItDown MCP Serverďź Microsoft ㎠MarkItDown (ăŞăă§ă Markdown ăŤăăŚăăă Python ăŠă¤ăăŠăŞ) ăĺŠç¨ăă幼ć´ć¸ďźPDF ă DOCXďźă Markdown 形ĺźăŤĺ¤ćăăŚč§Łćăăžăă InterviewData MCP Serverďź .NET ă§ĺŽčŁ ăăă MCP ăľăźăăźă§ăé˘ćĽăťăăˇă§ăłăŽăăźăżă SQLite ăŤäżĺăăžăă Aspire ăŻăăľăźăăšăăŁăšăŤăăŞăăăŤăšăă§ăăŻăăăŹăĄăăŞăźă玥çăăžăă ĺăłăłăăźăăłă㯠çŹçŤăăăăăťăšă¨ăăŚĺŽčĄăăă1 ă¤ăŽăłăăłăă§ă˘ăăŞăąăźăˇă§ăłĺ ¨ä˝ă辡ĺă§ăăžăă ăăżăźăł 1 : ăăŤăă¨ăźă¸ă§ăłăăŤăăăăłăăŞă ăăŽăľăłăăŤăçšăŤčĺłćˇąăăŽăŻă ăăłăăŞă ďźhandoffďź ăăżăźăł ăćĄç¨ăăŚăăçšă§ăă 1 ă¤ăŽă¨ăźă¸ă§ăłăăăăšăŚăĺŚçăăăŽă§ăŻăŞăăé˘ćĽăŽăăăťăšă 5 ă¤ăŽĺ°éă¨ăźă¸ă§ăłăăŤĺĺ˛ăăŚăăžăďź Agent ĺ˝šĺ˛ Tools Triage (ăăŞă˘ăźă¸) ăĄăăťăźă¸ăéŠĺăŞć ĺ˝ă¨ăźă¸ă§ăłăă¸ćŻăĺăă ăŞăďźăŤăźăăŁăłă°ăŽăżďź Receptionist (ĺäť) ăťăăˇă§ăłăä˝ćăă幼ć´ć¸ă¨čˇĺĺ 厚ăĺé MarkItDown + InterviewData Behavioral Interviewer (čĄĺé˘ćĽĺŽ) STAR ăĄă˝ăăăç¨ăăčĄĺé˘ćĽăĺŽć˝ InterviewData Technical Interviewer (ćčĄé˘ćĽĺŽ) čˇç¨ŽăŤĺżăăćčĄé˘ćĽăŽčłŞĺăčĄă InterviewData Summarizer (ăľăăŞăźçć) é˘ćĽăŽćçľçăŞăľăăŞăźăçć InterviewData ăăłăăŞăăăżăźăłă§ăŻăăăă¨ăźă¸ă§ăłăăäźčŠąăŽĺśĺžĄă揥ăŽă¨ăźă¸ă§ăłăăŤĺŽĺ ¨ăŤĺźă渥ăăžăă ĺźăçśăă ă¨ăźă¸ă§ăłăăăăăŽĺžăŽäźčŠąăăăšăŚć ĺ˝ăăžăă ăă㯠ăagent-as-toolsăăăżăźăłă¨ăŻç°ăŞăăžăă (agent-as-tools ă§ăŻăăĄă¤ăłăŽă¨ăźă¸ă§ăłăăäťăŽă¨ăźă¸ă§ăłăăčŁĺŠăăźăŤă¨ăăŚĺźăłĺşăăžăăăäźčŠąăŽĺśĺžĄčŞä˝ăŻăĄă¤ăłă¨ăźă¸ă§ăłăăäżćăăžăă) 䝼ä¸ăŻăăăŽăăłăăŞăăŻăźăŻăăăźăŽć§ćäžă§ăďź var workflow = AgentWorkflowBuilder .CreateHandoffBuilderWith(triageAgent) .WithHandoffs(triageAgent, [receptionistAgent, behaviouralAgent, technicalAgent, summariserAgent]) .WithHandoffs(receptionistAgent, [behaviouralAgent, triageAgent]) .WithHandoffs(behaviouralAgent, [technicalAgent, triageAgent]) .WithHandoffs(technicalAgent, [summariserAgent, triageAgent]) .WithHandoff(summariserAgent, triageAgent) .Build(); é常ăŽĺŚçăăăźďźhappy pathďźăŻćŹĄăŽé ĺşă§é˛ăżăžăă Receptionist â Behavioral â Technical â Summarizer ăăăăăŽĺ°éă¨ăźă¸ă§ăłăăă揥ăŽă¨ăźă¸ă§ăłăă¸ç´ćĽăăłăăŞăăăžăă ăăćłĺŽĺ¤ăŽçśćłăçşçăăĺ ´ĺăŻăă¨ăźă¸ă§ăłă㯠Triage ă¨ăźă¸ă§ăłăă¸ćťăăéŠĺăŞăŤăźăăŁăłă°ăĺ庌čĄăăžăă ăŞăăăăŽăľăłăăŤăŤăŻ ĺä¸ă¨ăźă¸ă§ăłăă˘ăźăăç¨ćăăăŚăăăăăăˇăłăăŤăŞć§ćă§ăŽăăăă¤ăĺŻč˝ă§ăă ăăăŤăăăĺä¸ă¨ăźă¸ă§ăłăă¨ăăŤăă¨ăźă¸ă§ăłăăŽă˘ăăăźăăćŻčźăăăă¨ăă§ăăžăă ăăżăźăł2: ăăźăŤçľąĺăŽăă㎠MCP ăăŽăăă¸ă§ăŻăă§ăŻăăăźăŤăŻă¨ăźă¸ă§ăłăăŽĺ é¨ăŤĺŽčŁ ăăăŚăăžăăă ăăăăă çŹçŤăă MCPďźModel Context Protocolďźăľăźăăźă¨ăăŚćäžăăăŚăăžăă äžăă°ăMarkItDown ăľăźăăźăŻăăŽăăă¸ă§ăŻăă ăă§ăŞăăăžăŁăăĺĽăŽă¨ăźă¸ă§ăłăăăă¸ă§ăŻăă§ăĺĺŠç¨ă§ăăžăăăžăăăăźăŤéçşăăźă ăŻă¨ăźă¸ă§ăłăéçşăăźă ă¨ăŻçŹçŤăăŚăăźăŤăăŞăŞăźăšăăăă¨ăĺŻč˝ă§ăă MCP ăŻč¨čŞéäžĺďźlanguage-agnosticďźă§ăăăă¨ăçšĺž´ă§ăă ăăŽăăăăăŽăľăłăăŤă§ăŻ MarkItDown ă Python ăľăźăăźă¨ăăŚĺä˝ăăă¨ăźă¸ă§ăłă㯠.NET ă§ĺŽčŁ ăăăŚăăžăă ă¨ăźă¸ă§ăłăăŻčľˇĺć㍠MCP ăŻăŠă¤ă˘ăłăăéăăŚăăźăŤăć¤ĺşăăĺż čŚăŞă¨ăźă¸ă§ăłăăŤăăăă渥ăăžăă var receptionistAgent = new ChatClientAgent( chatClient: chatClient, name: "receptionist", instructions: "You are the Receptionist. Set up sessions and collect documents...", tools: [.. markitdownTools, .. interviewDataTools]); ĺă¨ăźă¸ă§ăłăăŤăŻăĺż čŚăŞăăźăŤă ăăĺ˛ăĺ˝ăŚăăăžăďź Triage ă¨ăźă¸ă§ăłăďźăăźăŤăŞăďźăŤăźăăŁăłă°ăŽăżăć ĺ˝ďź ă¤ăłăżăăĽă˘ăźă¨ăźă¸ă§ăłăďźăťăăˇă§ăłăăźăżă¸ăŽă˘ăŻăťăš Receptionist ă¨ăźă¸ă§ăłăďźăăăĽăĄăłăč§Łć + ăťăăˇă§ăłă˘ăŻăťăš ăă㯠ćĺ°ć¨ŠéăŽĺĺďźprinciple of least privilegeďź ăŤĺşăĽăăč¨č¨ă§ăă ăăżăźăł3: Aspire ăŤăăăŞăźăąăšăăŹăźăˇă§ăł Aspire ăŻăă˘ăăŞăąăźăˇă§ăłĺ ¨ä˝ăăžă¨ăăŚçŽĄçăă彚ĺ˛ăć ăăžăă ă˘ăăŞăăšăăŻăľăźăăšăŽăăăă¸ăźďźć§ćďźăĺŽçžŠăă ăŠăŽăľăźăăšăĺĺ¨ăăăŽă ăăăăăăŠăŽăăăŤäžĺăăŚăăăŽă ăŠăŽč¨ĺŽăĺăĺăăŽă ă玥çăăžăă ăăăŤăăă揥ăŽăăăŞćŠč˝ăĺŠç¨ă§ăăžăďź Service discovery. ăľăźăăšăŻĺşĺŽăŽ URL ă§ăŻăŞăăăľăźăăšĺă§äşăăčŚă¤ăăăă¨ăă§ăăžăă Health checks. Aspire ăăăˇăĽăăźăă§ăĺăłăłăăźăăłăăŽçść ă確čŞă§ăăžăă Distributed tracing. ĺ ąéăŽăľăźăăšč¨ĺŽăéă㌠OpenTelemetry ăçľăżčžźăžăăžăă One-command startup. aspire run --file ./apphost.cs ăĺŽčĄăăă ăă§ăăăšăŚăŽăľăźăăšă辡ĺăăžăă ăăăă¤ćăŤăŻăazd up ăĺŽčĄăăăă¨ă§ăă˘ăăŞăąăźăˇă§ăłĺ ¨ä˝ă Azure Container Apps ăŤăăăă¤ăăăžăă ĺ§ăăŚăżăă äşĺćşĺ .NET 10 SDK 䝼é Azure ăľăăšăŻăŞăăˇă§ăł Microsoft Foundry project Docker Desktop ăžăăŻăăŽäťăŽăłăłăăăŠăłăżă¤ă ăăźăŤăŤă§ĺŽčĄăă git clone https://github.com/Azure-Samples/interview-coach-agent-framework.git cd interview-coach-agent-framework # Configure credentials dotnet user-secrets --file ./apphost.cs set MicrosoftFoundry:Project:Endpoint "<your-endpoint>" dotnet user-secrets --file ./apphost.cs set MicrosoftFoundry:Project:ApiKey "<your-key>" # Start all services aspire run --file ./apphost.cs Aspire Dashboard ăéăăăăšăŚăŽăľăźăăšăŽçść ă Running ăŤăŞăăžă§ĺž ăĄăžăă ăăŽĺžăWebUI ăŽă¨ăłăăă¤ăłăăăŻăŞăăŻăăă¨ă樥ćŹé˘ćĽăéĺ§ă§ăăžăă 䝼ä¸ăŻăăăłăăŞăăăżăźăłăăŠăŽăăăŤĺä˝ăăăă DevUI ä¸ă§ĺŻčŚĺăăăăŽă§ăă ăăŽăăŁăă UI ă使ăŁăŚăé˘ćĽĺčŁč ă¨ăăŚă¨ăźă¸ă§ăłăă¨ĺŻžčŠąăăăă¨ăă§ăăžăă Azure ăŤăăăă¤ăă azd auth login azd up Tăăă ăă§ĺŽäşă§ăă ćŽăăŽĺŚç㯠Aspire 㨠azd ăčŞĺă§ĺŽčĄăăžăă ăăăă¤ă¨ăăšăăĺŽäşăăăă揥ăŽăłăăłăăĺŽčĄăăăă¨ă§ăä˝ćăăăăăšăŚăŽăŞă˝ăźăšăĺŽĺ ¨ăŤĺé¤ă§ăăžăă azd down --force --purge ăăŽăľăłăăŤăăĺŚăšăă㨠Interview Coach ăĺŽéăŤčŠŚăăă¨ă§ă揥ăŽăăăŞĺ 厚ăçč§Łă§ăăžăďź Microsoft Foundry ă ă˘ăăŤăăăŻă¨ăłăă¨ăăŚĺŠç¨ăăćšćł Microsoft Agent Framework ă使ăŁă ĺä¸ă¨ăźă¸ă§ăłăăăăłăăŤăă¨ăźă¸ă§ăłăăˇăšăă ăŽć§çŻ ăăłăăŞăăŤăăăŞăźăąăšăăŹăźăˇă§ăłăç¨ăăŚăăŻăźăŻăăăźăĺ°éă¨ăźă¸ă§ăłăăŤĺĺ˛ăăćšćł ă¨ăźă¸ă§ăłăăłăźăă¨ăŻçŹçŤăă MCP ăăźăŤăľăźăăźăŽä˝ćă¨ĺŠç¨ Aspire ă使ăŁă č¤ć°ăľăźăăšăăăŞăă˘ăăŞăąăźăˇă§ăłăŽăŞăźăąăšăăŹăźăˇă§ăł ä¸č˛Ťć§ăŽăăć§é ĺăăăćŻăčăăçăżĺşăăăăłăăč¨č¨ azd up ă使ăŁă ă˘ăăŞăąăźăˇă§ăłĺ ¨ä˝ăŽăăăă¤ćšćł 芌ăăŚăżăă ĺŽĺ ¨ăŞă˝ăźăšăłăźă㯠GitHub ă§ĺ ŹéăăăŚăăžăďź Azure-Samples/interview-coach-agent-framework Microsoft Agent Framework ăĺăăŚä˝żăĺ ´ĺăŻăăžă揥ăŽčłćăăĺ§ăăăă¨ăăăăăăăžăă framework documentation Hello World sample. ăăŽĺžăăăŽăľăłăăŤăŤćťăŁăŚăăă¨ăăăăăŽčŚç´ ăăă大ăăŞăăă¸ă§ăŻăăŽä¸ă§ăŠăŽăăăŤçľăżĺăăăăŽăăçč§Łă§ăăă§ăăăă ăăăăăăŽăăżăźăłă使ăŁăŚä˝ăä˝ăŁăĺ ´ĺăŻăă㲠Issue ăä˝ćă㌠ćăăŚăă ăăă 揥ăŻďź (What's Next?) ćă ăŻăçžĺ¨ă揥ăŽăă㪠ăăăŞăçľąĺăˇăăŞăŞăŤăĺăçľăă§ăăžăďź Microsoft Foundry Agent Service GitHub Copilot A2A ăŞăŠăŞăŠă ăăăăŽćŠč˝ăăŞăŞăźăšăă揥珏ăăăŽăľăłăăŤăéćă˘ăăăăźăăăŚăăäşĺŽă§ăă Resources Microsoft Agent Framework ăăăĽăĄăłă Introducing Microsoft Agent Framework preview Microsoft Agent Framework Reaches Release Candidate Microsoft Foundry ăăăĽăĄăłă Microsoft Foundry Agent Service Microsoft Foundry Portal Microsoft.Extensions.AI Model Context Protocol specification Aspire ăăăĽăĄăłă ASP.NET BlazorThe JavaScript AI Build-a-thon Season 2 starts March 2!
The JavaScript AI Build-a-thon is a free, hands-on program designed to close that gap. Over the course of four weeks (March 2 - March 31, 2026), you'll move from running AI 100% on-device (Local AI), to designing multi-service, multi-agentic systems, all in JavaScript/ TypeScript and using tools you are already familiar with. The series will culminate in a hackathon, where you will create, compete and turn what you'll have learnt into working projects you can point to, talk about and extend.How To: Send requests to Azure Storage from Azure API Management
In this How To, I will show a simple mechanism for writing a payload to Azure Blob Storage from Azure API Management. Some examples where this is useful is implementing a Claim-Check pattern for large messages or to support message logging when Application Insights is not suitable.Durable Task Extension for Microsoft Agent Framework ă§ăĺ ç˘ăŞă¨ăźă¸ă§ăłăăć§çŻăă
ďźăă㯠2025/11/13 ăŤĺşăăă製ĺăăźă ăŽč¨äşăBulletproof agents with the durable task extension for Microsoft Agent FrameworkăăćĽćŹčŞăŤçżťč¨łăăăăŽă§ăăďź ćŹćĽ (2025/11/13)ăDurable Task Extension for Microsoft Agent Framework ăŽăăăŞăăŻăăŹăăĽăźăçşčĄ¨ă§ăăăă¨ă大ĺ¤ăăăăćăăžăă ăăŽćĄĺźľćŠč˝ăŻăAzure Durable Functions ㎠ĺŽç¸žăă čäš ć§ăŽăăĺŽčĄ (durable execution) (ăŻăŠăăˇăĽăĺ辡ĺăŤčăă) ă¨ĺćŁĺŽčĄ (č¤ć°ă¤ăłăšăżăłăšă§ĺä˝ăă) ćŠč˝ăăMicrosoft Agent Framework ăŤç´ćĽçľăżčžźăăă¨ă§ăćŹçŞç°ĺ˘ĺŻžĺżăŽăĺ ç˘ă§ăšăąăźăŠăăŤăŞ AI ă¨ăźă¸ă§ăłăăŽć§çŻćšćłăä¸ć°ăăžăă ăăăŤăăăăťăăˇă§ăłçŽĄçăé厳垊ć§ăăšăąăźăŞăłă°ăčŞĺçăŤĺŚçăăăăšăăźăăăŤă§ĺ ç˘ăŞ AI ă¨ăźă¸ă§ăłăă Azure ăŤăăăă¤ă§ăăéçşč ăŻă¨ăźă¸ă§ăłăăŽăă¸ăăŻăŤĺŽĺ ¨ăŤéä¸ă§ăăăăăŤăŞăăžăă ăă¨ăă°ăč¤ć°ćĽăŤăăăäźčŠąă§ăłăłăăăšăăçśćăăăŤăšăżăăźăľăźăăšă¨ăźă¸ă§ăłăăäşşéăŤăăćżčŞ (human-in-the-loop approval workflow) ăĺŤăăłăłăăłăăă¤ăăŠă¤ăłăăžăăŻĺ°éç㪠AI ă˘ăăŤăéŁćşăăăĺŽĺ ¨čŞĺĺăăăăăŤăă¨ăźă¸ă§ăłăăˇăšăă ăć§çŻăăĺ ´ĺă§ăăă㎠Durable Task Extension for Microsoft Agent Framework ăŻăăľăźăăźăŹăšăŽăˇăłăăŤăă§ćŹçŞăŹăăŤăŽäżĄé źć§ăăšăąăźăŠăăŞăăŁăăăăŚčŞżć´ćŠč˝ăćäžăăžăă Durable Task Extension ăŽä¸ťăŞćŠč˝ďź ăľăźăăźăŹăšăăšăăŁăłă° (Serverless Hosting)ďźAzure Functions ä¸ăŤă¨ăźă¸ă§ăłăăăăăă¤ăăć°ĺăŽă¤ăłăšăżăłăšăăăźăăžă§čŞĺăšăąăźăŞăłă°ăĺŽçžăăŞăăăăľăźăăźăŹăšă˘ăźăăăŻăăŁăŽĺŠçšăçśćăăăžăžĺŽĺ ¨ăŞĺśĺžĄăäżćăăžăă čŞĺăťăăˇă§ăłçŽĄç (Automatic Session Management)ďźă¨ăźă¸ă§ăłăăŻăăăăťăšăŽăŻăŠăăˇăĽăĺ辡ĺăă¤ăłăšăżăłăšéăŽĺćŁĺŽčĄăŤčăăăĺŽĺ ¨ăŞäźčŠąăłăłăăăšăăäżćăăć°¸çśçăŞăťăăˇă§ăłăçśćăăžăă ćąşĺŽçăŞăăŤăă¨ăźă¸ă§ăłăăŞăźăąăšăăŹăźăˇă§ăł (Deterministic Multi-Agent Orchestrations)ďź ăłăźăă§ĺśĺžĄăăăăäşć¸ŹĺŻč˝ăă¤ĺçžć§ăŽăăĺŽčĄăăżăźăłă§ăçšĺăă (specialized) durable agents ăçľăżĺăăăŚĺä˝ăăăă (訳訝ďźďźăćąşĺŽç㪠(deterministic)ăă¨ăŻăĺăĺ ĽĺăŤĺŻžăăŚăŻĺ¸¸ăŤĺăçľćăčżăăăŽă§ăăăŽĺä˝ăäşć¸ŹĺŻč˝ăŞăăŽăćăăžă) (訳訝ďźďźădurable agentăă¨ăŻăăăŽăăŹăźă ăŻăźăŻăŽă¨ăźă¸ă§ăłăăăăĺźăă§ăăăćŽéăŽă¨ăźă¸ă§ăłăă¨éăŁăŚDurable ăŞć§čłŞăćăŁăŚăăă¨ăźă¸ă§ăłăăŽăă¨ăćăăžă) ăľăźăăźăŹăšăŤăăăłăšăĺć¸ăäź´ă Human-in-the-Loop (Human-in-the-Loop with Serverless Cost Savings)ďź äşşéăŽĺ Ľĺăĺž ă¤éăăłăłăăĽăźăăŞă˝ăźăšăćśč˛ťăăăăłăšăăçşçăăžăăă Durable Task Scheduler ăŤăăçľăżčžźăżăŽĺŻčŚłć¸Źć§ (Built-in Observability with Durable Task Scheduler)ďźDurable Task Scheduler ㎠UI ăăăˇăĽăăźăăéăăŚăă¨ăźă¸ă§ăłăăŽćä˝ăăŞăźăąăšăăŹăźăˇă§ăłă桹ăĺŻčŚĺă§ăăžăă Durable Agent ăä˝ćăăŚĺŽčĄăăŚăżă ĺ ŹĺźăăăĽăĄăłă https://aka.ms/create-and-run-durable-agent ăłăźăăľăłă㍠(Python/C#) # Python endpoint = os.getenv("AZURE_OPENAI_ENDPOINT") deployment_name = os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME", "gpt-4o-mini") # ć¨ćşç㪠Microsoft Agent Framework ăăżăźăłăŤĺžăŁăŚ AI ă¨ăźă¸ă§ăłăăä˝ćăăžă agent = AzureOpenAIChatClient( endpoint=endpoint, deployment_name=deployment_name, credential=AzureCliCredential() ).create_agent( instructions="""ăăŞăăŻăăŠăăŞăăźăăŤĺŻžăăŚăčŞăżăăăć§é ĺăăăă é ĺçăŞăăăĽăĄăłăăä˝ćăăăăăă§ăăˇă§ăăŤăŞăłăłăăłăăŠă¤ăżăźă§ăă ăăźăăä¸ăăăăăă揥ăŽćé ă§é˛ăăŚăă ăăă 1. Web ć¤ç´˘ăăźăŤă使ăŁăŚăăźăăăŞăľăźăăă 2. ăăăĽăĄăłăăŽă˘ăŚăăŠă¤ăłăçćăă 3. éŠĺăŞć¸ĺźă§čŞŹĺžĺăŽăăăăăĽăĄăłăăć¸ă 4. é˘éŁăăäžă¨ĺşĺ ¸ďźĺźç¨ďźăĺŤăă""", name="DocumentPublisher", tools=[ AIFunctionFactory.Create(search_web), AIFunctionFactory.Create(generate_outline) ] ) # Durable ăŞăťăăˇă§ăłçŽĄçă§ă¨ăźă¸ă§ăłăăăăšăăăăă㍠Function ă˘ăăŞăć§ćăăžă app = AgentFunctionApp(agents=[agent]) app.run() // C# var endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT"); var deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT") ?? "gpt-4o-mini"; // ć¨ćşç㪠Microsoft Agent Framework ăăżăźăłăŤĺžăŁăŚ AI ă¨ăźă¸ă§ăłăăä˝ćăăžă AIAgent agent = new AzureOpenAIClient(new Uri(endpoint), new DefaultAzureCredential()) .GetChatClient(deploymentName) .CreateAIAgent( instructions: """ ăăŞăăŻăăŠăăŞăăźăăŤĺŻžăăŚăčŞăżăăăć§é ĺăăăă é ĺçăŞăăăĽăĄăłăăä˝ćăăăăăă§ăăˇă§ăăŤăŞăłăłăăłăăŠă¤ăżăźă§ăă ăăźăăä¸ăăăăăă揥ăŽćé ă§é˛ăăŚăă ăăă 1.Web ć¤ç´˘ăăźăŤă使ăŁăŚăăźăăăŞăľăźăăă 2.ăăăĽăĄăłăăŽă˘ăŚăăŠă¤ăłăçćăă 3.éŠĺăŞć¸ĺźă§čŞŹĺžĺăŽăăăăăĽăĄăłăăć¸ă 4.é˘éŁăăäžă¨ĺşĺ ¸ďźĺźç¨ďźăĺŤăă """, name: "DocumentPublisher", tools: [ AIFunctionFactory.Create(SearchWeb), AIFunctionFactory.Create(GenerateOutline) ]); // Durable ăŞăšăŹăă玥çă§ă¨ăźă¸ă§ăłăăăăšăăăăă㍠Functions ă˘ăăŞăć§ćăăžă // ăăăŤăăăHTTP ă¨ăłăăă¤ăłăăčŞĺă§ä˝ćăăăçść ăŽć°¸çśĺă玥çăăăžă using IHost app = FunctionsApplication .CreateBuilder(args) .ConfigureFunctionsWebApplication() .ConfigureDurableAgents(options => options.AddAIAgent(agent) ) .Build(); app.Run(); ăŞă Durable Task Extension ăĺż čŚăŞăŽă AI ă¨ăźă¸ă§ăłăăăĺç´ăŞăăŁăăăăăăăăč¤éă§éˇćéĺŽčĄăăăăżăšăŻăĺŚçăăéŤĺşŚăŞăˇăšăă ă¸ă¨é˛ĺăăăŤă¤ăăŚăć°ăăŞčŞ˛éĄă澎ä¸ăăžăă äźčŠąăć°ćĽăăć°éąéăŤăăăăăăăăăťăšăŽĺ辡ĺăăŻăŠăăˇăĽăé厳ăčś ăăŚçść ăäżćăăĺż čŚăăăăžăă ăăźăŤĺźăłĺşăăé常ăŽăżă¤ă ă˘ăŚăăčś ăăćéăčŚăăĺ ´ĺăăăăčŞĺăă§ăăŻăă¤ăłăă¨ĺžŠć§ăĺż čŚă§ăă 大éăŽăŻăźăŻăăźăăŤĺŻžĺżăăăăăć°ĺăŽă¨ăźă¸ă§ăłăäźčŠąăĺćăŤĺŚçă§ăăăăăĺćŁă¤ăłăšăżăłăšéă§ăŽĺźžĺçăŞăšăąăźăŞăłă°ăćąăăăăžăă č¤ć°ăŽĺ°éă¨ăźă¸ă§ăłăăăäżĄé źć§ăŽéŤăăă¸ăăšăăăťăšăŽăăăŤăäşć¸ŹĺŻč˝ă§ĺçžĺŻč˝ăŞĺŽčĄăăżăźăłă§čŞżć´ăăĺż čŚăăăăžăă ă¨ăźă¸ă§ăłăăŻăĺŚçăé˛ăăĺăŤäşşéăŽćżčŞăĺž ă¤ĺż čŚăăăĺ ´ĺăăăăăăŽéăŻçćłçăŤăŻăŞă˝ăźăšăćśč˛ťăăŞă (課éăăăŞă) ăă¨ăćăžăăžăă Durable Extension ăŻăAzure Durable Functions ăŽćŠč˝ă Microsoft Agent Framework ăŤćĄĺźľăăăă¨ă§ăăăăăŽčŞ˛éĄăŤĺŻžĺżăăžăăăăăŤăăăé厳ăŤčăăĺźžĺçăŤăšăąăźăŤăăčäš ć§ă¨ĺćŁĺŽčĄăŤăăŁăŚäşć¸ŹĺŻč˝ăŤĺä˝ăă AI ă¨ăźă¸ă§ăłăăć§çŻă§ăăžăă 4 ă¤ăŽćą : 4D ăăŽćĄĺźľćŠč˝ăŻă4 ă¤ăŽĺşćŹçăŞäžĄĺ¤ăŽćąăéç§°ă4DăăŤĺşăĽăăŚć§çŻăăăŚăăžăă Durability (čäš ć§) ăăšăŚăŽă¨ăźă¸ă§ăłăăŽçść ĺ¤ć´ďźăĄăăťăźă¸ăăăźăŤĺźăłĺşăăćććąşĺŽďźăŻăčŞĺçăŤčäš ć§ăŽăăăă§ăăŻăă¤ăłăă¨ăăŚäżĺăăăžăăă¨ăźă¸ă§ăłăăŻăă¤ăłăăŠć´ć°ăăŻăŠăăˇăĽăă垊ć§ăăéˇćéăŽĺž ćŠä¸ăŤăĄă˘ăŞăăă˘ăłăăźăăăăŚăăłăłăăăšăă夹ăăăŤĺéă§ăăžăăăăăŻăéˇćéĺŽčĄăăăĺŚçăĺ¤é¨ă¤ăăłăăĺž ćŠăăă¨ăźă¸ă§ăłăăŤä¸ĺŻćŹ ă§ăă Distributed (ĺćŁĺăŽ) ă¨ăźă¸ă§ăłăăŽĺŽčĄăŻăăšăŚăŽă¤ăłăšăżăłăšă§ĺŠç¨ĺŻč˝ă§ăăăĺźžĺçăŞăšăąăźăŞăłă°ă¨čŞĺăă§ă¤ăŤăŞăźăăźăĺŽçžăăžăăćŁĺ¸¸ăŞăăźăăŻăé厳ăçşçăăă¤ăłăšăżăłăšăŽä˝ćĽăăˇăźă ăŹăšăŤĺźăçśăăçśçśçăŞéç¨ăäżč¨źăăžăăăăŽĺćŁĺŽčĄă˘ăăŤăŤăăăć°ĺăŽăšăăźăăăŤă¨ăźă¸ă§ăłăăăšăąăźăŤă˘ăăăă丌ĺă§ĺä˝ă§ăăžăă Deterministic (ćąşĺŽć§) ă¨ăźă¸ă§ăłăăŽăŞăźăąăšăăŹăźăˇă§ăłăŻăé常ăŽăłăźăă¨ăăŚč¨čż°ăăăĺ˝äť¤ĺăă¸ăăŻă使ç¨ăăŚäşć¸ŹĺŻč˝ăŤĺŽčĄăăăžăăĺŽčĄăăšăĺŽçžŠăăăă¨ă§ăčŞĺăăšăăć¤č¨źĺŻč˝ăŞăŹăźăăŹăźăŤăăšăăźăŻăăŤăăźăäżĄé źă§ăăăă¸ăăšăŻăŞăăŁăŤăŤăŞăŻăźăŻăăăźăĺŽçžăăžăăĺż čŚăŤĺżăăŚć示çăŞĺśĺžĄăăăźăćäžăăă¨ăźă¸ă§ăłă丝ĺ°ăŽăŻăźăŻăăăźăčŁĺŽăăžăă Debuggability (ăăăă°ăăăă) IDEăăăăăŹăźăăăŹăźăŻăă¤ăłăăăšăżăăŻăăŹăźăšăĺä˝ăăšăăŞăŠăŽéŚ´ćăżăŽăăéçşăăźăŤăăăă°ăŠăăłă°č¨čŞă使ç¨ăăŚéçşăťăăăă°ă§ăăžăăă¨ăźă¸ă§ăłăă¨ăăŽăŞăźăąăšăăŹăźăˇă§ăłăŻăłăźăă¨ăăŚčĄ¨çžăăăăăăăăšăăăăăă°ăäżĺŽă厚ćă§ăă ĺŽéăŽćŠč˝ăŽĺä˝ ăľăźăăźăŹăš ăăšăăŁăłă° (Serverless hosting) ă¨ăźă¸ă§ăłăă Azure Functions ďźčżćĽä¸ăŤäťăŽ Azure ăľăźăăšăŤăćĄĺźľäşĺŽďźăŤăăăă¤ăă使ç¨ăăŚăăŞăă¨ăăŻăźăăžă§ă使ç¨ćăŻć°ĺă¤ăłăšăżăłăšăžă§čŞĺăšăąăźăŞăłă°ăăžăăćśč˛ťăăăłăłăăĽăźăăŁăłă° ăŞă˝ăźăšăŤĺŻžăăŚăŽăżćéăćŻćăăžăăăăŽăłăźăăăĄăźăšăăŽăăăă¤ććłăŤăăăăľăźăăźăŹăš ă˘ăźăăăŻăăŁăŽĺŠçšăçśćăăŞăăăăłăłăăĽăźăç°ĺ˘ (compute environment) ăĺŽĺ ¨ăŤĺśĺžĄă§ăăžăă # Python endpoint = os.getenv("AZURE_OPENAI_ENDPOINT") deployment_name = os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME", "gpt-4o-mini") # ć¨ćşç㪠Microsoft Agent Framework ăăżăźăłăŤĺžăŁăŚ AI ă¨ăźă¸ă§ăłăăä˝ćăăžă agent = AzureOpenAIChatClient( endpoint=endpoint, deployment_name=deployment_name, credential=AzureCliCredential() ).create_agent( instructions="""ăăŞăăŻăăŠăăŞăăźăăŤĺŻžăăŚăčŞăżăăăć§é ĺăăăă é ĺçăŞăăăĽăĄăłăăä˝ćăăăăăă§ăăˇă§ăăŤăŞăłăłăăłăăŠă¤ăżăźă§ăă ăăźăăä¸ăăăăăă揥ăŽćé ă§é˛ăăŚăă ăăă 1. Web ć¤ç´˘ăăźăŤă使ăŁăŚăăźăăăŞăľăźăăă 2. ăăăĽăĄăłăăŽă˘ăŚăăŠă¤ăłăçćăă 3. éŠĺăŞć¸ĺźă§čŞŹĺžĺăŽăăăăăĽăĄăłăăć¸ă 4. é˘éŁăăäžă¨ĺşĺ ¸ďźĺźç¨ďźăĺŤăă""", name="DocumentPublisher", tools=[ AIFunctionFactory.Create(search_web), AIFunctionFactory.Create(generate_outline) ] ) # Durable ăŞăťăăˇă§ăłçŽĄçă§ă¨ăźă¸ă§ăłăăăăšăăăăă㍠Function ă˘ăăŞăć§ćăăžă app = AgentFunctionApp(agents=[agent]) app.run() Automatic session managementďźčŞĺăťăăˇă§ăłçŽĄçďź ă¨ăźă¸ă§ăłăăŽăťăăˇă§ăłăŻăFunction ă˘ăăŞă§ć§ćăăčäš ć§ăŽăăăšăăŹăźă¸ăŤčŞĺçăŤăă§ăăŻăă¤ăłăăăăč¤ć°ă¤ăłăšăżăłăšéă§ăŽčäš ć§ă¨ĺćŁĺŽčĄăĺŻč˝ăŤăăžăăä¸ćăăăăťăšé厳ăŽĺžă§ăăăŠăŽă¤ăłăšăżăłăšăăă§ăă¨ăźă¸ă§ăłăăŽĺŽčĄăĺéă§ăăçśçśçăŞéç¨ăäżč¨źăăăžăă ĺ é¨çăŤăŻăă¨ăźă¸ă§ăłă㯠Durable Entities ă¨ăăŚĺŽčŁ ăăăŚăăžăăăăăăŻăĺŽčĄéă§çść ăäżćăăăšăăźăăăŤăŞăŞăă¸ă§ăŻăă§ăăăăŽă˘ăźăăăŻăăŁăŤăăăĺă¨ăźă¸ă§ăłăăťăăˇă§ăłăŻăäźčŠąĺąĽć´ă¨ăłăłăăăšăăäżćăăäżĄé źć§ăŽéŤăéˇĺŻżĺ˝ăŽă¨ăłăăŁăăŁă¨ăăŚćŠč˝ăăžăă ăˇăăŞăŞäž: č¤ć°ćĽăăć°éąéăŤăăăč¤éăŞăľăăźăćĄäťśăĺŚçăăăŤăšăżăăźăľăźăăšă¨ăźă¸ă§ăłăăă¨ăźă¸ă§ăłăăĺăăăă¤ăăăăăĺĽăŽă¤ăłăšăżăłăšăŤç§ťĺăăĺ ´ĺă§ăăäźčŠąĺąĽć´ăăłăłăăăšăăé˛ćăŻäżćăăăžăă # ćĺăŽĺŻžčŠą - ăăăĽăĄăłăä˝ćç¨ăŽć°ăăăšăŹăăăéĺ§ curl -X POST https://your-function-app.azurewebsites.net/api/agents/DocumentPublisher/threads \ -H "Content-Type: application/json" \ -d '{"message": "Azure Functions ăŽĺŠçšăŤă¤ăăŚăŽăăăĽăĄăłăăä˝ćăăŚăă ăă"}' # ăŹăšăăłăšăŤăŻăšăŹăă ID ă¨ĺćăŽăăăĽăĄăłăăŽă˘ăŚăăŠă¤ăłďźä¸ć¸ăăĺŤăžăăžă # {"threadId": "doc789", "response": "Azure Functions ăŽĺŠçšăŤé˘ăăçś˛çž çăŞăăăĽăĄăłăăä˝ćăăžăăćć°ć ĺ ąăć¤ç´˘ăăžă⌠[ăăăĽăĄăłăä¸ć¸ă] # Azure Functions ăŽĺŠçš\n\n## ăŻăăăŤ\nAzure Functions ăŻăă¤ăłăăŠçŽĄçăŞăă§ă¤ăăłăé§ĺăŽăłăźăăĺŽčĄă§ăăăľăźăăźăŹăšăŽăłăłăăĽăźăăľăźăăšă§ăâŚ\n\n## ăłăšăĺšç\n- ĺŽčĄćéăŤĺŻžăăŚăŽăżćŻćă\n- ă˘ă¤ăăŤçść ăŽăŞă˝ăźăšăŤăŻćéăăăăăŞă\n- čŞĺăšăąăźăŞăłă°ăŤăăéĺ°ăăăă¸ă§ăăłă°ăĺć¸âŚ\n\n## éçşč ăŽççŁć§\n- č¤ć°č¨čŞăŽăľăăźăďźC#, Python, JavaScript, Javaďź\n- çľąĺéçşăăźăŤă¨ CI/CD âŚ\n\n## ăšăąăźăŠăăŞăăŁ\n- éčŚăŤĺşăĽăčŞĺăšăąăźăŞăłă°\n- ä˝çžä¸ăăŽăŞăŻă¨ăšăăăˇăźă ăŹăšăŤĺŚçâŚ\n\nĺčćçŽ: [Azure ăăăĽăĄăłăăăľăźăăźăŹăšč¨çŽăŤé˘ăăç 犜]"} # 2 ĺçŽăŽĺŻžčŠą - ĺăăšăŹăăă§ăăăĽăĄăłăăćšĺ curl -X POST https://your-function-app.azurewebsites.net/api/agents/DocumentPublisher/threads/doc789 \ -H "Content-Type: application/json" \ -d '{"message": "äťăŽ Azure ăľăźăăšă¨ăŽçľąĺăŤé˘ăăăťăŻăˇă§ăłăčż˝ĺ ăăŚăăăăžăăďź"}' # ă¨ăźă¸ă§ăłă㯠Azure Functions ăăăĽăĄăłăăŽăłăłăăăšăăäżćăăčŚćąăăăăťăŻăˇă§ăłăčż˝ĺ ăăžă # {"threadId": "doc789", "response": "Azure Functions ăăăĽăĄăłăăŤăĺ ćŹçăŞçľąĺăťăŻăˇă§ăłăčż˝ĺ ăăžăă:\n\n## Azure ăľăźăăšă¨ăŽçľąĺ\n\n### Azure Storage\nBlob StorageăQueue StorageăTable Storage ă¸ăŽăăŞăŹăźă¨ăă¤ăłăăŁăłă°ăŤăăăă¤ăăłăé§ĺă˘ăźăăăŻăăŁăăˇăźă ăŹăšăŤĺŽçžâŚ\n\n### Azure Event Grid 㨠Event Hubs\năŞă˘ăŤăżă¤ă ăŽă¤ăăłăăšăăŞăźă ăĺŚçăăăšăąăźăŤĺŻč˝ăŞ Pub/Sub ăăżăźăłăĺŽčŁ âŚ\n\n### Azure Cosmos DB\năăăĽăĄăłăăăźăżăăźăšćä˝ĺăăŽçľăżčžźăżăă¤ăłăăŁăłă°ă¨ăĺ¤ć´ăăŁăźăăŽčŞĺĺŚçâŚ\n\n### Azure Service Bus\nă¨ăłăżăźăăŠă¤ăşăĄăăťăźă¸ăłă°ćŠč˝ăŤăăäżĄé źć§ăŽéŤăăĄăăťăźă¸ĺŚçâŚ\n\n### Azure AI Services\nOpenAIăCognitive ServicesăAI Search ă厚ćăŤçľąĺăăŚă¤ăłăăŞă¸ă§ăłăăŞă˘ăăŞăąăźăˇă§ăłăĺŽçžâŚ\n\năăŽăťăŻăˇă§ăłăŻăšăąăźăŠăăŞăăŁăŽăťăŻăˇă§ăłăŽĺžăŤčż˝ĺ ăăăŚăăžăăăŚăźăšăąăźăšăăăăă¤ăŽăăšăăăŠăŻăăŁăšăčż˝ĺ ăăžăăăăďź"} (訳č 注ďź11/20 çžĺ¨ăä¸č¨ăŽă¨ăłăăă¤ăłă URL ăăŞăŻă¨ăšăăăŹăšăăłăšăŽĺ˝˘ĺźăŻĺ¤ć´ăăăŚăăžăăăăŽč¨äşă§ăŻăŞăŞă¸ăăŤč¨äşăŽćăŽăžăžăŽč¨čźăŤăăŚăăžăăăäťĺžă (çžĺ¨ăžă preview çă§) ĺ¤ăăĺŻč˝ć§ăăăăăăćć°ăŽć ĺ ąăŻĺ ŹĺźăăăĽăĄăłăăĺç §ăăŚăă ăăďźhttps://aka.ms/create-and-run-durable-agent ) Deterministic multi-agent orchestrationsďźćąşĺŽçăŞăăŤăă¨ăźă¸ă§ăłăăŞăźăąăšăăŹăźăˇă§ăłďź ĺ˝äť¤ĺăłăźăă使ç¨ăăŚăč¤ć°ăŽĺ°éç㪠durable agents ă調ć´ăăžăăăăŽĺ ´ĺăĺśĺžĄăăăźăŻéçşč ăĺŽçžŠăăžăăăăăŻăă¨ăźă¸ă§ăłăă揥ăŽăšăăăăćąşĺŽăăă¨ăźă¸ă§ăłă丝ĺ°ăŽăŻăźăŻăăăźă¨ăŻç°ăŞăăžăă ćąşĺŽçăŞăźăąăšăăŹăźăˇă§ăłăŻăčŞĺăă§ăăŻăă¤ăłăă¨ĺžŠć§ăĺăăäşć¸ŹĺŻč˝ă§ĺçžĺŻč˝ăŞĺŽčĄăăżăźăłăćäžăăžăă ăˇăăŞăŞäž: ăĄăźăŤĺŚçăˇăšăă ă§ăăžăăšăă ć¤ĺşă¨ăźă¸ă§ăłăă使ç¨ăăăăŽĺéĄăŤĺşăĽăăŚćĄäťśäťăă§ç°ăŞăĺ°éă¨ăźă¸ă§ăłăăŤăŤăźăăŁăłă°ăăžăăăŞăźăąăšăăŹăźăˇă§ăłăŻăăŠăŽăšăăăă§é厳ăçşçăăŚăčŞĺçăŤĺžŠć§ăăĺŽäşć¸ăżăŽă¨ăźă¸ă§ăłăĺźăłĺşăăŻĺĺŽčĄăăăžăăă # Python app.orchestration_trigger(context_name="context") def document_publishing_orchestration(context: DurableOrchestrationContext): """č¤ć°ăŽĺ°éă¨ăźă¸ă§ăłăăĺ調ăăăćąşĺŽçăŞăźăąăšăăŹăźăˇă§ăłă""" doc_request = context.get_input() # ăŞăźăąăšăăŹăźăˇă§ăłăŽăłăłăăăšăăăĺ°éă¨ăźă¸ă§ăłăăĺĺž research_agent = context.get_agent("ResearchAgent") writer_agent = context.get_agent("DocumentPublisherAgent") # ăšăăă 1ďźWeb ć¤ç´˘ă§ăăăăŻă調ćťăă research_result = yield research_agent.run( messages=f"揥ăŽăăăăŻă調ćťăă丝čŚăŞć ĺ ąăĺéăăŚăă ăăďź{doc_request.topic}", response_schema=ResearchResult ) # ăšăăă 2ďźčŞżćťçľćăŤĺşăĽăăŚă˘ăŚăăŠă¤ăłăçćăă outline = yield context.call_activity("generate_outline", { "topic": doc_request.topic, "research_data": research_result.findings }) # ăšăăă 3ďźčŞżćťçľćă¨ă˘ăŚăăŠă¤ăłăŤĺşăĽăăŚăăăĽăĄăłăăä˝ćăă document = yield writer_agent.run( messages=f"""䝼ä¸ăŽăăăăŻăŤă¤ăăŚăçś˛çž çăŞăăăĽăĄăłăăä˝ćăăŚăă ăăďź{doc_request.topic} 調ćťçľć: {research_result.findings} ă˘ăŚăăŠă¤ăł: {outline} éŠĺăŞć¸ĺźă§ăć§é ĺăăčŞăżăăăăé ĺçăŞăăăĽăĄăłăăŤăăŚăă ăăăĺż čŚăŤĺżăăŚĺşĺ ¸ďźĺźç¨ďźăĺŤăăŚăă ăăă""", response_schema=DocumentResponse ) # ăšăăă 4ďźçćăăăăăĽăĄăłăăäżĺăăŚĺ Źéăă return yield context.call_activity("publish_document", { "title": doc_request.topic, "content": document.text, "citations": document.citations }) Human-in-the-loopďźäşşéăäťĺ¨ăăăäťçľăżďź ăŞăźăąăšăăŹăźăˇă§ăłăă¨ăźă¸ă§ăłăăŻăäşşéăŽĺ ĽĺăćżčŞăăŹăăĽăźăĺž ă¤éăăłăłăăĽăźăăŞă˝ăźăšăćśč˛ťăăăŤä¸ćĺć˘ă§ăăžăăă˘ăăŞăąăźăˇă§ăłăăŻăŠăăˇăĽăĺ辡ĺăăă¨ăăŚăăčäš ć§ăŽăăĺŽčĄ (durable execution) ăŤăăăć°ćĽăăć°éąéăŤăăăăäşşéăŽĺżçăăŞăźăąăšăăŹăźăˇă§ăłăĺž ćŠăăăă¨ăĺŻč˝ă§ăăăľăźăăźăŹăšăăšăăŁăłă°ă¨çľăżĺăăăăă¨ă§ăĺž ćŠćéä¸ăŻăăšăŚăŽăłăłăăĽăźăăŞă˝ăźăšăĺć˘ăăäşşéăĺ Ľĺăćäžăăăžă§ăłăłăăĽăźăăłăšăăĺŽĺ ¨ăŤćé¤ăăăžăă ăˇăăŞăŞäž: ăłăłăăłăĺ Źéă¨ăźă¸ă§ăłăăä¸ć¸ăăçćăăäşşéăŽăŹăăĽăźć ĺ˝č ăŤé俥ăăŚăćżčŞăć°ćĽéĺž ćŠăăăąăźăšăăăŽéăăŹăăĽăźćéä¸ăŻăłăłăăĽăźăăŞă˝ăźăšăĺŽčĄďźăžăăŻčŞ˛éďźăăžăăăäşşéăŽĺżçăĺąăă¨ăăŞăźăąăšăăŹăźăˇă§ăłăŻäźčŠąăłăłăăăšăă¨ĺŽčĄçść ăĺŽĺ ¨ăŤäżćăăăžăžčŞĺçăŤĺéăăžăă # Python app.orchestration_trigger(context_name="context") def content_approval_workflow(context: DurableOrchestrationContext): """äşşéăäťĺ¨ăăăăŻăźăŻăăăźďźĺž ćŠä¸ăŻăłăšăăźăďź""" topic = context.get_input() # ăšăăă 1ďźă¨ăźă¸ă§ăłăă使ăŁăŚăłăłăăłăăçć content_agent = context.get_agent("ContentGenerationAgent") draft_content = yield content_agent.run(f"{topic} ăŤă¤ăăŚăŽč¨äşăć¸ăăŚăă ăă") # ăšăăă 2ďźäşşéăŤăăăŹăăĽăźăäžé ź yield context.call_activity("notify_reviewer", draft_content) # ăšăăă 3ďźćżčŞăĺž ćŠďźĺž ćŠä¸ăŻăłăłăăĽăźăăŞă˝ăźăšăćśč˛ťăăŞăďź approval_event = context.wait_for_external_event("ApprovalDecision") timeout_task = context.create_timer(context.current_utc_datetime + timedelta(hours=24)) winner = yield context.task_any([approval_event, timeout_task]) if winner == approval_event: timeout_task.cancel() approved = approval_event.result if approved: result = yield context.call_activity("publish_content", draft_content) return result else: return "ăłăłăăłăăŻĺ´ä¸ăăăžăă" else: # ăżă¤ă ă˘ăŚăćďźăŹăăĽăźăă¨ăšăŤăŹăźăˇă§ăł result = yield context.call_activity("escalate_for_review", draft_content) return result Built-in agent observabilityďźă¨ăźă¸ă§ăłăăŽçľăżčžźăżĺŻčŚłć¸Źć§ďź Function App ă Durable Task Scheduler ăčäš ăăăŻă¨ăłăă¨ăăŚć§ćăăžăďźă¨ăźă¸ă§ăłăă¨ăŞăźăąăšăăŹăźăˇă§ăłăŽçść ăć°¸çśĺăăäťçľăżďźăDurable Task Scheduler ăŻădurable agents ăŤć¨ĺĽ¨ăăăăăăŻă¨ăłăă§ăăăćéŤăŽăšăŤăźăăăć§č˝ăĺŽĺ ¨ăŤçŽĄçăăăă¤ăłăăŠăăă㌠UI ăăăˇăĽăăźăăŤăăçľăżčžźăżăŽĺŻčŚłć¸Źć§ăćäžăăžăă Durable Task Scheduler ăăăˇăĽăăźăăŻăă¨ăźă¸ă§ăłăăŽćä˝ă桹ăĺŻčŚĺăăžăďź äźčŠąĺąĽć´ (Conversation history): ĺă¨ăźă¸ă§ăłăăťăăˇă§ăłăŽĺŽĺ ¨ăŞäźčŠąăšăŹăăă襨示ăăăăšăŚăŽăĄăăťăźă¸ăăăźăŤĺźăłĺşăăäťťććçšăŽăłăłăăăšăă確čŞĺŻč˝ ăăŤăă¨ăźă¸ă§ăłăăŽĺŻčŚĺ (Multi-agent visualization): č¤ć°ăŽĺ°éă¨ăźă¸ă§ăłăăĺźăłĺşăéăŽĺŽčĄăăăźăăă¨ăźă¸ă§ăłăéăŽăăłăăŞăă丌ĺĺŽčĄăćĄäťśĺĺ˛ăĺŤăčŚčŚçăŞčĄ¨çžă§čĄ¨ç¤ş ăăăŠăźăăłăšć㍠(Performance metrics): ă¨ăźă¸ă§ăłăăŽĺżçćéăăăźăŻăłä˝żç¨éăăŞăźăąăšăăŹăźăˇă§ăłăŽĺŽčĄćéăçŁčŚ ĺŽčĄĺąĽć´ (Execution history): ăăăă°ç¨ăŤĺŽĺ ¨ăŞăŞăăŹă¤ćŠč˝ăĺăă芳細ăŞĺŽčĄăă°ăŤă˘ăŻăťăšĺŻč˝ Demo Video Language support The Durable Task Extension ăŻäťĽä¸ăŽč¨čŞăăľăăźăăăŚăăžă: C# (.NET 8.0+) with Azure Functions Python (3.10+) with Azure Functions Support for additional computes coming soon. äťćĽăăĺ§ăăŚăżăžăăă Click here to create and run a durable agent Learn more Overview documentation C# Samples Python Samples ĺć Bulletproof agents with the durable task extension for Microsoft Agent Framework | Microsoft Community HubServerless MCP Agent with LangChain.js v1 â Burgers, Tools, and Traces đ
AI agents that can actually do stuff (not just chat) are the fun part nowadays, but wiring them cleanly into real APIs, keeping things observable, and shipping them to the cloud can get... messy. So we built a fresh endâtoâend sample to show how to do it right with the brand new LangChain.js v1 and Model Context Protocol (MCP). In case you missed it, MCP is a recent open standard that makes it easy for LLM agents to consume tools and APIs, and LangChain.js, a great framework for building GenAI apps and agents, has first-class support for it. You can quickly get up speed with the MCP for Beginners course and AI Agents for Beginners course. This new sample gives you: A LangChain.js v1 agent that streams its result, along reasoning + tool steps An MCP server exposing real tools (burger menu + ordering) from a business API A web interface with authentication, sessions history, and a debug panel (for developers) A production-ready multi-service architecture Serverless deployment on Azure in one command ( azd up ) Yes, itâs a burger ordering system. Who doesn't like burgers? Grab your favorite beverage â, and letâs dive in for a quick tour! TL;DR key takeaways New sample: full-stack Node.js AI agent using LangChain.js v1 + MCP tools Architecture: web app â agent API â MCP server â burger API Runs locally with a single npm start , deploys with azd up Uses streaming (NDJSON) with intermediate tool + LLM steps surfaced to the UI Ready to fork, extend, and plug into your own domain / tools What will you learn here? What this sample is about and its high-level architecture What LangChain.js v1 brings to the table for agents How to deploy and run the sample How MCP tools can expose real-world APIs Reference links for everything we use GitHub repo LangChain.js docs Model Context Protocol Azure Developer CLI MCP Inspector Use case You want an AI assistant that can take a natural language request like âOrder two spicy burgers and show me my pending ordersâ and: Understand intent (query menu, then place order) Call the right MCP tools in sequence, calling in turn the necessary APIs Stream progress (LLM tokens + tool steps) Return a clean final answer Swap âburgersâ for âinventoryâ, âbookingsâ, âsupport ticketsâ, or âIoT devicesâ and youâve got a reusable pattern! Sample overview Before we play a bit with the sample, let's have a look at the main services implemented here: Service Role Tech Agent Web App ( agent-webapp ) Chat UI + streaming + session history Azure Static Web Apps, Lit web components Agent API ( agent-api ) LangChain.js v1 agent orchestration + auth + history Azure Functions, Node.js Burger MCP Server ( burger-mcp ) Exposes burger API as tools over MCP (Streamable HTTP + SSE) Azure Functions, Express, MCP SDK Burger API ( burger-api ) Business logic: burgers, toppings, orders lifecycle Azure Functions, Cosmos DB Here's a simplified view of how they interact: There are also other supporting components like databases and storage not shown here for clarity. For this quickstart we'll only interact with the Agent Web App and the Burger MCP Server, as they are the main stars of the show here. LangChain.js v1 agent features The recent release of LangChain.js v1 is a huge milestone for the JavaScript AI community! It marks a significant shift from experimental tools to a production-ready framework. The new version doubles down on whatâs needed to build robust AI applications, with a strong focus on agents. This includes first-class support for streaming not just the final output, but also intermediate steps like tool calls and agent reasoning. This makes building transparent and interactive agent experiences (like the one in this sample) much more straightforward. Quickstart Requirements GitHub account Azure account (free signup, or if you're a student, get free credits here) Azure Developer CLI Deploy and run the sample We'll use GitHub Codespaces for a quick zero-install setup here, but if you prefer to run it locally, check the README. Click on the following link or open it in a new tab to launch a Codespace: Create Codespace This will open a VS Code environment in your browser with the repo already cloned and all the tools installed and ready to go. Provision and deploy to Azure Open a terminal and run these commands: # Install dependencies npm install # Login to Azure azd auth login # Provision and deploy all resources azd up Follow the prompts to select your Azure subscription and region. If you're unsure of which one to pick, choose East US 2 . The deployment will take about 15 minutes the first time, to create all the necessary resources (Functions, Static Web Apps, Cosmos DB, AI Models). If you're curious about what happens under the hood, you can take a look at the main.bicep file in the infra folder, which defines the infrastructure as code for this sample. Test the MCP server While the deployment is running, you can run the MCP server and API locally (even in Codespaces) to see how it works. Open another terminal and run: npm start This will start all services locally, including the Burger API and the MCP server, which will be available at http://localhost:3000/mcp . This may take a few seconds, wait until you see this message in the terminal: đ All services ready đ When these services are running without Azure resources provisioned, they will use in-memory data instead of Cosmos DB so you can experiment freely with the API and MCP server, though the agent won't be functional as it requires a LLM resource. MCP tools The MCP server exposes the following tools, which the agent can use to interact with the burger ordering system: Tool Name Description get_burgers Get a list of all burgers in the menu get_burger_by_id Get a specific burger by its ID get_toppings Get a list of all toppings in the menu get_topping_by_id Get a specific topping by its ID get_topping_categories Get a list of all topping categories get_orders Get a list of all orders in the system get_order_by_id Get a specific order by its ID place_order Place a new order with burgers (requires userId , optional nickname ) delete_order_by_id Cancel an order if it has not yet been started (status must be pending , requires userId ) You can test these tools using the MCP Inspector. Open another terminal and run: npx -y @modelcontextprotocol/inspector Then open the URL printed in the terminal in your browser and connect using these settings: Transport: Streamable HTTP URL: http://localhost:3000/mcp Connection Type: Via Proxy (should be default) Click on Connect, then try listing the tools first, and run get_burgers tool to get the menu info. Test the Agent Web App After the deployment is completed, you can run the command npm run env to print the URLs of the deployed services. Open the Agent Web App URL in your browser (it should look like https://<your-web-app>.azurestaticapps.net ). You'll first be greeted by an authentication page, you can sign in either with your GitHub or Microsoft account and then you should be able to access the chat interface. From there, you can start asking any question or use one of the suggested prompts, for example try asking: Recommend me an extra spicy burger . As the agent processes your request, you'll see the response streaming in real-time, along with the intermediate steps and tool calls. Once the response is complete, you can also unfold the debug panel to see the full reasoning chain and the tools that were invoked: Tip: Our agent service also sends detailed tracing data using OpenTelemetry. You can explore these either in Azure Monitor for the deployed service, or locally using an OpenTelemetry collector. We'll cover this in more detail in a future post. Wrap it up Congratulations, you just finished spinning up a full-stack serverless AI agent using LangChain.js v1, MCP tools, and Azureâs serverless platform. Now it's your turn to dive in the code and extend it for your use cases! đ And don't forget to azd down once you're done to avoid any unwanted costs. Going further This was just a quick introduction to this sample, and you can expect more in-depth posts and tutorials soon. Since we're in the era of AI agents, we've also made sure that this sample can be explored and extended easily with code agents like GitHub Copilot. We even built a custom chat mode to help you discover and understand the codebase faster! Check out the Copilot setup guide in the repo to get started. You can quickly get up speed with the MCP for Beginners course and AI Agents for Beginners course. If you like this sample, don't forget to star the repo âď¸! You can also join us in the Azure AI community Discord to chat and ask any questions. Happy coding and burger ordering! đEssential Microsoft Resources for MVPs & the Tech Community from the AI Tour
Unlock the power of Microsoft AI with redeliverable technical presentations, hands-on workshops, and open-source curriculum from the Microsoft AI Tour! Whether youâre a Microsoft MVP, Developer, or IT Professional, these expertly crafted resources empower you to teach, train, and lead AI adoption in your community. Explore top breakout sessions covering GitHub Copilot, Azure AI, Generative AI, and security best practicesâdesigned to simplify AI integration and accelerate digital transformation. Dive into interactive workshops that provide real-world applications of AI technologies. Take it a step further with Microsoftâs Open-Source AI Curriculum, offering beginner-friendly courses on AI, Machine Learning, Data Science, Cybersecurity, and GitHub Copilotâperfect for upskilling teams and fostering innovation. Donât just learnâlead. Access these resources, host impactful training sessions, and drive AI adoption in your organization. Start sharing today! Explore now: Microsoft AI Tour Resources.