// Copyright (c) Microsoft. All rights reserved. using System.ClientModel.Primitives; using System.Collections.Generic; using System.Reflection; using System.Threading.Tasks; namespace Microsoft.Agents.AI; internal static class RequestOptionsExtensions { /// Gets the singleton that adds a MEAI user-agent header. internal static PipelinePolicy UserAgentPolicy => MeaiUserAgentPolicy.Instance; /// Provides a pipeline policy that adds a "MEAI/x.y.z" user-agent header. private sealed class MeaiUserAgentPolicy : PipelinePolicy { public static MeaiUserAgentPolicy Instance { get; } = new MeaiUserAgentPolicy(); private static readonly string s_userAgentValue = CreateUserAgentValue(); public override void Process(PipelineMessage message, IReadOnlyList pipeline, int currentIndex) { AddUserAgentHeader(message); ProcessNext(message, pipeline, currentIndex); } public override ValueTask ProcessAsync(PipelineMessage message, IReadOnlyList pipeline, int currentIndex) { AddUserAgentHeader(message); return ProcessNextAsync(message, pipeline, currentIndex); } private static void AddUserAgentHeader(PipelineMessage message) => message.Request.Headers.Add("User-Agent", s_userAgentValue); private static string CreateUserAgentValue() { const string Name = "MEAI"; if (typeof(MeaiUserAgentPolicy).Assembly.GetCustomAttribute()?.InformationalVersion is string version) { int pos = version.IndexOf('+'); if (pos >= 0) { version = version.Substring(0, pos); } if (version.Length > 0) { return $"{Name}/{version}"; } } return Name; } } }