Skip to content

Commit 53e94ff

Browse files
author
Ben Thomas
committed
Merging arguments before using them to select AI service.
1 parent 03d9c53 commit 53e94ff

File tree

2 files changed

+61
-1
lines changed

2 files changed

+61
-1
lines changed

dotnet/src/Agents/Core/ChatCompletionAgent.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using System.Threading;
1111
using System.Threading.Tasks;
1212
using Microsoft.SemanticKernel.Agents.Extensions;
13+
using Microsoft.SemanticKernel.Arguments.Extensions;
1314
using Microsoft.SemanticKernel.ChatCompletion;
1415
using Microsoft.SemanticKernel.Diagnostics;
1516
using Microsoft.SemanticKernel.Services;
@@ -268,7 +269,7 @@ private async IAsyncEnumerable<ChatMessageContent> InternalInvokeAsync(
268269
{
269270
kernel ??= this.Kernel;
270271

271-
(IChatCompletionService chatCompletionService, PromptExecutionSettings? executionSettings) = GetChatCompletionService(kernel, arguments);
272+
(IChatCompletionService chatCompletionService, PromptExecutionSettings? executionSettings) = GetChatCompletionService(kernel, this.Arguments.MergeArguments(arguments));
272273

273274
ChatHistory chat = await this.SetupAgentChatHistoryAsync(history, arguments, kernel, additionalInstructions, cancellationToken).ConfigureAwait(false);
274275

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Copyright (c) Microsoft. All rights reserved.
2+
3+
using System.Collections.Generic;
4+
using System.Diagnostics.CodeAnalysis;
5+
using System.Linq;
6+
7+
namespace Microsoft.SemanticKernel.Arguments.Extensions;
8+
9+
/// <summary>
10+
/// Extensions for <see cref="KernelArguments"/>
11+
/// </summary>
12+
[ExcludeFromCodeCoverage]
13+
internal static class CoreKernelArgumentsExtensions
14+
{
15+
private static readonly Dictionary<string, PromptExecutionSettings> s_emptySettings = [];
16+
17+
/// <summary>
18+
/// Provides a merged instance of <see cref="KernelArguments"/> with precedence for override arguments.
19+
/// </summary>
20+
/// <param name="primaryArguments">Primary arguments to merge. This is the base set of arguments.</param>
21+
/// <param name="overrideArguments">The override arguments.</param>
22+
/// <remarks>
23+
/// This merge preserves original <see cref="PromptExecutionSettings"/> and <see cref="KernelArguments"/> parameters.
24+
/// It allows for incremental addition or replacement of specific parameters while also preserving the ability
25+
/// to override the execution settings.
26+
/// </remarks>
27+
internal static KernelArguments MergeArguments(this KernelArguments? primaryArguments, KernelArguments? overrideArguments)
28+
{
29+
// Avoid merge when override arguments are not set.
30+
if (overrideArguments is null)
31+
{
32+
return primaryArguments ?? [];
33+
}
34+
35+
// Avoid merge when the Agent arguments are not set.
36+
if (primaryArguments is null)
37+
{
38+
return overrideArguments ?? [];
39+
}
40+
41+
// Both instances are not null, merge with precedence for override arguments.
42+
43+
// Merge execution settings with precedence for override arguments.
44+
Dictionary<string, PromptExecutionSettings>? settings =
45+
(overrideArguments.ExecutionSettings ?? s_emptySettings)
46+
.Concat(primaryArguments.ExecutionSettings ?? s_emptySettings)
47+
.GroupBy(entry => entry.Key)
48+
.ToDictionary(entry => entry.Key, entry => entry.First().Value);
49+
50+
// Merge parameters with precedence for override arguments.
51+
Dictionary<string, object?>? parameters =
52+
overrideArguments
53+
.Concat(primaryArguments)
54+
.GroupBy(entry => entry.Key)
55+
.ToDictionary(entry => entry.Key, entry => entry.First().Value);
56+
57+
return new KernelArguments(parameters, settings);
58+
}
59+
}

0 commit comments

Comments
 (0)