1. Architecture Overview
AutoGen is a multi-language framework for building event-driven multi-agent AI systems. It provides a layered architecture: a core runtime handles agent lifecycle, messaging, and subscriptions; a high-level AgentChat layer provides conversational patterns; and an extensions layer plugs in model providers, code executors, tools, and memory stores. The framework ships as separate Python and .NET SDKs that interoperate through gRPC and the CloudEvents messaging standard.
The system is designed around three principles: agents communicate exclusively through messages (no shared mutable state), runtimes can be in-process or distributed without changing agent code, and model backends are pluggable through a uniform ChatCompletionClient interface.
┌─────────────────────────────────────────────────────┐
│ Applications │
│ AutoGen Studio │ AgBench │ Magentic-One │ Custom │
├─────────────────────────────────────────────────────┤
│ AgentChat Layer (Teams) │
│ RoundRobinGroupChat │ SelectorGroupChat │ Graph │
│ AssistantAgent │ UserProxyAgent │ Conditions │
├─────────────────────────────────────────────────────┤
│ Core Runtime Layer │
│ RoutedAgent │ MessageHandler │ Subscriptions │
│ InProcessRuntime │ GrpcWorkerAgentRuntime │
│ TopicId │ AgentId │ CancellationToken │
├─────────────────────────────────────────────────────┤
│ Extensions Layer │
│ Model Clients │ Code Executors │ Tools │ Memory │
│ MCP Integration │ Auth │ Runtimes │
├─────────────────────────────────────────────────────┤
│ Messaging / Transport │
│ CloudEvents │ Protobuf │ gRPC │ In-Process Queue │
└─────────────────────────────────────────────────────┘
Component Inventory
| Component | Path | Role |
|---|---|---|
autogen-core |
python/packages/autogen-core/ |
Core runtime: agents, messaging, subscriptions, tools, model interfaces |
autogen-agentchat |
python/packages/autogen-agentchat/ |
High-level conversational agents and team patterns |
autogen-ext |
python/packages/autogen-ext/ |
Extensions: model clients, code executors, MCP tools, memory, runtimes |
autogen-studio |
python/packages/autogen-studio/ |
Web UI for visual agent team building (FastAPI + Gatsby/React) |
agbench |
python/packages/agbench/ |
Agent benchmarking tool (GAIA, HumanEval) |
magentic-one-cli |
python/packages/magentic-one-cli/ |
CLI for the Magentic-One multi-agent web task system |
pyautogen |
python/packages/pyautogen/ |
Legacy compatibility shim for v0.2 API |
component-schema-gen |
python/packages/component-schema-gen/ |
JSON Schema generator for AutoGen components |
Microsoft.AutoGen.Core |
dotnet/src/Microsoft.AutoGen/Core/ |
.NET core runtime: AgentsApp, BaseAgent, subscriptions |
Microsoft.AutoGen.Contracts |
dotnet/src/Microsoft.AutoGen/Contracts/ |
.NET shared interfaces and message types |
AutoGen.OpenAI |
dotnet/src/AutoGen.OpenAI/ |
.NET OpenAI model client with middleware pipeline |
AutoGen.Anthropic |
dotnet/src/AutoGen.Anthropic/ |
.NET Anthropic model client |
AutoGen.Gemini |
dotnet/src/AutoGen.Gemini/ |
.NET Gemini model client |
AutoGen.Mistral |
dotnet/src/AutoGen.Mistral/ |
.NET Mistral model client |
AutoGen.SemanticKernel |
dotnet/src/AutoGen.SemanticKernel/ |
.NET Semantic Kernel integration |
AutoGen.AzureAIInference |
dotnet/src/AutoGen.AzureAIInference/ |
.NET Azure AI Inference client |
AutoGen.Ollama |
dotnet/src/AutoGen.Ollama/ |
.NET Ollama local model client |
AutoGen.LMStudio |
dotnet/src/AutoGen.LMStudio/ |
.NET LM Studio local server client |
AutoGen.Core |
dotnet/src/AutoGen.Core/ |
.NET legacy core (middleware, orchestrator, functions) |
AutoGen.SourceGenerator |
dotnet/src/AutoGen.SourceGenerator/ |
.NET source generator for type-safe function definitions |
AutoGen.WebAPI |
dotnet/src/AutoGen.WebAPI/ |
.NET OpenAI-compatible Web API wrapper |
AutoGen.DotnetInteractive |
dotnet/src/AutoGen.DotnetInteractive/ |
.NET Interactive code execution |
AgentHost |
dotnet/src/Microsoft.AutoGen/AgentHost/ |
.NET gRPC gateway service for distributed agents |
RuntimeGateway.Grpc |
dotnet/src/Microsoft.AutoGen/RuntimeGateway.Grpc/ |
gRPC runtime gateway with Orleans backend |
protos |
protos/ |
Shared Protobuf definitions for cross-language messaging |
Technology Stack
| Layer | Technology |
|---|---|
| Python runtime | Python 3.10+, asyncio, Pydantic v2 |
| .NET runtime | .NET 8.0+, C# 12, Microsoft.Extensions.Hosting |
| Messaging | CloudEvents v1, Protocol Buffers, gRPC |
| Web UI (Studio) | FastAPI, Gatsby 5, React 18, Ant Design, Tailwind CSS, Monaco Editor |
| Frontend state | Zustand, React Flow (@xyflow/react) |
| Model SDKs | openai, anthropic, ollama, azure-ai-inference, google-generativeai, llama-cpp-python |
| Code execution | Docker, Jupyter, Azure Container Instances |
| Auth | GitHub OAuth, Microsoft MSAL, Firebase |
| Database (Studio) | SQLite (via DatabaseManager) |
| Build tools | uv, poe (poethepoet), ruff, pyright, mypy |
| .NET build | MSBuild, NuGet, .NET Aspire |
| Documentation | Sphinx, MyST parser, pydata-sphinx-theme |
Data Flow: Agent Message Lifecycle
1. User/System → publishes message to TopicId
2. Runtime → matches TopicId against Subscriptions
3. Runtime → routes message to subscribed Agent(s)
4. Agent → @message_handler processes the message
5. Agent → optionally calls ChatCompletionClient.create()
6. Model → returns CreateResult (content, usage, finish_reason)
7. Agent → optionally publishes response to another TopicId
8. Runtime → repeats steps 2-7 until termination condition met
Note
In distributed mode (gRPC), steps 2-3 cross process boundaries. The
AgentRpcservice handlesOpenChannel(bidirectional streaming ofMessagepayloads) andOpenControlChannel(state management). Agent registration, subscription management, and message routing happen through the gateway.
2. System Requirements
Python SDK
| Requirement | Minimum | Recommended |
|---|---|---|
| Python | 3.10 | 3.12+ |
| OS | Windows 10, macOS 12, Ubuntu 20.04 | Latest LTS |
| Memory | 512 MB | 2+ GB (varies by model and concurrency) |
| Disk | 100 MB (packages) | 500 MB+ (with Docker images) |
| Docker | 20.10+ (for sandboxed code execution) | Docker Desktop latest |
| Network | Required for cloud model providers | Low-latency connection recommended |
.NET SDK
| Requirement | Minimum | Recommended |
|---|---|---|
| .NET SDK | 8.0 | 8.0 latest |
| OS | Windows 10, macOS 12, Ubuntu 20.04 | Latest LTS |
| Docker | 20.10+ (for AgentHost gateway) | Docker Desktop latest |
| .NET Aspire | Optional (for distributed dev experience) | Latest |
AutoGen Studio
| Requirement | Value |
|---|---|
| Python | 3.10+ |
| Default port | 8081 (UI), 8084 (serve), 8080 (lite) |
| Browser | Modern browser (Chrome, Firefox, Edge, Safari) |
| Database | SQLite (auto-created in ~/.autogenstudio) |
3. Configuration Reference
OpenAI CreateArguments — Complete Parameter Reference
| Parameter | Type | Default | Description |
|---|---|---|---|
model |
str |
Required | Model identifier (e.g., gpt-4o, gpt-4o-mini) |
api_key |
str |
From env | API key (falls back to OPENAI_API_KEY) |
temperature |
float |
None |
Sampling temperature (0.0–2.0) |
top_p |
float |
None |
Nucleus sampling probability |
max_tokens |
int |
None |
Maximum tokens to generate |
frequency_penalty |
float |
None |
Penalize frequent tokens (-2.0–2.0) |
presence_penalty |
float |
None |
Penalize present tokens (-2.0–2.0) |
stop |
str or list[str] |
None |
Stop sequences |
seed |
int |
None |
Deterministic sampling seed |
n |
int |
None |
Number of completions to generate |
user |
str |
None |
End-user identifier for abuse monitoring |
timeout |
float |
None |
Request timeout in seconds |
max_retries |
int |
Provider default | Maximum retry attempts |
parallel_tool_calls |
bool |
None |
Allow parallel function calls |
reasoning_effort |
str |
None |
minimal, low, medium, high (o1/o3 models only) |
response_format |
dict |
None |
text, json_object, or json_schema with schema |
stream_options |
dict |
None |
{"include_usage": true} for streaming token usage |
add_name_prefixes |
bool |
False |
Prepend agent name to messages |
include_name_in_message |
bool |
True |
Include name field in user messages (set False for providers that reject it) |
default_headers |
dict |
None |
Custom HTTP headers for API requests |
Azure OpenAI Additional Parameters
| Parameter | Type | Description |
|---|---|---|
azure_deployment |
str |
Azure deployment name |
azure_endpoint |
str |
Azure resource endpoint URL |
azure_ad_token_provider |
callable |
Azure AD token provider function |
Anthropic CreateArguments
| Parameter | Type | Default | Description |
|---|---|---|---|
model |
str |
Required | Model identifier (e.g., claude-3-5-sonnet-20241022) |
api_key |
str |
From env | API key (falls back to ANTHROPIC_API_KEY) |
max_tokens |
int |
None |
Maximum output tokens |
temperature |
float |
None |
Sampling temperature |
top_p |
float |
None |
Nucleus sampling |
top_k |
int |
None |
Top-k sampling |
stop_sequences |
list[str] |
None |
Stop sequences |
thinking |
dict |
None |
Extended thinking config: {"type": "enabled", "budget_tokens": N} |
Anthropic Bedrock configuration:
| Parameter | Type | Description |
|---|---|---|
aws_access_key |
str |
AWS access key ID (env: AWS_ACCESS_KEY_ID) |
aws_secret_key |
str |
AWS secret access key (env: AWS_SECRET_ACCESS_KEY) |
aws_region |
str |
AWS region (env: AWS_REGION) |
aws_session_token |
str |
AWS session token (env: AWS_SESSION_TOKEN) |
Ollama CreateArguments
| Parameter | Type | Default | Description |
|---|---|---|---|
model |
str |
Required | Model name (e.g., llama3.1) |
host |
str |
http://localhost:11434 |
Ollama server address |
Azure AI Inference
| Parameter | Type | Description |
|---|---|---|
endpoint |
str |
Azure AI endpoint (env: AZURE_AI_INFERENCE_ENDPOINT) |
credential |
str |
API key (env: AZURE_AI_INFERENCE_API_KEY) |
Important
API keys should never be hardcoded. Use environment variables or secret managers. All model client configuration classes accept
SecretStrtypes from Pydantic for secure handling.
ModelInfo — Required Fields
| Field | Type | Required | Description |
|---|---|---|---|
vision |
bool |
Yes | Image input support |
function_calling |
bool |
Yes | Tool/function call support |
json_output |
bool |
Yes | JSON mode support |
family |
str |
Yes (v0.4.7+) | Model family constant |
structured_output |
bool |
Warning if missing | Structured output schema support |
multiple_system_messages |
bool |
No | Multi-system-message support |
AutoGen Studio Environment Variables
| Variable | Default | Description |
|---|---|---|
AUTOGENSTUDIO_HOST |
127.0.0.1 |
Server bind address |
AUTOGENSTUDIO_PORT |
8081 |
Server port |
AUTOGENSTUDIO_API_DOCS |
true |
Enable FastAPI docs |
AUTOGENSTUDIO_APPDIR |
~/.autogenstudio |
Application data directory |
AUTOGENSTUDIO_DATABASE_URI |
None |
Database connection URI |
AUTOGENSTUDIO_AUTH_CONFIG |
None |
Auth configuration YAML path |
AUTOGENSTUDIO_UPGRADE_DATABASE |
None |
Set to 1 to upgrade DB schema |
AUTOGENSTUDIO_TEAM_FILE |
None |
Team JSON path (serve mode) |
AutoGen Studio Authentication Configuration
AutoGen Studio supports four authentication providers via YAML configuration:
# GitHub OAuth
type: github
github:
client_id: "your-github-client-id"
client_secret: "your-github-secret"
callback_url: "http://localhost:8081/api/auth/callback"
# Microsoft MSAL
type: msal
msal:
client_id: "your-msal-client-id"
client_secret: "your-msal-secret"
authority: "https://login.microsoftonline.com/your-tenant-id"
callback_url: "http://localhost:8081/api/auth/callback"
# Firebase
type: firebase
firebase:
project_id: "your-firebase-project"
api_key: "your-firebase-api-key"
Auth models:
| Class | Fields |
|---|---|
GithubAuthConfig |
client_id, client_secret, callback_url |
MSALAuthConfig |
client_id, client_secret, authority, callback_url |
FirebaseAuthConfig |
project_id, api_key |
AuthConfig |
type (github/msal/firebase/none), provider-specific config |
4. Deployment & Scaling
Python Deployment
AutoGen Studio production deployment:
autogenstudio ui \
--host 0.0.0.0 \
--port 8081 \
--workers 4 \
--database-uri "sqlite:///path/to/production.db" \
--auth-config /etc/autogenstudio/auth.yaml
AutoGen Studio API-only deployment (headless):
autogenstudio serve \
--team /path/to/team.json \
--host 0.0.0.0 \
--port 8084 \
--workers 2
.NET AgentHost Deployment (Distributed Runtime Gateway)
The .NET AgentHost serves as the gRPC gateway for distributed agent systems.
Dockerfile (from dotnet/src/Microsoft.AutoGen/AgentHost/Dockerfile):
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 5001
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Microsoft.Autogen.AgentHost.dll"]
Docker Compose example:
services:
agent-host:
build:
context: .
dockerfile: dotnet/src/Microsoft.AutoGen/AgentHost/Dockerfile
ports:
- "5001:5001"
AgBench Deployment
AgBench uses Docker containers for isolated benchmark execution:
FROM mcr.microsoft.com/devcontainers/python:3.11
RUN apt-get update && apt-get install ffmpeg exiftool -y
RUN pip install autogen-core autogen-agentchat autogen-ext pyyaml
Note
Set
AUTOGEN_REPO_BASEto the local repository path to enable Docker containers to use the correct agent versions.
.NET Aspire Hosting
For the .NET distributed dev experience, use the .AppHost projects:
cd dotnet/samples/Hello/Hello.AppHost
dotnet run
This starts the Aspire dashboard (typically at https://localhost:15887) with telemetry and logging for all agents.
Scaling Considerations
| Dimension | Approach |
|---|---|
| Concurrent users (Studio) | Increase --workers (uvicorn workers) |
| Agent throughput | Deploy multiple GrpcWorkerAgentRuntime processes behind the gateway |
| Model rate limits | Use ChatCompletionCache or implement client-side retry with backoff |
| Cross-language agents | Deploy .NET AgentHost as central gRPC gateway |
| Benchmark parallelism | Run multiple autogenbench run instances with different task files |
5. Operations
AutoGen Studio API Endpoints
| Method | Path | Auth | Purpose |
|---|---|---|---|
| GET | /auth/login-url |
None | Get OAuth login URL |
| GET | /auth/callback |
None | OAuth callback handler |
| POST | /auth/callback-handler |
None | Token exchange handler |
| GET | /auth/me |
Token | Get current user info |
| GET | /auth/type |
None | Get authentication type |
| GET | /teams/ |
Token | List teams |
| GET | /teams/{team_id} |
Token | Get team details |
| POST | /teams/ |
Token | Create team |
| DELETE | /teams/{team_id} |
Token | Delete team |
| GET | /sessions/ |
Token | List sessions |
| GET | /sessions/{session_id} |
Token | Get session |
| POST | /sessions/ |
Token | Create session |
| PUT | /sessions/{session_id} |
Token | Update session |
| DELETE | /sessions/{session_id} |
Token | Delete session |
| GET | /sessions/{session_id}/runs |
Token | List session runs |
| POST | /runs/ |
Token | Create a run |
| GET | /runs/{run_id} |
Token | Get run details |
| GET | /runs/{run_id}/messages |
Token | Get run messages |
| GET | /gallery/ |
Token | List gallery entries |
| GET | /gallery/{gallery_id} |
Token | Get gallery entry |
| POST | /gallery/ |
Token | Create gallery entry |
| PUT | /gallery/{gallery_id} |
Token | Update gallery entry |
| DELETE | /gallery/{gallery_id} |
Token | Delete gallery entry |
| GET | /settings/ |
Token | Get settings |
| PUT | /settings/ |
Token | Update settings |
| POST | /validation/ |
Token | Validate component |
| POST | /validation/test |
Token | Test component |
| POST | /mcp/ws/connect |
Token | Create MCP WebSocket connection |
| GET | /mcp/ws/status/{session_id} |
Token | Get MCP session status |
Tip
AutoGen Studio CORS is configured for local development origins:
localhost:8000,127.0.0.1:8000,localhost:8001,localhost:8081. For production, update the CORS middleware inapp.py.
gRPC Service Definition
The AgentRpc service (defined in protos/agent_worker.proto) provides the distributed runtime API:
| RPC | Type | Description |
|---|---|---|
OpenChannel |
Bidirectional streaming | Main message channel (Message → Message) |
OpenControlChannel |
Bidirectional streaming | State management (ControlMessage → ControlMessage) |
RegisterAgent |
Unary | Register an agent type with the gateway |
AddSubscription |
Unary | Add a topic subscription |
RemoveSubscription |
Unary | Remove a topic subscription |
GetSubscriptions |
Unary | List all subscriptions |
Protobuf message types:
| Message | Fields | Purpose |
|---|---|---|
AgentId |
type, key |
Unique agent identifier |
Payload |
data_type, data_content_type, data |
Serialized message payload |
RpcRequest |
request_id, source, target, method, payload, metadata |
Direct agent-to-agent RPC |
RpcResponse |
request_id, payload, error, metadata |
RPC response |
Message |
oneof: request, response, cloudEvent |
Envelope for all channel messages |
ControlMessage |
rpc_id, destination, respond_to, rpcMessage |
State save/load operations |
SaveStateRequest/Response |
agentId, state, error |
Agent state persistence |
LoadStateRequest/Response |
agentId, state, error |
Agent state recovery |
TypeSubscription |
topic_type, agent_type |
Exact topic match subscription |
TypePrefixSubscription |
topic_type_prefix, agent_type |
Prefix-based topic subscription |
Monitoring and Health
AutoGen Studio health can be monitored via the FastAPI /docs endpoint (Swagger UI) when --docs is enabled. The .NET Aspire dashboard provides telemetry for distributed .NET agents.
Tip
For production monitoring of AutoGen Studio, check the loguru output. The application logs startup, manager initialization, and shutdown events via
logger.info()/logger.error().
Backup Procedures
| Component | What to backup | Location |
|---|---|---|
| AutoGen Studio data | SQLite database | ~/.autogenstudio/ (or AUTOGENSTUDIO_APPDIR) |
| Team configurations | Team JSON files | Application-specific |
| Agent state (.NET) | State store | SaveStateRequest / LoadStateRequest via gRPC |
6. Performance
Model Client Caching
Use ChatCompletionCache to avoid redundant API calls:
from autogen_ext.models.cache import ChatCompletionCache
from autogen_ext.cache_store import DiskCacheStore, RedisCacheStore
# Disk cache
cache = ChatCompletionCache(
client=model_client,
cache_store=DiskCacheStore(cache_dir=".cache"),
)
# Redis cache (for shared caching across workers)
cache = ChatCompletionCache(
client=model_client,
cache_store=RedisCacheStore(redis_url="redis://localhost:6379"),
)
The cache is keyed on the full message sequence, tools, and create arguments. Both streaming and non-streaming calls are cached, and cached streaming results correctly replay as streams.
Token Counting
All ChatCompletionClient implementations provide token counting:
token_count = client.count_tokens(messages)
remaining = client.remaining_tokens(messages)
Usage tracking per request:
result = await client.create(messages)
print(f"Prompt: {result.usage.prompt_tokens}, Completion: {result.usage.completion_tokens}")
Performance Tuning
| Setting | Impact | Recommendation |
|---|---|---|
max_tokens |
Limits output length | Set to expected max to reduce latency and cost |
temperature=0 |
Deterministic output | Use for reproducible agent behavior |
reasoning_effort |
Controls o1/o3 thinking depth | Use minimal or low for routine tasks |
parallel_tool_calls=True |
Allows concurrent function calls | Enable for agents with multiple independent tools |
stream_options.include_usage=True |
Token usage in streaming | Enable for monitoring; slight overhead |
Studio --workers |
Concurrent request handling | Set to CPU count for production |
7. Security
Code Execution Security
Caution
The
LocalCommandLineCodeExecutorexecutes LLM-generated code directly on the host machine without any sandboxing (issue #7462). This is a critical security risk in production.
Recommended code executors by security level:
| Executor | Isolation | Use Case |
|---|---|---|
DockerCommandLineCodeExecutor |
Container sandbox | Production code execution |
AzureContainerCodeExecutor |
Cloud sandbox | Enterprise/cloud deployments |
DockerJupyterCodeExecutor |
Container + Jupyter | Interactive notebook execution |
LocalCommandLineCodeExecutor |
None | Local development only |
Authentication Architecture (Studio)
AutoGen Studio implements a layered auth system:
AuthMiddleware— FastAPI middleware that intercepts every request, validates tokens, and injects theUserobject intorequest.stateWebSocketAuthMiddleware— Separate handler for WebSocket connectionsAuthManager— Creates and validates JWT tokensAuthProvider(abstract) — Pluggable provider interface with implementations for GitHub, MSAL, Firebase, and NoAuthNoAuthProvider— Default provider that creates anonymous users (for local development)
Auth exceptions:
| Exception | HTTP Status | When |
|---|---|---|
AuthException |
401 | Generic auth failure |
InvalidTokenException |
401 | Token validation failed |
MissingTokenException |
401 | No token provided |
ProviderAuthException |
401 | Provider-specific failure |
ConfigurationException |
500 | Auth system misconfigured |
ForbiddenException |
403 | Insufficient permissions |
Warning
The default
NoAuthProvidercreates anonymous users with full access. Always configure a real auth provider before exposing AutoGen Studio to a network.
.NET Middleware Security
The .NET SDK uses a middleware pipeline for model interaction. Each provider (OpenAI, Anthropic, Gemini, Mistral, etc.) implements middleware that processes messages before and after model calls. This is the extension point for:
- Request/response logging
- Content filtering
- Token usage tracking
- Error handling and retry logic
API Key Management
- Python model clients accept API keys via constructor parameters or environment variables
.NETmodel clients use constructor parameters- AutoGen Studio stores temporary environment variables in
~/.autogenstudio/temp_env_vars.env - gRPC channels should use TLS in production
Important
The
temp_env_vars.envfile is created by the AutoGen Studio CLI to share configuration with uvicorn workers. It may contain sensitive values. Ensure file permissions are restricted.
MCP Security
MCP server connections support three transport types:
| Transport | Class | Security Considerations |
|---|---|---|
| Stdio | StdioServerParams |
Runs server as subprocess; inherits host permissions |
| SSE | SseServerParams |
HTTP-based; use TLS in production |
| Streamable HTTP | StreamableHttpServerParams |
HTTP-based; use TLS in production |
8. Developer Internals
Repository Structure
microsoft/autogen/
├── protos/ # Shared Protobuf definitions
│ ├── agent_worker.proto # Agent RPC service, messages, subscriptions
│ └── cloudevent.proto # CloudEvent format definition
├── python/
│ ├── packages/
│ │ ├── autogen-core/src/autogen_core/
│ │ │ ├── models/ # ChatCompletionClient, ModelFamily, message types
│ │ │ ├── tools/ # BaseTool, ToolSchema
│ │ │ ├── utils/ # JSON-to-Pydantic, load_json
│ │ │ ├── code_executor/ # Code executor interface
│ │ │ ├── memory/ # Memory interface
│ │ │ ├── model_context/ # Model context management
│ │ │ ├── tool_agent/ # Tool-executing agent
│ │ │ └── _telemetry/ # OpenTelemetry integration
│ │ ├── autogen-agentchat/src/autogen_agentchat/
│ │ │ ├── agents/ # AssistantAgent, UserProxyAgent
│ │ │ ├── teams/_group_chat/ # RoundRobinGroupChat, SelectorGroupChat
│ │ │ ├── conditions/ # Termination conditions
│ │ │ ├── tools/ # Agent-level tool wrappers
│ │ │ ├── ui/ # Console output formatter
│ │ │ ├── state/ # State serialization
│ │ │ └── base/ # Base classes
│ │ ├── autogen-ext/src/autogen_ext/
│ │ │ ├── models/ # OpenAI, Anthropic, Azure, Ollama, Gemini, LLama, SK adapters
│ │ │ ├── code_executors/ # Docker, Jupyter, Azure, local
│ │ │ ├── tools/ # MCP, HTTP, LangChain, GraphRAG, Azure, Semantic Kernel
│ │ │ ├── agents/ # WebSurfer, FileSurfer, Magentic-One, Azure, OpenAI
│ │ │ ├── memory/ # ChromaDB, Redis, Canvas, Mem0
│ │ │ ├── runtimes/grpc/ # GrpcWorkerAgentRuntime
│ │ │ ├── cache_store/ # Disk, Redis cache stores
│ │ │ ├── auth/ # Azure auth provider
│ │ │ ├── teams/ # Team extensions
│ │ │ ├── ui/ # UI extensions
│ │ │ └── experimental/ # Task-centric memory
│ │ ├── autogen-studio/
│ │ │ ├── autogenstudio/
│ │ │ │ ├── web/ # FastAPI app, routes, auth, config
│ │ │ │ ├── database/ # SQLite DatabaseManager
│ │ │ │ ├── datamodel/ # Pydantic models
│ │ │ │ ├── teammanager/ # Team execution management
│ │ │ │ ├── gallery/ # Default component gallery
│ │ │ │ ├── validation/ # Component validation
│ │ │ │ ├── mcp/ # MCP client/callbacks
│ │ │ │ ├── eval/ # Evaluation utilities
│ │ │ │ ├── lite/ # Lightweight mode
│ │ │ │ └── cli.py # Typer CLI
│ │ │ └── frontend/ # Gatsby/React SPA
│ │ ├── agbench/ # Benchmark runner
│ │ ├── magentic-one-cli/ # Magentic-One CLI
│ │ ├── pyautogen/ # Legacy compatibility
│ │ └── component-schema-gen/ # Schema generator
│ ├── samples/ # Example applications
│ ├── docs/ # Sphinx documentation
│ └── templates/ # Cookiecutter package template
├── dotnet/
│ ├── src/
│ │ ├── Microsoft.AutoGen/
│ │ │ ├── Core/ # AgentsApp, BaseAgent, runtime
│ │ │ ├── Contracts/ # IAgentRuntime, IHostableAgent interfaces
│ │ │ ├── Agents/ # Agent implementations
│ │ │ ├── AgentHost/ # gRPC gateway Dockerfile
│ │ │ ├── AgentChat/ # .NET AgentChat layer
│ │ │ ├── RuntimeGateway.Grpc/ # Orleans-backed gRPC gateway
│ │ │ ├── Core.Grpc/ # gRPC runtime implementation
│ │ │ └── Extensions/ # Aspire, MEAI, SK integration
│ │ ├── AutoGen.Core/ # Legacy core (middleware, orchestrator)
│ │ ├── AutoGen.OpenAI/ # OpenAI middleware + agents
│ │ ├── AutoGen.Anthropic/ # Anthropic middleware + agents
│ │ ├── AutoGen.Gemini/ # Gemini middleware + agents
│ │ ├── AutoGen.Mistral/ # Mistral middleware
│ │ ├── AutoGen.SemanticKernel/ # SK middleware
│ │ ├── AutoGen.AzureAIInference/ # Azure AI middleware
│ │ ├── AutoGen.Ollama/ # Ollama agent + middleware
│ │ ├── AutoGen.LMStudio/ # LM Studio agent
│ │ ├── AutoGen.SourceGenerator/ # Source generator
│ │ ├── AutoGen.WebAPI/ # OpenAI-compatible API
│ │ ├── AutoGen.DotnetInteractive/ # Code execution
│ │ └── AutoGen/ # Legacy API surface
│ ├── samples/ # .NET examples
│ ├── test/ # Test projects
│ └── website/ # DocFX documentation site
└── docs/ # Shared documentation
Architecture Deep Dive
Core Runtime (Python)
The autogen-core package defines the fundamental abstractions:
RoutedAgent— Base class for all agents. Uses the@message_handlerdecorator to register typed message handlers. Each agent has anAgentId(type + key) and belongs to a runtime.IAgentRuntime— Interface for runtimes that host agents. Supportsregister_agent_factory,add_subscription,publish_message,send_message.InProcessRuntime— Single-process runtime with an in-memory message queue. ConfigurableDeliverToSelfflag.TopicId— Typed topic identifier (type+source). Agents subscribe to topics viaTypeSubscriptionorTypePrefixSubscription.CancellationToken— Cooperative cancellation for async operations.ComponentBase— Mixin that enablesload_component()/dump_component()for JSON serialization of configuration.
Core Runtime (.NET)
The .NET SDK mirrors the Python architecture:
BaseAgent— Abstract base class for agents. UsesIHandle<T>interface for typed message handling.AgentsApp/AgentsAppBuilder— Application host with dependency injection, agent registration, and lifecycle management.InProcessRuntime— In-memory runtime with configurableDeliverToSelf.AgentRuntimeExtensions— Extension methods forRegisterAgentTypeAsync,RegisterImplicitAgentSubscriptionsAsync.TypeSubscriptionAttribute/TypePrefixSubscriptionAttribute— Declarative subscription binding via attributes.ReflectionHelper— DiscoversBaseAgentsubclasses for auto-registration viaAddAgentsFromAssemblies().
AgentChat Layer
The autogen-agentchat package provides high-level team patterns:
- Teams run conversations according to a strategy:
RoundRobinGroupChat— Cycles through participants in orderSelectorGroupChat— Uses an LLM to select the next speaker from participant descriptions- Graph-based teams (in
_graph/) — Allow custom conversation flow graphs - Magentic-One teams (in
_magentic_one/) — Orchestrated multi-agent web task system
- Agents receive messages and produce responses:
AssistantAgent— LLM-backed agent with system message and optional toolsUserProxyAgent— Represents human input
- Conditions control conversation termination:
MaxMessageTermination,TextMentionTermination,StopMessageTermination
Message Types (Python Core)
| Type | Purpose | Key Fields |
|---|---|---|
SystemMessage |
Developer instructions to the model | content: str |
UserMessage |
User input or agent-forwarded content | content: str | list[str | Image], source: str |
AssistantMessage |
Model-generated response | content: str | list[FunctionCall], thought: str | None, source: str |
FunctionExecutionResult |
Output from a tool call | content: str, name: str, call_id: str, is_error: bool |
FunctionExecutionResultMessage |
Collection of tool results | content: list[FunctionExecutionResult] |
CreateResult |
Full model response | finish_reason, content, usage: RequestUsage, cached: bool, thought: str | None |
RequestUsage |
Token counts | prompt_tokens: int, completion_tokens: int |
LLMMessage is the union type: SystemMessage | UserMessage | AssistantMessage | FunctionExecutionResultMessage.
CloudEvents Messaging
All inter-agent messages are wrapped in the CloudEvents specification:
message CloudEvent {
string id = 1;
string source = 2;
string spec_version = 3;
string type = 4;
map<string, CloudEventAttributeValue> attributes = 5;
oneof data {
bytes binary_data = 6;
string text_data = 7;
google.protobuf.Any proto_data = 8;
}
}
This enables cross-language, cross-process messaging. Python agents serialize to CloudEvents via the gRPC runtime, and .NET agents deserialize them through the gateway.
.NET Middleware Architecture
The .NET SDK uses a middleware pipeline pattern for model interactions. Each provider package includes middleware classes that can intercept and transform messages:
| Package | Middleware | Purpose |
|---|---|---|
AutoGen.Core |
FunctionCallMiddleware, PrintMessageMiddleware |
Function handling, console output |
AutoGen.OpenAI |
OpenAIChatRequestMessageConnector |
Message format conversion |
AutoGen.Anthropic |
AnthropicClientAgent middleware |
Anthropic-specific message handling |
AutoGen.Gemini |
GeminiChatAgent middleware |
Gemini message format conversion |
AutoGen.Mistral |
MistralChatAgent middleware |
Mistral message handling |
AutoGen.SemanticKernel |
SemanticKernelChatMessageContentConnector |
SK integration |
AutoGen.AzureAIInference |
AzureAIInferenceChatRequestMessageConnector |
Azure AI format conversion |
.NET Source Generator
The AutoGen.SourceGenerator package provides compile-time code generation for type-safe function definitions:
public partial class MyFunctions
{
/// <summary>Add two numbers.</summary>
/// <param name="a">The first number.</param>
/// <param name="b">The second number.</param>
[Function]
public Task<string> AddAsync(int a, int b)
{
return Task.FromResult($"{a} + {b} = {a + b}");
}
}
The generator produces:
- A schema class (
AddAsyncSchema) with properties matching parameters - A wrapper method (
AddAsyncWrapper) that deserializes JSON arguments - A
FunctionDefinitionproperty (AddAsyncFunction) with name, description, and JSON Schema parameters
Requirements: GenerateDocumentationFile must be true in the project file, and the class must be partial and public.
AutoGen Studio Architecture
AutoGen Studio is a full-stack web application:
Backend (autogenstudio/web/):
app.py— FastAPI application with lifespan management, CORS, auth middlewareroutes/— API routes: teams, sessions, runs, gallery, settings, validation, MCP, WebSocketauth/— Pluggable authentication (GitHub OAuth, MSAL, Firebase, NoAuth)deps.py— Dependency injection for DatabaseManager, ConnectionManager, TeamManagerconfig.py— Settings management
Frontend (frontend/):
- Gatsby 5 + React 18 SPA
- Ant Design component library
- Monaco Editor for code editing
- React Flow (
@xyflow/react) for visual team building - Zustand for state management
- Tailwind CSS for styling
Data flow:
- User creates a Team (JSON configuration of agents, models, conditions)
- User creates a Session (conversation context)
- User sends a task → backend creates a Run
- TeamManager executes the team configuration
- Messages stream back via WebSocket
- Results persist in SQLite database
Experimental: Task-Centric Memory
The autogen_ext.experimental.task_centric_memory module provides:
Apprentice— Agent that learns from task demonstrations and applies solutions to new tasksTeachability— Memory implementation that stores task-solution pairsChatCompletionClientRecorder— Records and replays model interactions for testingGrader— Evaluates agent performance on tasksPageLogger— Hierarchical HTML logging system
Note
The task-centric memory module is in
experimental/and its API may change. It implements a learn-by-demonstration pattern where theApprenticecan be trained on tasks and then autonomously apply learned solutions.
Code Patterns and Conventions
Python:
- Async-first: all agent handlers and model calls are
async - Pydantic v2 for all data models and configuration
- Type hints enforced via pyright and mypy
@message_handlerdecorator for typed message routingComponentBasemixin for serializable configuration- Package extras for optional dependencies (e.g.,
autogen-ext[openai])
Build system:
uvfor dependency management and virtual environmentspoethepoet(poe) for task running (poe fmt,poe lint,poe mypy,poe pyright)rufffor formatting and lintingshared_tasks.tomldefines common tasks across packages
.NET:
- C# 12 with primary constructors
IHostableAgent+IHandle<T>for type-safe message handling- Attribute-based subscriptions (
[TypeSubscription],[TypePrefixSubscription]) - Middleware pipeline for model interaction extensibility
AgentsAppBuilderfluent API for application construction- NuGet packages with centralized version management (
Directory.Packages.props)
Testing Strategy
Python testing:
- pytest with asyncio support
- Extensive mock-based model client tests (in
autogen-ext/tests/models/) - Tests cover: all model providers (OpenAI, Anthropic, Azure AI, Ollama, LLama.cpp, SK), caching, streaming, tool calling, structured output, cancellation, multimodal input, thinking mode
ChatCompletionClientRecorderfor deterministic test replay- pyright and mypy for static type checking
.NET testing:
- xUnit test framework
- Integration tests with Aspire AppHost (
Microsoft.AutoGen.Integration.Tests) - Provider-specific tests (OpenAI, Anthropic, Gemini, Mistral, Ollama, SK, Azure AI)
- Source generator approval tests (snapshot testing)
- gRPC tests for distributed runtime
Contributing
- Clone and setup:
git clone https://github.com/microsoft/autogen.git
cd autogen/python
uv sync
source .venv/bin/activate
- Run quality checks:
poe fmt # Format with ruff
poe lint # Lint with ruff
poe mypy # Type check with mypy
poe pyright # Type check with pyright
- Run tests for a specific package:
cd packages/autogen-core
poe test
- Build documentation:
poe docs-build # Build Sphinx docs
poe docs-serve # Serve locally
- Check markdown code blocks (CI tool):
python check_md_code_blocks.py docs/**/*.md
- Create a new package (using the cookiecutter template):
cd python/templates/new-package
cookiecutter .
9. Integration Points
Cross-Language Agent Communication
Python and .NET agents communicate through the shared gRPC AgentRpc service:
Python Agent ←→ GrpcWorkerAgentRuntime ←→ gRPC Channel ←→ AgentHost (.NET) ←→ .NET Agent
Both sides use the same Protobuf definitions (protos/agent_worker.proto, protos/cloudevent.proto). The C# namespace is Microsoft.AutoGen.Protobuf / Microsoft.AutoGen.Contracts.
Semantic Kernel Integration
The AutoGen.SemanticKernel package (.NET) and autogen_ext.models.semantic_kernel (Python) provide bidirectional integration:
- Use Semantic Kernel plugins as AutoGen tools
- Use AutoGen agents within SK orchestrations
- The
SemanticKernelChatCompletionAdapterwraps SK chat completion services as AutoGenChatCompletionClient
MCP (Model Context Protocol) Integration
AutoGen's MCP integration (autogen_ext.tools.mcp) supports:
| Component | Purpose |
|---|---|
McpWorkbench |
Connects to MCP servers and exposes their tools to agents |
McpSessionHost |
Full MCP host with sampling, elicitation, and roots |
ChatCompletionClientSampler |
Routes MCP sampling requests to a ChatCompletionClient |
StdioElicitor |
Command-line elicitation handler |
StaticRootsProvider |
Provides file system roots to MCP servers |
StdioServerParams |
Stdio transport configuration |
SseServerParams |
SSE transport configuration |
StreamableHttpServerParams |
HTTP transport configuration |
Memory Stores
| Store | Package | Backend |
|---|---|---|
ChromaDBMemory |
autogen_ext.memory.chromadb |
ChromaDB vector store |
RedisMemory |
autogen_ext.memory.redis |
Redis |
CanvasMemory |
autogen_ext.memory.canvas |
Canvas |
Mem0Memory |
autogen_ext.memory.mem0 |
Mem0 |
Teachability |
autogen_ext.experimental.task_centric_memory |
File-based learning |
Web Framework Integration
AutoGen includes sample integrations with web frameworks:
| Framework | Sample | Pattern |
|---|---|---|
| FastAPI | core_streaming_handoffs_fastapi |
OpenAI-compatible /chat/completions endpoint with streaming |
| FastAPI | core_streaming_response_fastapi |
Single-agent streaming response |
| Streamlit | agentchat_streamlit |
Chat UI with session state |
| Chainlit | agentchat_chainlit, core_chainlit |
Chat UI with message callbacks |
The FastAPI streaming sample implements a full OpenAI-compatible chat completions endpoint with agent handoffs:
@app.post("/chat/completions")
async def chat_completions_stream(request: Request):
# Routes to agents, streams responses as SSE
LM Studio Integration (.NET)
var lmStudioConfig = new LMStudioConfig("localhost", 5000);
var agent = new LMStudioAgent(
name: "agent",
systemMessage: "You are a helpful assistant.",
lmStudioConfig: lmStudioConfig
).RegisterPrintMessage();