agent-framework-rs
A Rust implementation of the Microsoft Agent Framework for building AI agents and multi-agent workflows.
This project ports the framework's architecture — chat clients, agents, tools, threads, memory, middleware, a graph-based workflow engine, a family of prebuilt multi-agent orchestrations, and the surrounding ecosystem (A2A, AG-UI, declarative specs, HTTP hosting, memory backends, compliance middleware) — to idiomatic, async Rust, with the goal of complete feature parity with the Python and .NET implementations.
Status: at parity for the core and nearly all of the ecosystem. The core runtime with retries and three middleware levels; OpenAI (chat + Responses API), Azure OpenAI, Azure AI Foundry, Anthropic, and Copilot Studio providers; a full Entra ID credential chain; MCP tools (stdio / HTTP / WebSocket, with prompts, sampling, and roots); the workflow engine (signature-validated checkpointing, human-in-the-loop, shared state, validation, visualization, sub-workflows); every orchestration (sequential, concurrent, group chat, handoff, Magentic with plan-review and stall-intervention HITL, workflow-as-agent); a complete A2A client; YAML agents/workflows; HTTP hosting (DevUI-style + embedded debug page, A2A, AG-UI, OpenAI-compatible); Redis, Mem0, Cosmos DB, and Azure AI Search memory/storage; and Purview compliance middleware are implemented and tested. See PARITY.md for the detailed, grounded matrix and the roadmap for the short list of what's left.
Highlights
- Agents — a
ChatAgentwith instructions, tools, default options, conversation threads, memory/context providers, and middleware at all three levels: agent-run, chat-client-call, and per-tool-invocation. - Automatic tool calling — the function-invocation loop executes local tools and feeds results back to the model until it produces a final answer.
- Retries —
RetryingChatClientwraps any client with aRetryPolicy: exponential backoff with jitter, retryable-status classification, and serverRetry-Afterhonored over the computed delay. - Human-in-the-loop everywhere — tool-call approval
(
ApprovalMode::AlwaysRequire), workflowrequest_infopauses, Magentic plan review before execution, and Magentic stall intervention mid-run. - Structured output — request a JSON-Schema-conforming response with
ResponseFormat::json_schemaand parse it withresponse.parse_json::<T>(). Works on every provider — for Anthropic (no nativeresponse_format) it's folded into the system prompt, which the Python and .NET references don't do at all. - Streaming — token-by-token streaming for both chat clients and agents.
- Workflows — a Pregel-style, superstep graph engine (
WorkflowBuilder) with single edges, conditions, fan-out, fan-in, and switch/case routing, plus checkpointing (in-memory and file-backed, with graph-signature validation on resume), human-in-the-loop request/response, run-scoped shared state, graph validation, Mermaid/DOT visualization, and sub-workflow composition. - Orchestration — prebuilt
SequentialBuilder,ConcurrentBuilder,GroupChatBuilder(round-robin, custom, or LLM-managed),HandoffBuilder, andMagenticBuilderpatterns, plusWorkflowAgentto expose any workflow as anAgent. - Providers — OpenAI (Chat Completions + Responses API), Azure OpenAI
(API key or Entra ID), Azure AI Foundry persistent agents, Anthropic, and
Copilot Studio (Direct-to-Engine), all behind the
ChatClient/Agentabstractions; plus a hand-rolled Entra ID credential chain (AzureCliCredential,ClientSecretCredential,ManagedIdentityCredential,ChainedTokenCredential). - MCP — stdio, streamable HTTP, and WebSocket transports; tools, prompts,
server-initiated sampling (
chat_client_sampling_handleranswerssampling/createMessagewith your model), and roots. - A2A — call any Agent2Agent server as a local
Agent(A2AAgent), with card discovery, multi-turn context continuity, streaming, push-notification config, task resubscription, and the authenticated extended card. - Declarative — load agents from the official YAML spec vocabulary and workflows from a Rust-native spec, with env interpolation and pluggable provider/tool registries.
- Hosting — serve agents/workflows over HTTP with axum: a DevUI-style API
(
/v1/entities,/v1/responseswith SSE) with an embedded zero-dependency debug page at/, A2A serving (agent card + JSON-RPC), the AG-UI protocol (AgUiRouterSSE events for CopilotKit frontends), and an OpenAI-compatible/v1/chat/completions. - Memory & storage — Redis-backed history and long-term memory (BM25 via RediSearch, SCAN fallback on plain Redis), Mem0, Azure Cosmos DB message store, and an Azure AI Search context provider.
- Compliance — Purview middleware evaluates prompts and responses against
Microsoft Graph
processContentand blocks on DLP verdicts. - Observability —
ObservableChatClientemitstracingspans following OpenTelemetry GenAI semantic conventions, ready to bridge into any OTel exporter.
Workspace layout
| Crate | Description |
|---|---|
agent-framework-core |
Core abstractions: types, chat client + retries, agents, tools, threads, memory, middleware, observability, workflows & orchestration. |
agent-framework-openai |
OpenAI Chat Completions and Responses API clients (also for OpenAI-compatible endpoints). |
agent-framework-anthropic |
Anthropic (Claude) Messages API client. |
agent-framework-azure |
Azure OpenAI client + the Entra ID credential chain (CLI / client-secret / managed-identity / chained). |
agent-framework-foundry |
Azure AI Foundry Responses API chat client (FoundryChatClient) + client-side Prompt Agents (FoundryAgent). |
agent-framework-azure-ai-search |
Azure AI Search context provider (semantic + optional vector query). |
agent-framework-mcp |
MCP client: stdio/HTTP/WebSocket transports, tools, prompts, sampling, roots. |
agent-framework-a2a |
Agent2Agent protocol client: A2AAgent + A2AClient (full task surface). |
agent-framework-declarative |
Declarative YAML/JSON agents and workflows with provider/tool registries. |
agent-framework-hosting |
HTTP serving (axum): DevUI-style API + embedded debug UI, A2A, AG-UI, OpenAI-compatible. |
agent-framework-redis |
Redis-backed ChatMessageStore and long-term-memory ContextProvider (RediSearch BM25). |
agent-framework-mem0 |
Mem0 hosted-API long-term-memory ContextProvider. |
agent-framework-cosmos |
Azure Cosmos DB NoSQL ChatMessageStore (master-key HMAC REST). |
agent-framework-copilotstudio |
Microsoft Copilot Studio agent client (Direct-to-Engine). |
agent-framework-purview |
Microsoft Purview compliance middleware (processContent DLP checks). |
agent-framework |
Umbrella crate re-exporting the core plus everything above behind cargo features. |
Quick start
[]
= "0.1"
= { = "1", = ["full"] }
use *;
async
Tools
use *;
use json;
let get_weather = new
.into_definition;
let agent = builder.tool.build;
let reply = agent.run_once.await?;
Workflows
use Arc;
use *;
use SequentialBuilder;
let workflow = new
.participants
.build?;
let result = workflow.run.await?;
let final_output = result.last_output;
Feature flags
The umbrella agent-framework crate re-exports [agent-framework-core]
unconditionally, plus each companion crate behind a cargo feature:
| Feature | Crate | Default |
|---|---|---|
openai |
agent-framework-openai — OpenAI Chat Completions + Responses API |
yes |
anthropic |
agent-framework-anthropic — Anthropic (Claude) Messages API |
no |
azure |
agent-framework-azure — Azure OpenAI (api-key / Entra ID) |
no |
mcp |
agent-framework-mcp — Model Context Protocol tools (stdio, HTTP, websocket) |
no |
a2a |
agent-framework-a2a — Agent2Agent protocol client |
no |
declarative |
agent-framework-declarative — YAML/JSON agents & workflows |
no |
hosting |
agent-framework-hosting — serve agents over HTTP (DevUI-style, A2A, AG-UI, OpenAI-compatible) |
no |
redis |
agent-framework-redis — Redis chat-message store & context provider |
no |
mem0 |
agent-framework-mem0 — Mem0 long-term memory provider |
no |
foundry |
agent-framework-foundry — Azure AI Foundry Responses API chat client + Prompt Agents |
no |
azure-ai-search |
agent-framework-azure-ai-search — Azure AI Search memory |
no |
cosmos |
agent-framework-cosmos — Cosmos DB NoSQL message store |
no |
copilotstudio |
agent-framework-copilotstudio — Copilot Studio agents |
no |
purview |
agent-framework-purview — Purview compliance middleware |
no |
otel-metrics |
GenAI metrics (token-usage / operation-duration / function-invocation histograms) via the opentelemetry API crate |
no |
full |
all of the above except otel-metrics |
no |
# Everything:
= { = "0.1", = ["full"] }
# Just OpenAI (the default) plus Anthropic:
= { = "0.1", = ["anthropic"] }
Examples
69 runnable examples live in examples/, organized by topic
(agents, providers, workflows, orchestrations, mcp, hosting, memory,
observability, a2a, declarative, compliance). See
examples/README.md for the full gallery — every
example with a one-line description and what it needs to run. The offline
ones need no API key or network access; the rest read their provider's
credentials from environment variables, and skip gracefully when unset.
All of them run the same way, no --features flag needed:
A few highlights:
OPENAI_API_KEY=sk-...
OPENAI_API_KEY=sk-...
Design
The crate mirrors the Python framework's module structure so concepts map one-to-one:
Python (agent_framework) |
Rust |
|---|---|
_types |
types (ChatMessage, Content, ChatResponse, ChatOptions, ResponseFormat, …) |
_clients |
client (ChatClient, FunctionInvokingChatClient, RetryingChatClient) |
_agents |
agent (Agent, ChatAgent, as_tool) |
_tools |
tools (Tool, AiFunction, hosted tools, ApprovalMode) |
_threads |
threads (AgentThread, ChatMessageStore) |
_memory |
memory (ContextProvider, AggregateContextProvider) |
_middleware |
middleware (agent / chat / function pipelines) |
observability |
observability (ObservableChatClient, OTel GenAI spans) |
_workflows |
workflow (Workflow, WorkflowBuilder, Executor, checkpointing, HITL, shared state, validation, viz, sub-workflows) |
_workflows._sequential / _concurrent / _group_chat / _handoff / _magentic / _agent |
workflow::orchestration (SequentialBuilder, ConcurrentBuilder, GroupChatBuilder, HandoffBuilder, MagenticBuilder, WorkflowAgent) |
_mcp |
agent-framework-mcp (McpStdioTool, McpStreamableHttpTool, McpWebsocketTool, prompts, sampling, roots) |
a2a package |
agent-framework-a2a (A2AAgent, A2AClient) |
declarative package |
agent-framework-declarative (DeclarativeLoader) |
devui / ag-ui packages |
agent-framework-hosting (AgentHost, A2ARouter, AgUiRouter, OpenAiRouter, embedded debug UI) |
redis / mem0 packages |
agent-framework-redis / agent-framework-mem0 |
foundry / azure-ai-search packages |
agent-framework-foundry / agent-framework-azure-ai-search |
copilotstudio / purview packages |
agent-framework-copilotstudio / agent-framework-purview |
(.NET Microsoft.Agents.AI.CosmosNoSql) |
agent-framework-cosmos |
Cross-cutting behavior implemented in Python via class decorators
(use_function_invocation, use_*_middleware) is expressed in Rust as wrapper
types (FunctionInvokingChatClient, RetryingChatClient,
ObservableChatClient) and explicit middleware pipelines.
Roadmap
See PARITY.md for the feature matrix and GAP_ANALYSIS.md for the audited gap list and its status section (the current source of truth). The remaining gaps:
- Workflow depth: typed executor routing / multiple handlers,
AgentExecutorRequest-style envelopes, sub-workflow request interception, orchestrationwith_request_info/with_checkpointingoptions, event origin/warning events, viz file export - Cross-language wire compatibility:
type-tagged message payloads,raw_representation/additional_propertieson content types - AG-UI: the client (
AGUIChatClient) and predictive-state events (STATE_SNAPSHOT/STATE_DELTA,confirm_changes) - DevUI parity: conversations API, run cancellation,
/meta, directory-based entity discovery, auth; the React frontend - A2A serving: streaming, non-terminal task lifecycle, file/data parts,
push-notification config,
tasks/resubscribe, extended card - Providers:
AzureOpenAIAssistantsClientwrapper, the new Foundry Prompt-Agent client;as_mcp_server - MCP client: standalone GET-based SSE listening, automatic reconnect, elicitation
- Redis provider: embeddings/vector-KNN and hybrid search (BM25 full-text ships on Redis Stack)
- Cosmos DB: Entra ID/AAD auth,
TransactionalBatch, hierarchical partition keys, TTL, and a Cosmos-backed workflow-checkpoint store - The upstream Copilot-Studio declarative workflow DSL (declarative agents already follow the official schema)
- Purview: protection-scopes precheck/caching, background content-activity logging, JWT-derived identity fallback
- OTel SDK exporter wiring stays the application's job by design
(spans and
otel-metricshistograms are emitted and bridge-ready) - Remaining ecosystem: ChatKit, the
labexperimental packages, DurableTask/Azure Functions hosting
Done — everything else, including:
- Core data model, function-invocation loop, approval flow, structured
output on every provider (auto-parsed into
response.value), andRetryingChatClientretries withRetry-Aftersupport -
ChatAgentwith threads (serialize/deserialize + store factory), memory,as_tool, per-runAgentRunOptions, and agent / chat / function middleware - Trait-level
run_stream: real token SSE through hosting (DevUI-style, AG-UI, OpenAI-compatible), incremental agent updates inside orchestrations, streaming A2A -
AiFunction::typed— parameter schemas derived from Rust types (schemars), plus invocation limits and hosted-tool config setters - Providers: OpenAI (chat + Responses + Assistants), Azure OpenAI
(chat + Responses), Azure AI Foundry (incl. Bing grounding /
file-search configs), Anthropic (betas + hosted tools + citations),
Copilot Studio; Entra ID credential chain incl.
DefaultAzureCredential - Multimodal input (images/audio/files) and citation annotations on OpenAI + Anthropic; granular service errors (auth / invalid-request / content-filter)
- MCP: stdio + HTTP + WebSocket, tools, prompts, sampling, roots, and
first-class
ToolSourceintegration withlist_changedreloads - Workflow engine incl. signature-validated checkpointing (fan-in state included), concurrent supersteps, HITL, shared state, validation, viz, sub-workflows
- All orchestrations incl. Magentic plan-review and stall-intervention HITL
- A2A client (full task surface) and A2A serving (card + JSON-RPC)
- Declarative YAML agents; Rust-native workflow specs
- Hosting: DevUI-style API + embedded debug page, AG-UI (with client tools injected per-run), OpenAI-compatible
- Redis (BM25), Mem0, Cosmos DB, Azure AI Search; Purview middleware
- Observability: OTel GenAI spans (request + tool attributes) and
optional GenAI metrics histograms (
otel-metrics) - 69 runnable examples in
examples/
Development
License
MIT. This is an independent port and is not affiliated with or endorsed by Microsoft.