diff --git a/packages/firebase_ai/firebase_ai/example/lib/pages/token_count_page.dart b/packages/firebase_ai/firebase_ai/example/lib/pages/token_count_page.dart index 8e2455d5d429..152b09718e21 100644 --- a/packages/firebase_ai/firebase_ai/example/lib/pages/token_count_page.dart +++ b/packages/firebase_ai/firebase_ai/example/lib/pages/token_count_page.dart @@ -87,8 +87,7 @@ class _TokenCountPageState extends State { const prompt = 'tell a short story'; final content = Content.text(prompt); final tokenResponse = await widget.model.countTokens([content]); - final tokenResult = 'Count token: ${tokenResponse.totalTokens}, billable ' - 'characters: ${tokenResponse.totalBillableCharacters}'; + final tokenResult = 'Count token: ${tokenResponse.totalTokens}'; _messages.add(MessageData(text: tokenResult, fromUser: false)); final contentResponse = await widget.model.generateContent([content]); diff --git a/packages/firebase_ai/firebase_ai/lib/src/api.dart b/packages/firebase_ai/firebase_ai/lib/src/api.dart index afe69f6dce52..687fe5cc6510 100644 --- a/packages/firebase_ai/firebase_ai/lib/src/api.dart +++ b/packages/firebase_ai/firebase_ai/lib/src/api.dart @@ -31,6 +31,9 @@ final class CountTokensResponse { /// The number of characters that the `model` could bill at. /// /// Always non-negative. + @Deprecated( + 'Use `totalTokens` instead; Gemini 2.0 series models and newer are always billed by token count.', + ) final int? totalBillableCharacters; /// List of modalities that were processed in the request input. diff --git a/packages/firebase_ai/firebase_ai/test/api_test.dart b/packages/firebase_ai/firebase_ai/test/api_test.dart index e00b8090325a..0da8522fd67e 100644 --- a/packages/firebase_ai/firebase_ai/test/api_test.dart +++ b/packages/firebase_ai/firebase_ai/test/api_test.dart @@ -25,17 +25,14 @@ void main() { group('CountTokensResponse', () { test('constructor initializes fields correctly', () { final details = [ModalityTokenCount(ContentModality.text, 10)]; - final response = CountTokensResponse(100, - totalBillableCharacters: 50, promptTokensDetails: details); + final response = CountTokensResponse(100, promptTokensDetails: details); expect(response.totalTokens, 100); - expect(response.totalBillableCharacters, 50); expect(response.promptTokensDetails, same(details)); }); test('constructor with null optional fields', () { final response = CountTokensResponse(100); expect(response.totalTokens, 100); - expect(response.totalBillableCharacters, isNull); expect(response.promptTokensDetails, isNull); }); }); @@ -445,7 +442,6 @@ void main() { test('parses valid full JSON correctly', () { final json = { 'totalTokens': 120, - 'totalBillableCharacters': 240, 'promptTokensDetails': [ { 'modality': 'TEXT', @@ -455,7 +451,6 @@ void main() { }; final response = VertexSerialization().parseCountTokensResponse(json); expect(response.totalTokens, 120); - expect(response.totalBillableCharacters, 240); expect(response.promptTokensDetails, isNotNull); expect(response.promptTokensDetails, hasLength(2)); expect(response.promptTokensDetails![0].modality, ContentModality.text); @@ -469,7 +464,6 @@ void main() { final json = {'totalTokens': 50}; final response = VertexSerialization().parseCountTokensResponse(json); expect(response.totalTokens, 50); - expect(response.totalBillableCharacters, isNull); expect(response.promptTokensDetails, isNull); }); diff --git a/packages/firebase_vertexai/firebase_vertexai/example/lib/pages/token_count_page.dart b/packages/firebase_vertexai/firebase_vertexai/example/lib/pages/token_count_page.dart index 148fc21a4399..0b3b60f6c622 100644 --- a/packages/firebase_vertexai/firebase_vertexai/example/lib/pages/token_count_page.dart +++ b/packages/firebase_vertexai/firebase_vertexai/example/lib/pages/token_count_page.dart @@ -87,8 +87,7 @@ class _TokenCountPageState extends State { const prompt = 'tell a short story'; final content = Content.text(prompt); final tokenResponse = await widget.model.countTokens([content]); - final tokenResult = 'Count token: ${tokenResponse.totalTokens}, billable ' - 'characters: ${tokenResponse.totalBillableCharacters}'; + final tokenResult = 'Count token: ${tokenResponse.totalTokens}'; _messages.add(MessageData(text: tokenResult, fromUser: false)); final contentResponse = await widget.model.generateContent([content]); diff --git a/packages/firebase_vertexai/firebase_vertexai/test/api_test.dart b/packages/firebase_vertexai/firebase_vertexai/test/api_test.dart index e00b8090325a..0da8522fd67e 100644 --- a/packages/firebase_vertexai/firebase_vertexai/test/api_test.dart +++ b/packages/firebase_vertexai/firebase_vertexai/test/api_test.dart @@ -25,17 +25,14 @@ void main() { group('CountTokensResponse', () { test('constructor initializes fields correctly', () { final details = [ModalityTokenCount(ContentModality.text, 10)]; - final response = CountTokensResponse(100, - totalBillableCharacters: 50, promptTokensDetails: details); + final response = CountTokensResponse(100, promptTokensDetails: details); expect(response.totalTokens, 100); - expect(response.totalBillableCharacters, 50); expect(response.promptTokensDetails, same(details)); }); test('constructor with null optional fields', () { final response = CountTokensResponse(100); expect(response.totalTokens, 100); - expect(response.totalBillableCharacters, isNull); expect(response.promptTokensDetails, isNull); }); }); @@ -445,7 +442,6 @@ void main() { test('parses valid full JSON correctly', () { final json = { 'totalTokens': 120, - 'totalBillableCharacters': 240, 'promptTokensDetails': [ { 'modality': 'TEXT', @@ -455,7 +451,6 @@ void main() { }; final response = VertexSerialization().parseCountTokensResponse(json); expect(response.totalTokens, 120); - expect(response.totalBillableCharacters, 240); expect(response.promptTokensDetails, isNotNull); expect(response.promptTokensDetails, hasLength(2)); expect(response.promptTokensDetails![0].modality, ContentModality.text); @@ -469,7 +464,6 @@ void main() { final json = {'totalTokens': 50}; final response = VertexSerialization().parseCountTokensResponse(json); expect(response.totalTokens, 50); - expect(response.totalBillableCharacters, isNull); expect(response.promptTokensDetails, isNull); });