1. Architecture Overview
AI Agents for Beginners is a 16-lesson educational curriculum from Microsoft that teaches AI agent development through structured lessons and runnable code samples. The repository is not a standalone application — it is a course package containing markdown content, Jupyter notebooks, and standalone code samples in Python and C# (.NET) that demonstrate agent patterns using the Microsoft Agent Framework (MAF).
System Architecture
ai-agents-for-beginners/
├── 00-course-setup/ Lesson 00: setup guide + Azure Search C# sample
├── 01-intro-to-ai-agents/ Lesson 01: intro + code_samples/
│ └── code_samples/ 01-dotnet-agent-framework.cs
├── 02-explore-agentic-frameworks/ Lesson 02: frameworks + code_samples/
├── 03-agentic-design-patterns/ Lesson 03: design patterns + code_samples/
├── 04-tool-use/ Lesson 04: tool use + code_samples/ + tests
├── 05-agentic-rag/ Lesson 05: RAG + code_samples/
├── 06-building-trustworthy-agents/ Lesson 06: trust + code_samples/
├── 07-planning-design/ Lesson 07: planning + code_samples/
├── 08-multi-agent/ Lesson 08: multi-agent + code_samples/ + solution/
├── 09-metacognition/ Lesson 09: metacognition + code_samples/
├── 10-ai-agents-production/ Lesson 10: production + code_samples/
├── 11-agentic-protocols/ Lesson 11: MCP protocols + code_samples/
├── 12-context-engineering/ Lesson 12: context engineering + code_samples/
├── 13-agent-memory/ Lesson 13: agent memory
├── 14-microsoft-agent-framework/ Lesson 14: MAF deep dive + code-samples/
├── 15-browser-use/ Lesson 15: browser use
├── translations/ 40+ language translations
├── translated_images/ Localized images
├── requirements.txt Python dependencies
├── global.json .NET SDK version pin
└── .env.example Environment variable template
Component Inventory
| Component | Path | Role |
|---|---|---|
| Lesson READMEs | {NN}-{topic}/README.md |
Conceptual teaching material |
| Python notebooks | {NN}-{topic}/code_samples/*-python-agent-framework.ipynb |
Interactive Python exercises |
| C# samples | {NN}-{topic}/code_samples/*-dotnet-agent-framework.cs |
Standalone C# demonstrations |
| MCP server | 11-agentic-protocols/code_samples/mcp-agents/server/ |
Resumable MCP server with agent tools |
| MCP client | 11-agentic-protocols/code_samples/mcp-agents/client/ |
Interactive host application |
| Event store | 11-agentic-protocols/code_samples/mcp-agents/server/event_store.py |
Session resumption storage |
| GitHub MCP app | 11-agentic-protocols/code_samples/github-mcp/app.py |
Chainlit + MAF multi-agent workflow |
| Hotel booking workflow | 14-microsoft-agent-framework/code-samples/hotel_booking_workflow_sample.py |
Conditional workflow demonstration |
| Azure Search setup | 00-course-setup/AzureSearch.cs |
Index creation and document upload |
| Translations | translations/{lang}/ |
Localized lesson content |
| Translated images | translated_images/{lang}/ |
Localized screenshots and diagrams |
Technology Stack
| Layer | Technology | Version/Details |
|---|---|---|
| Agent Framework | Microsoft Agent Framework (MAF) | agent-framework (Python), Microsoft.Agents.AI (NuGet) |
| AI Services | Azure AI Foundry (Agent Service v2) | Responses API |
| AI Models | GPT-4o, GPT-4o-mini | Via Azure AI Foundry, GitHub Models, OpenAI, MiniMax |
| Protocol | Model Context Protocol (MCP) | mcp[cli] with StreamableHTTP transport |
| Chat UI | Chainlit | For Lesson 11 GitHub MCP sample |
| Search | Azure AI Search | For Lesson 5 (RAG) and Lesson 11 |
| Auth | Azure CLI (AzureCliCredential) |
Keyless authentication |
| Python | 3.12+ | Virtual environment recommended |
| .NET | 10.0+ SDK | Inline #:package NuGet references |
| A2A | Agent-to-Agent SDK | a2a-sdk |
Note
The repository uses
AzureCliCredentialfor authentication throughout, avoiding API key management. This is a deliberate architectural choice aligned with Microsoft's keyless connection best practices.
Data Flow: Typical Lesson Execution
User → Jupyter Notebook / .cs file
→ Load .env (dotenv)
→ AzureCliCredential (az login session)
→ Azure AI Foundry Agent Service (or GitHub Models / OpenAI / MiniMax)
→ Agent executes with tools
→ Streaming response to user
For multi-agent workflows (Lessons 08, 14):
User Input → WorkflowBuilder
→ Agent A (start executor)
→ Edge → Agent B (reviewer / next stage)
→ [Optional: conditional routing]
→ Final output streamed to user
For MCP-based agent communication (Lesson 11):
User → Host (MCP Client)
→ MCP Server (StreamableHTTP)
→ Agent Tool (travel_agent / research_agent)
→ Progress notifications → Client
→ Elicitation / Sampling (mid-execution interaction)
→ EventStore (session resumption)
→ Final result
2. System Requirements
| Requirement | Minimum | Recommended |
|---|---|---|
| Python | 3.12 | 3.12+ |
| .NET SDK | 10.0 | 10.0+ |
| Azure CLI | Latest | Latest |
| Git | 2.25 | Latest |
| OS | Windows / macOS / Linux | Any |
| Disk space | ~500 MB (sparse) | ~3 GB (full clone) |
| Azure Subscription | Required | With AI Foundry access |
| Network | Internet access | For Azure services and model API calls |
Python Dependencies (from requirements.txt)
| Package | Purpose |
|---|---|
azure-ai-inference |
Azure AI model inference |
azure-ai-projects |
Azure AI Foundry project management |
azure-identity |
Azure authentication (AzureCliCredential) |
azure-search-documents |
Azure AI Search (Lesson 5, 11) |
agent-framework |
Microsoft Agent Framework |
a2a-sdk |
Agent-to-Agent protocol SDK |
mcp[cli] |
Model Context Protocol with CLI tools |
openai |
OpenAI API client |
httpx |
HTTP client |
ipykernel |
Jupyter notebook kernel |
nest-asyncio |
Nested async event loop support |
numpy |
Numerical operations |
pandas |
Data manipulation |
pillow |
Image processing |
python-dotenv |
.env file loading |
uvicorn |
ASGI server (MCP server) |
.NET NuGet Dependencies (per sample)
| Package | Version | Used In |
|---|---|---|
Microsoft.Extensions.AI |
10.4.1 / 9.9.1 | Lessons 01-08 |
Microsoft.Extensions.AI.OpenAI |
10.4.1+ | Lessons 01-04 |
Microsoft.Agents.AI.OpenAI |
1.1.0 / 1.0.0-preview | Lessons 01-08 |
Microsoft.Agents.AI |
1.0.0-preview | Lessons 05-08 |
Microsoft.Agents.AI.Workflows |
1.0.0-preview | Lesson 08 |
Azure.AI.Agents.Persistent |
1.2.0-beta | Lessons 05, 08 |
Azure.Identity |
1.15.0 | Lessons 05, 08 |
DotNetEnv |
3.1.1 | Lessons 05, 07, 08 |
OpenTelemetry.Api |
1.12.0 | Lesson 08 |
System.Linq.Async |
6.0.3 | Lessons 05, 08 |
Important
The
global.jsonat the repository root pins the .NET SDK to version10.0.100withrollForward: latestFeatureandallowPrerelease: false. This ensures consistent behavior across environments.
3. Configuration Reference
Environment Variables — Complete Reference
| Variable | Type | Default | Required | Description | Used In |
|---|---|---|---|---|---|
AZURE_AI_PROJECT_ENDPOINT |
string | — | Yes | Azure AI Foundry project endpoint URL | All Azure notebooks |
AZURE_AI_MODEL_DEPLOYMENT_NAME |
string | gpt-4.1-mini |
Yes | Model deployment name in Foundry | All Azure notebooks |
AZURE_SEARCH_SERVICE_ENDPOINT |
string | — | Lesson 5, 11 | Azure AI Search service URL | RAG, MCP GitHub app |
AZURE_SEARCH_API_KEY |
string | — | Lesson 5, 11 | Azure AI Search admin API key | RAG, MCP GitHub app |
GITHUB_TOKEN |
string | — | Lessons 6, 8, C# | GitHub personal access token | GitHub Models provider |
GITHUB_ENDPOINT |
string | https://models.inference.ai.azure.com |
No | GitHub Models API endpoint | GitHub Models provider |
GITHUB_MODEL_ID |
string | gpt-4o-mini / gpt-4o |
No | Model name for GitHub Models | GitHub Models provider |
GH_ENDPOINT |
string | https://models.github.ai/inference |
No | C# sample GitHub Models endpoint | C# Lessons 01-04 |
GH_MODEL_ID |
string | openai/gpt-5-mini |
No | C# sample model ID | C# Lessons 01-04 |
GH_TOKEN |
string | — | C# samples | C# sample GitHub token | C# Lessons 01-04 |
MINIMAX_API_KEY |
string | — | No | MiniMax API key | Lesson 14 |
MINIMAX_BASE_URL |
string | https://api.minimax.io/v1 |
No | MiniMax API endpoint | Lesson 14 |
MINIMAX_MODEL_ID |
string | MiniMax-M2.7 |
No | MiniMax model name | Lesson 14 |
OPENAI_API_KEY |
string | — | No | OpenAI API key (fallback provider) | Lesson 14 |
Warning
The C# samples (Lessons 01-04) use
GH_ENDPOINT,GH_MODEL_ID, andGH_TOKENwith different defaults than the Python samples'GITHUB_ENDPOINT,GITHUB_MODEL_ID, andGITHUB_TOKEN. These are separate variable sets — setting one does not configure the other.
Configuration Files
| File | Format | Location | Purpose |
|---|---|---|---|
.env.example |
dotenv | Repository root | Template for environment variables |
.env |
dotenv | Repository root (gitignored) | Active environment configuration |
global.json |
JSON | Repository root | .NET SDK version pin |
requirements.txt |
pip | Repository root | Python dependency specification |
.env.example Structure
AZURE_AI_PROJECT_ENDPOINT=https://<your-project>.services.ai.azure.com/api/projects/<your-project-id>
AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o
global.json
{
"sdk": {
"version": "10.0.100",
"rollForward": "latestFeature",
"allowPrerelease": false
}
}
Tip
The
rollForward: latestFeaturesetting allows using newer patch versions of the 10.0 SDK without updatingglobal.json.
4. Deployment & Scaling
This repository is an educational course, not a deployable application. However, two components within it can be deployed independently:
MCP Server Deployment (Lesson 11)
The resumable MCP server at 11-agentic-protocols/code_samples/mcp-agents/server/ can be run as a standalone service:
python -m server.server --port 8006
| Flag | Default | Description |
|---|---|---|
--port |
8006 |
Port to listen on |
--no-event-store |
false |
Disable event store (disables session resumption) |
The server uses Starlette + Uvicorn with these configuration defaults:
config = uvicorn.Config(
app=app,
host="127.0.0.1",
port=port,
log_level="info",
limit_concurrency=10,
timeout_keep_alive=30,
access_log=True,
)
Security settings restrict access to localhost:
security_settings = TransportSecuritySettings(
allowed_hosts=["127.0.0.1:*", "localhost:*"],
allowed_origins=["http://127.0.0.1:*", "http://localhost:*"]
)
Caution
The MCP server's
TransportSecuritySettingsonly allows connections from127.0.0.1andlocalhost. To expose it to other hosts, you must modify theallowed_hostsandallowed_originsinserver.py. Do this only in secure, controlled environments.
Chainlit Application (Lesson 11)
The GitHub MCP app at 11-agentic-protocols/code_samples/github-mcp/app.py is a Chainlit-based web application:
chainlit run app.py
This application requires:
- Azure AI Foundry credentials (via
az login) - Azure AI Search credentials (
AZURE_SEARCH_SERVICE_ENDPOINT,AZURE_SEARCH_API_KEY) - An MCP server configured in Chainlit's MCP settings
GitHub Codespaces
The repository supports GitHub Codespaces for zero-install cloud development environments. Create a codespace directly from the GitHub repository page.
5. Operations
Repository Maintenance
Keeping lessons updated: Each lesson is self-contained in its directory. To update a lesson, modify the README.md and/or code_samples/ within that lesson's directory.
Translation pipeline: The translations/ directory contains lesson content in 40+ languages. The translated_images/ directory contains localized screenshots. These are maintained by an automated translation pipeline.
Note
The translation infrastructure generates one translated README per language per lesson. Each translation directory mirrors the English lesson structure but with localized content and image references.
Event Store Management (MCP Server)
The MCP server supports two event store implementations:
SimpleEventStore (in-memory, default):
- Events stored in a Python list
- Lost on server restart
- Suitable for development and testing
PersistentEventStore (SQLite):
- Events stored in
events.db - Survives server restarts
- Uses
check_same_thread=Falsefor async compatibility - Schema:
CREATE TABLE events (id INTEGER PRIMARY KEY AUTOINCREMENT, stream_id TEXT NOT NULL, message TEXT NOT NULL)
Tip
For production-like testing of session resumption, use the
PersistentEventStore. TheSimpleEventStoreis fine for quick development iterations but won't survive server restarts.
Azure AI Search Index Management
Lesson 11's GitHub MCP app creates and manages an Azure AI Search index named event-descriptions:
- Index fields:
id(String, key),content(String, searchable) - On startup, the app checks if the index exists and creates it if not
- Documents are loaded from
event-descriptions.md, split by---delimiter - Existing documents are cleared and re-uploaded on each run
6. Performance
Model Provider Comparison
| Provider | Latency | Context Window | Cost Model |
|---|---|---|---|
| Azure AI Foundry | Low (Azure network) | Model-dependent | Azure pricing |
| GitHub Models | Moderate | Model-dependent | Free tier available |
| MiniMax | Moderate | Up to 204K tokens | MiniMax pricing |
| OpenAI | Moderate | Model-dependent | OpenAI pricing |
MCP Server Performance Characteristics
The MCP server is configured for educational use:
limit_concurrency=10— maximum 10 concurrent connectionstimeout_keep_alive=30— 30-second keep-alive timeout- Agent tool steps use
anyio.sleep(2)— 2-second delay between steps (simulated work) - Long-running agent: 50 steps × 2 seconds = ~100 seconds total
Note
The sleep delays in agent tools are intentional for demonstration purposes. In a production system, these would be replaced with actual computation.
7. Security
Authentication Model
The course uses AzureCliCredential exclusively — no API keys are required for Azure authentication. This follows Microsoft's keyless connection best practices.
| Service | Auth Method | Credential Source |
|---|---|---|
| Azure AI Foundry | AzureCliCredential |
az login session |
| Azure AI Search | API key | .env file |
| GitHub Models | Personal access token | .env file |
| MiniMax | API key | .env file |
| OpenAI | API key | .env file |
Warning
While Azure AI Foundry uses keyless auth, Azure AI Search and alternative providers still require API keys stored in the
.envfile. Never commit.envto version control.
MCP Server Security
The MCP server enforces transport-level security:
security_settings = TransportSecuritySettings(
allowed_hosts=["127.0.0.1:*", "localhost:*"],
allowed_origins=["http://127.0.0.1:*", "http://localhost:*"]
)
This restricts all connections to localhost. The server does not implement authentication — it assumes a trusted local environment.
Secrets Management
| Secret | Storage | Risk if Exposed |
|---|---|---|
AZURE_SEARCH_API_KEY |
.env |
Azure Search index read/write access |
GITHUB_TOKEN |
.env |
GitHub API access (scope-dependent) |
GH_TOKEN |
.env |
Same as GITHUB_TOKEN, used in C# samples |
MINIMAX_API_KEY |
.env |
MiniMax API access and billing |
OPENAI_API_KEY |
.env |
OpenAI API access and billing |
Caution
The
.env.examplefile does not include placeholder values for API keys. Always verify that.envis listed in.gitignorebefore committing.
8. Developer Internals
Repository Structure
ai-agents-for-beginners/
├── 00-course-setup/ Setup guide
│ └── AzureSearch.cs Azure Search index creation (C#)
├── 01-intro-to-ai-agents/ Introduction lesson
│ └── code_samples/
│ └── 01-dotnet-agent-framework.cs Simple agent with tool
├── 02-explore-agentic-frameworks/ Framework exploration
│ └── code_samples/
│ └── 02-dotnet-agent-framework.cs Multi-turn agent with threads
├── 03-agentic-design-patterns/ Design principles
│ └── code_samples/
│ └── 03-dotnet-agent-framework.cs Transparency/control/consistency demo
├── 04-tool-use/ Tool calling patterns
│ └── code_samples/
│ ├── 04-dotnet-agent-framework.cs Multi-tool composition
│ └── test_demo_plugins.py Plugin unit tests
├── 05-agentic-rag/ RAG pattern
│ └── code_samples/
│ └── 05-dotnet-agent-framework.cs File search with vector store
├── 06-building-trustworthy-agents/ Trust and safety
├── 07-planning-design/ Task decomposition
│ └── code_samples/
│ └── 07-dotnet-agent-framework.cs Structured output planning
├── 08-multi-agent/ Multi-agent systems
│ └── code_samples/
│ ├── 08-dotnet-agent-framework.cs WorkflowBuilder sequential
│ └── workflows-agent-framework/ Full workflow tutorial
├── 09-metacognition/ Agent self-reflection
├── 10-ai-agents-production/ Production considerations
├── 11-agentic-protocols/ MCP protocol
│ └── code_samples/
│ ├── github-mcp/app.py Chainlit multi-agent app
│ └── mcp-agents/
│ ├── server/server.py Resumable MCP server
│ ├── server/event_store.py Event store implementations
│ └── client/client.py Interactive MCP client
├── 12-context-engineering/ Context management
├── 13-agent-memory/ Memory patterns
├── 14-microsoft-agent-framework/ MAF deep dive
│ └── code-samples/
│ └── hotel_booking_workflow_sample.py Conditional workflow
├── 15-browser-use/ Browser automation
├── translations/ 40+ language translations
├── translated_images/ Localized images
├── requirements.txt Python dependencies
├── global.json .NET SDK config
└── .env.example Env var template
Module Reference
11-agentic-protocols/code_samples/github-mcp/app.py
The most complex code sample in the repository. A Chainlit-based multi-agent application that demonstrates MCP integration with Azure AI Foundry.
Key components:
| Function/Decorator | Purpose |
|---|---|
search_events(query) |
RAG tool — searches Azure AI Search and Devpost API for events |
flatten(xss) |
Utility — flattens nested lists |
@cl.on_mcp_connect / on_mcp() |
MCP lifecycle — handles MCP server connection, discovers tools |
@cl.step / call_tool() |
Tool execution — routes MCP tool calls to the correct server |
@cl.on_chat_start / on_chat_start() |
Session init — creates 3 agents (GitHub, Hackathon, Events), builds sequential workflow |
@cl.on_chat_end / on_chat_end() |
Session cleanup (no-op) |
route_user_input(user_input) |
Input routing — regex-based selection of which agents to invoke |
@cl.on_message / on_message() |
Message handler — orchestrates single-agent or multi-agent workflow execution |
Agent definitions:
| Agent | Role | Capabilities |
|---|---|---|
GithubAgent |
Analyzes GitHub repositories by username | Uses MCP tools for GitHub API access |
HackathonAgent |
Recommends hackathon project ideas | Based on user's GitHub profile analysis |
EventsAgent |
Recommends tech events | Uses search_events tool for Azure Search + Devpost |
Workflow pattern: Sequential — GitHub → Hackathon → Events, built with WorkflowBuilder.
11-agentic-protocols/code_samples/mcp-agents/server/server.py
Resumable MCP server implementing the StreamableHTTP transport with three agent tools.
Classes:
| Class | Parent | Purpose |
|---|---|---|
PriceConfirmationSchema |
BaseModel |
Pydantic schema for elicitation — price confirmation with notes |
ResumableServer |
Server (MCP) |
Server with tool handlers for travel, research, and long-running agents |
Tools exposed:
| Tool | Parameters | Features Demonstrated |
|---|---|---|
travel_agent |
destination (default: "Paris") |
Progress notifications, elicitation (price confirmation), cancellation |
research_agent |
topic (default: "AI trends") |
Progress notifications, sampling (AI-generated summary) |
long_running_agent |
None | 50 steps × 2s, log messages, resumption testing |
Key functions:
| Function | Purpose |
|---|---|
create_server_app(event_store) |
Creates Starlette ASGI app with StreamableHTTPSessionManager |
run_server(port, with_event_store) |
Starts Uvicorn server with configurable port and event store |
main() |
CLI entry point with --port and --no-event-store flags |
11-agentic-protocols/code_samples/mcp-agents/server/event_store.py
Two event store implementations for MCP session resumption.
SimpleEventStore (in-memory):
| Method | Purpose |
|---|---|
store_event(stream_id, message) |
Appends event to list, returns incremented ID |
replay_events_after(last_event_id, callback) |
Replays events after a given ID via callback |
get_event_count() |
Returns total stored events |
clear_events() |
Clears all events and resets counter |
PersistentEventStore (SQLite):
| Method | Purpose |
|---|---|
store_event(stream_id, message) |
Inserts into SQLite via asyncio.to_thread |
replay_events_after(last_event_id, callback) |
Fetches and replays events for the same stream |
_create_table() |
Creates events table on init |
close() |
Closes SQLite connection with error handling |
Context manager (__enter__/__exit__) |
Supports with statement for resource cleanup |
14-microsoft-agent-framework/code-samples/hotel_booking_workflow_sample.py
Conditional workflow demonstration with three Pydantic models and routing logic.
Classes:
| Class | Parent | Fields |
|---|---|---|
BookingCheckResult |
BaseModel |
destination, has_availability, message |
AlternativeResult |
BaseModel |
alternative_destination, reason |
BookingConfirmation |
BaseModel |
destination, action, message |
Functions:
| Function | Purpose |
|---|---|
hotel_booking(destination) |
@ai_function — simulates hotel availability (Stockholm, Seattle, Tokyo, London, Amsterdam have rooms) |
has_availability_condition(message) |
Routing condition — returns True when rooms are available |
no_availability_condition(message) |
Routing condition — returns True when no rooms available |
display_result(response, ctx) |
@executor — yields final workflow output |
main() |
Builds and runs conditional workflow with two test cases |
Workflow graph:
User Input → availability_agent
├── [has rooms] → booking_agent → display_result
└── [no rooms] → alternative_agent → display_result
Provider auto-detection order: MiniMax → GitHub Models → OpenAI (based on which API key env var is set).
C# Samples (Lessons 01-08)
Each C# sample follows a consistent pattern:
- Inline
#:packageNuGet dependency declarations - Environment variable loading (
GH_ENDPOINT,GH_MODEL_ID,GH_TOKENorGITHUB_*variants) OpenAIClientcreation pointed at GitHub Models endpointAIAgentcreation via fluent API (.AsAIAgent()or.CreateAIAgent())- Tool registration via
AIFunctionFactory.Create() - Streaming execution via
RunStreamingAsync()
Key API patterns:
// Lesson 01: Simple agent
AIAgent agent = openAIClient
.GetChatClient(model_id)
.AsAIAgent(instructions: "...", tools: [...]);
// Lesson 02+: Agent with named options and thread
AIAgent agent = openAIClient
.GetChatClient(model_id)
.AsIChatClient()
.CreateAIAgent(name: "...", instructions: "...", tools: [...]);
AgentThread thread = agent.GetNewThread();
// Lesson 07: Structured output
ChatClientAgentOptions options = new(name: "...", instructions: "...") {
ChatOptions = new() {
ResponseFormat = ChatResponseFormatJson.ForJsonSchema(
schema: AIJsonUtilities.CreateJsonSchema(typeof(TravelPlan)),
schemaName: "TravelPlan")
}
};
// Lesson 08: Multi-agent workflow
var workflow = new WorkflowBuilder(frontdeskAgent)
.AddEdge(frontdeskAgent, reviewerAgent)
.Build();
04-tool-use/code_samples/test_demo_plugins.py
Unit tests for the tool use lesson's Python plugins:
| Test | Validates |
|---|---|
test_calculator_add() |
CalculatorPlugin.add(5, 7) == 12 |
test_calculator_subtract() |
CalculatorPlugin.subtract(10, 4) == 6 |
test_time_plugin() |
TimePlugin.get_current_time() returns 19-char datetime string |
Note
These tests import from
demo_tool_agentwhich is a Python module defined in the corresponding notebook. The test file contains a typo (AssertionErrorinstead ofAssertionError) that would prevent proper exception handling — this is a non-critical issue in educational sample code.
Code Patterns and Conventions
Agent creation pattern (Python — MAF):
from agent_framework import WorkflowBuilder
from agent_framework.openai import OpenAIChatClient
chat_client = OpenAIChatClient(base_url=endpoint, api_key=token, model_id=model)
agent = chat_client.create_agent(instructions="...", name="...", tools=[...])
Agent creation pattern (Python — Azure AI Foundry):
from agent_framework.azure import AzureAIProjectAgentProvider
from azure.identity import AzureCliCredential
provider = AzureAIProjectAgentProvider(credential=AzureCliCredential())
agent = await provider.create_agent(name="...", instructions="...")
Workflow patterns:
- Sequential:
WorkflowBuilder().set_start_executor(a).add_edge(a, b).build() - Concurrent:
ConcurrentBuilder().participants([a, b]).build() - Conditional:
.add_edge(a, b, condition=condition_func) - Fan-out/Fan-in (C#):
.AddFanOutEdge()/.AddFanInEdge()
Environment variable loading: All samples use python-dotenv (load_dotenv()) or DotNetEnv (Env.Load()) to load .env files, typically from the repository root via relative path ../../../.env.
Structured output: Pydantic BaseModel subclasses for Python, JsonPropertyName-annotated C# classes for .NET, passed as response_format to agent configuration.
Testing Strategy
The repository has minimal automated testing:
04-tool-use/code_samples/test_demo_plugins.py— 3 unit tests for calculator and time plugins- No integration test suite
- No CI/CD pipeline configuration visible in the briefing
Testing is primarily manual: run the notebook, verify the output matches expected behavior.
Potential Improvements
- Automated testing: Add pytest or unittest suites for each lesson's code samples
- CI pipeline: Add GitHub Actions to validate that all samples at least import correctly
- Dependency pinning:
requirements.txtlacks version pins — could cause breakage as packages update - Consistent env var naming: Python samples use
GITHUB_*while C# usesGH_*— could be unified - Error handling: Most samples use broad
except Exceptioncatches — could be more specific - The
test_demo_plugins.pytypo:AssertionErrorshould beAssertionError(though both resolve to the same built-in)
Contributing
The repository is open source under MIT license and accepts community contributions. Existing community engagement (from GitHub issues):
- Issue #503: Content contribution for a new lesson on securing AI agents with cryptographic receipts
- Issue #517: Integration proposal for agentic commerce
- Issue #525: Typo fix for broken README link (closed, fixed)
- Issue #518: Typo fix in Lesson 05 image (closed)
- Issue #491: Missing Chinese translation for agent memory module (closed)
- Issue #479: Resource suggestion for a multi-agent CLI runtime (closed)
9. Integration Points
Azure AI Foundry
Primary integration for model inference and agent services:
- Endpoint: Configured via
AZURE_AI_PROJECT_ENDPOINT - Auth:
AzureCliCredential(no API keys) - Protocol: Azure AI Agent Service v2 (Responses API)
- SDK:
azure-ai-projects,azure-ai-inference
Azure AI Search
Used for RAG (Lesson 5) and event search (Lesson 11):
- Endpoint: Configured via
AZURE_SEARCH_SERVICE_ENDPOINT - Auth: Admin API key via
AZURE_SEARCH_API_KEY - SDK:
azure-search-documents - Index schema: Simple key-value with
id(String) andcontent(searchable String)
GitHub Models
Alternative model provider used in Lessons 6, 8, and C# samples:
- Endpoint:
https://models.inference.ai.azure.com(Python) orhttps://models.github.ai/inference(C#) - Auth: Personal access token via
GITHUB_TOKEN/GH_TOKEN - SDK: OpenAI client library with custom endpoint
MiniMax
OpenAI-compatible alternative provider for Lesson 14:
- Endpoint:
https://api.minimax.io/v1 - Auth: API key via
MINIMAX_API_KEY - Models:
MiniMax-M2.7(recommended),MiniMax-M2.7-highspeed - Feature: Up to 204K token context window
Model Context Protocol (MCP)
Lesson 11 implements MCP server and client for agent-to-agent communication:
- Transport: StreamableHTTP (Starlette + Uvicorn)
- Features used: Tool calls, progress notifications, log messages, elicitation, sampling, session resumption
- Event store: In-memory (
SimpleEventStore) or SQLite (PersistentEventStore) - SDK:
mcp[cli]
Chainlit
Chat UI framework for the GitHub MCP demo:
- Entry point:
app.pywith@cl.on_chat_start,@cl.on_message,@cl.on_mcp_connect - Features: Streaming responses, tool step visualization, MCP server integration, user session management
Devpost API
External API called by the search_events tool in Lesson 11:
- Endpoint:
https://devpost.com/api/hackathons?search={query} - Method: GET with 5-second timeout
- Response: JSON with
hackathonsarray containingtitleandurlfields - Purpose: Supplements Azure AI Search results with live hackathon data