Skip to content

Commit 99c5718

Browse files
dmytrostrukCopilot
andauthored
Python: Create/Get Agent API for Azure V2 (#3059)
* Added get_agent method to Azure AI V2 * Small fixes * Small fix * Removed AzureAIAgentProvider * Added create_agent method * Small fixes * Fixed code interpreter tool mapping * Added agent provider for V2 client * Updated response format handling * Added provider example * Fixed errors * Update python/samples/getting_started/agents/azure_ai/README.md Co-authored-by: Copilot <[email protected]> * Small fix * Updates from merge * Resolved comments * Resolved comments --------- Co-authored-by: Copilot <[email protected]>
1 parent f56808b commit 99c5718

35 files changed

+1904
-337
lines changed

python/packages/azure-ai/agent_framework_azure_ai/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from ._chat_client import AzureAIAgentClient, AzureAIAgentOptions
66
from ._client import AzureAIClient
7+
from ._provider import AzureAIProjectAgentProvider
78
from ._shared import AzureAISettings
89

910
try:
@@ -15,6 +16,7 @@
1516
"AzureAIAgentClient",
1617
"AzureAIAgentOptions",
1718
"AzureAIClient",
19+
"AzureAIProjectAgentProvider",
1820
"AzureAISettings",
1921
"__version__",
2022
]

python/packages/azure-ai/agent_framework_azure_ai/_client.py

Lines changed: 5 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import sys
44
from collections.abc import Mapping, MutableSequence
5-
from typing import TYPE_CHECKING, Any, ClassVar, Generic, TypedDict, cast
5+
from typing import TYPE_CHECKING, Any, ClassVar, Generic, TypedDict, TypeVar, cast
66

77
from agent_framework import (
88
AGENT_FRAMEWORK_USER_AGENT,
@@ -13,23 +13,20 @@
1313
use_chat_middleware,
1414
use_function_invocation,
1515
)
16-
from agent_framework.exceptions import ServiceInitializationError, ServiceInvalidRequestError
16+
from agent_framework.exceptions import ServiceInitializationError
1717
from agent_framework.observability import use_instrumentation
1818
from agent_framework.openai._responses_client import OpenAIBaseResponsesClient
1919
from azure.ai.projects.aio import AIProjectClient
2020
from azure.ai.projects.models import (
2121
MCPTool,
2222
PromptAgentDefinition,
2323
PromptAgentDefinitionText,
24-
ResponseTextFormatConfigurationJsonObject,
25-
ResponseTextFormatConfigurationJsonSchema,
26-
ResponseTextFormatConfigurationText,
2724
)
2825
from azure.core.credentials_async import AsyncTokenCredential
2926
from azure.core.exceptions import ResourceNotFoundError
30-
from pydantic import BaseModel, ValidationError
27+
from pydantic import ValidationError
3128

32-
from ._shared import AzureAISettings
29+
from ._shared import AzureAISettings, create_text_format_config
3330

3431
if TYPE_CHECKING:
3532
from agent_framework.openai import OpenAIResponsesOptions
@@ -286,47 +283,6 @@ async def close(self) -> None:
286283
"""Close the project_client."""
287284
await self._close_client_if_needed()
288285

289-
def _create_text_format_config(
290-
self, response_format: type[BaseModel] | Mapping[str, Any]
291-
) -> (
292-
ResponseTextFormatConfigurationJsonSchema
293-
| ResponseTextFormatConfigurationJsonObject
294-
| ResponseTextFormatConfigurationText
295-
):
296-
"""Convert response_format into Azure text format configuration."""
297-
if isinstance(response_format, type) and issubclass(response_format, BaseModel):
298-
schema = response_format.model_json_schema()
299-
# Ensure additionalProperties is explicitly false to satisfy Azure validation
300-
if isinstance(schema, dict):
301-
schema.setdefault("additionalProperties", False)
302-
return ResponseTextFormatConfigurationJsonSchema(
303-
name=response_format.__name__,
304-
schema=schema,
305-
)
306-
307-
if isinstance(response_format, Mapping):
308-
format_config = self._convert_response_format(response_format)
309-
format_type = format_config.get("type")
310-
if format_type == "json_schema":
311-
# Ensure schema includes additionalProperties=False to satisfy Azure validation
312-
schema = dict(format_config.get("schema", {})) # type: ignore[assignment]
313-
schema.setdefault("additionalProperties", False)
314-
config_kwargs: dict[str, Any] = {
315-
"name": format_config.get("name") or "response",
316-
"schema": schema,
317-
}
318-
if "strict" in format_config:
319-
config_kwargs["strict"] = format_config["strict"]
320-
if "description" in format_config:
321-
config_kwargs["description"] = format_config["description"]
322-
return ResponseTextFormatConfigurationJsonSchema(**config_kwargs)
323-
if format_type == "json_object":
324-
return ResponseTextFormatConfigurationJsonObject()
325-
if format_type == "text":
326-
return ResponseTextFormatConfigurationText()
327-
328-
raise ServiceInvalidRequestError("response_format must be a Pydantic model or mapping.")
329-
330286
async def _get_agent_reference_or_create(
331287
self,
332288
run_options: dict[str, Any],
@@ -380,7 +336,7 @@ async def _get_agent_reference_or_create(
380336
# response_format is accessed from chat_options or additional_properties
381337
# since the base class excludes it from run_options
382338
if chat_options and (response_format := chat_options.get("response_format")):
383-
args["text"] = PromptAgentDefinitionText(format=self._create_text_format_config(response_format))
339+
args["text"] = PromptAgentDefinitionText(format=create_text_format_config(response_format))
384340

385341
# Combine instructions from messages and options
386342
combined_instructions = [

0 commit comments

Comments
 (0)