From 93809e9921b4ad4a238baef528489e0ef4732d89 Mon Sep 17 00:00:00 2001 From: Stephen Toub Date: Sat, 25 Jan 2025 18:04:56 -0500 Subject: [PATCH] Update OpenTelemtryChatClient/EmbeddingGenerator for 1.30 --- .../ChatCompletion/OpenTelemetryChatClient.cs | 12 ++++++------ .../Embeddings/OpenTelemetryEmbeddingGenerator.cs | 2 +- .../Microsoft.Extensions.AI/OpenTelemetryConsts.cs | 1 + .../ChatCompletion/OpenTelemetryChatClientTests.cs | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/OpenTelemetryChatClient.cs b/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/OpenTelemetryChatClient.cs index aabc8078609..cf7df564e73 100644 --- a/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/OpenTelemetryChatClient.cs +++ b/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/OpenTelemetryChatClient.cs @@ -23,7 +23,7 @@ namespace Microsoft.Extensions.AI; /// Represents a delegating chat client that implements the OpenTelemetry Semantic Conventions for Generative AI systems. /// -/// This class provides an implementation of the Semantic Conventions for Generative AI systems v1.29, defined at . +/// This class provides an implementation of the Semantic Conventions for Generative AI systems v1.30, defined at . /// The specification is still experimental and subject to change; as such, the telemetry output by this client is also subject to change. /// public sealed partial class OpenTelemetryChatClient : DelegatingChatClient @@ -251,6 +251,11 @@ public override async IAsyncEnumerable CompleteSt _ = activity.AddTag(OpenTelemetryConsts.GenAI.Request.PresencePenalty, presencePenalty); } + if (options.Seed is long seed) + { + _ = activity.AddTag(OpenTelemetryConsts.GenAI.Request.Seed, seed); + } + if (options.StopSequences is IList stopSequences) { _ = activity.AddTag(OpenTelemetryConsts.GenAI.Request.StopSequences, $"[{string.Join(", ", stopSequences.Select(s => $"\"{s}\""))}]"); @@ -285,11 +290,6 @@ public override async IAsyncEnumerable CompleteSt _ = activity.AddTag(OpenTelemetryConsts.GenAI.Request.PerProvider(_system, "response_format"), responseFormat); } - if (options.Seed is long seed) - { - _ = activity.AddTag(OpenTelemetryConsts.GenAI.Request.PerProvider(_system, "seed"), seed); - } - if (options.AdditionalProperties is { } props) { // Log all additional request options as per-provider tags. This is non-normative, but it covers cases where diff --git a/src/Libraries/Microsoft.Extensions.AI/Embeddings/OpenTelemetryEmbeddingGenerator.cs b/src/Libraries/Microsoft.Extensions.AI/Embeddings/OpenTelemetryEmbeddingGenerator.cs index 8bb38bf2e07..497e87f2d7a 100644 --- a/src/Libraries/Microsoft.Extensions.AI/Embeddings/OpenTelemetryEmbeddingGenerator.cs +++ b/src/Libraries/Microsoft.Extensions.AI/Embeddings/OpenTelemetryEmbeddingGenerator.cs @@ -16,7 +16,7 @@ namespace Microsoft.Extensions.AI; /// Represents a delegating embedding generator that implements the OpenTelemetry Semantic Conventions for Generative AI systems. /// -/// This class provides an implementation of the Semantic Conventions for Generative AI systems v1.29, defined at . +/// This class provides an implementation of the Semantic Conventions for Generative AI systems v1.30, defined at . /// The specification is still experimental and subject to change; as such, the telemetry output by this client is also subject to change. /// /// The type of input used to produce embeddings. diff --git a/src/Libraries/Microsoft.Extensions.AI/OpenTelemetryConsts.cs b/src/Libraries/Microsoft.Extensions.AI/OpenTelemetryConsts.cs index 4c40c04c236..031d88a140f 100644 --- a/src/Libraries/Microsoft.Extensions.AI/OpenTelemetryConsts.cs +++ b/src/Libraries/Microsoft.Extensions.AI/OpenTelemetryConsts.cs @@ -66,6 +66,7 @@ public static class Request public const string Model = "gen_ai.request.model"; public const string MaxTokens = "gen_ai.request.max_tokens"; public const string PresencePenalty = "gen_ai.request.presence_penalty"; + public const string Seed = "gen_ai.request.seed"; public const string StopSequences = "gen_ai.request.stop_sequences"; public const string Temperature = "gen_ai.request.temperature"; public const string TopK = "gen_ai.request.top_k"; diff --git a/test/Libraries/Microsoft.Extensions.AI.Tests/ChatCompletion/OpenTelemetryChatClientTests.cs b/test/Libraries/Microsoft.Extensions.AI.Tests/ChatCompletion/OpenTelemetryChatClientTests.cs index 1d99cb60731..d9dace62191 100644 --- a/test/Libraries/Microsoft.Extensions.AI.Tests/ChatCompletion/OpenTelemetryChatClientTests.cs +++ b/test/Libraries/Microsoft.Extensions.AI.Tests/ChatCompletion/OpenTelemetryChatClientTests.cs @@ -167,7 +167,7 @@ async static IAsyncEnumerable CallbackAsync( Assert.Equal("""["hello", "world"]""", activity.GetTagItem("gen_ai.request.stop_sequences")); Assert.Equal("value1", activity.GetTagItem("gen_ai.testservice.request.service_tier")); Assert.Equal("value2", activity.GetTagItem("gen_ai.testservice.request.something_else")); - Assert.Equal(42L, activity.GetTagItem("gen_ai.testservice.request.seed")); + Assert.Equal(42L, activity.GetTagItem("gen_ai.request.seed")); Assert.Equal("id123", activity.GetTagItem("gen_ai.response.id")); Assert.Equal("""["stop"]""", activity.GetTagItem("gen_ai.response.finish_reasons"));