Skip to content

Commit 4270c00

Browse files
authored
Remove Microsoft.Bcl.HashCode package reference from M.E.AI.Abstractions (#6780)
* Remove Microsoft.Bcl.HashCode package reference from M.E.AI.Abstractions It was added unexpectedly. Also added a changelog entry on the MCP support
1 parent a4db9d8 commit 4270c00

File tree

5 files changed

+75
-5
lines changed

5 files changed

+75
-5
lines changed

src/Libraries/Microsoft.Extensions.AI.Abstractions/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
- Added non-invocable `AIFunctionDeclaration` (base class for `AIFunction`), `AIFunctionFactory.CreateDeclaration`, and `AIFunction.AsDeclarationOnly`.
66
- Added `[Experimental]` support for user approval of function invocations via `ApprovalRequiredAIFunction`, `FunctionApprovalRequestContent`, and friends.
7+
- Added `[Experimental]` support for MCP server-hosted tools via `HostedMcpServerTool`, `HostedMcpServerToolApprovalMode`, and friends.
78

89
## 9.8.0
910

src/Libraries/Microsoft.Extensions.AI.Abstractions/HostedMcpServerToolRequireSpecificApprovalMode.cs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
using System.Diagnostics.CodeAnalysis;
77
using System.Linq;
88

9+
#pragma warning disable S109 // Magic numbers should not be used
10+
#pragma warning disable EA0011 // Consider removing unnecessary conditional access operator (?)
11+
912
namespace Microsoft.Extensions.AI;
1013

1114
/// <summary>
@@ -42,7 +45,7 @@ public override bool Equals(object? obj) => obj is HostedMcpServerToolRequireSpe
4245

4346
/// <inheritdoc/>
4447
public override int GetHashCode() =>
45-
HashCode.Combine(GetListHashCode(AlwaysRequireApprovalToolNames), GetListHashCode(NeverRequireApprovalToolNames));
48+
Combine(GetListHashCode(AlwaysRequireApprovalToolNames), GetListHashCode(NeverRequireApprovalToolNames));
4649

4750
private static bool ListEquals(IList<string>? list1, IList<string>? list2) =>
4851
ReferenceEquals(list1, list2) ||
@@ -55,12 +58,32 @@ private static int GetListHashCode(IList<string>? list)
5558
return 0;
5659
}
5760

61+
#if NET
5862
HashCode hc = default;
59-
foreach (string item in list)
63+
for (int i = 0; i < list.Count; i++)
6064
{
61-
hc.Add(item);
65+
hc.Add(list[i]);
6266
}
6367

6468
return hc.ToHashCode();
69+
#else
70+
int hash = 0;
71+
for (int i = 0; i < list.Count; i++)
72+
{
73+
hash = Combine(hash, list[i]?.GetHashCode() ?? 0);
74+
}
75+
76+
return hash;
77+
#endif
78+
}
79+
80+
private static int Combine(int h1, int h2)
81+
{
82+
#if NET
83+
return HashCode.Combine(h1, h2);
84+
#else
85+
uint rol5 = ((uint)h1 << 5) | ((uint)h1 >> 27);
86+
return ((int)rol5 + h1) ^ h2;
87+
#endif
6588
}
6689
}

src/Libraries/Microsoft.Extensions.AI.Abstractions/Microsoft.Extensions.AI.Abstractions.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232

3333
<ItemGroup Condition="'$(TargetFrameworkIdentifier)' != '.NETCoreApp'">
3434
<PackageReference Include="System.Text.Json" />
35-
<PackageReference Include="Microsoft.Bcl.HashCode" />
3635
</ItemGroup>
3736

3837
<ItemGroup Condition="'$(TargetFramework)' == 'net462'">

src/Libraries/Microsoft.Extensions.AI.OpenAI/CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
## NOT YET RELEASED
44

5+
- Updated to depend on OpenAI 2.4.0
56
- Updated tool mappings to recognize any `AIFunctionDeclaration`.
67
- Updated to accommodate the additions in `Microsoft.Extensions.AI.Abstractions`.
7-
- Updated to depend on OpenAI 2.4.0
88

99
## 9.8.0-preview.1.25412.6
1010

test/Libraries/Microsoft.Extensions.AI.Abstractions.Tests/HostedMcpServerToolApprovalModeTests.cs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,51 @@ public void Serialization_RequireSpecific_Roundtrips()
4545
HostedMcpServerToolApprovalMode? result = JsonSerializer.Deserialize(json, TestJsonSerializerContext.Default.HostedMcpServerToolApprovalMode);
4646
Assert.Equal(requireSpecific, result);
4747
}
48+
49+
[Fact]
50+
public void Equality_RequireSpecific_WorksAsExpected()
51+
{
52+
var mode1 = HostedMcpServerToolApprovalMode.RequireSpecific(["ToolA", "ToolB"], ["ToolC"]);
53+
var mode2 = HostedMcpServerToolApprovalMode.RequireSpecific(["ToolA", "ToolB"], ["ToolC"]);
54+
Assert.Equal(mode1, mode2);
55+
Assert.Equal(mode1.GetHashCode(), mode2.GetHashCode());
56+
57+
Assert.NotNull(mode1.AlwaysRequireApprovalToolNames);
58+
mode1.AlwaysRequireApprovalToolNames.Add("ToolD");
59+
Assert.NotEqual(mode1, mode2);
60+
Assert.NotEqual(mode1.GetHashCode(), mode2.GetHashCode());
61+
62+
Assert.NotNull(mode2.AlwaysRequireApprovalToolNames);
63+
mode2.AlwaysRequireApprovalToolNames.Add("ToolD");
64+
Assert.Equal(mode1, mode2);
65+
Assert.Equal(mode1.GetHashCode(), mode2.GetHashCode());
66+
67+
Assert.NotNull(mode2.NeverRequireApprovalToolNames);
68+
mode2.NeverRequireApprovalToolNames.Add("ToolE");
69+
Assert.NotEqual(mode1, mode2);
70+
Assert.NotEqual(mode1.GetHashCode(), mode2.GetHashCode());
71+
72+
Assert.NotNull(mode1.NeverRequireApprovalToolNames);
73+
mode1.NeverRequireApprovalToolNames.Add("ToolE");
74+
Assert.Equal(mode1, mode2);
75+
Assert.Equal(mode1.GetHashCode(), mode2.GetHashCode());
76+
77+
var mode3 = HostedMcpServerToolApprovalMode.RequireSpecific(null, null);
78+
Assert.Equal(mode3.GetHashCode(), mode3.GetHashCode());
79+
var mode4 = HostedMcpServerToolApprovalMode.RequireSpecific(["a"], null);
80+
Assert.Equal(mode4.GetHashCode(), mode4.GetHashCode());
81+
Assert.NotEqual(mode3, mode4);
82+
Assert.NotEqual(mode3.GetHashCode(), mode4.GetHashCode());
83+
84+
var mode5 = HostedMcpServerToolApprovalMode.RequireSpecific(null, ["b"]);
85+
Assert.Equal(mode5.GetHashCode(), mode5.GetHashCode());
86+
Assert.NotEqual(mode3, mode5);
87+
Assert.NotEqual(mode3.GetHashCode(), mode5.GetHashCode());
88+
Assert.NotEqual(mode4, mode5);
89+
Assert.NotEqual(mode4.GetHashCode(), mode5.GetHashCode());
90+
91+
var mode6 = HostedMcpServerToolApprovalMode.RequireSpecific([], []);
92+
Assert.Equal(mode6.GetHashCode(), mode6.GetHashCode());
93+
Assert.NotEqual(mode3, mode6);
94+
}
4895
}

0 commit comments

Comments
 (0)