forked from microsoft/semantic-kernel
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCoreKernelArgumentsExtensions.cs
59 lines (50 loc) · 2.39 KB
/
CoreKernelArgumentsExtensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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);
}
}