From 7a402b83dc86dab3c2b57cbc74ba5875ead8a326 Mon Sep 17 00:00:00 2001 From: Cynthia J Date: Tue, 3 Feb 2026 11:45:43 -0800 Subject: [PATCH 1/3] add test for server prompt code execution --- .../lib/pages/server_template_page.dart | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/packages/firebase_ai/firebase_ai/example/lib/pages/server_template_page.dart b/packages/firebase_ai/firebase_ai/example/lib/pages/server_template_page.dart index efe0c8946b94..4c36971550cb 100644 --- a/packages/firebase_ai/firebase_ai/example/lib/pages/server_template_page.dart +++ b/packages/firebase_ai/firebase_ai/example/lib/pages/server_template_page.dart @@ -154,6 +154,15 @@ class _ServerTemplatePageState extends State { color: Theme.of(context).colorScheme.primary, ), tooltip: 'Generate', + ), + if (!_loading) + IconButton( + onPressed: _testCodeExecution, + icon: Icon( + Icons.code, + color: Theme.of(context).colorScheme.primary, + ), + tooltip: 'Test Code Execution', ) else const CircularProgressIndicator(), @@ -290,6 +299,62 @@ class _ServerTemplatePageState extends State { } } + Future _testCodeExecution() async { + setState(() { + _loading = true; + }); + + try { + _messages + .add(MessageData(text: 'Testing code execution', fromUser: true)); + final response = await _templateGenerativeModel + ?.generateContent('cj-code-execution', inputs: {}); + + //_messages.add(MessageData(text: response?.text, fromUser: false)); + final buffer = StringBuffer(); + for (final part in response!.candidates.first.content.parts) { + if (part is ExecutableCodePart) { + buffer.writeln('Executable Code:'); + buffer.writeln('Language: ${part.language}'); + buffer.writeln('Code:'); + buffer.writeln(part.code); + } else if (part is CodeExecutionResultPart) { + buffer.writeln('Code Execution Result:'); + buffer.writeln('Outcome: ${part.outcome}'); + buffer.writeln('Output:'); + buffer.writeln(part.output); + } else if (part is TextPart) { + buffer.writeln(part.text); + } + } + + if (buffer.isNotEmpty) { + _messages.add( + MessageData( + text: buffer.toString(), + fromUser: false, + ), + ); + } + + setState(() { + _loading = false; + _scrollDown(); + }); + } catch (e) { + _showError(e.toString()); + setState(() { + _loading = false; + }); + } finally { + _textController.clear(); + setState(() { + _loading = false; + }); + _textFieldFocus.requestFocus(); + } + } + void _showError(String message) { showDialog( context: context, From 697a44e538d61559bb512cb890910ab66e2bc92d Mon Sep 17 00:00:00 2001 From: Cynthia J Date: Thu, 19 Feb 2026 14:49:54 -0800 Subject: [PATCH 2/3] review comments --- .../example/lib/pages/server_template_page.dart | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/packages/firebase_ai/firebase_ai/example/lib/pages/server_template_page.dart b/packages/firebase_ai/firebase_ai/example/lib/pages/server_template_page.dart index b98e73b17527..eb09a836e1b8 100644 --- a/packages/firebase_ai/firebase_ai/example/lib/pages/server_template_page.dart +++ b/packages/firebase_ai/firebase_ai/example/lib/pages/server_template_page.dart @@ -129,7 +129,7 @@ class _ServerTemplatePageState extends State { const SizedBox.square( dimension: 15, ), - if (!_loading) + if (!_loading) ...[ IconButton( onPressed: () async { await _serverTemplateImagen(_textController.text); @@ -140,7 +140,6 @@ class _ServerTemplatePageState extends State { ), tooltip: 'Imagen', ), - if (!_loading) IconButton( onPressed: () async { await _serverTemplateImageInput(_textController.text); @@ -151,7 +150,6 @@ class _ServerTemplatePageState extends State { ), tooltip: 'Image Input', ), - if (!_loading) IconButton( onPressed: () async { await _serverTemplateUrlContext(_textController.text); @@ -162,7 +160,6 @@ class _ServerTemplatePageState extends State { ), tooltip: 'URL Context', ), - if (!_loading) IconButton( onPressed: () async { await _sendServerTemplateMessage(_textController.text); @@ -173,7 +170,6 @@ class _ServerTemplatePageState extends State { ), tooltip: 'Generate', ), - if (!_loading) IconButton( onPressed: _testCodeExecution, icon: Icon( @@ -181,8 +177,8 @@ class _ServerTemplatePageState extends State { color: Theme.of(context).colorScheme.primary, ), tooltip: 'Test Code Execution', - ) - else + ), + ] else const CircularProgressIndicator(), ], ), @@ -396,7 +392,6 @@ class _ServerTemplatePageState extends State { final response = await _templateGenerativeModel ?.generateContent('cj-code-execution', inputs: {}); - //_messages.add(MessageData(text: response?.text, fromUser: false)); final buffer = StringBuffer(); for (final part in response!.candidates.first.content.parts) { if (part is ExecutableCodePart) { From e6cedfbdc4857e237a8213c295bb5df38166a80c Mon Sep 17 00:00:00 2001 From: Cynthia J Date: Thu, 19 Feb 2026 15:55:17 -0800 Subject: [PATCH 3/3] fix analyzer --- .../firebase_ai/example/lib/pages/server_template_page.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/firebase_ai/firebase_ai/example/lib/pages/server_template_page.dart b/packages/firebase_ai/firebase_ai/example/lib/pages/server_template_page.dart index eb09a836e1b8..1be4e6d11ffe 100644 --- a/packages/firebase_ai/firebase_ai/example/lib/pages/server_template_page.dart +++ b/packages/firebase_ai/firebase_ai/example/lib/pages/server_template_page.dart @@ -390,6 +390,7 @@ class _ServerTemplatePageState extends State { _messages .add(MessageData(text: 'Testing code execution', fromUser: true)); final response = await _templateGenerativeModel + // ignore: experimental_member_use ?.generateContent('cj-code-execution', inputs: {}); final buffer = StringBuffer();