![]()
Up to dis point for di course you don build agents wey dey run for your laptop, inside notebook, wey az login and some environment variables dey control. Na di correct way to learn be dis. But e no be correct way to run agent wey thousand customers dey depend on for 3 a.m.
Dis lesson na about di gap wey dey “e dey work for my machine” and “e dey work, steady and cheap, for production.” We go close dat gap wit Microsoft Foundry and Microsoft Foundry Agent Service, and we go build real customer support agent wey get tools, retrieval, memory, evaluation, and monitoring.
Dis lesson go cover:
After you finish dis lesson, you go sabi how to:
Dis lesson assume say you don finish di other lessons and dem correct for:
You go also need:
az login).requirements.txt.Prototype agent and production agent get di same core loop — think, call tools, respond. Wetin change na everything wey wrap dat loop. Model fit be like 20% of production agent; di other 80% na di operational skeleton.
| Concern | Prototype | Production |
|---|---|---|
| Hosting | Runs inside your notebook | Runs as hosted service, versioned and rolled out |
| Identity | Your az login token |
Managed identity wit scoped RBAC |
| State | For-memory, lost if restart | Externalised (thread store, memory service) |
| Failure | You dey see traceback | Retries, fallbacks, dead-letter, alerts |
| Cost | “Na small cents” | Tracked per request, routed, cached, budgeted |
| Quality | You dey eyeball output | Evaluated automatically before every release |
| Trust | You dey approve every action | Policy + human-in-the-loop for risky actions |
Keep dis table for mind. Every section below na one of dis rows.
You go use three patterns, most times combined.
Agent object dey inside your application process. Your code dey call model provider directly; reasoning loop dey your service. Na wetin every previous lesson do before.
Agent go registered as resource inside Microsoft Foundry. Foundry dey run reasoning loop, store threads, enforce content safety and RBAC, and show agent for Foundry portal. Your app become thin client wey dey create threads and read responses.
Multiple agents (and tools) join become graph with explicit control flow — sequential steps, branching, human approval nodes, and durable checkpoints wey fit pause and resume. Dis na Microsoft Agent Framework Workflows features wey dem apply for deployment scale.
flowchart TB
subgraph P1[Client-Dey Host]
A1[Your App Proces] --> M1[Model Provider]
end
subgraph P2[Hosted Agent]
A2[Thin Client] --> F2[Foundry Agent Service]
F2 --> M2[Model + Tools + Thread Store]
end
subgraph P3[Agent Work Flow]
A3[Orchestrator] --> S1[Triage Agent]
S1 --> S2[Resolver Agent]
S2 --> H[Human Approval Node]
H --> S3[Action Agent]
end
Deploy agent no be one-time push. E be loop, and e resemble software release cycle cause na wetin e be.
flowchart LR
Create[Create / Author] --> Version[Version]
Version --> Evaluate[Evaluate offline]
Evaluate -->|pass gate| Deploy[Deploy for hosted]
Evaluate -->|fail gate| Create
Deploy --> Observe[Observe for online]
Observe --> Improve[Collect failure dem]
Improve --> Create
Deploy --> Retire[Retire old version]
Key idea, carry over from Lesson 10: offline evaluation na gate, no be afterthought. New agent version no go ship unless e clear your evaluation thresholds. Online observability dey feed real-world failures back into offline test set. Na di whole loop be dat.
Scaling agent different from scaling stateless web API, because each request fit trigger multiple expensive model and tool calls. Four methods dey carry most load.
Stateless request handling. No keep per-user state for your process memory. Keep conversation threads for Foundry thread store or memory service so any instance fit handle any request. Na dis one dey allow horizontal scaling — add instances, no sticky sessions.
Model routing. No every request need your most capable (and most expensive) model. Route simple request — intent classification, short factual answer — go small, fast model, reserve big model for serious reasoning. Foundry’s Model Router fit help you do dis, or you fit build your own light classifier. You go build your own version for the lab.
Response caching. Many support questions na near-duplicates (“how I fit reset my password?”). Cache answers to common questions and serve dem without hitting model at all. Even modest cache hit rate fit reduce cost and latency seriously.
Concurrency and backpressure. Model providers get rate limits. Hold your concurrency, use retries with exponential backoff, and fail gracefully (queued “we dey on top am” response better than 500 error).
flowchart LR
Q[User question] --> C{Cache don hit?}
C -->|yes| R[Return cached answer]
C -->|no| Router{Complexity?}
Router -->|simple| SLM[Small model]
Router -->|complex| LLM[Large model]
SLM --> Out[Response]
LLM --> Out
Out --> Store[Cache + trace]
You no fit operate wetin you no fit see. As Lesson 10 cover, Microsoft Agent Framework dey emit OpenTelemetry traces naturally — every model call, tool invoke, and orchestration step become span. For production you export those spans to Microsoft Foundry (or any OTel-compatible backend) so you fit:
from agent_framework.observability import get_tracer
tracer = get_tracer()
with tracer.start_as_current_span("support_request") as span:
span.set_attribute("customer.tier", "enterprise")
span.set_attribute("routed.model", "gpt-5-nano")
# agent execution dey traced automatically inside dis span
Attributes like customer.tier and routed.model na wetin turn wall of traces to answerable questions (“Enterprise customers dey routed to small model too often?”).
Cost for production agents na tokens be main thing. Three levers, by impact order:
Evaluation gates and cost control na same discipline from two sides: evaluation talk you di quality floor, routing and caching keep cost near dat floor as possible.
Governance. Hosted Agents inherit Foundry’s RBAC, content safety, and audit logging. Give each agent managed identity wey get least privilege e need — read-only access to knowledge base, scoped access to ticketing API, no extra.
Human-in-the-loop. Some action dey too serious to automate — like refund, delete account, escalate to legal team. Microsoft Agent Framework support approval-required tools: agent propose action, execution pause, human fit approve or reject, then workflow continue. You don see dis primitive for Lesson 6; now you dey deploy am.
MCP for production. MCP allow your agent to use external tools via standard interface. For production, treat every MCP server as untrusted boundary: pin server version, run am wit scoped identity, validate outputs, neva expose secrets. MCP server na dependency, dependencies get patched, audited, and rate-limited.
flowchart TB
subgraph Dev[Development Architecture]
D1[Notebook] --> D2[Agent Framework]
D2 --> D3[Model Provider]
D2 --> D4[Local tools]
end
subgraph Deploy[Deployment Architecture]
E1[CI pipeline] --> E2[Evaluation gate]
E2 -->|pass| E3[Foundry Agent Service]
E3 --> E4[Versioned hosted agent]
end
subgraph Run[Runtime Architecture]
F1[Client app] --> F2[Hosted agent]
F2 --> F3[Model Router]
F2 --> F4[Azure AI Search RAG]
F2 --> F5[Memory service]
F2 --> F6[MCP tools]
F2 --> F7[OTel -> Foundry tracing]
F2 --> F8[Human approval]
end
Those three diagrams — development, deployment, runtime — na same agent for three life stages. Di lab wey follow go walk you through to build am.
Open code_samples/16-python-agent-framework.ipynb and run am fully. You go build Contoso customer support agent wit every production concern wired in:
Notebook organized so each production concern na self-contained, runnable section. Di core na routing-plus-caching request handler:
async def handle_support_request(query: str, customer_id: str) -> str:
# 1. Serve from cache wen we fit.
cached = response_cache.get(normalize(query))
if cached:
return cached
# 2. Route by complexity to control cost.
model = "gpt-5-nano" if is_simple(query) else "gpt-5-mini"
# 3. Run di agent inside trace span for observability.
with tracer.start_as_current_span("support_request") as span:
span.set_attribute("routed.model", model)
span.set_attribute("customer.id", customer_id)
response = await support_agent.run(query, model=model)
# 4. Cache and return.
response_cache.set(normalize(query), response.text)
return response.text
Di evaluation gate wey guard di release look like dis:
async def evaluation_gate(agent, test_cases, threshold: float = 0.8) -> bool:
passed = 0
for case in test_cases:
result = await agent.run(case["input"])
if score_response(result.text, case["expected"]) >= 0.8:
passed += 1
pass_rate = passed / len(test_cases)
print(f"Evaluation pass rate: {pass_rate:.0%} (gate: {threshold:.0%})")
return pass_rate >= threshold # na only if di gate pass u go deploy am
Read every line — di notebook keep primitives deliberately small so nothing dey hide behind framework call.
Di evaluation gate wey I talk about before dey run offline against your agent object. Once agent don deployed as Hosted Agent, you need one more, even cheaper check: di deployed endpoint really dey answer?
Deploy “successfully” just prove say di control plane accept di definition — e no prove say agent dey respond. Missing dependency, wrong model routing, or expired connection fit make deployment green but no response dey come. Smoke test fit catch dis in seconds, for every deploy, no need full evaluation cost.
Dis repository come wit ready-to-use smoke-test pipeline wey built on top of AI Smoke Test GitHub Action:
tests/lesson-16-smoke-tests.json get prompts and assertions for Contoso support agent (grounded policy answers, order lookup, on-topic keeping, multi-turn thread continuity). Catalogs for other lessons’ agents dey there too — check tests/README.md..github/workflows/smoke-test.yml dey login wit Azure OIDC and dey POST each prompt to agent’s Responses endpoint, failing job if any assertion miss.- name: Smoke-test hosted agent
uses: JFolberth/ai-smoketest@v1
with:
project_endpoint: $
agent_name: ContosoSupportAgent
tests_file: tests/lesson-16-smoke-tests.json
Run am from the Actions tab wen your agent don deploy, provide your Foundry project endpoint and agent name. Di federated identity need di Azure AI User role for Foundry project scope. Think of di layers like pyramid: smoke tests (fit reach and dey respond?) dey run every time dem deploy, offline evaluation (sharp enough to ship?) dey run before promotion, and online evaluation (how e dey perform for jungle?) dey run steady steady.
Test your understanding before you move to di assignment.
1. Roughly how much production agent na “di model,” and wetin be di rest?
2. When you go prefer Hosted Agent pass client-hosted agent?
3. Why e important say scalable agent no get own process memory state?
4. Wetin model routing solve and how e relate to evaluation?
5. Wetin be “evaluation gate” and where e dey for lifecycle?
6. Why MCP server suppose dey treated as untrusted boundary for production?
7. Which single change usually get biggest impact on production agent cost, and why?
8. Wetin span attributes like customer.tier and routed.model dey do for observability?
Take di customer support agent from di lab and make am strong for specific scenario: subscription billing support agent for SaaS company.
Your submission suppose:
get_subscription_status, get_invoice, and issue_credit (credits pass $50 need human approval).Write short paragraph (for markdown cell) explain which model-routing rule you choose and how you go validate am with real traffic. No be only one correct answer — dem dey check if you sabi how production things connect well.
For dis lesson you move agent from prototype go production with Microsoft Foundry:
Di next lesson go take di opposite journey: instead of to scale agents up inside cloud, you go bring dem down to single developer machine and run dem fully local.
Building Computer Use Agents (CUA)
Disclaimer: Dis document don translate wit AI translation service Co-op Translator. Even tho we dey try make am correct, abeg make you know say automated translation fit get errors or mistakes. Di original document for dia own language na im be di correct source. For important info, make person wey sabi human translation do am. We no go responsible for any misunderstanding or wrong understanding wey fit happen because of dis translation.