01. Accept input
Validate the request length and selected mode. Treat the text as untrusted data, not instructions to the application.
POST /api/analyzeSUPPORT SIGNAL / 15-MINUTE WALKTHROUGH
Turn a support request into something a person can inspect. Keep classification, evidence, and approval as separate responsibilities.
THE BUSINESS PROBLEM
A support operator needs a classification, a suggested next step, and a draft reply. The application must preserve what the requester actually said without pretending it confirmed the cause, contacted anyone, or restored service.
THE RESPONSIBILITY BOUNDARY
Validate the request length and selected mode. Treat the text as untrusted data, not instructions to the application.
POST /api/analyzeA code-defined Agent Framework agent calls a Foundry deployment. The application owns the instructions; Foundry serves inference.
AsAIAgent / RunAsyncParse the result. Check labels, required text, and exact evidence membership. Reject invalid results rather than simulating a success.
Triage.ValidateInspect and edit the proposed reply. Approval is local; changing reviewed text clears it. No message is sent.
Original + human editsNo. In the live lab, AIProjectClient.AsAIAgent defines the agent in application code. It does not create a service-managed agent resource. The agent runs in the .NET application, with no tools or conversation memory in this sample. App Service hosting is optional and separate from model inference.
Direct model inference would also solve this one-shot task. The framework provides a small agent boundary for learning; multiple agents would not improve the explanation.
READ BEFORE CLASSIFYING
The production portal has been unavailable to all users since 9:15 AM. Opening the dashboard returns error 500. We need access restored to continue operations.
This text comes from the application's Service outage scenario. It reports scope and symptoms; it does not verify them.
Pause here. Which category fits? Is the cause known? Would you promise a recovery time based on this text?
EXPECTED SIMULATION OUTPUT / NOT AI
Outage-related words select Reliability. Production-wide scope selects High. These are deterministic teaching rules, not measured model behavior.
The simulator copies up to 180 characters. This fixture is shorter than that limit.
SUGGESTION / NOT EXECUTION
Verify service status and scope before escalating to the on-call team.
No diagnosis. No recovery promise.
The draft reply acknowledges the request and says the cause and resolution timeline are not confirmed. The app does not investigate systems or contact anyone.
ONE APPLICATION CHECK, MADE VISIBLE
Edit an evidence excerpt. This browser exercise illustrates the exact, case-sensitive substring check. It does not classify the request or run the .NET validator.
This excerpt appears exactly in the request. It does not establish the cause, scope, or correctness of the proposed response. Human review is still required.
FOLLOW THE LIVE PATH, THEN THE SHARED CHECKS
In the live branch of POST /api/analyze, the app defines one agent, runs it, and parses its response. Authentication is configured separately: Azure CLI locally or managed identity when hosted.
var agent = new AIProjectClient(uri!, credential).AsAIAgent(
model: model!, name: "SupportSignal", instructions: Triage.Instructions);
var response = await agent.RunAsync(JsonSerializer.Serialize(new { untrustedSupportRequest = request.Text }), cancellationToken: timeout.Token);
proposal = Triage.Parse(response.ToString());Triage.Instructions asks for JSON and says the request is untrusted. This lab does not use a model-enforced JSON schema. The application must still reject bad output.
After simulation or live inference, Triage.Validate checks allowed category and priority values, required field lengths, and evidence membership. Valid JSON alone is insufficient.
The live branch has a cancellation deadline. An invalid provider result stays an error. It is never replaced silently with the deterministic simulation.
Read the failure pathsBrowser code clears approval after changes. Export preserves the original proposal and adds humanEdits. Local approval is not a command to send the reply.
if (!input.Contains(p.Evidence, StringComparison.Ordinal)) throw new InvalidDataException("Evidence is not in the request");This line is deliberately small. It proves membership, not meaning. The browser experiment above illustrates this rule; the complete validator also checks the other proposal fields.
YOUR LIVE PRESENTATION
"We want a reviewable proposal, not an autonomous support action." State that the displayed result is deterministic simulation, not a model recording.
Ask what is known. Show the expected category and priority, then try the invented quote. Explain why a matching quote still does not prove a diagnosis.
Show the live agent invocation and the shared validator. The agent definition belongs to the app; inference belongs to Foundry. Simulation bypasses the agent.
Analyze Service outage in simulation mode. Edit the reply, approve it, then edit again to clear approval. Export and point out originals versus human edits.
"We validated the shape and the quotation. A person must still judge the interpretation." Leave room for a question.
From the repository root, with PowerShell 7 and the exact SDK from global.json installed:
.\scripts\Test-Prerequisites.ps1
.\Start-Demo.ps1 -Lab 1 -OfflineOpen http://localhost:5187. Select Service outage and Analyze request. Expect Reliability / Priority high with a simulation label. No model or MAF runs. Rehearse before the event so restore and compilation do not happen on stage.
Editing a reply or next step clears approval. Changing the input or mode clears the proposal. Reload loses browser state. Stop the server with Ctrl+C and remove exported synthetic JSON when no longer needed.
Prerequisites, live setup, costs, and cleanupWHAT THIS DEMO DOES NOT PROVE
Keyword rules reproduce the workflow but can mishandle negation or mixed intent. Their output and timing do not measure a model.
Asking the model to ignore embedded commands is useful guidance, not proof against every adversarial request. Inputs and outputs remain untrusted.
The app's review state is in browser memory. It is not persisted or an identity-verified approval. Nothing is sent.
The repository records dated live observations separately. This website makes no new inference call and does not verify your credentials, access, or deployment.
The sample pins .NET SDK 11.0.100-rc.1.26425.128 (RC1) and Microsoft.Agents.AI.Foundry 1.24.0-preview.261006.1. The connector is preview; this guide neither upgrades it nor claims it is generally available.
AsAIAgent, and the distinction from service-managed agents. Accessed October 15, 2026.The quote exercise and presentation sequence are this project's teaching design. The review rule is application behavior, not a framework-provided approval guarantee.
Validate what you can.
Expose what you cannot.