Azure AI Projects Py
MicrosoftOfficialCreated by Microsoft
- Skill
- Tool integration
- Software development
- MIT
- Low risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The azure-ai-projects-py skill provides an interface for interacting with the Azure AI Projects Python SDK. It enables developers to manage the lifecycle of AI agents, deployments, datasets, and indexes within the Foundry environment. The SDK supports both synchronous and asynchronous operations, integrates with Azure identity management, and provides an OpenAI-compatible client for standard API interactions.
What it does
- Create and manage versioned AI agents using PromptAgentDefinition
- List and manage model deployments, datasets, and indexes
- Execute and manage agent threads, messages, and runs
- Access an OpenAI-compatible client for standard chat completions
- Configure and run evaluations on AI models
- Manage project connections to external services
When to use it
- When building AI applications that require integration with Microsoft Foundry
- When you need to manage agent versions and definitions programmatically
- When performing batch evaluations or quality checks on AI outputs
- When you need to interface with Azure-managed AI resources and deployments
Advantages
- Provides a unified client for managing diverse AI project resources
- Supports both sync and async programming patterns
- Enables versioning for agent definitions
- Integrates with standard Azure authentication via DefaultAzureCredential
Usage examples
- “How do I initialize the AIProjectClient?”
- Use the AIProjectClient class with your project endpoint and a DefaultAzureCredential instance, wrapped in a context manager.
- “How can I create a versioned agent?”
- Use the client.agents.create_version method, passing a PromptAgentDefinition object with your model, instructions, and version label.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/microsoft/azure-ai-projects-py/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip azure-ai-projects-py.zip -d .agents/skills
Documentation by Microsoft
Azure AI Projects Python SDK (Foundry SDK)
Build AI applications on Microsoft Foundry using the azure-ai-projects SDK.
Installation
pip install azure-ai-projects azure-identityEnvironment Variables
AZURE_AI_PROJECT_ENDPOINT="https://<resource>.services.ai.azure.com/api/projects/<project>" # Required for all auth methods
AZURE_AI_MODEL_DEPLOYMENT_NAME="gpt-4o-mini" # Required for all auth methods
AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in productionAuthentication & Lifecycle
🔑 Two rules apply to every code sample below:
Prefer
DefaultAzureCredential. It works locally (Azure CLI / VS Code / Developer CLI) and in Azure (managed identity, workload identity) with no code change. Avoid connection strings, account/API keys — they bypass Entra audit and rotation.
Local dev:
DefaultAzureCredentialworks as-is.Production: set
AZURE_TOKEN_CREDENTIALS=prod(orAZURE_TOKEN_CREDENTIALS=<specific_credential>) to constrain the credential chain to production-safe credentials.Wrap every client in a context manager so HTTP transports, sockets, and token caches are released deterministically:
Sync:
with <Client>(...) as client:Async:
async with <Client>(...) as client:andasync with DefaultAzureCredential() as credential:(fromazure.identity.aio)Snippets may abbreviate this setup, but production code should always follow both rules.
import os
from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
from azure.ai.projects import AIProjectClient
# Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
credential = DefaultAzureCredential()
# Or use a specific credential directly in production:
# See https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credential = ManagedIdentityCredential()
with AIProjectClient(
endpoint=os.environ["AZURE_AI_PROJECT_ENDPOINT"],
credential=credential,
) as client:
deployments = list(client.deployments.list())Client Operations Overview
| Operation | Access | Purpose |
|---|---|---|
client.agents | .agents.* | Agent CRUD, versions, threads, runs |
client.connections | .connections.* | List/get project connections |
client.deployments | .deployments.* | List model deployments |
client.datasets | .datasets.* | Dataset management |
client.indexes | .indexes.* | Index management |
client.evaluations | .evaluations.* | Run evaluations |
client.red_teams | .red_teams.* | Red team operations |
Two Client Approaches
1. AIProjectClient (Native Foundry)
from azure.ai.projects import AIProjectClient
with AIProjectClient(
endpoint=os.environ["AZURE_AI_PROJECT_ENDPOINT"],
credential=DefaultAzureCredential(),
) as client:
# Use Foundry-native operations
agent = client.agents.create_agent(
model=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
name="my-agent",
instructions="You are helpful.",
)2. OpenAI-Compatible Client
# Get OpenAI-compatible client from project
openai_client = client.get_openai_client()
# Use standard OpenAI API
response = openai_client.chat.completions.create(
model=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
messages=[{"role": "user", "content": "Hello!"}],
)Agent Operations
Create Agent (Basic)
agent = client.agents.create_agent(
model=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
name="my-agent",
instructions="You are a helpful assistant.",
)Create Agent with Tools
from azure.ai.agents.models import CodeInterpreterTool, FileSearchTool
agent = client.agents.create_agent(
model=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
name="tool-agent",
instructions="You can execute code and search files.",
tools=[CodeInterpreterTool(), FileSearchTool()],
)Versioned Agents with PromptAgentDefinition
from azure.ai.projects.models import PromptAgentDefinition
# Create a versioned agent
agent_version = client.agents.create_version(
agent_name="customer-support-agent",
definition=PromptAgentDefinition(
model=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
instructions="You are a customer support specialist.",
tools=[], # Add tools as needed
),
version_label="v1.0",
)See references/agents.md for detailed agent patterns.
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 (requires connection) |
| 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 |
| Memory Search | MemorySearchTool | Search agent memory stores |
| SharePoint | SharepointGroundingTool | Search SharePoint content |
See references/tools.md for all tool patterns.
Thread and Message Flow
# 1. Create thread
thread = client.agents.threads.create()
# 2. Add message
client.agents.messages.create(
thread_id=thread.id,
role="user",
content="What's the weather like?",
)
# 3. Create and process run
run = client.agents.runs.create_and_process(
thread_id=thread.id,
agent_id=agent.id,
)
# 4. Get response
if run.status == "completed":
messages = client.agents.messages.list(thread_id=thread.id)
for msg in messages:
if msg.role == "assistant":
print(msg.content[0].text.value)Connections
# List all connections
connections = client.connections.list()
for conn in connections:
print(f"{conn.name}: {conn.connection_type}")
# Get specific connection
connection = client.connections.get(connection_name="my-search-connection")See references/connections.md for connection patterns.
Deployments
# List available model deployments
deployments = client.deployments.list()
for deployment in deployments:
print(f"{deployment.name}: {deployment.model}")See references/deployments.md for deployment patterns.
Datasets and Indexes
# List datasets
datasets = client.datasets.list()
# List indexes
indexes = client.indexes.list()See references/datasets-indexes.md for data operations.
Evaluation
# Using OpenAI client for evals
openai_client = client.get_openai_client()
# Create evaluation with built-in evaluators
eval_run = openai_client.evals.runs.create(
eval_id="my-eval",
name="quality-check",
data_source={
"type": "custom",
"item_references": [{"item_id": "test-1"}],
},
testing_criteria=[
{"type": "fluency"},
{"type": "task_adherence"},
],
)See references/evaluation.md for evaluation patterns.
Async Client
from azure.ai.projects.aio import AIProjectClient
async with AIProjectClient(
endpoint=os.environ["AZURE_AI_PROJECT_ENDPOINT"],
credential=DefaultAzureCredential(),
) as client:
agent = await client.agents.create_agent(...)
# ... async operationsSee references/async-patterns.md for async patterns.
Memory Stores
# Create memory store for agent
memory_store = client.agents.create_memory_store(
name="conversation-memory",
)
# Attach to agent for persistent memory
agent = client.agents.create_agent(
model=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
name="memory-agent",
tools=[MemorySearchTool()],
tool_resources={"memory": {"store_ids": [memory_store.id]}},
)Best Practices
Pick sync OR async and stay consistent. Do not mix
azure.ai.projectssync clients withazure.ai.projects.aioasync clients in the same call path. Choose one mode per module.Always use context managers for clients and async credentials. Wrap every client in
with AIProjectClient(...) as client:(sync) orasync with AIProjectClient(...) as client:(async). For asyncDefaultAzureCredentialfromazure.identity.aio, also useasync with credential:so tokens and transports are cleaned up.Clean up agents when done:
client.agents.delete_agent(agent.id)Use
create_and_processfor simple runs, streaming for real-time UXUse versioned agents for production deployments
Prefer connections for external service integration (AI Search, Bing, etc.)
SDK Comparison
| Feature | azure-ai-projects | azure-ai-agents |
|---|---|---|
| Level | High-level (Foundry) | Low-level (Agents) |
| Client | AIProjectClient | AgentsClient |
| Versioning | create_version() | Not available |
| Connections | Yes | No |
| Deployments | Yes | No |
| Datasets/Indexes | Yes | No |
| Evaluation | Via OpenAI client | No |
| When to use | Full Foundry integration | Standalone agent apps |
Reference Files
references/agents.md: Agent operations with PromptAgentDefinition
references/tools.md: All agent tools with examples
references/evaluation.md: Evaluation operations overview
references/built-in-evaluators.md: Complete built-in evaluator reference
references/custom-evaluators.md: Code and prompt-based evaluator patterns
references/connections.md: Connection operations
references/deployments.md: Deployment enumeration
references/datasets-indexes.md: Dataset and index operations
references/async-patterns.md: Async client usage
references/api-reference.md: Complete API reference for all 373 SDK exports (v2.0.0b4)
scripts/run_batch_evaluation.py: CLI tool for batch evaluations
Files
- ATTRIBUTION.mdAdded by AutoGineer971 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SKILL.md10.8 KiB
- references/agents.md6.7 KiB
- references/api-reference.md27.3 KiB
- references/async-patterns.md6.8 KiB
- references/built-in-evaluators.md11.5 KiB
- references/connections.md4.7 KiB
- references/custom-evaluators.md14.1 KiB
- references/datasets-indexes.md4.2 KiB
- references/deployments.md3.5 KiB
- references/evaluation.md10.7 KiB
- references/tools.md11.7 KiB
- scripts/run_batch_evaluation.pyScript12.2 KiB
scripts/run_batch_evaluation.py
#!/usr/bin/env python3
"""
Batch Evaluation CLI Tool
Run batch evaluations on test datasets using Azure AI Projects SDK.
Supports quality, safety, agent evaluators, and OpenAI graders.
Usage:
python run_batch_evaluation.py --data test_data.jsonl --evaluators coherence relevance
python run_batch_evaluation.py --data test_data.jsonl --evaluators coherence --output results.json
python run_batch_evaluation.py --data test_data.jsonl --safety
python run_batch_evaluation.py --data test_data.jsonl --agent --evaluators intent_resolution task_adherence
Environment Variables:
AZURE_AI_PROJECT_ENDPOINT - Azure AI project endpoint (required)
AZURE_AI_MODEL_DEPLOYMENT_NAME - Model deployment name (default: gpt-4o-mini)
"""
import argparse
import json
import os
import sys
import time
from pathlib import Path
from typing import Any
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
from openai.types.evals.create_eval_jsonl_run_data_source_param import (
CreateEvalJSONLRunDataSourceParam,
SourceFileContent,
SourceFileContentContent,
)
from openai.types.eval_create_params import DataSourceConfigCustom
# Built-in evaluators by category
QUALITY_EVALUATORS = [
"coherence",
"relevance",
"fluency",
"groundedness",
]
SAFETY_EVALUATORS = [
"violence",
"sexual",
"self_harm",
"hate_unfairness",
]
AGENT_EVALUATORS = [
"intent_resolution",
"response_completeness",
"task_adherence",
"tool_call_accuracy",
]
NLP_EVALUATORS = ["f1", "rouge", "bleu", "gleu", "meteor"]
def load_jsonl(path: str) -> list[dict]:
"""Load JSONL file into list of dicts."""
data = []
with open(path, "r", encoding="utf-8") as f:
for line in f:
line = line.strip()
if line:
data.append(json.loads(line))
return data
def build_data_source(
data: list[dict],
is_agent: bool = False,
) -> CreateEvalJSONLRunDataSourceParam:
"""Build data source from loaded data."""
content = []
for item in data:
if is_agent:
# Agent data: extract sample fields from item
sample = {
"output_text": item.pop("output_text", item.get("response", "")),
}
if "output_items" in item:
sample["output_items"] = item.pop("output_items")
content.append(SourceFileContentContent(item=item, sample=sample))
else:
content.append(SourceFileContentContent(item=item, sample={}))
return CreateEvalJSONLRunDataSourceParam(
type="jsonl",
source=SourceFileContent(type="file_content", content=content),
)
def build_data_source_config(
data: list[dict],
is_agent: bool = False,
) -> DataSourceConfigCustom:
"""Build data source config based on data schema."""
# Infer schema from first item
if not data:
raise ValueError("Data is empty")
first_item = data[0]
properties = {}
required = []
for key in first_item:
if key not in ["output_text", "output_items"]: # Agent fields go in sample
properties[key] = {"type": "string"}
required.append(key)
return DataSourceConfigCustom(
type="custom",
item_schema={
"type": "object",
"properties": properties,
"required": required,
},
include_sample_schema=is_agent,
)
def build_testing_criteria(
evaluator_names: list[str],
deployment_name: str,
is_agent: bool = False,
) -> list[dict]:
"""Build testing criteria for the specified evaluators."""
criteria = []
for name in evaluator_names:
# Determine data mapping based on evaluator type
if name in QUALITY_EVALUATORS:
if name == "groundedness":
data_mapping = {
"query": "{{item.query}}",
"context": "{{item.context}}",
"response": "{{item.response}}",
}
else:
data_mapping = {
"query": "{{item.query}}",
"response": "{{item.response}}",
}
needs_model = True
elif name in SAFETY_EVALUATORS:
data_mapping = {
"query": "{{item.query}}",
"response": "{{item.response}}",
}
needs_model = False # Safety evaluators may not need deployment
elif name in AGENT_EVALUATORS:
if is_agent:
if name == "tool_call_accuracy":
data_mapping = {
"query": "{{item.query}}",
"response": "{{sample.output_items}}",
}
else:
data_mapping = {
"query": "{{item.query}}",
"response": "{{sample.output_text}}",
}
else:
data_mapping = {
"query": "{{item.query}}",
"response": "{{item.response}}",
}
needs_model = True
elif name in NLP_EVALUATORS:
data_mapping = {
"response": "{{item.response}}",
"ground_truth": "{{item.ground_truth}}",
}
needs_model = False
else:
print(f"Warning: Unknown evaluator '{name}', skipping")
continue
criterion = {
"type": "azure_ai_evaluator",
"name": name,
"evaluator_name": f"builtin.{name}",
"data_mapping": data_mapping,
}
if needs_model:
criterion["initialization_parameters"] = {"deployment_name": deployment_name}
criteria.append(criterion)
return criteria
def run_evaluation(
endpoint: str,
data_path: str,
evaluator_names: list[str],
deployment_name: str,
is_agent: bool = False,
) -> dict[str, Any]:
"""Run batch evaluation using Azure AI Projects SDK."""
# Load data
data = load_jsonl(data_path)
print(f"Loaded {len(data)} items from {data_path}")
# Build data source and config
data_source = build_data_source(data, is_agent=is_agent)
data_source_config = build_data_source_config(data, is_agent=is_agent)
# Build testing criteria
testing_criteria = build_testing_criteria(
evaluator_names,
deployment_name,
is_agent=is_agent,
)
if not testing_criteria:
raise ValueError("No valid testing criteria configured")
print(f"Configured {len(testing_criteria)} evaluators")
# Create client and run evaluation
with (
DefaultAzureCredential() as credential,
AIProjectClient(endpoint=endpoint, credential=credential) as project_client,
):
openai_client = project_client.get_openai_client()
# Create evaluation definition
eval_object = openai_client.evals.create(
name=f"Batch Evaluation - {Path(data_path).stem}",
data_source_config=data_source_config,
testing_criteria=testing_criteria,
)
print(f"Created evaluation: {eval_object.id}")
# Create and run evaluation
run = openai_client.evals.runs.create(
eval_id=eval_object.id,
name="CLI Run",
data_source=data_source,
)
print(f"Started run: {run.id}")
# Poll for completion
while run.status not in ["completed", "failed", "cancelled"]:
print(f"Status: {run.status}...")
time.sleep(5)
run = openai_client.evals.runs.retrieve(
eval_id=eval_object.id,
run_id=run.id,
)
if run.status != "completed":
raise RuntimeError(f"Evaluation run {run.status}: {getattr(run, 'error', 'Unknown error')}")
print(f"Run completed: {run.status}")
# Retrieve results
output_items = list(
openai_client.evals.runs.output_items.list(
eval_id=eval_object.id,
run_id=run.id,
)
)
# Aggregate metrics
metrics: dict[str, list[float]] = {}
rows = []
for output_item in output_items:
row_results = {}
for result in output_item.results:
if result.score is not None:
if result.name not in metrics:
metrics[result.name] = []
metrics[result.name].append(result.score)
row_results[result.name] = result.score
rows.append(row_results)
# Calculate averages
avg_metrics = {}
for name, scores in metrics.items():
avg_metrics[name] = sum(scores) / len(scores) if scores else 0.0
return {
"eval_id": eval_object.id,
"run_id": run.id,
"status": run.status,
"metrics": avg_metrics,
"rows": rows,
"total_items": len(output_items),
}
def main():
parser = argparse.ArgumentParser(
description="Run batch evaluation on test datasets using Azure AI Projects SDK",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog=__doc__,
)
parser.add_argument("--data", "-d", required=True, help="Path to JSONL data file")
parser.add_argument(
"--evaluators",
"-e",
nargs="+",
default=["coherence", "relevance"],
help=f"Evaluators to run. Quality: {QUALITY_EVALUATORS}, "
f"Safety: {SAFETY_EVALUATORS}, Agent: {AGENT_EVALUATORS}, NLP: {NLP_EVALUATORS}",
)
parser.add_argument(
"--safety",
action="store_true",
help="Include all safety evaluators",
)
parser.add_argument(
"--agent",
action="store_true",
help="Include all agent evaluators (uses sample.output_text for response)",
)
parser.add_argument(
"--output",
"-o",
help="Output file for results (JSON)",
)
parser.add_argument(
"--deployment",
default=None,
help="Model deployment name (overrides AZURE_AI_MODEL_DEPLOYMENT_NAME)",
)
args = parser.parse_args()
# Validate environment
endpoint = os.environ.get("AZURE_AI_PROJECT_ENDPOINT")
if not endpoint:
print("Error: AZURE_AI_PROJECT_ENDPOINT environment variable required")
sys.exit(1)
deployment = args.deployment or os.environ.get("AZURE_AI_MODEL_DEPLOYMENT_NAME", "gpt-4o-mini")
# Validate data file
data_path = Path(args.data)
if not data_path.exists():
print(f"Error: Data file not found: {args.data}")
sys.exit(1)
# Build evaluator list
evaluator_names = list(args.evaluators)
if args.safety:
evaluator_names.extend(SAFETY_EVALUATORS)
if args.agent:
evaluator_names.extend(AGENT_EVALUATORS)
# Remove duplicates while preserving order
seen = set()
unique_evaluators = []
for e in evaluator_names:
if e not in seen:
seen.add(e)
unique_evaluators.append(e)
evaluator_names = unique_evaluators
print(f"Running evaluation with: {evaluator_names}")
print(f"Data file: {args.data}")
print(f"Deployment: {deployment}")
print(f"Agent mode: {args.agent}")
# Run evaluation
try:
result = run_evaluation(
endpoint=endpoint,
data_path=str(data_path),
evaluator_names=evaluator_names,
deployment_name=deployment,
is_agent=args.agent,
)
except Exception as e:
print(f"Error during evaluation: {e}")
sys.exit(1)
# Output results
print("\n=== Evaluation Results ===")
print(f"Eval ID: {result['eval_id']}")
print(f"Run ID: {result['run_id']}")
print(f"Status: {result['status']}")
print(f"Total Items: {result['total_items']}")
print("\nMetrics:")
for metric, value in sorted(result["metrics"].items()):
print(f" {metric}: {value:.4f}")
# Save to file if requested
if args.output:
output_path = Path(args.output)
with open(output_path, "w", encoding="utf-8") as f:
json.dump(result, f, indent=2, default=str)
print(f"\nResults saved to: {args.output}")
print("\nEvaluation complete!")
if __name__ == "__main__":
main()
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an API key, Needs Python
Security
What our scanner noticed· Low risk
- Instructions that use the network
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Microsoft
- Publisher
- Microsoft (Official)
- Source
- microsoft/skills · .github/plugins/azure-sdk-python/skills/azure-ai-projects-py · commit 0696600
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Microsoft.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download azure-ai-projects-py.zip