Skip to content

Commit 6258e94

Browse files
committed
complete step 5
1 parent aab9fb2 commit 6258e94

File tree

22 files changed

+809
-574
lines changed

22 files changed

+809
-574
lines changed

colorist/codelab_rebuild.yaml

Lines changed: 98 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)