diff --git a/dotnet/src/Connectors/Connectors.Google.UnitTests/Core/Gemini/Clients/GeminiChatGenerationTests.cs b/dotnet/src/Connectors/Connectors.Google.UnitTests/Core/Gemini/Clients/GeminiChatGenerationTests.cs index 2c19b210b2c8..82d804d500b3 100644 --- a/dotnet/src/Connectors/Connectors.Google.UnitTests/Core/Gemini/Clients/GeminiChatGenerationTests.cs +++ b/dotnet/src/Connectors/Connectors.Google.UnitTests/Core/Gemini/Clients/GeminiChatGenerationTests.cs @@ -164,6 +164,8 @@ public async Task ShouldReturnValidGeminiMetadataAsync() } Assert.Equal(testDataResponse.UsageMetadata!.PromptTokenCount, metadata.PromptTokenCount); + Assert.Equal(testDataResponse.UsageMetadata!.CachedContentTokenCount, metadata.CachedContentTokenCount); + Assert.Equal(testDataResponse.UsageMetadata!.ThoughtsTokenCount, metadata.ThoughtsTokenCount); Assert.Equal(testDataCandidate.TokenCount, metadata.CurrentCandidateTokenCount); Assert.Equal(testDataResponse.UsageMetadata.CandidatesTokenCount, metadata.CandidatesTokenCount); Assert.Equal(testDataResponse.UsageMetadata.TotalTokenCount, metadata.TotalTokenCount); @@ -207,6 +209,8 @@ public async Task ShouldReturnValidDictionaryMetadataAsync() } Assert.Equal(testDataResponse.UsageMetadata!.PromptTokenCount, metadata[nameof(GeminiMetadata.PromptTokenCount)]); + Assert.Equal(testDataResponse.UsageMetadata!.CachedContentTokenCount, metadata[nameof(GeminiMetadata.CachedContentTokenCount)]); + Assert.Equal(testDataResponse.UsageMetadata!.ThoughtsTokenCount, metadata[nameof(GeminiMetadata.ThoughtsTokenCount)]); Assert.Equal(testDataCandidate.TokenCount, metadata[nameof(GeminiMetadata.CurrentCandidateTokenCount)]); Assert.Equal(testDataResponse.UsageMetadata.CandidatesTokenCount, metadata[nameof(GeminiMetadata.CandidatesTokenCount)]); Assert.Equal(testDataResponse.UsageMetadata.TotalTokenCount, metadata[nameof(GeminiMetadata.TotalTokenCount)]); diff --git a/dotnet/src/Connectors/Connectors.Google.UnitTests/Core/Gemini/Clients/GeminiChatStreamingTests.cs b/dotnet/src/Connectors/Connectors.Google.UnitTests/Core/Gemini/Clients/GeminiChatStreamingTests.cs index 692da9146b04..808ce2eb6fc4 100644 --- a/dotnet/src/Connectors/Connectors.Google.UnitTests/Core/Gemini/Clients/GeminiChatStreamingTests.cs +++ b/dotnet/src/Connectors/Connectors.Google.UnitTests/Core/Gemini/Clients/GeminiChatStreamingTests.cs @@ -174,6 +174,8 @@ public async Task ShouldReturnValidGeminiMetadataAsync() } Assert.Equal(testDataResponse.UsageMetadata!.PromptTokenCount, metadata.PromptTokenCount); + Assert.Equal(testDataResponse.UsageMetadata!.CachedContentTokenCount, metadata.CachedContentTokenCount); + Assert.Equal(testDataResponse.UsageMetadata!.ThoughtsTokenCount, metadata.ThoughtsTokenCount); Assert.Equal(testDataCandidate.TokenCount, metadata.CurrentCandidateTokenCount); Assert.Equal(testDataResponse.UsageMetadata.CandidatesTokenCount, metadata.CandidatesTokenCount); Assert.Equal(testDataResponse.UsageMetadata.TotalTokenCount, metadata.TotalTokenCount); @@ -218,6 +220,8 @@ public async Task ShouldReturnValidDictionaryMetadataAsync() } Assert.Equal(testDataResponse.UsageMetadata!.PromptTokenCount, metadata[nameof(GeminiMetadata.PromptTokenCount)]); + Assert.Equal(testDataResponse.UsageMetadata!.CachedContentTokenCount, metadata[nameof(GeminiMetadata.CachedContentTokenCount)]); + Assert.Equal(testDataResponse.UsageMetadata!.ThoughtsTokenCount, metadata[nameof(GeminiMetadata.ThoughtsTokenCount)]); Assert.Equal(testDataCandidate.TokenCount, metadata[nameof(GeminiMetadata.CurrentCandidateTokenCount)]); Assert.Equal(testDataResponse.UsageMetadata.CandidatesTokenCount, metadata[nameof(GeminiMetadata.CandidatesTokenCount)]); Assert.Equal(testDataResponse.UsageMetadata.TotalTokenCount, metadata[nameof(GeminiMetadata.TotalTokenCount)]); diff --git a/dotnet/src/Connectors/Connectors.Google/Core/Gemini/Clients/GeminiChatCompletionClient.cs b/dotnet/src/Connectors/Connectors.Google/Core/Gemini/Clients/GeminiChatCompletionClient.cs index 3d52a92f8825..4b81ba03cf2a 100644 --- a/dotnet/src/Connectors/Connectors.Google/Core/Gemini/Clients/GeminiChatCompletionClient.cs +++ b/dotnet/src/Connectors/Connectors.Google/Core/Gemini/Clients/GeminiChatCompletionClient.cs @@ -685,6 +685,8 @@ private static GeminiMetadata GetResponseMetadata( FinishReason = candidate.FinishReason, Index = candidate.Index, PromptTokenCount = geminiResponse.UsageMetadata?.PromptTokenCount ?? 0, + CachedContentTokenCount = geminiResponse.UsageMetadata?.CachedContentTokenCount ?? 0, + ThoughtsTokenCount = geminiResponse.UsageMetadata?.ThoughtsTokenCount ?? 0, CurrentCandidateTokenCount = candidate.TokenCount, CandidatesTokenCount = geminiResponse.UsageMetadata?.CandidatesTokenCount ?? 0, TotalTokenCount = geminiResponse.UsageMetadata?.TotalTokenCount ?? 0, diff --git a/dotnet/src/Connectors/Connectors.Google/Core/Gemini/Models/GeminiResponse.cs b/dotnet/src/Connectors/Connectors.Google/Core/Gemini/Models/GeminiResponse.cs index 5a028c459a14..04802e3dfd15 100644 --- a/dotnet/src/Connectors/Connectors.Google/Core/Gemini/Models/GeminiResponse.cs +++ b/dotnet/src/Connectors/Connectors.Google/Core/Gemini/Models/GeminiResponse.cs @@ -39,6 +39,18 @@ internal sealed class UsageMetadataElement [JsonPropertyName("promptTokenCount")] public int PromptTokenCount { get; set; } + /// + /// Gets the number of cached content tokens used. + /// + [JsonPropertyName("cachedContentTokenCount")] + public int CachedContentTokenCount { get; set; } + + /// + /// Gets the number of thoughts tokens used. + /// + [JsonPropertyName("thoughtsTokenCount")] + public int ThoughtsTokenCount { get; set; } + /// /// Gets the count of used tokens for all candidates. /// diff --git a/dotnet/src/Connectors/Connectors.Google/Models/Gemini/GeminiMetadata.cs b/dotnet/src/Connectors/Connectors.Google/Models/Gemini/GeminiMetadata.cs index bd03d4cba9ea..1765cebb6ce5 100644 --- a/dotnet/src/Connectors/Connectors.Google/Models/Gemini/GeminiMetadata.cs +++ b/dotnet/src/Connectors/Connectors.Google/Models/Gemini/GeminiMetadata.cs @@ -44,12 +44,21 @@ public int PromptTokenCount } /// - /// The count of token in the current candidate. + /// The count of cached content tokens. /// - public int CurrentCandidateTokenCount + public int CachedContentTokenCount { - get => (this.GetValueFromDictionary(nameof(this.CurrentCandidateTokenCount)) as int?) ?? 0; - internal init => this.SetValueInDictionary(value, nameof(this.CurrentCandidateTokenCount)); + get => (this.GetValueFromDictionary(nameof(this.CachedContentTokenCount)) as int?) ?? 0; + internal init => this.SetValueInDictionary(value, nameof(this.CachedContentTokenCount)); + } + + /// + /// The count of thoughts tokens. + /// + public int ThoughtsTokenCount + { + get => (this.GetValueFromDictionary(nameof(this.ThoughtsTokenCount)) as int?) ?? 0; + internal init => this.SetValueInDictionary(value, nameof(this.ThoughtsTokenCount)); } /// @@ -61,6 +70,15 @@ public int CandidatesTokenCount internal init => this.SetValueInDictionary(value, nameof(this.CandidatesTokenCount)); } + /// + /// The count of token in the current candidate. + /// + public int CurrentCandidateTokenCount + { + get => (this.GetValueFromDictionary(nameof(this.CurrentCandidateTokenCount)) as int?) ?? 0; + internal init => this.SetValueInDictionary(value, nameof(this.CurrentCandidateTokenCount)); + } + /// /// The total count of tokens (prompt + total candidates token count). /// diff --git a/dotnet/src/IntegrationTests/Connectors/Google/Gemini/GeminiChatCompletionTests.cs b/dotnet/src/IntegrationTests/Connectors/Google/Gemini/GeminiChatCompletionTests.cs index 7645d9cf107e..20f7e7f6eee3 100644 --- a/dotnet/src/IntegrationTests/Connectors/Google/Gemini/GeminiChatCompletionTests.cs +++ b/dotnet/src/IntegrationTests/Connectors/Google/Gemini/GeminiChatCompletionTests.cs @@ -409,6 +409,8 @@ public async Task ChatGenerationReturnsUsedTokensAsync(ServiceType serviceType) Assert.True(geminiMetadata.CandidatesTokenCount > 0); Assert.True(geminiMetadata.PromptTokenCount > 0); Assert.True(geminiMetadata.CurrentCandidateTokenCount > 0); + Assert.True(geminiMetadata.CachedContentTokenCount > 0); + Assert.True(geminiMetadata.ThoughtsTokenCount > 0); } [RetryTheory] @@ -433,10 +435,14 @@ public async Task ChatStreamingReturnsUsedTokensAsync(ServiceType serviceType) this.Output.WriteLine($"TotalTokenCount: {geminiMetadata.TotalTokenCount}"); this.Output.WriteLine($"CandidatesTokenCount: {geminiMetadata.CandidatesTokenCount}"); this.Output.WriteLine($"PromptTokenCount: {geminiMetadata.PromptTokenCount}"); + this.Output.WriteLine($"CachedContentTokenCount: {geminiMetadata.CachedContentTokenCount}"); + this.Output.WriteLine($"ThoughtsTokenCount: {geminiMetadata.ThoughtsTokenCount}"); this.Output.WriteLine($"CurrentCandidateTokenCount: {geminiMetadata.CurrentCandidateTokenCount}"); Assert.True(geminiMetadata.TotalTokenCount > 0); Assert.True(geminiMetadata.CandidatesTokenCount > 0); Assert.True(geminiMetadata.PromptTokenCount > 0); + Assert.True(geminiMetadata.CachedContentTokenCount > 0); + Assert.True(geminiMetadata.ThoughtsTokenCount > 0); Assert.True(geminiMetadata.CurrentCandidateTokenCount > 0); }