Skip to content

Commit 185b9a1

Browse files
Merge branch 'graduate-liquid-package' of https://github.com/SergeyMenshykh/semantic-kernel into graduate-liquid-package
2 parents 6127913 + 9d72193 commit 185b9a1

File tree

12 files changed

+262
-55
lines changed

12 files changed

+262
-55
lines changed

dotnet/Directory.Packages.props

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<PackageVersion Include="Azure.AI.ContentSafety" Version="1.0.0" />
1919
<PackageVersion Include="Azure.AI.Inference" Version="1.0.0-beta.2" />
2020
<PackageVersion Include="Azure.AI.OpenAI" Version="[2.2.0-beta.4]" />
21-
<PackageVersion Include="Azure.AI.Projects" Version="[1.0.0-beta.3]" />
21+
<PackageVersion Include="Azure.AI.Projects" Version="[1.0.0-beta.7]" />
2222
<PackageVersion Include="Azure.Identity" Version="1.13.2" />
2323
<PackageVersion Include="Azure.Monitor.OpenTelemetry.Exporter" Version="1.3.0" />
2424
<PackageVersion Include="Azure.Search.Documents" Version="11.6.0" />

dotnet/samples/GettingStartedWithAgents/AzureAIAgent/Step08_AzureAIAgent_Declarative.cs

+21-14
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ public async Task AzureAIAgentWithConfiguration()
4141
var kernel = builder.Build();
4242

4343
var agent = await factory.CreateAgentFromYamlAsync(text, new() { Kernel = kernel }, TestConfiguration.ConfigurationRoot);
44-
Assert.NotNull(agent);
4544

4645
await InvokeAgentAsync(agent!, "Could you please create a bar chart for the operating profit using the following data and provide the file to me? Company A: $1.2 million, Company B: $2.5 million, Company C: $3.0 million, Company D: $1.8 million");
4746
}
@@ -55,17 +54,33 @@ public async Task AzureAIAgentWithKernel()
5554
name: MyAgent
5655
description: My helpful agent.
5756
instructions: You are helpful agent.
58-
model:
59-
id: ${AzureAI:ChatModelId}
6057
""";
6158
AzureAIAgentFactory factory = new();
6259

6360
var agent = await factory.CreateAgentFromYamlAsync(text, new() { Kernel = this._kernel }, TestConfiguration.ConfigurationRoot);
64-
Assert.NotNull(agent);
6561

6662
await InvokeAgentAsync(agent!, "Could you please create a bar chart for the operating profit using the following data and provide the file to me? Company A: $1.2 million, Company B: $2.5 million, Company C: $3.0 million, Company D: $1.8 million");
6763
}
6864

65+
[Fact]
66+
public async Task AzureAIAgentWithId()
67+
{
68+
var text =
69+
"""
70+
id: ${AzureAI:AgentId}
71+
type: foundry_agent
72+
instructions: You are helpful agent who always responds in French.
73+
""";
74+
AzureAIAgentFactory factory = new();
75+
76+
var agent = await factory.CreateAgentFromYamlAsync(text, new() { Kernel = this._kernel }, TestConfiguration.ConfigurationRoot);
77+
78+
await InvokeAgentAsync(
79+
agent!,
80+
"Could you please create a bar chart for the operating profit using the following data and provide the file to me? Company A: $1.2 million, Company B: $2.5 million, Company C: $3.0 million, Company D: $1.8 million",
81+
deleteAgent: false);
82+
}
83+
6984
[Fact]
7085
public async Task AzureAIAgentWithCodeInterpreter()
7186
{
@@ -83,7 +98,6 @@ public async Task AzureAIAgentWithCodeInterpreter()
8398
AzureAIAgentFactory factory = new();
8499

85100
var agent = await factory.CreateAgentFromYamlAsync(text, new() { Kernel = this._kernel }, TestConfiguration.ConfigurationRoot);
86-
Assert.NotNull(agent);
87101

88102
await InvokeAgentAsync(agent!, "Use code to determine the values in the Fibonacci sequence that that are less then the value of 101?");
89103
}
@@ -121,7 +135,6 @@ public async Task AzureAIAgentWithFunctions()
121135
this._kernel.Plugins.Add(plugin);
122136

123137
var agent = await factory.CreateAgentFromYamlAsync(text, new() { Kernel = this._kernel }, TestConfiguration.ConfigurationRoot);
124-
Assert.NotNull(agent);
125138

126139
await InvokeAgentAsync(agent!, "What is the special soup and how much does it cost?");
127140
}
@@ -151,7 +164,6 @@ public async Task AzureAIAgentWithBingGrounding()
151164
this._kernel.Plugins.Add(plugin);
152165

153166
var agent = await factory.CreateAgentFromYamlAsync(text, new() { Kernel = this._kernel }, TestConfiguration.ConfigurationRoot);
154-
Assert.NotNull(agent);
155167

156168
await InvokeAgentAsync(agent!, "What is the latest new about the Semantic Kernel?");
157169
}
@@ -182,7 +194,6 @@ public async Task AzureAIAgentWithFileSearch()
182194
this._kernel.Plugins.Add(plugin);
183195

184196
var agent = await factory.CreateAgentFromYamlAsync(text, new() { Kernel = this._kernel }, TestConfiguration.ConfigurationRoot);
185-
Assert.NotNull(agent);
186197

187198
await InvokeAgentAsync(agent!, "What are the key features of the Semantic Kernel?");
188199
}
@@ -272,7 +283,6 @@ public async Task AzureAIAgentWithOpenAPI()
272283
AzureAIAgentFactory factory = new();
273284

274285
var agent = await factory.CreateAgentFromYamlAsync(text, new() { Kernel = this._kernel }, TestConfiguration.ConfigurationRoot);
275-
Assert.NotNull(agent);
276286

277287
await InvokeAgentAsync(agent!, "What is the current weather in Dublin?");
278288
}
@@ -339,7 +349,6 @@ public async Task AzureAIAgentWithOpenAPIYaml()
339349
AzureAIAgentFactory factory = new();
340350

341351
var agent = await factory.CreateAgentFromYamlAsync(text, new() { Kernel = this._kernel }, TestConfiguration.ConfigurationRoot);
342-
Assert.NotNull(agent);
343352

344353
await InvokeAgentAsync(agent!, "What is the current weather in Dublin?");
345354
}
@@ -374,7 +383,6 @@ public async Task AzureAIAgentWithTemplate()
374383
var promptTemplateFactory = new KernelPromptTemplateFactory();
375384

376385
var agent = await factory.CreateAgentFromYamlAsync(text, new() { Kernel = this._kernel }, TestConfiguration.ConfigurationRoot);
377-
Assert.NotNull(agent);
378386

379387
var options = new AgentInvokeOptions()
380388
{
@@ -388,7 +396,7 @@ public async Task AzureAIAgentWithTemplate()
388396
Microsoft.SemanticKernel.Agents.AgentThread? agentThread = null;
389397
try
390398
{
391-
await foreach (var response in agent.InvokeAsync([], agentThread, options))
399+
await foreach (var response in agent!.InvokeAsync([], agentThread, options))
392400
{
393401
agentThread = response.Thread;
394402
this.WriteAgentChatMessage(response);
@@ -397,8 +405,7 @@ public async Task AzureAIAgentWithTemplate()
397405
finally
398406
{
399407
var azureaiAgent = agent as AzureAIAgent;
400-
Assert.NotNull(azureaiAgent);
401-
await azureaiAgent.Client.DeleteAgentAsync(azureaiAgent.Id);
408+
await azureaiAgent!.Client.DeleteAgentAsync(azureaiAgent.Id);
402409

403410
if (agentThread is not null)
404411
{

dotnet/samples/GettingStartedWithAgents/BedrockAgent/Step07_BedrockAgent_Declarative.cs

+24-4
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,24 @@ public async Task BedrockAgentWithConfiguration()
3939
await InvokeAgentAsync(agent!, "Cats and Dogs");
4040
}
4141

42+
/// <summary>
43+
/// Demonstrates loading an existing Bedrock Agent.
44+
/// </summary>
45+
[Fact]
46+
public async Task BedrockAgentWithId()
47+
{
48+
var text =
49+
"""
50+
id: ${BedrockAgent:AgentId}
51+
type: bedrock_agent
52+
""";
53+
BedrockAgentFactory factory = new();
54+
55+
var agent = await factory.CreateAgentFromYamlAsync(text, configuration: TestConfiguration.ConfigurationRoot);
56+
57+
await InvokeAgentAsync(agent!, "What is Semantic Kernel?", false);
58+
}
59+
4260
/// <summary>
4361
/// Demonstrates creating and using a Bedrock Agent with a code interpreter.
4462
/// </summary>
@@ -175,7 +193,7 @@ protected override async Task<BedrockAgent> CreateAgentAsync(string agentName)
175193
/// <summary>
176194
/// Invoke the agent with the user input.
177195
/// </summary>
178-
private async Task InvokeAgentAsync(Agent agent, string input)
196+
private async Task InvokeAgentAsync(Agent agent, string input, bool deleteAgent = true)
179197
{
180198
AgentThread? agentThread = null;
181199
try
@@ -192,9 +210,11 @@ private async Task InvokeAgentAsync(Agent agent, string input)
192210
}
193211
finally
194212
{
195-
var bedrockAgent = agent as BedrockAgent;
196-
Assert.NotNull(bedrockAgent);
197-
await bedrockAgent.Client.DeleteAgentAsync(new() { AgentId = bedrockAgent.Id });
213+
if (deleteAgent)
214+
{
215+
var bedrockAgent = agent as BedrockAgent;
216+
await bedrockAgent!.Client.DeleteAgentAsync(new() { AgentId = bedrockAgent.Id });
217+
}
198218

199219
if (agentThread is not null)
200220
{

dotnet/samples/GettingStartedWithAgents/OpenAIAssistant/Step07_Assistant_Declarative.cs

+26-4
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,26 @@ public async Task OpenAIAssistantAgentWithKernel()
9191
await InvokeAgentAsync(agent!, "Cats and Dogs");
9292
}
9393

94+
/// <summary>
95+
/// Demonstrates loading an existing OpenAI Assistant.
96+
/// </summary>
97+
[Fact]
98+
public async Task OpenAIAssistantAgentWithId()
99+
{
100+
var text =
101+
"""
102+
id: ${AzureOpenAI:AgentId}
103+
type: openai_assistant
104+
name: StoryAgent
105+
instructions: Tell a story suitable for children about the topic provided by the user. You always respond in French.
106+
""";
107+
OpenAIAssistantAgentFactory factory = new();
108+
109+
var agent = await factory.CreateAgentFromYamlAsync(text, new() { Kernel = this._kernel }, configuration: TestConfiguration.ConfigurationRoot);
110+
111+
await InvokeAgentAsync(agent!, "Cats and Dogs", deleteAgent: false);
112+
}
113+
94114
/// <summary>
95115
/// Demonstrates creating and using a OpenAI Assistant with templated instructions.
96116
/// </summary>
@@ -170,7 +190,7 @@ public Step07_Assistant_Declarative(ITestOutputHelper output) : base(output)
170190
/// <summary>
171191
/// Invoke the agent with the user input.
172192
/// </summary>
173-
private async Task InvokeAgentAsync(Agent agent, string input)
193+
private async Task InvokeAgentAsync(Agent agent, string input, bool deleteAgent = true)
174194
{
175195
AgentThread? agentThread = null;
176196
try
@@ -187,9 +207,11 @@ private async Task InvokeAgentAsync(Agent agent, string input)
187207
}
188208
finally
189209
{
190-
var openaiAgent = agent as OpenAIAssistantAgent;
191-
Assert.NotNull(openaiAgent);
192-
await openaiAgent.Client.DeleteAssistantAsync(openaiAgent.Id);
210+
if (deleteAgent)
211+
{
212+
var openaiAgent = agent as OpenAIAssistantAgent;
213+
await openaiAgent!.Client.DeleteAssistantAsync(openaiAgent.Id);
214+
}
193215

194216
if (agentThread is not null)
195217
{

dotnet/src/Agents/AzureAI/Definition/AzureAIAgentFactory.cs

+22-3
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,34 @@ public AzureAIAgentFactory()
3030
public override async Task<Agent?> TryCreateAsync(Kernel kernel, AgentDefinition agentDefinition, AgentCreationOptions? agentCreationOptions = null, CancellationToken cancellationToken = default)
3131
{
3232
Verify.NotNull(agentDefinition);
33-
Verify.NotNull(agentDefinition.Model);
34-
Verify.NotNull(agentDefinition.Model.Id);
3533

3634
if (agentDefinition.Type?.Equals(AzureAIAgentType, System.StringComparison.Ordinal) ?? false)
3735
{
3836
var projectClient = agentDefinition.GetAIProjectClient(kernel);
3937

4038
AgentsClient client = projectClient.GetAgentsClient();
41-
Azure.AI.Projects.Agent agent = await client.CreateAgentAsync(
39+
Azure.AI.Projects.Agent agent;
40+
if (!string.IsNullOrEmpty(agentDefinition.Id))
41+
{
42+
// Get an existing agent
43+
agent = await client.GetAgentAsync(
44+
agentDefinition.Id,
45+
cancellationToken: cancellationToken).ConfigureAwait(false);
46+
47+
return new AzureAIAgent(agent, client)
48+
{
49+
Kernel = kernel,
50+
Arguments = agentDefinition.GetDefaultKernelArguments(kernel) ?? [],
51+
Template = agentDefinition.GetPromptTemplate(kernel, agentCreationOptions?.PromptTemplateFactory),
52+
Instructions = agentDefinition.Instructions ?? agent.Instructions,
53+
};
54+
}
55+
56+
// Create a new agent
57+
Verify.NotNull(agentDefinition.Model);
58+
Verify.NotNull(agentDefinition.Model.Id);
59+
60+
agent = await client.CreateAgentAsync(
4261
model: agentDefinition.Model.Id,
4362
name: agentDefinition.Name,
4463
description: agentDefinition.Description,

dotnet/src/Agents/Bedrock/Definition/BedrockAgentFactory.cs

+28-7
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,39 @@ public BedrockAgentFactory()
3333
public override async Task<Agent?> TryCreateAsync(Kernel kernel, AgentDefinition agentDefinition, AgentCreationOptions? agentCreationOptions = null, CancellationToken cancellationToken = default)
3434
{
3535
Verify.NotNull(agentDefinition);
36-
Verify.NotNull(agentDefinition.Name);
37-
Verify.NotNull(agentDefinition.Description);
38-
Verify.NotNull(agentDefinition.Instructions);
39-
Verify.NotNull(agentDefinition.Model);
40-
Verify.NotNull(agentDefinition.Model.Id);
4136

4237
if (agentDefinition.Type?.Equals(BedrockAgentType, System.StringComparison.Ordinal) ?? false)
4338
{
44-
// create the agent
45-
var agentResourceRoleArn = GetAgentResourceRoleArn(agentDefinition);
4639
var agentClient = new AmazonBedrockAgentClient();
4740
var runtimeClient = new AmazonBedrockAgentRuntimeClient();
41+
42+
if (!string.IsNullOrEmpty(agentDefinition.Id))
43+
{
44+
// Get an existing agent
45+
var agentResponse = await agentClient.GetAgentAsync(
46+
new()
47+
{
48+
AgentId = agentDefinition.Id,
49+
},
50+
cancellationToken
51+
).ConfigureAwait(false);
52+
53+
return new BedrockAgent(agentResponse.Agent, agentClient, runtimeClient)
54+
{
55+
Kernel = kernel,
56+
Arguments = agentDefinition.GetDefaultKernelArguments(kernel) ?? [],
57+
Template = agentDefinition.GetPromptTemplate(kernel, agentCreationOptions?.PromptTemplateFactory),
58+
Instructions = agentDefinition.Instructions,
59+
};
60+
}
61+
62+
// create the agent
63+
Verify.NotNull(agentDefinition.Name);
64+
Verify.NotNull(agentDefinition.Description);
65+
Verify.NotNull(agentDefinition.Instructions);
66+
Verify.NotNull(agentDefinition.Model);
67+
Verify.NotNull(agentDefinition.Model.Id);
68+
var agentResourceRoleArn = GetAgentResourceRoleArn(agentDefinition);
4869
var agentModel = await agentClient.CreateAgentAndWaitAsync(
4970
new()
5071
{

dotnet/src/Agents/OpenAI/Definition/OpenAIAssistantAgentFactory.cs

+22-6
Original file line numberDiff line numberDiff line change
@@ -31,26 +31,42 @@ public OpenAIAssistantAgentFactory()
3131
public override async Task<Agent?> TryCreateAsync(Kernel kernel, AgentDefinition agentDefinition, AgentCreationOptions? agentCreationOptions = null, CancellationToken cancellationToken = default)
3232
{
3333
Verify.NotNull(agentDefinition);
34-
Verify.NotNull(agentDefinition.Model);
35-
Verify.NotNull(agentDefinition.Model.Id);
3634

37-
Agent? agent = null;
3835
if (this.IsSupported(agentDefinition))
3936
{
4037
var client = agentDefinition.GetOpenAIClient(kernel);
4138
AssistantClient assistantClient = client.GetAssistantClient();
4239

40+
Assistant model;
41+
if (!string.IsNullOrEmpty(agentDefinition.Id))
42+
{
43+
// Get an existing assistant
44+
model = await assistantClient.GetAssistantAsync(agentDefinition.Id, cancellationToken).ConfigureAwait(false);
45+
46+
return new OpenAIAssistantAgent(model, assistantClient)
47+
{
48+
Kernel = kernel,
49+
Arguments = agentDefinition.GetDefaultKernelArguments(kernel) ?? [],
50+
Template = agentDefinition.GetPromptTemplate(kernel, agentCreationOptions?.PromptTemplateFactory),
51+
Instructions = agentDefinition.Instructions ?? model.Instructions,
52+
};
53+
}
54+
55+
// Create a new assistant
56+
Verify.NotNull(agentDefinition.Model);
57+
Verify.NotNull(agentDefinition.Model.Id);
58+
4359
var assistantCreationOptions = agentDefinition.CreateAssistantCreationOptions();
44-
Assistant model = await assistantClient.CreateAssistantAsync(agentDefinition.Model.Id, assistantCreationOptions, cancellationToken).ConfigureAwait(false);
60+
model = await assistantClient.CreateAssistantAsync(agentDefinition.Model.Id, assistantCreationOptions, cancellationToken).ConfigureAwait(false);
4561

46-
agent = new OpenAIAssistantAgent(model, assistantClient)
62+
return new OpenAIAssistantAgent(model, assistantClient)
4763
{
4864
Kernel = kernel,
4965
Arguments = agentDefinition.GetDefaultKernelArguments(kernel) ?? [],
5066
Template = agentDefinition.GetPromptTemplate(kernel, agentCreationOptions?.PromptTemplateFactory),
5167
};
5268
}
5369

54-
return agent;
70+
return null;
5571
}
5672
}

0 commit comments

Comments
 (0)