home / skills / microsoft / skills / azure-ai-agents-python
/.github/skills/azure-ai-agents-python
This skill helps you build and manage Azure AI Agents workflows in Python, enabling threads, messages, runs, streaming, and vector storage.
npx playbooks add skill microsoft/skills --skill azure-ai-agents-pythonReview the files below or copy the command above to add this skill to your agents.
---
name: azure-ai-agents-python
description: Build AI agents using the Azure AI Agents Python SDK (azure-ai-agents). Use when creating agents hosted on Azure AI Foundry with tools (File Search, Code Interpreter, Bing Grounding, Azure AI Search, Function Calling, OpenAPI, MCP), managing threads and messages, implementing streaming responses, or working with vector stores. This is the low-level SDK - for higher-level abstractions, use the agent-framework skill instead.
---
# Azure AI Agents Python SDK
Build agents hosted on Azure AI Foundry using the `azure-ai-agents` SDK.
## Installation
```bash
pip install azure-ai-agents azure-identity
# Or with azure-ai-projects for additional features
pip install azure-ai-projects azure-identity
```
## Environment Variables
```bash
PROJECT_ENDPOINT="https://<resource>.services.ai.azure.com/api/projects/<project>"
MODEL_DEPLOYMENT_NAME="gpt-4o-mini"
```
## Authentication
```python
from azure.identity import DefaultAzureCredential
from azure.ai.agents import AgentsClient
credential = DefaultAzureCredential()
client = AgentsClient(
endpoint=os.environ["PROJECT_ENDPOINT"],
credential=credential,
)
```
## Core Workflow
The basic agent lifecycle: **create agent → create thread → create message → create run → get response**
### Minimal Example
```python
import os
from azure.identity import DefaultAzureCredential
from azure.ai.agents import AgentsClient
client = AgentsClient(
endpoint=os.environ["PROJECT_ENDPOINT"],
credential=DefaultAzureCredential(),
)
# 1. Create agent
agent = client.create_agent(
model=os.environ["MODEL_DEPLOYMENT_NAME"],
name="my-agent",
instructions="You are a helpful assistant.",
)
# 2. Create thread
thread = client.threads.create()
# 3. Add message
client.messages.create(
thread_id=thread.id,
role="user",
content="Hello!",
)
# 4. Create and process run
run = client.runs.create_and_process(thread_id=thread.id, agent_id=agent.id)
# 5. Get response
if run.status == "completed":
messages = client.messages.list(thread_id=thread.id)
for msg in messages:
if msg.role == "assistant":
print(msg.content[0].text.value)
# Cleanup
client.delete_agent(agent.id)
```
## Tools Overview
| Tool | Class | Use Case |
|------|-------|----------|
| Code Interpreter | `CodeInterpreterTool` | Execute Python, generate files |
| File Search | `FileSearchTool` | RAG over uploaded documents |
| Bing Grounding | `BingGroundingTool` | Web search |
| Azure AI Search | `AzureAISearchTool` | Search your indexes |
| Function Calling | `FunctionTool` | Call your Python functions |
| OpenAPI | `OpenApiTool` | Call REST APIs |
| MCP | `McpTool` | Model Context Protocol servers |
See [references/tools.md](references/tools.md) for detailed patterns.
## Adding Tools
```python
from azure.ai.agents import CodeInterpreterTool, FileSearchTool
agent = client.create_agent(
model=os.environ["MODEL_DEPLOYMENT_NAME"],
name="tool-agent",
instructions="You can execute code and search files.",
tools=[CodeInterpreterTool()],
tool_resources={"code_interpreter": {"file_ids": [file.id]}},
)
```
## Function Calling
```python
from azure.ai.agents import FunctionTool, ToolSet
def get_weather(location: str) -> str:
"""Get weather for a location."""
return f"Weather in {location}: 72F, sunny"
functions = FunctionTool(functions=[get_weather])
toolset = ToolSet()
toolset.add(functions)
agent = client.create_agent(
model=os.environ["MODEL_DEPLOYMENT_NAME"],
name="function-agent",
instructions="Help with weather queries.",
toolset=toolset,
)
# Process run - toolset auto-executes functions
run = client.runs.create_and_process(
thread_id=thread.id,
agent_id=agent.id,
toolset=toolset, # Pass toolset for auto-execution
)
```
## Streaming
```python
from azure.ai.agents import AgentEventHandler
class MyHandler(AgentEventHandler):
def on_message_delta(self, delta):
if delta.text:
print(delta.text.value, end="", flush=True)
def on_error(self, data):
print(f"Error: {data}")
with client.runs.stream(
thread_id=thread.id,
agent_id=agent.id,
event_handler=MyHandler(),
) as stream:
stream.until_done()
```
See [references/streaming.md](references/streaming.md) for advanced patterns.
## File Operations
### Upload File
```python
file = client.files.upload_and_poll(
file_path="data.csv",
purpose="assistants",
)
```
### Create Vector Store
```python
vector_store = client.vector_stores.create_and_poll(
file_ids=[file.id],
name="my-store",
)
agent = client.create_agent(
model=os.environ["MODEL_DEPLOYMENT_NAME"],
tools=[FileSearchTool()],
tool_resources={"file_search": {"vector_store_ids": [vector_store.id]}},
)
```
## Async Client
```python
from azure.ai.agents.aio import AgentsClient
async with AgentsClient(
endpoint=os.environ["PROJECT_ENDPOINT"],
credential=DefaultAzureCredential(),
) as client:
agent = await client.create_agent(...)
# ... async operations
```
See [references/async-patterns.md](references/async-patterns.md) for async patterns.
## Response Format
### JSON Mode
```python
agent = client.create_agent(
model=os.environ["MODEL_DEPLOYMENT_NAME"],
response_format={"type": "json_object"},
)
```
### JSON Schema
```python
agent = client.create_agent(
model=os.environ["MODEL_DEPLOYMENT_NAME"],
response_format={
"type": "json_schema",
"json_schema": {
"name": "weather_response",
"schema": {
"type": "object",
"properties": {
"temperature": {"type": "number"},
"conditions": {"type": "string"},
},
"required": ["temperature", "conditions"],
},
},
},
)
```
## Thread Management
### Continue Conversation
```python
# Save thread_id for later
thread_id = thread.id
# Resume later
client.messages.create(
thread_id=thread_id,
role="user",
content="Follow-up question",
)
run = client.runs.create_and_process(thread_id=thread_id, agent_id=agent.id)
```
### List Messages
```python
messages = client.messages.list(thread_id=thread.id, order="asc")
for msg in messages:
role = msg.role
content = msg.content[0].text.value
print(f"{role}: {content}")
```
## Best Practices
1. **Use context managers** for async client
2. **Clean up agents** when done: `client.delete_agent(agent.id)`
3. **Use `create_and_process`** for simple cases, **streaming** for real-time UX
4. **Pass toolset to run** for automatic function execution
5. **Poll operations** use `*_and_poll` methods for long operations
## Reference Files
- [references/tools.md](references/tools.md): All tool types with detailed examples
- [references/streaming.md](references/streaming.md): Event handlers and streaming patterns
- [references/async-patterns.md](references/async-patterns.md): Async client usage
This skill demonstrates building and hosting AI agents on Azure AI Foundry using the azure-ai-agents Python SDK. It covers agent lifecycle operations, thread and message management, tool integration (Code Interpreter, File Search, Bing Grounding, Azure AI Search, Function Calling, OpenAPI, MCP), streaming responses, and vector store support. Use this low-level SDK when you need direct control over agent runs, tools, and streaming behavior.
The SDK exposes an AgentsClient to create agents, threads, messages, runs, and to stream events. Typical flow: create an agent, open a thread, post user messages, call create_and_process (or stream) to produce a run, then read assistant messages. Tools and toolsets are attached to agents or passed into runs to enable function execution, file search, code execution, and web grounding. Long-running operations support polling and there is an async client for coroutine-based workflows.
Do I need a separate project endpoint and model deployment name?
Yes. Set PROJECT_ENDPOINT to your Azure AI project endpoint and MODEL_DEPLOYMENT_NAME to the deployed model identifier before creating agents.
When should I use the async client?
Use the async client for high-concurrency services or when integrating with async frameworks like FastAPI or asyncio-based applications.