Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

.Net: Removing KernelAgent.cs and moving its functionality into Agent.cs #11244

Merged
merged 9 commits into from
Apr 2, 2025
3 changes: 2 additions & 1 deletion dotnet/src/Agents/Core/ChatCompletionAgent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using System.Threading;
using System.Threading.Tasks;
using Microsoft.SemanticKernel.Agents.Extensions;
using Microsoft.SemanticKernel.Arguments.Extensions;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Diagnostics;
using Microsoft.SemanticKernel.Services;
Expand Down Expand Up @@ -268,7 +269,7 @@ private async IAsyncEnumerable<ChatMessageContent> InternalInvokeAsync(
{
kernel ??= this.Kernel;

(IChatCompletionService chatCompletionService, PromptExecutionSettings? executionSettings) = GetChatCompletionService(kernel, arguments);
(IChatCompletionService chatCompletionService, PromptExecutionSettings? executionSettings) = GetChatCompletionService(kernel, this.Arguments.MergeArguments(arguments));

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

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// Copyright (c) Microsoft. All rights reserved.

using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;

namespace Microsoft.SemanticKernel.Arguments.Extensions;

/// <summary>
/// Extensions for <see cref="KernelArguments"/>
/// </summary>
[ExcludeFromCodeCoverage]
internal static class CoreKernelArgumentsExtensions
{
private static readonly Dictionary<string, PromptExecutionSettings> s_emptySettings = [];

/// <summary>
/// Provides a merged instance of <see cref="KernelArguments"/> with precedence for override arguments.
/// </summary>
/// <param name="primaryArguments">Primary arguments to merge. This is the base set of arguments.</param>
/// <param name="overrideArguments">The override arguments.</param>
/// <remarks>
/// This merge preserves original <see cref="PromptExecutionSettings"/> and <see cref="KernelArguments"/> parameters.
/// It allows for incremental addition or replacement of specific parameters while also preserving the ability
/// to override the execution settings.
/// </remarks>
internal static KernelArguments MergeArguments(this KernelArguments? primaryArguments, KernelArguments? overrideArguments)
{
// Avoid merge when override arguments are not set.
if (overrideArguments is null)
{
return primaryArguments ?? [];
}

// Avoid merge when the Agent arguments are not set.
if (primaryArguments is null)
{
return overrideArguments ?? [];
}

// Both instances are not null, merge with precedence for override arguments.

// Merge execution settings with precedence for override arguments.
Dictionary<string, PromptExecutionSettings>? settings =
(overrideArguments.ExecutionSettings ?? s_emptySettings)
.Concat(primaryArguments.ExecutionSettings ?? s_emptySettings)
.GroupBy(entry => entry.Key)
.ToDictionary(entry => entry.Key, entry => entry.First().Value);

// Merge parameters with precedence for override arguments.
Dictionary<string, object?>? parameters =
overrideArguments
.Concat(primaryArguments)
.GroupBy(entry => entry.Key)
.ToDictionary(entry => entry.Key, entry => entry.First().Value);

return new KernelArguments(parameters, settings);
}
}
Loading