From c0baba28e2670a4f9366ce322c62935c79d40458 Mon Sep 17 00:00:00 2001 From: toshiossada Date: Wed, 30 Apr 2025 17:11:10 -0300 Subject: [PATCH 1/4] feat: Creating onDone event be trigger when request was done exposing GenerateContentResponse --- .../providers/implementations/gemini_provider.dart | 12 ++++++++++-- lib/src/providers/interface/chat_message.dart | 4 ++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/src/providers/implementations/gemini_provider.dart b/lib/src/providers/implementations/gemini_provider.dart index 5c0e8d0..8f0e48b 100644 --- a/lib/src/providers/implementations/gemini_provider.dart +++ b/lib/src/providers/implementations/gemini_provider.dart @@ -29,6 +29,7 @@ class GeminiProvider extends LlmProvider with ChangeNotifier { /// model's generation behavior. GeminiProvider({ required GenerativeModel model, + this.onDone, Iterable? history, List? chatSafetySettings, GenerationConfig? chatGenerationConfig, @@ -38,7 +39,7 @@ class GeminiProvider extends LlmProvider with ChangeNotifier { _chatGenerationConfig = chatGenerationConfig { _chat = _startChat(history); } - + final void Function(GenerateContentResponse)? onDone; final GenerativeModel _model; final List? _chatSafetySettings; final GenerationConfig? _chatGenerationConfig; @@ -53,6 +54,7 @@ class GeminiProvider extends LlmProvider with ChangeNotifier { prompt: prompt, attachments: attachments, contentStreamGenerator: (c) => _model.generateContentStream([c]), + onDone: onDone, ); @override @@ -68,6 +70,7 @@ class GeminiProvider extends LlmProvider with ChangeNotifier { prompt: prompt, attachments: attachments, contentStreamGenerator: _chat!.sendMessageStream, + onDone: onDone, ); // don't write this code if you're targeting the web until this is fixed: @@ -90,6 +93,7 @@ class GeminiProvider extends LlmProvider with ChangeNotifier { required Iterable attachments, required Stream Function(Content) contentStreamGenerator, + required void Function(GenerateContentResponse response)? onDone, }) async* { final content = Content('user', [ TextPart(prompt), @@ -104,7 +108,11 @@ class GeminiProvider extends LlmProvider with ChangeNotifier { // if (text != null) yield text; // } yield* response - .map((chunk) => chunk.text) + .map((chunk) { + if (chunk.candidates.any((e) => e.finishReason != null)) + onDone?.call(chunk); + return chunk.text; + }) .where((text) => text != null) .cast(); } diff --git a/lib/src/providers/interface/chat_message.dart b/lib/src/providers/interface/chat_message.dart index a1e6aa1..86ba75e 100644 --- a/lib/src/providers/interface/chat_message.dart +++ b/lib/src/providers/interface/chat_message.dart @@ -27,6 +27,7 @@ class ChatMessage { required this.origin, required this.text, required this.attachments, + this.functionCalls = const [], }) : assert(origin.isUser && text != null && text.isNotEmpty || origin.isLlm); /// Converts a JSON map representation to a [ChatMessage]. @@ -79,6 +80,7 @@ class ChatMessage { /// Text content of the message. String? text; + List> functionCalls; /// The origin of the message (user or LLM). final MessageOrigin origin; @@ -90,6 +92,8 @@ class ChatMessage { /// /// This is typically used for LLM messages that are streamed in parts. void append(String text) => this.text = (this.text ?? '') + text; + void appendFunctionCalls(Map functionCall) => + functionCalls.add(functionCall); @override String toString() => From 961d2c0184c662d84d20df29443d193405dc2347 Mon Sep 17 00:00:00 2001 From: toshiossada Date: Wed, 30 Apr 2025 17:12:20 -0300 Subject: [PATCH 2/4] fix: remove unnecessary modify --- lib/src/providers/implementations/gemini_provider.dart | 3 ++- lib/src/providers/interface/chat_message.dart | 4 ---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/lib/src/providers/implementations/gemini_provider.dart b/lib/src/providers/implementations/gemini_provider.dart index 8f0e48b..1b89edd 100644 --- a/lib/src/providers/implementations/gemini_provider.dart +++ b/lib/src/providers/implementations/gemini_provider.dart @@ -109,8 +109,9 @@ class GeminiProvider extends LlmProvider with ChangeNotifier { // } yield* response .map((chunk) { - if (chunk.candidates.any((e) => e.finishReason != null)) + if (chunk.candidates.any((e) => e.finishReason != null)) { onDone?.call(chunk); + } return chunk.text; }) .where((text) => text != null) diff --git a/lib/src/providers/interface/chat_message.dart b/lib/src/providers/interface/chat_message.dart index 86ba75e..a1e6aa1 100644 --- a/lib/src/providers/interface/chat_message.dart +++ b/lib/src/providers/interface/chat_message.dart @@ -27,7 +27,6 @@ class ChatMessage { required this.origin, required this.text, required this.attachments, - this.functionCalls = const [], }) : assert(origin.isUser && text != null && text.isNotEmpty || origin.isLlm); /// Converts a JSON map representation to a [ChatMessage]. @@ -80,7 +79,6 @@ class ChatMessage { /// Text content of the message. String? text; - List> functionCalls; /// The origin of the message (user or LLM). final MessageOrigin origin; @@ -92,8 +90,6 @@ class ChatMessage { /// /// This is typically used for LLM messages that are streamed in parts. void append(String text) => this.text = (this.text ?? '') + text; - void appendFunctionCalls(Map functionCall) => - functionCalls.add(functionCall); @override String toString() => From f1448fa3c3af321e0f4f2a5faa8436ec9eaea77c Mon Sep 17 00:00:00 2001 From: toshiossada Date: Wed, 30 Apr 2025 20:31:10 -0300 Subject: [PATCH 3/4] fix: adding onDone on VertexProvider --- lib/src/providers/implementations/vertex_provider.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/src/providers/implementations/vertex_provider.dart b/lib/src/providers/implementations/vertex_provider.dart index d9858d3..5ba8301 100644 --- a/lib/src/providers/implementations/vertex_provider.dart +++ b/lib/src/providers/implementations/vertex_provider.dart @@ -29,6 +29,7 @@ class VertexProvider extends LlmProvider with ChangeNotifier { /// model's generation behavior. VertexProvider({ required GenerativeModel model, + this.onDone, Iterable? history, List? chatSafetySettings, GenerationConfig? chatGenerationConfig, @@ -39,6 +40,7 @@ class VertexProvider extends LlmProvider with ChangeNotifier { _chat = _startChat(history); } + final void Function(GenerateContentResponse)? onDone; final GenerativeModel _model; final List? _chatSafetySettings; final GenerationConfig? _chatGenerationConfig; From 225ba2635155cf1c1bff09ba7d03f5eca57ab05e Mon Sep 17 00:00:00 2001 From: toshiossada Date: Thu, 1 May 2025 00:46:45 -0300 Subject: [PATCH 4/4] fix: replace onDone for onFunctionCalls --- .../implementations/gemini_provider.dart | 15 ++++++++------- .../implementations/vertex_provider.dart | 5 ++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/src/providers/implementations/gemini_provider.dart b/lib/src/providers/implementations/gemini_provider.dart index 1b89edd..12fdb3c 100644 --- a/lib/src/providers/implementations/gemini_provider.dart +++ b/lib/src/providers/implementations/gemini_provider.dart @@ -29,7 +29,7 @@ class GeminiProvider extends LlmProvider with ChangeNotifier { /// model's generation behavior. GeminiProvider({ required GenerativeModel model, - this.onDone, + this.onFunctionCalls, Iterable? history, List? chatSafetySettings, GenerationConfig? chatGenerationConfig, @@ -39,7 +39,7 @@ class GeminiProvider extends LlmProvider with ChangeNotifier { _chatGenerationConfig = chatGenerationConfig { _chat = _startChat(history); } - final void Function(GenerateContentResponse)? onDone; + final void Function(Iterable)? onFunctionCalls; final GenerativeModel _model; final List? _chatSafetySettings; final GenerationConfig? _chatGenerationConfig; @@ -54,7 +54,7 @@ class GeminiProvider extends LlmProvider with ChangeNotifier { prompt: prompt, attachments: attachments, contentStreamGenerator: (c) => _model.generateContentStream([c]), - onDone: onDone, + onFunctionCalls: onFunctionCalls, ); @override @@ -70,7 +70,7 @@ class GeminiProvider extends LlmProvider with ChangeNotifier { prompt: prompt, attachments: attachments, contentStreamGenerator: _chat!.sendMessageStream, - onDone: onDone, + onFunctionCalls: onFunctionCalls, ); // don't write this code if you're targeting the web until this is fixed: @@ -93,7 +93,7 @@ class GeminiProvider extends LlmProvider with ChangeNotifier { required Iterable attachments, required Stream Function(Content) contentStreamGenerator, - required void Function(GenerateContentResponse response)? onDone, + required void Function(Iterable)? onFunctionCalls, }) async* { final content = Content('user', [ TextPart(prompt), @@ -109,8 +109,9 @@ class GeminiProvider extends LlmProvider with ChangeNotifier { // } yield* response .map((chunk) { - if (chunk.candidates.any((e) => e.finishReason != null)) { - onDone?.call(chunk); + if (chunk.candidates.any((e) => e.finishReason != null) && + chunk.functionCalls.isNotEmpty) { + onFunctionCalls?.call(chunk.functionCalls); } return chunk.text; }) diff --git a/lib/src/providers/implementations/vertex_provider.dart b/lib/src/providers/implementations/vertex_provider.dart index 5ba8301..293260a 100644 --- a/lib/src/providers/implementations/vertex_provider.dart +++ b/lib/src/providers/implementations/vertex_provider.dart @@ -29,7 +29,7 @@ class VertexProvider extends LlmProvider with ChangeNotifier { /// model's generation behavior. VertexProvider({ required GenerativeModel model, - this.onDone, + this.onFunctionCalls, Iterable? history, List? chatSafetySettings, GenerationConfig? chatGenerationConfig, @@ -39,8 +39,7 @@ class VertexProvider extends LlmProvider with ChangeNotifier { _chatGenerationConfig = chatGenerationConfig { _chat = _startChat(history); } - - final void Function(GenerateContentResponse)? onDone; + final void Function(Iterable)? onFunctionCalls; final GenerativeModel _model; final List? _chatSafetySettings; final GenerationConfig? _chatGenerationConfig;