@@ -219,9 +219,8 @@ steps:
219219 chatStateNotifier.addUserMessage(message);
220220 logStateNotifier.logUserText(message);
221221 try {
222- final responseText =
223- (await chatSession.sendMessage(Content.text(message))).text?.trim() ??
224- 'No text response received';
222+ final response = await chatSession.sendMessage(Content.text(message));
223+ final responseText = response.text?.trim() ?? 'No text response received';
225224 logStateNotifier.logLlmText(responseText);
226225 chatStateNotifier.addLlmMessage(responseText, MessageState.complete);
227226 } catch (e, st) {
@@ -650,7 +649,96 @@ steps:
650649 steps :
651650 - name : Remove generated code
652651 rmdir : step_05
653-
652+ - name : Patch lib/services/gemini_chat_service.dart
653+ path : colorist/lib/services/gemini_chat_service.dart
654+ patch-u : |
655+ --- b/colorist/step_05/lib/services/gemini_chat_service.dart
656+ +++ a/colorist/step_05/lib/services/gemini_chat_service.dart
657+ @@ -12,6 +12,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
658+ import 'package:riverpod_annotation/riverpod_annotation.dart';
659+
660+ import '../providers/gemini.dart';
661+ +import 'gemini_tools.dart';
662+
663+ part 'gemini_chat_service.g.dart';
664+
665+ @@ -31,6 +32,13 @@ class GeminiChatService {
666+ final responseText = response.text?.trim() ?? 'No text response received';
667+ logStateNotifier.logLlmText(responseText);
668+ chatStateNotifier.addLlmMessage(responseText, MessageState.complete);
669+ +
670+ + if (response.functionCalls.isNotEmpty) {
671+ + final geminiTools = ref.read(geminiToolsProvider);
672+ + for (final functionCall in response.functionCalls) {
673+ + geminiTools.handleFunctionCall(functionCall.name, functionCall.args);
674+ + }
675+ + }
676+ } catch (e, st) {
677+ logStateNotifier.logError(e, st: st);
678+ }
679+ - name : Patch lib/services/gemini_tools.dart
680+ path : colorist/lib/services/gemini_tools.dart
681+ patch-u : |
682+ --- b/colorist/step_05/lib/services/gemini_tools.dart
683+ +++ a/colorist/step_05/lib/services/gemini_tools.dart
684+ @@ -2,6 +2,8 @@
685+ // Use of this source code is governed by a BSD-style license that can be
686+ // found in the LICENSE file.
687+
688+ +import 'package:colorist_ui/providers/color_state_notifier.dart';
689+ +import 'package:colorist_ui/providers/log_state_notifier.dart';
690+ import 'package:firebase_vertexai/firebase_vertexai.dart';
691+ import 'package:flutter_riverpod/flutter_riverpod.dart';
692+ import 'package:riverpod_annotation/riverpod_annotation.dart';
693+ @@ -26,6 +28,45 @@ class GeminiTools {
694+ List<Tool> get tools => [
695+ Tool.functionDeclarations([setColorFuncDecl]),
696+ ];
697+ +
698+ + Map<String, Object?> handleFunctionCall(
699+ + String functionName,
700+ + Map<String, Object?> arguments,
701+ + ) {
702+ + final logStateNotifier = ref.read(logStateNotifierProvider.notifier);
703+ + logStateNotifier.logFunctionCall(functionName, arguments);
704+ + return switch (functionName) {
705+ + 'set_color' => handleSetColor(arguments),
706+ + _ => handleUnknownFunction(functionName),
707+ + };
708+ + }
709+ +
710+ + Map<String, Object?> handleSetColor(Map<String, Object?> arguments) {
711+ + final colorStateNotifier = ref.read(colorStateNotifierProvider.notifier);
712+ + final red = (arguments['red'] as num).toDouble();
713+ + final green = (arguments['green'] as num).toDouble();
714+ + final blue = (arguments['blue'] as num).toDouble();
715+ + final functionResults = {
716+ + 'success': true,
717+ + 'current_color':
718+ + colorStateNotifier
719+ + .updateColor(red: red, green: green, blue: blue)
720+ + .toLLMContextMap(),
721+ + };
722+ +
723+ + final logStateNotifier = ref.read(logStateNotifierProvider.notifier);
724+ + logStateNotifier.logFunctionResults(functionResults);
725+ + return functionResults;
726+ + }
727+ +
728+ + Map<String, Object?> handleUnknownFunction(String functionName) {
729+ + final logStateNotifier = ref.read(logStateNotifierProvider.notifier);
730+ + logStateNotifier.logWarning('Unsupported function call $functionName');
731+ + return {
732+ + 'success': false,
733+ + 'reason': 'Unsupported function call $functionName',
734+ + };
735+ + }
736+ }
737+
738+ @riverpod
739+ - name : Run build_runner
740+ path : colorist
741+ dart : run build_runner build --delete-conflicting-outputs
654742 - name : Copy step_05
655743 copydir :
656744 from : colorist
@@ -663,6 +751,9 @@ steps:
663751 - name : Remove generated code
664752 rmdir : step_06
665753
754+ - name : Run build_runner
755+ path : colorist
756+ dart : run build_runner build --delete-conflicting-outputs
666757 - name : Copy step_06
667758 copydir :
668759 from : colorist
@@ -675,6 +766,9 @@ steps:
675766 - name : Remove generated code
676767 rmdir : step_07
677768
769+ - name : Run build_runner
770+ path : colorist
771+ dart : run build_runner build --delete-conflicting-outputs
678772 - name : Upgrade deps
679773 path : colorist
680774 flutter : pub upgrade --major-versions
0 commit comments