mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
b12109b7e4
* Bump MEAI to 10.5.1 and add per-call x-client header support
Replaces the brittle UserAgentResponsesClient subclass with a clean
per-call x-client-* header pipeline built on the new Microsoft.Extensions.AI
10.5.1 OpenAIRequestPolicies hook.
Public surface (Microsoft.Agents.AI.Foundry, [Experimental(MAAI001)]):
* chatOptions.WithClientHeader(name, value) and .WithClientHeaders(IEnumerable)
validate the x-client- prefix (case-insensitive), apply all-or-nothing on
bulk, and throw InvalidOperationException on foreign-typed slot collision
* myAgent.AsBuilder().UseClientHeaders().Build() opts a customer-built agent
into the pipeline; idempotent via agent.GetService<ClientHeadersAgent>()
* Foundry-built agents (FoundryAgent.Create*) pre-wire automatically
Internals:
* ClientHeadersAgent decorator snapshots the dict at scope-push time so
concurrent runs sharing a ChatOptions reference do not leak headers
* ClientHeadersScope is an AsyncLocal<IReadOnlyDictionary<string,string>?>
with LIFO push/dispose semantics
* ClientHeadersPolicy singleton stamps headers via Headers.Set so per-call
values overwrite any same-name header from earlier policies and so
duplicate registration is value-stable
* OpenAIRequestPoliciesReflection dedups against MEAI's private _entries
field and falls back to AddPolicy on any reflection failure; a CI test
asserts the field shape on every MEAI bump
Hosting cleanup:
* Deleted UserAgentResponsesClient and its dummy throwing pipeline
* HostedAgentUserAgentPolicy is now registered via OpenAIRequestPolicies
in FoundryHostingExtensions.TryApplyUserAgent
Tests:
* 19 new unit tests in ClientHeadersExtensionsTests.cs covering validation,
AsyncLocal isolation, snapshot semantics, end-to-end wire stamping, and
shared-chat-client dedup
* Updated OpenTelemetryAgentTests for MEAI 10.5.1 changes to web_search
serialization and the reduced tool definition payload when sensitive
data capture is disabled
Microsoft.Extensions.Compliance.Abstractions stays at 10.5.0 because no
10.5.1 release exists on nuget.org.
* Address PR review: pre-wire AsAIAgent path and dedup TryApplyUserAgent
* FoundryAgent: extract WireClientHeaders helper and call it from the
internal (AIProjectClient, ChatClientAgent) constructor used by
AzureAIProjectChatClientExtensions.AsAIAgent so those Foundry-built
agents also pre-wire the x-client header pipeline.
* Foundry.Hosting TryApplyUserAgent: dedup HostedAgentUserAgentPolicy
registration per OpenAIRequestPolicies instance via
ConditionalWeakTable so per-request resolution does not grow the
policy list unboundedly on singleton agents.
* Add tests covering AsAIAgent pre-wire and TryApplyUserAgent dedup
Backs the PR review fixes from a4c8f91 with regression tests:
* ClientHeadersExtensionsTests: AsAIAgent_FoundryAgent_HasPreWiredClientHeadersAgent
asserts the FoundryAgent built via AzureAIProjectChatClientExtensions.AsAIAgent
contains a ClientHeadersAgent in its delegating chain (catches future
regressions of the bypass).
* ClientHeadersExtensionsTests: FoundryAgent_PublicConstructor_HasPreWiredClientHeadersAgent
covers the public constructor path the same way.
* ClientHeadersExtensionsTests: UseClientHeaders_RepeatedRegistrations_OnSameChatClient_OnlyRegistersOnce
invokes UseClientHeaders 25 times on a shared chat client and asserts via
reflection that OpenAIRequestPolicies._entries length is exactly 1.
* HostedTryApplyUserAgentDedupTests: two tests asserting
FoundryHostingExtensions.TryApplyUserAgent stays at one entry per
OpenAIRequestPolicies instance after 50 calls on the same agent and across
distinct agents on different chat clients.
* Move tests next to their SUT
Removes the dedicated HostedTryApplyUserAgentDedupTests.cs test class.
Tests are co-located with the SUT they exercise:
* FoundryAgentTests.cs gains the Constructor_PreWiresClientHeadersAgent
and Constructor_FromAsAIAgentExtension_PreWiresClientHeadersAgent
cases, since FoundryAgent is the SUT for the pre-wire behavior.
* HostedOutboundUserAgentTests.cs gains the two TryApplyUserAgent dedup
cases, since FoundryHostingExtensions.TryApplyUserAgent is the SUT
it already covers.
* ClientHeadersExtensionsTests.cs keeps only the
UseClientHeaders_RepeatedRegistrations_OnSameChatClient_OnlyRegistersOnce
case, which exercises the public ClientHeadersExtensions surface.
* Remove redundant WithCancellation on inner streaming call
ct is already passed to InnerAgent.RunStreamingAsync, so
.WithCancellation(ct) on the resulting IAsyncEnumerable is a no-op.
Caught by Sergey on PR review.
* Address PR review: surface downstream MEAI experimental ID
* Add AIOpenAIRequestPolicies = MEAIExperiments alias to
DiagnosticIds.Experiments (matches the existing AIResponseContinuations,
AIMcpServers, AIFunctionApprovals pattern).
* Mark public ClientHeadersExtensions with [Experimental(AIOpenAIRequestPolicies)]
instead of AgentsAIExperiments. Consumers now see the MEAI001 warning,
surfacing the dependency on MEAI's experimental OpenAIRequestPolicies hook.
* Mark internal OpenAIRequestPoliciesReflection with the same alias to
suppress warnings at the source rather than via project-wide NoWarn.
* Remove MEAI001 from Foundry csproj NoWarn (kept on Foundry.Hosting where
pre-PR usages remain).
* Clarify ClientHeadersScope XML doc: AsyncLocal flows values forward but
does NOT auto-restore on method return; explicit using/Dispose is what
gives stack-style LIFO semantics.
196 lines
13 KiB
XML
196 lines
13 KiB
XML
<Project>
|
|
<PropertyGroup>
|
|
<!-- Enable central package management -->
|
|
<!-- https://learn.microsoft.com/en-us/nuget/consume-packages/Central-Package-Management -->
|
|
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
|
|
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
|
|
</PropertyGroup>
|
|
<PropertyGroup>
|
|
<!-- Aspire -->
|
|
<AspireAppHostSdkVersion>13.1.0</AspireAppHostSdkVersion>
|
|
</PropertyGroup>
|
|
<ItemGroup>
|
|
<!-- Aspire.* -->
|
|
<PackageVersion Include="Anthropic" Version="12.13.0" />
|
|
<PackageVersion Include="Anthropic.Foundry" Version="0.5.0" />
|
|
<PackageVersion Include="Aspire.Hosting" Version="$(AspireAppHostSdkVersion)" />
|
|
<PackageVersion Include="Aspire.Azure.AI.OpenAI" Version="13.0.0-preview.1.25560.3" />
|
|
<PackageVersion Include="Aspire.Azure.AI.Inference" Version="13.1.0-preview.1.25616.3" />
|
|
<PackageVersion Include="Aspire.Hosting.Azure.AIFoundry" Version="13.1.0-preview.1.25616.3" />
|
|
<PackageVersion Include="Aspire.Hosting.AppHost" Version="$(AspireAppHostSdkVersion)" />
|
|
<PackageVersion Include="Aspire.Hosting.Azure.CognitiveServices" Version="$(AspireAppHostSdkVersion)" />
|
|
<PackageVersion Include="Aspire.Microsoft.Azure.Cosmos" Version="$(AspireAppHostSdkVersion)" />
|
|
<PackageVersion Include="CommunityToolkit.Aspire.OllamaSharp" Version="13.0.0" />
|
|
<!-- Azure.* -->
|
|
<PackageVersion Include="Azure.AI.AgentServer.Core" Version="1.0.0-beta.23" />
|
|
<PackageVersion Include="Azure.AI.AgentServer.Invocations" Version="1.0.0-beta.3" />
|
|
<PackageVersion Include="Azure.AI.AgentServer.Responses" Version="1.0.0-beta.4" />
|
|
<PackageVersion Include="Azure.AI.Projects" Version="2.0.0" />
|
|
<PackageVersion Include="Azure.AI.Agents.Persistent" Version="1.2.0-beta.10" />
|
|
<PackageVersion Include="Azure.AI.OpenAI" Version="2.9.0-beta.1" />
|
|
<PackageVersion Include="Azure.Core" Version="1.53.0" />
|
|
<PackageVersion Include="Azure.Identity" Version="1.21.0" />
|
|
<PackageVersion Include="DotNetEnv" Version="3.1.1" />
|
|
<PackageVersion Include="Azure.Monitor.OpenTelemetry.Exporter" Version="1.5.0" />
|
|
<!-- Google Gemini -->
|
|
<PackageVersion Include="Google.GenAI" Version="1.6.0" />
|
|
<PackageVersion Include="Mscc.GenerativeAI.Microsoft" Version="2.9.3" />
|
|
<!-- Microsoft.Azure.* -->
|
|
<PackageVersion Include="Microsoft.Azure.Cosmos" Version="3.54.0" />
|
|
<!-- Newtonsoft.Json -->
|
|
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
|
|
<!-- System.* -->
|
|
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="10.0.6" />
|
|
<PackageVersion Include="Microsoft.Bcl.HashCode" Version="6.0.0" />
|
|
<PackageVersion Include="Microsoft.Bcl.Memory" Version="10.0.5" />
|
|
<PackageVersion Include="System.ClientModel" Version="1.10.0" />
|
|
<PackageVersion Include="System.CodeDom" Version="10.0.0" />
|
|
<PackageVersion Include="System.Collections.Immutable" Version="10.0.1" />
|
|
<PackageVersion Include="System.CommandLine" Version="2.0.0-rc.2.25502.107" />
|
|
<PackageVersion Include="System.Diagnostics.DiagnosticSource" Version="10.0.6" />
|
|
<PackageVersion Include="System.Linq.AsyncEnumerable" Version="10.0.5" />
|
|
<PackageVersion Include="System.Net.Http.Json" Version="10.0.0" />
|
|
<PackageVersion Include="System.Net.ServerSentEvents" Version="10.0.5" />
|
|
<PackageVersion Include="System.Text.Json" Version="10.0.6" />
|
|
<PackageVersion Include="System.Threading.Channels" Version="10.0.6" />
|
|
<PackageVersion Include="System.Threading.Tasks.Extensions" Version="4.6.3" />
|
|
<PackageVersion Include="System.Net.Security" Version="4.3.2" />
|
|
<!-- OpenTelemetry -->
|
|
<PackageVersion Include="OpenTelemetry" Version="1.15.3" />
|
|
<PackageVersion Include="OpenTelemetry.Api" Version="1.15.3" />
|
|
<PackageVersion Include="OpenTelemetry.Exporter.Console" Version="1.15.3" />
|
|
<PackageVersion Include="OpenTelemetry.Exporter.InMemory" Version="1.15.3" />
|
|
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.15.3" />
|
|
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.15.3" />
|
|
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.15.2" />
|
|
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.15.1" />
|
|
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.15.1" />
|
|
<!-- Microsoft.AspNetCore.* -->
|
|
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="10.0.0" />
|
|
<PackageVersion Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="10.0.0" />
|
|
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="10.0.0" />
|
|
<PackageVersion Include="Swashbuckle.AspNetCore.SwaggerUI" Version="10.0.0" />
|
|
<!-- Microsoft.Extensions.* -->
|
|
<PackageVersion Include="Microsoft.Extensions.AI" Version="10.5.1" />
|
|
<PackageVersion Include="Microsoft.Extensions.AI.Abstractions" Version="10.5.1" />
|
|
<PackageVersion Include="Microsoft.Extensions.AI.Evaluation" Version="10.4.0" />
|
|
<PackageVersion Include="Microsoft.Extensions.AI.Evaluation.Quality" Version="10.4.0" />
|
|
<PackageVersion Include="Microsoft.Extensions.AI.Evaluation.Safety" Version="10.3.0-preview.1.26109.11" />
|
|
<PackageVersion Include="Microsoft.Extensions.AI.OpenAI" Version="10.5.1" />
|
|
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="10.0.0" />
|
|
<PackageVersion Include="Microsoft.Extensions.Compliance.Abstractions" Version="10.5.0" />
|
|
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="10.0.1" />
|
|
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="10.0.1" />
|
|
<PackageVersion Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="10.0.1" />
|
|
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="10.0.1" />
|
|
<PackageVersion Include="Microsoft.Extensions.Configuration.UserSecrets" Version="10.0.1" />
|
|
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.1" />
|
|
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.6" />
|
|
<PackageVersion Include="Microsoft.Extensions.FileSystemGlobbing" Version="10.0.6" />
|
|
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="10.0.1" />
|
|
<PackageVersion Include="Microsoft.Extensions.Http.Resilience" Version="10.0.0" />
|
|
<PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.1" />
|
|
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.6" />
|
|
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="10.0.1" />
|
|
<PackageVersion Include="Microsoft.Extensions.ServiceDiscovery" Version="10.0.0" />
|
|
<PackageVersion Include="Microsoft.Extensions.VectorData.Abstractions" Version="9.7.0" />
|
|
<!-- Vector Stores -->
|
|
<PackageVersion Include="Microsoft.SemanticKernel.Connectors.InMemory" Version="1.67.0-preview" />
|
|
<PackageVersion Include="Microsoft.SemanticKernel.Connectors.Qdrant" Version="1.67.0-preview" />
|
|
<!-- Agent SDKs -->
|
|
<PackageVersion Include="GitHub.Copilot.SDK" Version="0.1.29" />
|
|
<PackageVersion Include="Microsoft.Agents.CopilotStudio.Client" Version="1.3.171-beta" />
|
|
<!-- M365 Agents SDK -->
|
|
<PackageVersion Include="AdaptiveCards" Version="3.1.0" />
|
|
<PackageVersion Include="Microsoft.Agents.Authentication.Msal" Version="1.3.171-beta" />
|
|
<PackageVersion Include="Microsoft.Agents.Hosting.AspNetCore" Version="1.3.171-beta" />
|
|
<!-- A2A -->
|
|
<PackageVersion Include="A2A" Version="1.0.0-preview2" />
|
|
<PackageVersion Include="A2A.AspNetCore" Version="1.0.0-preview2" />
|
|
<!-- MCP -->
|
|
<PackageVersion Include="ModelContextProtocol" Version="1.1.0" />
|
|
<!-- Hyperlight -->
|
|
<PackageVersion Include="Hyperlight.HyperlightSandbox.Api" Version="0.4.0" />
|
|
<!-- Inference SDKs -->
|
|
<PackageVersion Include="Microsoft.ML.OnnxRuntimeGenAI" Version="0.10.0" />
|
|
<PackageVersion Include="Microsoft.ML.Tokenizers" Version="2.0.0" />
|
|
<PackageVersion Include="OllamaSharp" Version="5.4.8" />
|
|
<PackageVersion Include="OpenAI" Version="2.10.0" />
|
|
<!-- Identity -->
|
|
<PackageVersion Include="Microsoft.Identity.Client.Extensions.Msal" Version="4.83.1" />
|
|
<!-- Workflows -->
|
|
<PackageVersion Include="Microsoft.Agents.ObjectModel" Version="2026.2.4.1" />
|
|
<PackageVersion Include="Microsoft.Agents.ObjectModel.Json" Version="2026.2.4.1" />
|
|
<PackageVersion Include="Microsoft.Agents.ObjectModel.PowerFx" Version="2026.2.4.1" />
|
|
<PackageVersion Include="Microsoft.PowerFx.Interpreter" Version="1.8.1" />
|
|
<!-- Durable Task -->
|
|
<PackageVersion Include="Microsoft.DurableTask.Client" Version="1.18.0" />
|
|
<PackageVersion Include="Microsoft.DurableTask.Client.AzureManaged" Version="1.18.0" />
|
|
<PackageVersion Include="Microsoft.DurableTask.Worker" Version="1.18.0" />
|
|
<PackageVersion Include="Microsoft.DurableTask.Worker.AzureManaged" Version="1.18.0" />
|
|
<!-- Azure Functions -->
|
|
<PackageVersion Include="Microsoft.Azure.Functions.Worker" Version="2.50.0" />
|
|
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Extensions.DurableTask" Version="1.12.1" />
|
|
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Extensions.DurableTask.AzureManaged" Version="1.0.1" />
|
|
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.3.0" />
|
|
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore" Version="2.1.0" />
|
|
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Extensions.Mcp" Version="1.0.0" />
|
|
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Sdk" Version="2.0.7" />
|
|
<!-- Redis -->
|
|
<PackageVersion Include="StackExchange.Redis" Version="2.10.1" />
|
|
<!-- Console UX -->
|
|
<PackageVersion Include="Spectre.Console" Version="0.49.1" />
|
|
<!-- Test -->
|
|
<PackageVersion Include="FluentAssertions" Version="8.8.0" />
|
|
<PackageVersion Include="Microsoft.AspNetCore.TestHost" Condition="'$(TargetFramework)' == 'net8.0'" Version="8.0.22" />
|
|
<PackageVersion Include="Microsoft.AspNetCore.TestHost" Condition="'$(TargetFramework)' == 'net9.0'" Version="9.0.11" />
|
|
<PackageVersion Include="Microsoft.AspNetCore.TestHost" Condition="'$(TargetFramework)' == 'net10.0'" Version="10.0.0" />
|
|
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.0" />
|
|
<PackageVersion Include="Moq" Version="[4.18.4]" />
|
|
<PackageVersion Include="xunit.v3.mtp-v2" Version="3.2.2" />
|
|
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />
|
|
<PackageVersion Include="xRetry.v3" Version="1.0.0-rc3" />
|
|
<PackageVersion Include="Microsoft.Testing.Extensions.CodeCoverage" Version="18.4.1" />
|
|
<!-- Symbols -->
|
|
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" />
|
|
<!-- Toolset -->
|
|
<PackageVersion Include="ReferenceTrimmer" Version="3.4.5" />
|
|
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.11.0" />
|
|
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.14.0" />
|
|
<PackageVersion Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="10.0.100" />
|
|
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers">
|
|
<PrivateAssets>all</PrivateAssets>
|
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
</PackageReference>
|
|
<PackageVersion Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.14.15" />
|
|
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers">
|
|
<PrivateAssets>all</PrivateAssets>
|
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
</PackageReference>
|
|
<PackageVersion Include="xunit.analyzers" Version="1.23.0" />
|
|
<PackageReference Include="xunit.analyzers">
|
|
<PrivateAssets>all</PrivateAssets>
|
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
</PackageReference>
|
|
<PackageVersion Include="Moq.Analyzers" Version="0.3.1" />
|
|
<PackageReference Include="Moq.Analyzers">
|
|
<PrivateAssets>all</PrivateAssets>
|
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
</PackageReference>
|
|
<PackageVersion Include="Roslynator.Analyzers" Version="4.14.1" />
|
|
<PackageReference Include="Roslynator.Analyzers">
|
|
<PrivateAssets>all</PrivateAssets>
|
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
</PackageReference>
|
|
<PackageVersion Include="Roslynator.CodeAnalysis.Analyzers" Version="4.14.1" />
|
|
<PackageReference Include="Roslynator.CodeAnalysis.Analyzers">
|
|
<PrivateAssets>all</PrivateAssets>
|
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
</PackageReference>
|
|
<PackageVersion Include="Roslynator.Formatting.Analyzers" Version="4.14.1" />
|
|
<PackageReference Include="Roslynator.Formatting.Analyzers">
|
|
<PrivateAssets>all</PrivateAssets>
|
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
</PackageReference>
|
|
</ItemGroup>
|
|
</Project> |