Skip to content

Commit fdb9a0c

Browse files
nick863trrwilson
andauthored
Regenerate code (#53960)
* Regenerate code * Comment one test and record Mempry tores CRUD test. * fix discovered pagination issue and prep for beta.3 --------- Co-authored-by: Travis Wilson <[email protected]>
1 parent 3901640 commit fdb9a0c

File tree

82 files changed

+285
-107
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+285
-107
lines changed

sdk/ai/Azure.AI.Agents/README.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Azure AI Agents client library for .NET
22

3+
> [!WARNING]
4+
> This feature branch folder is outdated and pending removal.
5+
>
6+
> Please refer to the `Azure.AI.Projects` and `Azure.AI.Projects.OpenAI` folders for the up-to-date code and information about Agents.
7+
38
Develop Agents using the Azure AI Foundry platform, leveraging an extensive ecosystem of models, tools, and capabilities from OpenAI, Microsoft, and other LLM providers.
49

510
**Note:** While this package can be used independently, we recommend using the Azure AI Projects client library (Azure.AI.Projects) for enhanced experience. The Projects library provides simplified access to advanced functionality, such as creating and managing Agents, enumerating AI models, working with datasets, managing search indexes, evaluating generative AI performance, and enabling OpenTelemetry tracing.
@@ -24,7 +29,7 @@ Develop Agents using the Azure AI Foundry platform, leveraging an extensive ecos
2429
- [Prompt Agents](#prompt-agents)
2530
- [Agents](#agents)
2631
- [Responses](#responses)
27-
- [Coversations](#coversations)
32+
- [Conversations](#Conversations)
2833
- [Container App](#container-app)
2934
- [File search](#file-search)
3035
- [Code interpreter](#code-interpreter)
@@ -250,7 +255,7 @@ Finally, we need to remove the `AgentVersion` object.
250255
await agentClient.DeleteAgentAsync(agentName: "myAgent");
251256
```
252257

253-
#### Coversations
258+
#### Conversations
254259

255260
Conversations may be used to store the previous conversation with the agent. To add the responses to a conversation,
256261
set the conversation ID to the `ResponseCreationOptions`.

sdk/ai/Azure.AI.Agents/samples/Sample1_Agent_Versions.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,17 +57,17 @@ await foreach (AgentVersion oneAgentVersion in agentVersions)
5757
4. To communicate with the agent, we will need to create a conversation.
5858

5959
Synchronous sample:
60-
```C# Snippet:Sample_CreateCoversation_Sync_2
61-
ConversationClient coversations = client.GetConversationClient();
62-
AgentConversation conversation = coversations.CreateConversation();
60+
```C# Snippet:Sample_CreateConversation_Sync_2
61+
ConversationClient Conversations = client.GetConversationClient();
62+
AgentConversation conversation = Conversations.CreateConversation();
6363
ModelReaderWriterOptions options = new("W");
6464
BinaryData conversationBin = ((IPersistableModel<AgentConversation>)conversation).Write(options);
6565
```
6666

6767
Asynchronous sample:
68-
```C# Snippet:Sample_CreateCoversation_Async_2
69-
ConversationClient coversations = client.GetConversationClient();
70-
AgentConversation conversation = await coversations.CreateConversationAsync();
68+
```C# Snippet:Sample_CreateConversation_Async_2
69+
ConversationClient Conversations = client.GetConversationClient();
70+
AgentConversation conversation = await Conversations.CreateConversationAsync();
7171
ModelReaderWriterOptions options = new("W");
7272
BinaryData conversationBin = ((IPersistableModel<AgentConversation>)conversation).Write(options);
7373
```
@@ -129,12 +129,12 @@ Console.WriteLine(response.GetOutputText());
129129

130130
Synchronous sample:
131131
```C# Snippet:Sample_Cleanup_Sync_2
132-
coversations.DeleteConversation(conversationId: conversation.Id);
132+
Conversations.DeleteConversation(conversationId: conversation.Id);
133133
client.DeleteAgentVersion(agentName: agentVersion.Name, agentVersion: agentVersion.Version);
134134
```
135135

136136
Asynchronous sample:
137137
```C# Snippet:Sample_Cleanup_Async_2
138-
await coversations.DeleteConversationAsync(conversationId: conversation.Id);
138+
await Conversations.DeleteConversationAsync(conversationId: conversation.Id);
139139
await client.DeleteAgentVersionAsync(agentName: agentVersion.Name, agentVersion: agentVersion.Version);
140140
```

sdk/ai/Azure.AI.Agents/tests/Samples/Sample_CreateAgentVersion.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ public async Task CreateAgentVersionAsync()
4848
}
4949
#endregion
5050

51-
#region Snippet:Sample_CreateCoversation_Async_2
52-
ConversationClient coversations = client.GetConversationClient();
53-
AgentConversation conversation = await coversations.CreateConversationAsync();
51+
#region Snippet:Sample_CreateConversation_Async_2
52+
ConversationClient Conversations = client.GetConversationClient();
53+
AgentConversation conversation = await Conversations.CreateConversationAsync();
5454
ModelReaderWriterOptions options = new("W");
5555
BinaryData conversationBin = ((IPersistableModel<AgentConversation>)conversation).Write(options);
5656
#endregion
@@ -77,7 +77,7 @@ public async Task CreateAgentVersionAsync()
7777
Console.WriteLine(response.GetOutputText());
7878
#endregion
7979
#region Snippet:Sample_Cleanup_Async_2
80-
await coversations.DeleteConversationAsync(conversationId: conversation.Id);
80+
await Conversations.DeleteConversationAsync(conversationId: conversation.Id);
8181
await client.DeleteAgentVersionAsync(agentName: agentVersion.Name, agentVersion: agentVersion.Version);
8282
#endregion
8383
}
@@ -112,9 +112,9 @@ public void CreateAgentVersion()
112112
}
113113
#endregion
114114

115-
#region Snippet:Sample_CreateCoversation_Sync_2
116-
ConversationClient coversations = client.GetConversationClient();
117-
AgentConversation conversation = coversations.CreateConversation();
115+
#region Snippet:Sample_CreateConversation_Sync_2
116+
ConversationClient Conversations = client.GetConversationClient();
117+
AgentConversation conversation = Conversations.CreateConversation();
118118
ModelReaderWriterOptions options = new("W");
119119
BinaryData conversationBin = ((IPersistableModel<AgentConversation>)conversation).Write(options);
120120
#endregion
@@ -142,7 +142,7 @@ public void CreateAgentVersion()
142142
Console.WriteLine(response.GetOutputText());
143143
#endregion
144144
#region Snippet:Sample_Cleanup_Sync_2
145-
coversations.DeleteConversation(conversationId: conversation.Id);
145+
Conversations.DeleteConversation(conversationId: conversation.Id);
146146
client.DeleteAgentVersion(agentName: agentVersion.Name, agentVersion: agentVersion.Version);
147147
#endregion
148148
}

sdk/ai/Azure.AI.Projects.OpenAI/CHANGELOG.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
# Release History
22

3-
## 1.0.0-beta.3 (Unreleased)
3+
## 1.0.0-beta.3 (2025-11-15)
4+
5+
### Bugs Fixed
6+
7+
- Addressed an issue that caused paginated responses like conversation items to never terminate when large numbers of items are fetched
8+
9+
## 1.0.0-beta.3 (2025-11-14)
410

511
### Features Added
612

@@ -12,7 +18,7 @@
1218

1319
## 1.0.0-beta.2 (2025-11-14)
1420

15-
### Bugs fixed
21+
### Bugs Fixed
1622

1723
- Addressed a problem where not supplying an options instance to the `ProjectResponsesClient` constructor resulted in fallback to the `https://api.openai.com/v1` endpoint
1824

sdk/ai/Azure.AI.Projects.OpenAI/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Develop Agents using the Azure AI Foundry platform, leveraging an extensive ecos
2424
- [Prompt Agents](#prompt-agents)
2525
- [Agents](#agents)
2626
- [Responses](#responses)
27-
- [Coversations](#coversations)
27+
- [Conversations](#Conversations)
2828
- [Container App](#container-app)
2929
- [File search](#file-search)
3030
- [Code interpreter](#code-interpreter)

sdk/ai/Azure.AI.Projects.OpenAI/assets.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
"AssetsRepo": "Azure/azure-sdk-assets",
33
"AssetsRepoPrefixPath": "net",
44
"TagPrefix": "net/ai/Azure.AI.Projects.OpenAI",
5-
"Tag": "net/ai/Azure.AI.Projects.OpenAI_8a364fa4af"
5+
"Tag": "net/ai/Azure.AI.Projects.OpenAI_ed5f3bf439"
66
}

sdk/ai/Azure.AI.Projects.OpenAI/samples/Sample5_MemorySearchTool.md

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,20 +58,21 @@ OpenAIResponse response = await responseClient.CreateResponseAsync([request]);
5858
Synchronous sample:
5959
```C# Snippet:Sample_WriteOutput_MemoryTool_Sync
6060
string scope = "Joke from conversation";
61-
List<ResponseItem> updateItems = [request];
61+
MemoryUpdateOptions memoryOptions = new(scope);
62+
memoryOptions.Items.Add(request);
6263
Assert.That(response.Status, Is.EqualTo(ResponseStatus.Completed));
63-
6464
foreach (ResponseItem item in response.OutputItems)
6565
{
66-
updateItems.Add(item);
66+
memoryOptions.Items.Add(item);
6767
}
6868
Console.WriteLine(response.GetOutputText());
6969
```
7070

7171
Asynchronous sample:
7272
```C# Snippet:Sample_WriteOutput_MemoryTool_Async
7373
string scope = "Joke from conversation";
74-
List<ResponseItem> updateItems = [request];
74+
MemoryUpdateOptions memoryOptions = new(scope);
75+
memoryOptions.Items.Add(request);
7576
while (response.Status != ResponseStatus.Incomplete && response.Status != ResponseStatus.Failed && response.Status != ResponseStatus.Completed){
7677
await Task.Delay(TimeSpan.FromMilliseconds(500));
7778
response = await responseClient.GetResponseAsync(responseId: response.Id);
@@ -80,7 +81,7 @@ Assert.That(response.Status, Is.EqualTo(ResponseStatus.Completed));
8081

8182
foreach (ResponseItem item in response.OutputItems)
8283
{
83-
updateItems.Add(item);
84+
memoryOptions.Items.Add(item);
8485
}
8586
Console.WriteLine(response.GetOutputText());
8687
```
@@ -98,12 +99,12 @@ MemoryStore memoryStore = projectClient.MemoryStores.CreateMemoryStore(
9899
definition: memoryStoreDefinition,
99100
description: "Memory store for conversation."
100101
);
101-
MemoryUpdateOptions updateOptions = new(scope);
102-
foreach (ResponseItem updateItem in updateItems)
102+
MemoryUpdateResult updateResult = projectClient.MemoryStores.UpdateMemories(memoryStoreName: memoryStore.Name, options: memoryOptions);
103+
while (updateResult.Status != MemoryStoreUpdateStatus.Failed && updateResult.Status != MemoryStoreUpdateStatus.Completed)
103104
{
104-
updateOptions.Items.Add(updateItem);
105+
Thread.Sleep(TimeSpan.FromMilliseconds(500));
106+
updateResult = await projectClient.MemoryStores.GetUpdateResultAsync(memoryStore.Name, updateResult.UpdateId);
105107
}
106-
projectClient.MemoryStores.UpdateMemories(memoryStoreName: memoryStore.Name, options: updateOptions);
107108
```
108109

109110
Asynchronous sample:
@@ -117,7 +118,12 @@ MemoryStore memoryStore = await projectClient.MemoryStores.CreateMemoryStoreAsyn
117118
definition: memoryStoreDefinition,
118119
description: "Memory store for conversation."
119120
);
120-
projectClient.MemoryStores.UpdateMemories(memoryStore.Name, new MemoryUpdateOptions(scope));
121+
MemoryUpdateResult updateResult = await projectClient.MemoryStores.UpdateMemoriesAsync(memoryStoreName: memoryStore.Name, options: memoryOptions);
122+
while (updateResult.Status != MemoryStoreUpdateStatus.Failed && updateResult.Status != MemoryStoreUpdateStatus.Completed)
123+
{
124+
await Task.Delay(TimeSpan.FromMilliseconds(500));
125+
updateResult = await projectClient.MemoryStores.GetUpdateResultAsync(memoryStore.Name, updateResult.UpdateId);
126+
}
121127
```
122128

123129
7. Check that the memory store contain the relevant memories.

sdk/ai/Azure.AI.Projects.OpenAI/src/Azure.AI.Projects.OpenAI.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
ongoing forward compatibility.
99
</Description>
1010
<AssemblyTitle>Microsoft Foundry OpenAI .NET Extensions</AssemblyTitle>
11-
<Version>1.0.0-beta.2</Version>
11+
<Version>1.0.0-beta.3</Version>
1212
<PackageTags>Azure.AI.Projects.OpenAI</PackageTags>
1313
<TargetFrameworks>$(RequiredTargetFrameworks)</TargetFrameworks>
1414
<NoWarn>$(NoWarn);OPENAI001;CS1591;AZC0007;AZC0012;AZC0015;AZC0030;AZC0031;AZC0034;SA1649;SA1402;AZC0035</NoWarn>

sdk/ai/Azure.AI.Projects.OpenAI/src/Custom/Internal/InternalOpenAICollectionResultOptions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ public InternalOpenAICollectionResultOptions GetCloneForPage<T>(InternalOpenAIPa
5757
ParentResourceId = ParentResourceId,
5858
Limit = Limit,
5959
Order = Order,
60-
AfterId = AfterId,
61-
BeforeId = BeforeId,
60+
AfterId = page.LastId,
61+
BeforeId = page.FirstId,
6262
};
6363
clonedOptions.Filters.AddRange(Filters);
6464
clonedOptions.Includes.AddRange(Includes);

sdk/ai/Azure.AI.Projects.OpenAI/tests/ConversationsTests.cs

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44
using System.ClientModel;
55
using System.ClientModel.Primitives;
66
using System.Collections.Generic;
7+
using System.Collections.ObjectModel;
78
using System.Linq;
89
using System.Text;
910
using System.Threading.Tasks;
11+
using Azure.AI.Projects.OpenAI;
1012
using Microsoft.ClientModel.TestFramework;
1113
using NUnit.Framework;
12-
using Azure.AI.Projects.OpenAI;
1314
using OpenAI;
1415
using OpenAI.Files;
1516
using OpenAI.Responses;
@@ -106,4 +107,82 @@ public async Task ConversationOperationsWork()
106107
}
107108
}
108109
}
110+
111+
[RecordedTest]
112+
public async Task ConversationItemPaginationWorks()
113+
{
114+
ProjectOpenAIClient client = GetTestProjectOpenAIClient();
115+
116+
// Create a conversation
117+
ProjectConversation conversation = await client.Conversations.CreateProjectConversationAsync();
118+
Assert.That(conversation?.Id, Does.StartWith("conv_"));
119+
120+
// Create 40 messages for the conversation
121+
List<ResponseItem> messagesToAdd = new();
122+
for (int i = 1; i <= 40; i++)
123+
{
124+
messagesToAdd.Add(ResponseItem.CreateUserMessageItem($"Message {i}"));
125+
}
126+
127+
// Trying to add all 40 at once should fail
128+
ClientResultException exceptionFromOperation = Assert.ThrowsAsync<ClientResultException>(async () => _ = await client.Conversations.CreateProjectConversationItemsAsync(conversation.Id, messagesToAdd));
129+
Assert.That(exceptionFromOperation.GetRawResponse().Content.ToString(), Does.Contain("20 items"));
130+
131+
List<ResponseItem> firstHalfMessages = [];
132+
for (int i = 0; i < 20; i++)
133+
{
134+
firstHalfMessages.Add(messagesToAdd[i]);
135+
}
136+
List<ResponseItem> secondHalfMessages = [];
137+
for (int i = 20; i < messagesToAdd.Count; i++)
138+
{
139+
secondHalfMessages.Add(messagesToAdd[i]);
140+
}
141+
142+
ReadOnlyCollection<ResponseItem> createdItems = await client.Conversations.CreateProjectConversationItemsAsync(
143+
conversation.Id,
144+
firstHalfMessages);
145+
Assert.That(createdItems, Has.Count.EqualTo(20));
146+
createdItems = await client.Conversations.CreateProjectConversationItemsAsync(conversation.Id, secondHalfMessages);
147+
Assert.That(createdItems, Has.Count.EqualTo(20));
148+
149+
// Test ascending order traversal
150+
List<AgentResponseItem> ascendingItems = [];
151+
await foreach (AgentResponseItem item in client.Conversations.GetProjectConversationItemsAsync(
152+
conversation.Id,
153+
limit: 5,
154+
order: "asc"))
155+
{
156+
ascendingItems.Add(item);
157+
}
158+
Assert.That(ascendingItems, Has.Count.EqualTo(40));
159+
160+
// Test descending order traversal
161+
List<AgentResponseItem> descendingItems = [];
162+
await foreach (AgentResponseItem item in client.Conversations.GetProjectConversationItemsAsync(
163+
conversation.Id,
164+
limit: 5,
165+
order: "desc"))
166+
{
167+
descendingItems.Add(item);
168+
}
169+
Assert.That(descendingItems, Has.Count.EqualTo(40));
170+
171+
// Verify that ascending and descending lists contain the same items but in reverse order
172+
descendingItems.Reverse();
173+
Assert.That(ascendingItems.Count, Is.EqualTo(descendingItems.Count));
174+
for (int i = 0; i < ascendingItems.Count; i++)
175+
{
176+
Assert.That(ascendingItems[i].Id, Is.EqualTo(descendingItems[i].Id),
177+
$"Item at position {i} should be the same in both orderings");
178+
}
179+
180+
// Verify that we can collect all items consistently
181+
List<AgentResponseItem> allItems = [];
182+
await foreach (AgentResponseItem item in client.Conversations.GetProjectConversationItemsAsync(conversation.Id))
183+
{
184+
allItems.Add(item);
185+
}
186+
Assert.That(allItems, Has.Count.EqualTo(40));
187+
}
109188
}

0 commit comments

Comments
 (0)