Skip to content

Commit 05055af

Browse files
author
Rodrigo
committed
Add Gemini usage metadata CachedContentTokenCount and ThoughtsTokenCount
1 parent 167308f commit 05055af

6 files changed

Lines changed: 50 additions & 4 deletions

File tree

dotnet/src/Connectors/Connectors.Google.UnitTests/Core/Gemini/Clients/GeminiChatGenerationTests.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,8 @@ public async Task ShouldReturnValidGeminiMetadataAsync()
164164
}
165165

166166
Assert.Equal(testDataResponse.UsageMetadata!.PromptTokenCount, metadata.PromptTokenCount);
167+
Assert.Equal(testDataResponse.UsageMetadata!.CachedContentTokenCount, metadata.CachedContentTokenCount);
168+
Assert.Equal(testDataResponse.UsageMetadata!.ThoughtsTokenCount, metadata.ThoughtsTokenCount);
167169
Assert.Equal(testDataCandidate.TokenCount, metadata.CurrentCandidateTokenCount);
168170
Assert.Equal(testDataResponse.UsageMetadata.CandidatesTokenCount, metadata.CandidatesTokenCount);
169171
Assert.Equal(testDataResponse.UsageMetadata.TotalTokenCount, metadata.TotalTokenCount);
@@ -207,6 +209,8 @@ public async Task ShouldReturnValidDictionaryMetadataAsync()
207209
}
208210

209211
Assert.Equal(testDataResponse.UsageMetadata!.PromptTokenCount, metadata[nameof(GeminiMetadata.PromptTokenCount)]);
212+
Assert.Equal(testDataResponse.UsageMetadata!.CachedContentTokenCount, metadata[nameof(GeminiMetadata.CachedContentTokenCount)]);
213+
Assert.Equal(testDataResponse.UsageMetadata!.ThoughtsTokenCount, metadata[nameof(GeminiMetadata.ThoughtsTokenCount)]);
210214
Assert.Equal(testDataCandidate.TokenCount, metadata[nameof(GeminiMetadata.CurrentCandidateTokenCount)]);
211215
Assert.Equal(testDataResponse.UsageMetadata.CandidatesTokenCount, metadata[nameof(GeminiMetadata.CandidatesTokenCount)]);
212216
Assert.Equal(testDataResponse.UsageMetadata.TotalTokenCount, metadata[nameof(GeminiMetadata.TotalTokenCount)]);

dotnet/src/Connectors/Connectors.Google.UnitTests/Core/Gemini/Clients/GeminiChatStreamingTests.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,8 @@ public async Task ShouldReturnValidGeminiMetadataAsync()
174174
}
175175

176176
Assert.Equal(testDataResponse.UsageMetadata!.PromptTokenCount, metadata.PromptTokenCount);
177+
Assert.Equal(testDataResponse.UsageMetadata!.CachedContentTokenCount, metadata.CachedContentTokenCount);
178+
Assert.Equal(testDataResponse.UsageMetadata!.ThoughtsTokenCount, metadata.ThoughtsTokenCount);
177179
Assert.Equal(testDataCandidate.TokenCount, metadata.CurrentCandidateTokenCount);
178180
Assert.Equal(testDataResponse.UsageMetadata.CandidatesTokenCount, metadata.CandidatesTokenCount);
179181
Assert.Equal(testDataResponse.UsageMetadata.TotalTokenCount, metadata.TotalTokenCount);
@@ -218,6 +220,8 @@ public async Task ShouldReturnValidDictionaryMetadataAsync()
218220
}
219221

220222
Assert.Equal(testDataResponse.UsageMetadata!.PromptTokenCount, metadata[nameof(GeminiMetadata.PromptTokenCount)]);
223+
Assert.Equal(testDataResponse.UsageMetadata!.CachedContentTokenCount, metadata[nameof(GeminiMetadata.CachedContentTokenCount)]);
224+
Assert.Equal(testDataResponse.UsageMetadata!.ThoughtsTokenCount, metadata[nameof(GeminiMetadata.ThoughtsTokenCount)]);
221225
Assert.Equal(testDataCandidate.TokenCount, metadata[nameof(GeminiMetadata.CurrentCandidateTokenCount)]);
222226
Assert.Equal(testDataResponse.UsageMetadata.CandidatesTokenCount, metadata[nameof(GeminiMetadata.CandidatesTokenCount)]);
223227
Assert.Equal(testDataResponse.UsageMetadata.TotalTokenCount, metadata[nameof(GeminiMetadata.TotalTokenCount)]);

dotnet/src/Connectors/Connectors.Google/Core/Gemini/Clients/GeminiChatCompletionClient.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,8 @@ private static GeminiMetadata GetResponseMetadata(
685685
FinishReason = candidate.FinishReason,
686686
Index = candidate.Index,
687687
PromptTokenCount = geminiResponse.UsageMetadata?.PromptTokenCount ?? 0,
688+
CachedContentTokenCount = geminiResponse.UsageMetadata?.CachedContentTokenCount ?? 0,
689+
ThoughtsTokenCount = geminiResponse.UsageMetadata?.ThoughtsTokenCount ?? 0,
688690
CurrentCandidateTokenCount = candidate.TokenCount,
689691
CandidatesTokenCount = geminiResponse.UsageMetadata?.CandidatesTokenCount ?? 0,
690692
TotalTokenCount = geminiResponse.UsageMetadata?.TotalTokenCount ?? 0,

dotnet/src/Connectors/Connectors.Google/Core/Gemini/Models/GeminiResponse.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,18 @@ internal sealed class UsageMetadataElement
3939
[JsonPropertyName("promptTokenCount")]
4040
public int PromptTokenCount { get; set; }
4141

42+
/// <summary>
43+
/// Gets the number of cached content tokens used.
44+
/// </summary>
45+
[JsonPropertyName("cachedContentTokenCount")]
46+
public int CachedContentTokenCount { get; set; }
47+
48+
/// <summary>
49+
/// Gets the number of thoughts tokens used.
50+
/// </summary>
51+
[JsonPropertyName("thoughtsTokenCount")]
52+
public int ThoughtsTokenCount { get; set; }
53+
4254
/// <summary>
4355
/// Gets the count of used tokens for all candidates.
4456
/// </summary>

dotnet/src/Connectors/Connectors.Google/Models/Gemini/GeminiMetadata.cs

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,21 @@ public int PromptTokenCount
4444
}
4545

4646
/// <summary>
47-
/// The count of token in the current candidate.
47+
/// The count of cached content tokens.
4848
/// </summary>
49-
public int CurrentCandidateTokenCount
49+
public int CachedContentTokenCount
5050
{
51-
get => (this.GetValueFromDictionary(nameof(this.CurrentCandidateTokenCount)) as int?) ?? 0;
52-
internal init => this.SetValueInDictionary(value, nameof(this.CurrentCandidateTokenCount));
51+
get => (this.GetValueFromDictionary(nameof(this.CachedContentTokenCount)) as int?) ?? 0;
52+
internal init => this.SetValueInDictionary(value, nameof(this.CachedContentTokenCount));
53+
}
54+
55+
/// <summary>
56+
/// The count of thoughts tokens.
57+
/// </summary>
58+
public int ThoughtsTokenCount
59+
{
60+
get => (this.GetValueFromDictionary(nameof(this.ThoughtsTokenCount)) as int?) ?? 0;
61+
internal init => this.SetValueInDictionary(value, nameof(this.ThoughtsTokenCount));
5362
}
5463

5564
/// <summary>
@@ -61,6 +70,15 @@ public int CandidatesTokenCount
6170
internal init => this.SetValueInDictionary(value, nameof(this.CandidatesTokenCount));
6271
}
6372

73+
/// <summary>
74+
/// The count of token in the current candidate.
75+
/// </summary>
76+
public int CurrentCandidateTokenCount
77+
{
78+
get => (this.GetValueFromDictionary(nameof(this.CurrentCandidateTokenCount)) as int?) ?? 0;
79+
internal init => this.SetValueInDictionary(value, nameof(this.CurrentCandidateTokenCount));
80+
}
81+
6482
/// <summary>
6583
/// The total count of tokens (prompt + total candidates token count).
6684
/// </summary>

dotnet/src/IntegrationTests/Connectors/Google/Gemini/GeminiChatCompletionTests.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,8 @@ public async Task ChatGenerationReturnsUsedTokensAsync(ServiceType serviceType)
409409
Assert.True(geminiMetadata.CandidatesTokenCount > 0);
410410
Assert.True(geminiMetadata.PromptTokenCount > 0);
411411
Assert.True(geminiMetadata.CurrentCandidateTokenCount > 0);
412+
Assert.True(geminiMetadata.CachedContentTokenCount > 0);
413+
Assert.True(geminiMetadata.ThoughtsTokenCount > 0);
412414
}
413415

414416
[RetryTheory]
@@ -433,10 +435,14 @@ public async Task ChatStreamingReturnsUsedTokensAsync(ServiceType serviceType)
433435
this.Output.WriteLine($"TotalTokenCount: {geminiMetadata.TotalTokenCount}");
434436
this.Output.WriteLine($"CandidatesTokenCount: {geminiMetadata.CandidatesTokenCount}");
435437
this.Output.WriteLine($"PromptTokenCount: {geminiMetadata.PromptTokenCount}");
438+
this.Output.WriteLine($"CachedContentTokenCount: {geminiMetadata.CachedContentTokenCount}");
439+
this.Output.WriteLine($"ThoughtsTokenCount: {geminiMetadata.ThoughtsTokenCount}");
436440
this.Output.WriteLine($"CurrentCandidateTokenCount: {geminiMetadata.CurrentCandidateTokenCount}");
437441
Assert.True(geminiMetadata.TotalTokenCount > 0);
438442
Assert.True(geminiMetadata.CandidatesTokenCount > 0);
439443
Assert.True(geminiMetadata.PromptTokenCount > 0);
444+
Assert.True(geminiMetadata.CachedContentTokenCount > 0);
445+
Assert.True(geminiMetadata.ThoughtsTokenCount > 0);
440446
Assert.True(geminiMetadata.CurrentCandidateTokenCount > 0);
441447
}
442448

0 commit comments

Comments
 (0)