Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
a72aeef
Update version
dargilco Jul 1, 2026
0c5bd80
Merge remote-tracking branch 'origin/main' into feature/azure-ai-proj…
dargilco Jul 6, 2026
ef83c08
Merge remote-tracking branch 'origin/main' into feature/azure-ai-proj…
dargilco Jul 7, 2026
166052b
Restore tsp-location.yaml
dargilco Jul 7, 2026
b15ba3d
Update emitter skill for Python to deal with prerequisites (#47878)
dargilco Jul 7, 2026
deb805e
Merge branch 'main' into feature/azure-ai-projects/vnext
howieleung Jul 7, 2026
cf8829f
change log (#47916)
howieleung Jul 7, 2026
64783d8
[azure-ai-projects] Emit SDK from TypeSpec (commit fca510e0) (#47914)
dargilco Jul 8, 2026
eae0318
Merge remote-tracking branch 'origin/main' into feature/azure-ai-proj…
dargilco Jul 8, 2026
f6a0197
Merge remote-tracking branch 'origin/main' into feature/azure-ai-proj…
dargilco Jul 9, 2026
939b4c3
Fix TypeSpec paths (#47959)
dargilco Jul 9, 2026
51dbaa7
Merge branch 'main' into feature/azure-ai-projects/vnext
howieleung Jul 16, 2026
747ce0b
Merge remote-tracking branch 'origin/main' into feature/azure-ai-proj…
dargilco Jul 20, 2026
f2e1cab
Merge remote-tracking branch 'origin/main' into feature/azure-ai-proj…
dargilco Jul 21, 2026
ae7422f
Merge remote-tracking branch 'origin/main' into feature/azure-ai-proj…
dargilco Jul 21, 2026
4cad88f
Merge remote-tracking branch 'origin/main' into feature/azure-ai-proj…
dargilco Jul 22, 2026
1de6714
Merge remote-tracking branch 'origin/main' into feature/azure-ai-proj…
dargilco Jul 22, 2026
73ca2c6
Merge remote-tracking branch 'origin/main' into feature/azure-ai-proj…
dargilco Jul 23, 2026
8932768
Remove sample_agent_toolbox_skill.py per bakcned folks and Linda requ…
howieleung Jul 23, 2026
02145d9
Re-emit from latest TypeSpec and do required updates (#48216)
dargilco Jul 24, 2026
a33bfb2
Merge remote-tracking branch 'origin/main' into feature/azure-ai-proj…
dargilco Jul 24, 2026
ca0aae3
Re-emit, to remove WebIQ tools (#48240)
dargilco Jul 24, 2026
0d65d14
update report
dargilco Jul 24, 2026
695e62b
Updates in prep for a release of 2.4.0 (#48248)
dargilco Jul 24, 2026
ae8d605
Update rename tsp-location.yaml, so it does not break release build
dargilco Jul 24, 2026
350e355
change log (#48246)
howieleung Jul 24, 2026
d68f0da
Add sample toolboxes for synchronous and asynchronous AIProjectClient…
howieleung Jul 24, 2026
2ffb388
Comment out additional sample tests in TestSamples class
howieleung Jul 24, 2026
9714db0
Merge remote-tracking branch 'origin/main' into feature/azure-ai-proj…
dargilco Jul 25, 2026
f169f24
Update to version 2.5.0
dargilco Jul 28, 2026
9f0123f
Howie/sample 35 (#48310)
howieleung Jul 28, 2026
ef6270b
Add console helpers in SDK to capture print statement from sample to …
howieleung Jul 30, 2026
284de72
Fix formatting in llm-analyze.py documentation for improved readability
howieleung Jul 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions sdk/ai/azure-ai-projects/.env.template
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,14 @@ SHAREPOINT_USER_INPUT=
FABRIC_USER_INPUT=
BING_CUSTOM_USER_INPUT=
A2A_USER_INPUT=
A2A_ENDPOINT=
EVALUATOR_NAME=
DATASET_NAME=
DATASET_VERSION=
DATASET_VERSION_1=
DATASET_VERSION_2=
DATA_FOLDER=
DOWNLOAD_FOLDER=
POLL_INTERVAL_SECONDS=
EVAL_MODEL=
OPTIMIZATION_MODEL=
Expand All @@ -57,6 +62,44 @@ WORK_IQ_PROJECT_CONNECTION_ID=
WORK_IQ_USER_INPUT=
FABRIC_IQ_PROJECT_CONNECTION_ID=
FABRIC_IQ_USER_INPUT=
AI_SEARCH_CONNECTION_NAME=
INDEX_NAME=
INDEX_VERSION=
FILE_PATH=
AGENT_ID=
APPINSIGHTS_RESOURCE_ID=
TRACE_LOOKBACK_HOURS=
FOUNDRY_AGENT_VERSION=
FOUNDRY_CONVERSATION_IDS=
FOUNDRY_TRACE_IDS=
FOUNDRY_INSTANT_MODEL_NAME=
FOUNDRY_REFERENCE_DATASET_NAME=
FOUNDRY_REFERENCE_DATASET_VERSION=
FOUNDRY_TRACES_WINDOW_DAYS=
AZURE_AI_PROJECT_ENDPOINT=
AZURE_AI_MODEL_DEPLOYMENT_NAME=
AZURE_AI_MODEL_DEPLOYMENT_NAME_FOR_AUDIO=
ENDPOINT_URL=
ENDPOINT_API_KEY=
ENDPOINT_APP_ID=
AZURE_RESOURCE_GROUP_NAME=
MODEL_PUBLISHER=
MODEL_VERSION=
MODEL_ENDPOINT=
MODEL_API_KEY=
COMPUTER_USE_MODEL_DEPLOYMENT_NAME=
STORAGE_INPUT_QUEUE_NAME=
STORAGE_OUTPUT_QUEUE_NAME=
STORAGE_QUEUE_SERVICE_ENDPOINT=
DELEGATED_USER_IDENTITY=
DELEGATED_USER_IDENTITY_2=
FOUNDRY_HOSTED_AGENT_REMOTE_BUILD=
GITHUB_CONNECTION_NAME=
GITHUB_PAT_TOKEN=
GITHUB_REPOSITORY_NAME=
GITHUB_USERNAME=
TEAMS_CONNECTION_NAME=
TEAMS_CHANNEL_URL=

#######################################################################
#
Expand Down
18 changes: 18 additions & 0 deletions sdk/ai/azure-ai-projects/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,23 @@
# Release History

## 2.5.0 (Unreleased)

### Features Added

Placeholder
Comment on lines +5 to +7

### Breaking Changes

Placeholder

### Bugs Fixed

Placeholder

### Sample updates

Placeholder

## 2.4.0 (2026-07-24)

### Features Added
Expand Down
28 changes: 28 additions & 0 deletions sdk/ai/azure-ai-projects/azure/ai/projects/_console.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# ------------------------------------
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
# ------------------------------------

"""Handwritten console helpers used by SDK customization code."""

from __future__ import annotations

from typing import IO


def console_print(
*values: object,
sep: str | None = " ",
end: str | None = "\n",
file: IO[str] | None = None,
flush: bool = False,
) -> None:
"""Mirror ``print`` behind a named helper for SDK console capture.

The SDK patch modules alias this helper to ``print`` so contributors can
keep writing plain ``print(...)`` calls while tests still patch one module-
local symbol to distinguish SDK console output from sample-authored prints.
Keeping this helper in a handwritten module avoids placing custom behavior
in generated files that may be overwritten by the next emit.
"""
print(*values, sep=sep, end=end, file=file, flush=flush)
8 changes: 1 addition & 7 deletions sdk/ai/azure-ai-projects/azure/ai/projects/_patch.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,14 @@
from azure.core.tracing.decorator import distributed_trace
from azure.core.credentials import TokenCredential
from azure.identity import get_bearer_token_provider
from ._console import console_print as print
from ._client import AIProjectClient as AIProjectClientGenerated
from .operations import TelemetryOperations
from .models._patch import _BETA_OPERATION_FEATURE_HEADERS, _FOUNDRY_FEATURES_HEADER_NAME, _has_header_case_insensitive

logger = logging.getLogger(__name__)


# ---------------------------------------------------------------------------
# Shared helpers used by both the sync and async AIProjectClient.get_openai_client()
# implementations. Defined at module level so the async client can import and reuse
# them without duplicating the logic.
# ---------------------------------------------------------------------------


def _resolve_openai_base_url(config: Any, agent_name: Optional[str], kwargs: dict) -> str:
"""Resolve the base URL for the (Async)OpenAI client.

Expand Down
2 changes: 1 addition & 1 deletion sdk/ai/azure-ai-projects/azure/ai/projects/_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@
# Changes may cause incorrect behavior and will be lost if the code is regenerated.
# --------------------------------------------------------------------------

VERSION = "2.4.0"
VERSION = "2.5.0"
1 change: 1 addition & 0 deletions sdk/ai/azure-ai-projects/azure/ai/projects/aio/_patch.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from azure.core.tracing.decorator import distributed_trace
from azure.core.credentials_async import AsyncTokenCredential
from azure.identity.aio import get_bearer_token_provider
from .._console import console_print as print
from .._patch import (
_AuthSecretsFilter,
_build_openai_user_agent,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Tool Classes: Removed Properties (v2.2.0 → v2.3.0)

The following Tool-derived classes had properties **removed** in v2.3.0 compared to v2.2.0. These properties (`name`, `description`, `tool_configs`) now only exist on the corresponding `ToolboxTool` subclasses.

## General Availability Tools

| Class Name | Removed Properties |
|------------|-------------------|
| `AzureAISearchTool` | `name: Optional[str]`, `description: Optional[str]`, `tool_configs: Optional[dict[str, ToolConfig]]` |
| `AzureFunctionTool` | `tool_configs: Optional[dict[str, ToolConfig]]` |
| `BingGroundingTool` | `name: Optional[str]`, `description: Optional[str]`, `tool_configs: Optional[dict[str, ToolConfig]]` |
| `CaptureStructuredOutputsTool` | `name: Optional[str]`, `description: Optional[str]`, `tool_configs: Optional[dict[str, ToolConfig]]` |
| `CodeInterpreterTool` | `name: Optional[str]`, `description: Optional[str]`, `tool_configs: Optional[dict[str, ToolConfig]]` |
| `FileSearchTool` | `name: Optional[str]`, `description: Optional[str]`, `tool_configs: Optional[dict[str, ToolConfig]]` |
| `FunctionShellToolParam` | `name: Optional[str]`, `description: Optional[str]`, `tool_configs: Optional[dict[str, ToolConfig]]` |
| `FunctionTool` | *(no changes)* |
| `ImageGenTool` | `name: Optional[str]`, `description: Optional[str]`, `tool_configs: Optional[dict[str, ToolConfig]]` |
| `LocalShellToolParam` | `name: Optional[str]`, `description: Optional[str]`, `tool_configs: Optional[dict[str, ToolConfig]]` |
| `MCPTool` | `tool_configs: Optional[dict[str, ToolConfig]]` |
| `OpenApiTool` | `tool_configs: Optional[dict[str, ToolConfig]]` |
| `WebSearchTool` | `name: Optional[str]`, `description: Optional[str]`, `tool_configs: Optional[dict[str, ToolConfig]]` |
v
## Preview Tools

| Class Name | Removed Properties |
|------------|-------------------|
| `A2APreviewTool` | `name: Optional[str]`, `description: Optional[str]`, `tool_configs: Optional[dict[str, ToolConfig]]` |
| `BingCustomSearchPreviewTool` | `name: Optional[str]`, `description: Optional[str]`, `tool_configs: Optional[dict[str, ToolConfig]]` |
| `BrowserAutomationPreviewTool` | `name: Optional[str]`, `description: Optional[str]`, `tool_configs: Optional[dict[str, ToolConfig]]` |
| `ComputerUsePreviewTool` | *(no changes)* |
| `FabricIQPreviewTool` | `name: Optional[str]`, `description: Optional[str]`, `tool_configs: Optional[dict[str, ToolConfig]]` |
| `MemorySearchPreviewTool` | `name: Optional[str]`, `description: Optional[str]`, `tool_configs: Optional[dict[str, ToolConfig]]` |
| `MicrosoftFabricPreviewTool` | `name: Optional[str]`, `description: Optional[str]`, `tool_configs: Optional[dict[str, ToolConfig]]` |
| `SharepointPreviewTool` | `name: Optional[str]`, `description: Optional[str]`, `tool_configs: Optional[dict[str, ToolConfig]]` |
| `ToolboxSearchPreviewTool` | `name: Optional[str]`, `description: Optional[str]`, `tool_configs: Optional[dict[str, ToolConfig]]` |
| `WebSearchPreviewTool` | *(no changes)* |
| `WorkIQPreviewTool` | `name: Optional[str]`, `description: Optional[str]`, `tool_configs: Optional[dict[str, ToolConfig]]` |

## Summary

- **Total Tool classes analyzed:** 24
- **Classes with removed properties:** 19
- **Common pattern:** `name`, `description`, and `tool_configs` were moved exclusively to `ToolboxTool` subclasses
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
load_dotenv()

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent")
agent_name = os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent"

with (
DefaultAzureCredential() as credential,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
model = os.environ["FOUNDRY_MODEL_NAME"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent")
agent_name = os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent"
with (
DefaultAzureCredential() as credential,
AIProjectClient(endpoint=endpoint, credential=credential) as project_client,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
model = os.environ["FOUNDRY_MODEL_NAME"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent")
agent_name = os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent"


async def main():
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
load_dotenv()

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent")
agent_name = os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent"

with (
DefaultAzureCredential() as credential,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ class CalendarEvent(BaseModel):


endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent")
agent_name = os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent"

with (
DefaultAzureCredential() as credential,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
load_dotenv()

agent = None
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent")
agent_name = os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent"

with (
DefaultAzureCredential() as credential,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
load_dotenv()

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent")
agent_name = os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent"


tool = AzureAISearchTool(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
agent = None

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent")
agent_name = os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent"


tool = AzureFunctionTool(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
load_dotenv()

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent")
agent_name = os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent"


tool = BingCustomSearchPreviewTool(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
load_dotenv()

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent")
agent_name = os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent"


tool = BingGroundingTool(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
load_dotenv()

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent")
agent_name = os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent"


tool = BrowserAutomationPreviewTool(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
load_dotenv()

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent")
agent_name = os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent"

with (
DefaultAzureCredential() as credential,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
load_dotenv()

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent")
agent_name = os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent"


async def main() -> None:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ async def main() -> None:

# Create agent with code interpreter tool
agent = await project_client.agents.create_version(
agent_name=os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent"),
agent_name=os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent",
definition=PromptAgentDefinition(
model=os.environ["FOUNDRY_MODEL_NAME"],
instructions="You are a helpful assistant.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
load_dotenv()

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent")
agent_name = os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent"

# Initialize state machine
current_state = SearchState.INITIAL
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
load_dotenv()

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent")
agent_name = os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent"


async def main():
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
load_dotenv()

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent")
agent_name = os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent"

tool = MicrosoftFabricPreviewTool(
fabric_dataagent_preview=FabricDataAgentToolParameters(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
load_dotenv()

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent")
agent_name = os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent"

tool_payload = FabricIQPreviewTool(
project_connection_id=os.environ["FABRIC_IQ_PROJECT_CONNECTION_ID"],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@

# Create agent with file search tool
agent = project_client.agents.create_version(
agent_name=os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent"),
agent_name=os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent",
definition=agent_definition,
description="File search agent for product information queries.",
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@

load_dotenv()

agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent")
agent_name = os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent"


def get_horoscope(sign: str) -> str:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
load_dotenv()

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent")
agent_name = os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent"
image_generation_model = os.environ["IMAGE_GENERATION_MODEL_DEPLOYMENT_NAME"]

tool = ImageGenTool(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@

load_dotenv()
endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent")
agent_name = os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent"
image_generation_model = os.environ["IMAGE_GENERATION_MODEL_DEPLOYMENT_NAME"]


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
load_dotenv()

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "MyAgent")
agent_name = os.environ.get("FOUNDRY_AGENT_NAME") or "MyAgent"

mcp_tool = MCPTool(
server_label="api-specs",
Expand Down
Loading
Loading