Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
3b8b56e
Samples fix (#4932)
westey-m Mar 26, 2026
63dee91
.NET: Improve observability sample (#4917)
TaoChenOSU Mar 26, 2026
3585581
.NET: Fix bug with per-service-call persistence and approvals (#4933)
westey-m Mar 26, 2026
9bfa593
Python: Move ag_ui_workflow_handoff demo from demos/ to 05-end-to-end…
moonbox3 Mar 26, 2026
5530bc5
.NET: feat: Implement return-to-previous routing in handoff workflow …
lokitoth Mar 26, 2026
0fcbe7e
.NET: [Breaking] Restructure agent skills to use multi-source archite…
SergeyMenshykh Mar 26, 2026
3611be8
Bump flatted from 3.3.3 to 3.4.2 in /python/packages/devui/frontend (…
dependabot[bot] Mar 27, 2026
cc0cfaa
[BREAKING] Python: fix OpenAI Azure routing and provider samples (#4925)
eavanvalkenburg Mar 27, 2026
451e282
Stage
rogerbarreto Mar 4, 2026
a629a56
Add FoundryAgentClient, model param, chatClientFactory, and RAPI samples
rogerbarreto Mar 4, 2026
0fbb35b
Add auto-discovery constructor and simplify RAPI samples
rogerbarreto Mar 4, 2026
af3c828
Add remaining RAPI samples (Step04-Step12)
rogerbarreto Mar 4, 2026
0e3c129
Add all RAPI samples (Step09-Step23) and switch to AzureCliCredential
rogerbarreto Mar 4, 2026
07fae71
Switch Step01-03 samples to AzureCliCredential for consistency
rogerbarreto Mar 4, 2026
157acb1
Clarify connection ID format in SharePoint and Fabric READMEs
rogerbarreto Mar 5, 2026
851d10a
Normalize env vars, fix structured output, update READMEs with connec…
rogerbarreto Mar 5, 2026
528e178
Refactor memory samples and switch to DefaultAzureCredential
rogerbarreto Mar 5, 2026
154b75e
Switch all RAPI samples to DefaultAzureCredential and format
rogerbarreto Mar 6, 2026
d96e736
Rename to Microsoft Foundry, add metadata, rename RAPI folder
rogerbarreto Mar 6, 2026
2bda25d
Address PR review: simplify sample comments and fix DeepResearch cred…
rogerbarreto Mar 6, 2026
7f880fa
Restore full DefaultAzureCredential warning comment in DeepResearch s…
rogerbarreto Mar 6, 2026
009cd10
Add ADR 0020: Foundry agent type naming convention
rogerbarreto Mar 6, 2026
273a663
Simplify FoundryResponsesAgent samples with env-var constructors and …
rogerbarreto Mar 9, 2026
e6b42ae
Add FoundryAITool factory, rename RAPI folders, and clean up references
rogerbarreto Mar 9, 2026
21c2a0d
Rename FoundryVersionedAgents subfolders from FoundryAgents_* to Foun…
rogerbarreto Mar 9, 2026
d063865
Add FoundryVersionedAgent class and refactor extension method internals
rogerbarreto Mar 9, 2026
0960b69
Add CreateConversationSessionAsync, DeleteAIAgentAsync, auto-resolve …
rogerbarreto Mar 9, 2026
adde342
Remove manual AIProjectClient construction from FoundryVersionedAgent…
rogerbarreto Mar 9, 2026
7dadd91
Replace aiProjectClient extension calls with FoundryVersionedAgent fa…
rogerbarreto Mar 9, 2026
c37b55e
Remove unused using directives from Step01.2, Step09, Eval_Step02
rogerbarreto Mar 9, 2026
45b2c16
Update ADR 0020 with accepted decision: Option 6
rogerbarreto Mar 9, 2026
10bdfe3
Update Step01 basics samples to use FoundryVersionedAgent factories
rogerbarreto Mar 9, 2026
a6f5b89
Add DeleteAIAgentVersionAsync to FoundryVersionedAgent
rogerbarreto Mar 9, 2026
b70c0bf
Fix cleanup comments: DeleteAIAgentAsync deletes the agent and all it…
rogerbarreto Mar 9, 2026
b501840
Update all FoundryVersionedAgents READMEs for FoundryVersionedAgent a…
rogerbarreto Mar 9, 2026
1114950
Revert unrelated AGUI and Hosting.OpenAI formatting changes to main
rogerbarreto Mar 10, 2026
8b68b43
Remove env-var auto-discovery, add AsAIAgent, mark extensions Obsolete
rogerbarreto Mar 11, 2026
040538d
Update all samples to use explicit endpoint, credential, and model pa…
rogerbarreto Mar 11, 2026
abbaa66
Migrate remaining samples and source from obsoleted extension methods
rogerbarreto Mar 11, 2026
93f1121
Add unit tests for FoundryAgent and FoundryVersionedAgent
rogerbarreto Mar 11, 2026
9d3b0cd
Finalize Foundry agent migration
rogerbarreto Mar 11, 2026
34c4c80
Apply formatter cleanup after validation
rogerbarreto Mar 11, 2026
cfd91e1
Add integration tests for FoundryAgent and FoundryVersionedAgent
rogerbarreto Mar 11, 2026
3c959f1
Update ADR 0020 with test coverage details
rogerbarreto Mar 11, 2026
1d968d7
Simplify Foundry agents and validate moved samples
rogerbarreto Mar 13, 2026
bd21a06
Rename FoundryAgent integration tests to ResponsesAgent
rogerbarreto Mar 13, 2026
a95faeb
Update documentation for ChatClientAgent usage
rogerbarreto Mar 13, 2026
9690c4d
Refactor ChatClientAgent instantiation for clarity
rogerbarreto Mar 13, 2026
915075d
Revise agent type naming and usage examples
rogerbarreto Mar 13, 2026
a4d8c5f
Fix Azure SDK namespace migration after rebase
rogerbarreto Mar 23, 2026
b802780
Address merge markers
rogerbarreto Mar 23, 2026
e05e24b
Replace obsolete GetAIAgentAsync with AsAIAgent in samples
rogerbarreto Mar 23, 2026
82a8419
Fix broken markdown links in Responses sample READMEs
rogerbarreto Mar 23, 2026
d274a98
Fix format errors and address PR review comments
rogerbarreto Mar 23, 2026
e73b006
Apply dotnet format fixes to PR-changed files
rogerbarreto Mar 23, 2026
9e91575
Fix build errors from format pass and apply naming conventions
rogerbarreto Mar 23, 2026
337c598
Introduce FoundryAgent sealed type and update AsAIAgent extensions
rogerbarreto Mar 24, 2026
cf910fc
Collapse sample folders and add FoundryAgent_Step01 sample
rogerbarreto Mar 24, 2026
13fd794
Update READMEs for flat AgentsWithFoundry structure
rogerbarreto Mar 24, 2026
8416ce3
Fix FoundryAgent_Step01 sample with full create/run/delete lifecycle
rogerbarreto Mar 24, 2026
748df31
Revert RAPI samples to use AIAgent instead of FoundryAgent
rogerbarreto Mar 24, 2026
4f10db8
Convert versioned-pattern samples to pure RAPI
rogerbarreto Mar 24, 2026
625f820
Fix format issues from Docker CI check
rogerbarreto Mar 24, 2026
5abf396
Switch Step09 MCP sample to Microsoft Learn HTTP endpoint
rogerbarreto Mar 24, 2026
83112b8
Fix missing final newline in Step09 MCP sample
rogerbarreto Mar 24, 2026
3ad2bac
Address PR review: use DelegatingAIAgent, clean up Step01 sample
rogerbarreto Mar 25, 2026
cacd72d
Update sample using Project specialized type instead
rogerbarreto Mar 25, 2026
4d2ec55
Address PR review feedback: DefaultAzureCredential warnings, sample s…
rogerbarreto Mar 26, 2026
649885d
Split Step02, simplify RAG Step04, sharpen Step23 differentiation
rogerbarreto Mar 26, 2026
ef8a4db
Fix Hosted MCP sample: use ResponseTool.CreateMcpTool and move tool t…
rogerbarreto Mar 26, 2026
f287444
Fix broken README link after Step02 split
rogerbarreto Mar 26, 2026
20723d1
Address Sergey round 3 feedback: branding, README nav, sample rename
rogerbarreto Mar 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
46 changes: 27 additions & 19 deletions .github/workflows/python-integration-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,8 @@ jobs:
environment: integration
timeout-minutes: 60
env:
OPENAI_CHAT_MODEL_ID: ${{ vars.OPENAI__CHATMODELID }}
OPENAI_RESPONSES_MODEL_ID: ${{ vars.OPENAI__RESPONSESMODELID }}
OPENAI_EMBEDDINGS_MODEL_ID: ${{ vars.OPENAI_EMBEDDING_MODEL_ID }}
OPENAI_CHAT_MODEL: ${{ vars.OPENAI__CHATMODELID }}
OPENAI_RESPONSES_MODEL: ${{ vars.OPENAI__RESPONSESMODELID }}
OPENAI_MODEL: ${{ vars.OPENAI__RESPONSESMODELID }}
OPENAI_EMBEDDING_MODEL: ${{ vars.OPENAI_EMBEDDING_MODEL_ID }}
OPENAI_API_KEY: ${{ secrets.OPENAI__APIKEY }}
Expand Down Expand Up @@ -96,10 +95,10 @@ jobs:
environment: integration
timeout-minutes: 60
env:
AZURE_OPENAI_CHAT_DEPLOYMENT_NAME: ${{ vars.AZUREOPENAI__RESPONSESDEPLOYMENTNAME }}
AZURE_OPENAI_CHAT_DEPLOYMENT_NAME: ${{ vars.AZUREOPENAI__CHATDEPLOYMENTNAME }}
AZURE_OPENAI_RESPONSES_DEPLOYMENT_NAME: ${{ vars.AZUREOPENAI__RESPONSESDEPLOYMENTNAME }}
AZURE_OPENAI_DEPLOYMENT_NAME: ${{ vars.AZUREOPENAI__RESPONSESDEPLOYMENTNAME }}
AZURE_OPENAI_EMBEDDING_DEPLOYMENT_NAME: ${{ vars.AZUREOPENAI__EMBEDDINGDEPLOYMENTNAME }}
AZURE_OPENAI_EMBEDDING_DEPLOYMENT_NAME: ${{ vars.AZURE_OPENAI_EMBEDDING_DEPLOYMENT_NAME }}
AZURE_OPENAI_ENDPOINT: ${{ vars.AZUREOPENAI__ENDPOINT }}
defaults:
run:
Expand All @@ -126,7 +125,9 @@ jobs:
uv run pytest --import-mode=importlib
packages/openai/tests/openai/test_openai_chat_completion_client_azure.py
packages/openai/tests/openai/test_openai_chat_client_azure.py
packages/openai/tests/openai/test_openai_embedding_client_azure.py
packages/azure-ai/tests/azure_openai
--ignore=packages/azure-ai/tests/azure_openai/test_azure_responses_client_foundry.py
-m integration
-n logical --dist worksteal
--timeout=120 --session-timeout=900 --timeout_method thread
Expand Down Expand Up @@ -202,15 +203,15 @@ jobs:
timeout-minutes: 60
env:
UV_PYTHON: "3.11"
OPENAI_CHAT_MODEL_ID: ${{ vars.OPENAI__CHATMODELID }}
OPENAI_RESPONSES_MODEL_ID: ${{ vars.OPENAI__RESPONSESMODELID }}
OPENAI_CHAT_MODEL: ${{ vars.OPENAI__CHATMODELID }}
OPENAI_RESPONSES_MODEL: ${{ vars.OPENAI__RESPONSESMODELID }}
OPENAI_MODEL: ${{ vars.OPENAI__RESPONSESMODELID }}
OPENAI_API_KEY: ${{ secrets.OPENAI__APIKEY }}
OPENAI_EMBEDDING_MODEL: ${{ vars.OPENAI_EMBEDDING_MODEL_ID }}
OPENAI_API_KEY: ${{ secrets.OPENAI__APIKEY }}
AZURE_OPENAI_ENDPOINT: ${{ vars.AZUREOPENAI__ENDPOINT }}
AZURE_OPENAI_DEPLOYMENT_NAME: ${{ vars.AZUREOPENAI__RESPONSESDEPLOYMENTNAME }}
FOUNDRY_MODEL: ${{ vars.AZUREAI__DEPLOYMENTNAME }}
FOUNDRY_PROJECT_ENDPOINT: ${{ secrets.AZUREAI__ENDPOINT }}
FOUNDRY_PROJECT_ENDPOINT: ${{ vars.FOUNDRY_PROJECT_ENDPOINT }}
FOUNDRY_MODEL: ${{ vars.FOUNDRY_MODEL }}
FUNCTIONS_WORKER_RUNTIME: "python"
DURABLE_TASK_SCHEDULER_CONNECTION_STRING: "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None"
AzureWebJobsStorage: "UseDevelopmentStorage=true"
Expand Down Expand Up @@ -248,17 +249,19 @@ jobs:
--timeout=360 --session-timeout=900 --timeout_method thread
--retries 2 --retry-delay 5

# Azure AI integration tests
python-tests-azure-ai:
name: Python Integration Tests - Azure AI
# Foundry integration tests
python-tests-foundry:
name: Python Integration Tests - Foundry
runs-on: ubuntu-latest
environment: integration
timeout-minutes: 60
env:
AZURE_AI_PROJECT_ENDPOINT: ${{ secrets.AZUREAI__ENDPOINT }}
AZURE_AI_MODEL_DEPLOYMENT_NAME: ${{ vars.AZUREAI__DEPLOYMENTNAME }}
FOUNDRY_PROJECT_ENDPOINT: ${{ secrets.AZUREAI__ENDPOINT }}
FOUNDRY_MODEL: ${{ vars.AZUREAI__DEPLOYMENTNAME }}
FOUNDRY_PROJECT_ENDPOINT: ${{ vars.FOUNDRY_PROJECT_ENDPOINT }}
FOUNDRY_MODEL: ${{ vars.FOUNDRY_MODEL }}
FOUNDRY_AGENT_NAME: ${{ vars.FOUNDRY_AGENT_NAME }}
FOUNDRY_AGENT_VERSION: ${{ vars.FOUNDRY_AGENT_VERSION }}
LOCAL_MCP_URL: ${{ vars.LOCAL_MCP__URL }}
defaults:
run:
Expand All @@ -282,9 +285,14 @@ jobs:
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
- name: Test with pytest
timeout-minutes: 15
run: |
uv run --directory packages/azure-ai poe integration-tests -n logical --dist worksteal --timeout=120 --session-timeout=900 --timeout_method thread --retries 2 --retry-delay 5
uv run --directory packages/foundry poe integration-tests -n logical --dist worksteal --timeout=120 --session-timeout=900 --timeout_method thread --retries 2 --retry-delay 5
run: >
uv run pytest --import-mode=importlib
packages/azure-ai/tests/azure_openai/test_azure_responses_client_foundry.py
packages/foundry/tests
-m integration
-n logical --dist worksteal
--timeout=120 --session-timeout=900 --timeout_method thread
--retries 2 --retry-delay 5

# Azure Cosmos integration tests
python-tests-cosmos:
Expand Down Expand Up @@ -341,7 +349,7 @@ jobs:
python-tests-azure-openai,
python-tests-misc-integration,
python-tests-functions,
python-tests-azure-ai,
python-tests-foundry,
python-tests-cosmos
]
steps:
Expand Down
44 changes: 26 additions & 18 deletions .github/workflows/python-merge-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -141,9 +141,8 @@ jobs:
runs-on: ubuntu-latest
environment: integration
env:
OPENAI_CHAT_MODEL_ID: ${{ vars.OPENAI__CHATMODELID }}
OPENAI_RESPONSES_MODEL_ID: ${{ vars.OPENAI__RESPONSESMODELID }}
OPENAI_EMBEDDINGS_MODEL_ID: ${{ vars.OPENAI_EMBEDDING_MODEL_ID }}
OPENAI_CHAT_MODEL: ${{ vars.OPENAI__CHATMODELID }}
OPENAI_RESPONSES_MODEL: ${{ vars.OPENAI__RESPONSESMODELID }}
OPENAI_MODEL: ${{ vars.OPENAI__RESPONSESMODELID }}
OPENAI_EMBEDDING_MODEL: ${{ vars.OPENAI_EMBEDDING_MODEL_ID }}
OPENAI_API_KEY: ${{ secrets.OPENAI__APIKEY }}
Expand Down Expand Up @@ -195,10 +194,10 @@ jobs:
runs-on: ubuntu-latest
environment: integration
env:
AZURE_OPENAI_CHAT_DEPLOYMENT_NAME: ${{ vars.AZUREOPENAI__RESPONSESDEPLOYMENTNAME }}
AZURE_OPENAI_CHAT_DEPLOYMENT_NAME: ${{ vars.AZUREOPENAI__CHATDEPLOYMENTNAME }}
AZURE_OPENAI_RESPONSES_DEPLOYMENT_NAME: ${{ vars.AZUREOPENAI__RESPONSESDEPLOYMENTNAME }}
AZURE_OPENAI_DEPLOYMENT_NAME: ${{ vars.AZUREOPENAI__RESPONSESDEPLOYMENTNAME }}
AZURE_OPENAI_EMBEDDING_DEPLOYMENT_NAME: ${{ vars.AZUREOPENAI__EMBEDDINGDEPLOYMENTNAME }}
AZURE_OPENAI_EMBEDDING_DEPLOYMENT_NAME: ${{ vars.AZURE_OPENAI_EMBEDDING_DEPLOYMENT_NAME }}
AZURE_OPENAI_ENDPOINT: ${{ vars.AZUREOPENAI__ENDPOINT }}
defaults:
run:
Expand All @@ -223,7 +222,9 @@ jobs:
uv run pytest --import-mode=importlib
packages/openai/tests/openai/test_openai_chat_completion_client_azure.py
packages/openai/tests/openai/test_openai_chat_client_azure.py
packages/openai/tests/openai/test_openai_embedding_client_azure.py
packages/azure-ai/tests/azure_openai
--ignore=packages/azure-ai/tests/azure_openai/test_azure_responses_client_foundry.py
-m integration
-n logical --dist worksteal
--timeout=120 --session-timeout=900 --timeout_method thread
Expand Down Expand Up @@ -333,15 +334,15 @@ jobs:
environment: integration
env:
UV_PYTHON: "3.11"
OPENAI_CHAT_MODEL_ID: ${{ vars.OPENAI__CHATMODELID }}
OPENAI_RESPONSES_MODEL_ID: ${{ vars.OPENAI__RESPONSESMODELID }}
OPENAI_CHAT_MODEL: ${{ vars.OPENAI__CHATMODELID }}
OPENAI_RESPONSES_MODEL: ${{ vars.OPENAI__RESPONSESMODELID }}
OPENAI_MODEL: ${{ vars.OPENAI__RESPONSESMODELID }}
OPENAI_API_KEY: ${{ secrets.OPENAI__APIKEY }}
OPENAI_EMBEDDING_MODEL: ${{ vars.OPENAI_EMBEDDING_MODEL_ID }}
OPENAI_API_KEY: ${{ secrets.OPENAI__APIKEY }}
AZURE_OPENAI_ENDPOINT: ${{ vars.AZUREOPENAI__ENDPOINT }}
AZURE_OPENAI_DEPLOYMENT_NAME: ${{ vars.AZUREOPENAI__RESPONSESDEPLOYMENTNAME }}
FOUNDRY_MODEL: ${{ vars.AZUREAI__DEPLOYMENTNAME }}
FOUNDRY_PROJECT_ENDPOINT: ${{ secrets.AZUREAI__ENDPOINT }}
FOUNDRY_PROJECT_ENDPOINT: ${{ vars.FOUNDRY_PROJECT_ENDPOINT }}
FOUNDRY_MODEL: ${{ vars.FOUNDRY_MODEL }}
FUNCTIONS_WORKER_RUNTIME: "python"
DURABLE_TASK_SCHEDULER_CONNECTION_STRING: "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None"
AzureWebJobsStorage: "UseDevelopmentStorage=true"
Expand Down Expand Up @@ -387,8 +388,8 @@ jobs:
fail-on-empty: false
title: Functions integration test results

python-tests-azure-ai:
name: Python Tests - Azure AI
python-tests-foundry:
name: Python Integration Tests - Foundry
needs: paths-filter
if: >
github.event_name != 'pull_request' &&
Expand All @@ -401,8 +402,10 @@ jobs:
env:
AZURE_AI_PROJECT_ENDPOINT: ${{ secrets.AZUREAI__ENDPOINT }}
AZURE_AI_MODEL_DEPLOYMENT_NAME: ${{ vars.AZUREAI__DEPLOYMENTNAME }}
FOUNDRY_PROJECT_ENDPOINT: ${{ secrets.AZUREAI__ENDPOINT }}
FOUNDRY_MODEL: ${{ vars.AZUREAI__DEPLOYMENTNAME }}
FOUNDRY_PROJECT_ENDPOINT: ${{ vars.FOUNDRY_PROJECT_ENDPOINT }}
FOUNDRY_MODEL: ${{ vars.FOUNDRY_MODEL }}
FOUNDRY_AGENT_NAME: ${{ vars.FOUNDRY_AGENT_NAME }}
FOUNDRY_AGENT_VERSION: ${{ vars.FOUNDRY_AGENT_VERSION }}
LOCAL_MCP_URL: ${{ vars.LOCAL_MCP__URL }}
defaults:
run:
Expand All @@ -424,9 +427,14 @@ jobs:
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
- name: Test with pytest
timeout-minutes: 15
run: |
uv run --directory packages/azure-ai poe integration-tests -n logical --dist worksteal --timeout=120 --session-timeout=900 --timeout_method thread --retries 2 --retry-delay 5
uv run --directory packages/foundry poe integration-tests -n logical --dist worksteal --timeout=120 --session-timeout=900 --timeout_method thread --retries 2 --retry-delay 5
run: >
uv run pytest --import-mode=importlib
packages/azure-ai/tests/azure_openai/test_azure_responses_client_foundry.py
packages/foundry/tests
-m integration
-n logical --dist worksteal
--timeout=120 --session-timeout=900 --timeout_method thread
--retries 2 --retry-delay 5
working-directory: ./python
- name: Test Azure AI samples
timeout-minutes: 10
Expand Down Expand Up @@ -513,7 +521,7 @@ jobs:
python-tests-azure-openai,
python-tests-misc-integration,
python-tests-functions,
python-tests-azure-ai,
python-tests-foundry,
python-tests-cosmos,
]
steps:
Expand Down
125 changes: 125 additions & 0 deletions docs/decisions/0020-foundry-agent-type-naming.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
---
status: accepted
contact: rogerbarreto
date: 2026-03-06
deciders: rogerbarreto, alliscode
consulted: ""
informed: ""
---

# Foundry agent surface stays centered on `ChatClientAgent`

## Context

The Microsoft Foundry integration exposes two distinct usage patterns:

1. Direct Responses usage, where callers provide model, instructions, and tools at runtime.
2. Server-side versioned agents, where callers create and manage `AgentVersion` resources through `AIProjectClient.Agents`.

We briefly explored adding public wrapper types such as `FoundryAgent`, `FoundryVersionedAgent`, and `FoundryResponsesChatClient` to make those paths feel more specialized. That direction created extra public types, duplicated existing `ChatClientAgent` behavior, and pushed samples toward compatibility helpers instead of the native Azure SDK flow.

## Decision

Keep the public surface centered on `ChatClientAgent`.

- Direct Responses scenarios use `AIProjectClient.AsAIAgent(...)`.
- Server-side versioned scenarios use native `AIProjectClient.Agents` APIs to create or retrieve agent resources, then wrap `AgentRecord` or `AgentVersion` with `AIProjectClient.AsAIAgent(...)`.
- Compatibility helpers such as `AIProjectClient.CreateAIAgentAsync(...)` and `AIProjectClient.GetAIAgentAsync(...)` remain only as obsolete migration shims.
- Public wrapper types `FoundryAgent`, `FoundryVersionedAgent`, `FoundryResponsesChatClient`, and `FoundryResponsesChatClientAgent` are not part of the chosen direction.

## Why

- `ChatClientAgent` is already the framework abstraction used everywhere else.
- `AIProjectClient` is the native Azure SDK entry point for versioned agent lifecycle operations.
- A single agent abstraction avoids parallel type hierarchies for the same backend.
- Samples become clearer when they show either:
- direct Responses construction via `AIProjectClient.AsAIAgent(...)`, or
- native Foundry resource management via `AIProjectClient.Agents`.

## Consequences

### Direct Responses path

Use the convenience overloads on `AIProjectClient`:

```csharp
AIProjectClient aiProjectClient = new(new Uri(endpoint), credential);

ChatClientAgent agent = aiProjectClient.AsAIAgent(
model: deploymentName,
instructions: "You are good at telling jokes.",
name: "JokerAgent");
```

Or use composed `ChatClientAgent`

```csharp
ProjectResponsesClient projectResponsesClient = new(new Uri(endpoint), new DefaultAzureCredential(), new AgentReference($"model:{deploymentName}"));

ChatClientAgent agent = new(
chatClient: projectResponsesClient.AsIChatClient(),
instructions: "You are good at telling jokes.",
name: "JokerAgent");
```

This path is code-first and does not create a persistent server-side agent.

### Versioned agent path

Use the convenience overloads on `AIProjectClient`:

```csharp
AIProjectClient aiProjectClient = new(new Uri(endpoint), credential);

AgentVersion version = await aiProjectClient.Agents.CreateAgentVersionAsync(
"JokerAgent",
new AgentVersionCreationOptions(
new PromptAgentDefinition(deploymentName)
{
Instructions = "You are good at telling jokes."
}));

ChatClientAgent agent = aiProjectClient.AsAIAgent(version);
```

Or use composed `ChatClientAgent`

```csharp
AIProjectClient aiProjectClient = new(new Uri(endpoint), credential);

AgentVersion version = await aiProjectClient.Agents.CreateAgentVersionAsync(
"JokerAgent",
new AgentVersionCreationOptions(
new PromptAgentDefinition(deploymentName)
{
Instructions = "You are good at telling jokes."
}));

ProjectResponsesClient projectResponsesClient = aiProjectClient
.GetProjectOpenAIClient()
.GetProjectResponsesClientForAgent(new AgentReference(version.Name, version.Version));

ChatClientAgent agent = new(
chatClient: projectResponsesClient.AsIChatClient(),
name: "JokerAgent");
```

### Samples

- `FoundryAgents/` samples show the direct Responses path with `AIProjectClient.AsAIAgent(...)`.
- `FoundryVersionedAgents/` samples should show native `AIProjectClient.Agents` create/get/delete flows plus `AsAIAgent(...)`.

### Compatibility APIs

Obsolete helper extensions remain only to ease migration of existing code. New samples and new guidance should not be written against them.

## Rejected direction

Do not introduce or preserve separate public wrapper types whose main purpose is to forward to `ChatClientAgent` while carrying Foundry-specific naming.

That approach:

- duplicates lifecycle concepts already present on `AIProjectClient`,
- fragments the public API,
- complicates samples and docs,
- and makes migration harder by encouraging wrapper-specific affordances.
Loading