From f1f65a636d3806933456cd67617fc6e8b909272e Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Fri, 24 Oct 2025 14:58:28 -0400 Subject: [PATCH 1/3] [Firebase AI] Test a chat template with `name` and `language` params --- .../ConversationFromTemplateScreen.swift | 19 ++++++++++++++++- .../ConversationFromTemplateViewModel.swift | 21 +++++++++++++------ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/firebaseai/ChatExample/Screens/ConversationFromTemplateScreen.swift b/firebaseai/ChatExample/Screens/ConversationFromTemplateScreen.swift index 4adb1523d..fbd49ff48 100644 --- a/firebaseai/ChatExample/Screens/ConversationFromTemplateScreen.swift +++ b/firebaseai/ChatExample/Screens/ConversationFromTemplateScreen.swift @@ -28,6 +28,12 @@ struct ConversationFromTemplateScreen: View { @State private var userPrompt = "" + @State + private var userName = "" + + @State + private var preferredLanguage = "" + init(firebaseService: FirebaseAI, title: String) { self.title = title self.firebaseService = firebaseService @@ -44,6 +50,17 @@ struct ConversationFromTemplateScreen: View { var body: some View { VStack { + VStack { + HStack { + Text("Name:") + TextField("Your name", text: $userName) + } + HStack { + Text("Language:") + TextField("Your preferred response language", text: $preferredLanguage) + } + }.padding() + ScrollViewReader { scrollViewProxy in List { ForEach(viewModel.messages) { message in @@ -104,7 +121,7 @@ struct ConversationFromTemplateScreen: View { Task { let prompt = userPrompt userPrompt = "" - await viewModel.sendMessage(prompt) + await viewModel.sendMessage(prompt, name: userName, language: preferredLanguage) } } diff --git a/firebaseai/ChatExample/ViewModels/ConversationFromTemplateViewModel.swift b/firebaseai/ChatExample/ViewModels/ConversationFromTemplateViewModel.swift index 63d19d28f..bda8022d5 100644 --- a/firebaseai/ChatExample/ViewModels/ConversationFromTemplateViewModel.swift +++ b/firebaseai/ChatExample/ViewModels/ConversationFromTemplateViewModel.swift @@ -41,18 +41,20 @@ class ConversationFromTemplateViewModel: ObservableObject { init(firebaseService: FirebaseAI) { model = firebaseService.templateGenerativeModel() - chat = model.startChat(templateID: "chat-history") + chat = model.startChat(templateID: "apple-qs-chat") } - func sendMessage(_ text: String) async { + func sendMessage(_ text: String, name: String, language: String) async { error = nil - await internalSendMessage(text) + let name = name.isEmpty ? nil : name + let language = language.isEmpty ? nil : language + await internalSendMessage(text, name: name, language: language) } func startNewChat() { stop() error = nil - chat = model.startChat(templateID: "chat-history") + chat = model.startChat(templateID: "apple-qs-chat") messages.removeAll() } @@ -61,7 +63,7 @@ class ConversationFromTemplateViewModel: ObservableObject { error = nil } - private func internalSendMessage(_ text: String) async { + private func internalSendMessage(_ text: String, name: String?, language: String?) async { chatTask?.cancel() chatTask = Task { @@ -79,7 +81,14 @@ class ConversationFromTemplateViewModel: ObservableObject { messages.append(systemMessage) do { - let response = try await chat.sendMessage(text, inputs: ["message": text]) + var inputs = ["message": text] + if let name { + inputs["name"] = name + } + if let language { + inputs["language"] = language + } + let response = try await chat.sendMessage(text, inputs: inputs) if let responseText = response.text { // replace pending message with backend response From 1f23dda774e7335d58c95e41017d1794b354fdbc Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Fri, 24 Oct 2025 15:15:05 -0400 Subject: [PATCH 2/3] Add template details --- .../ConversationFromTemplateViewModel.swift | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/firebaseai/ChatExample/ViewModels/ConversationFromTemplateViewModel.swift b/firebaseai/ChatExample/ViewModels/ConversationFromTemplateViewModel.swift index bda8022d5..ffd657567 100644 --- a/firebaseai/ChatExample/ViewModels/ConversationFromTemplateViewModel.swift +++ b/firebaseai/ChatExample/ViewModels/ConversationFromTemplateViewModel.swift @@ -20,6 +20,28 @@ import Foundation import UIKit +// Template Details +// +// Configuration +// +// input: +// default: +// language: "English" +// schema: +// name?: string +// language?: string +// message: string +// +// Prompt and system instructions +// +// {{role "system"}} +// {{#if name}}The user's name is {{name}}.{{/if}} +// The user prefers to communicate in {{language}}. +// {{history}} +// {{role "user"}} +// {{message}} +// + @MainActor class ConversationFromTemplateViewModel: ObservableObject { /// This array holds both the user's and the system's chat messages From 7d7a2cb6378fe30d7243bf37acb8a7f4ae019a13 Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Fri, 24 Oct 2025 15:29:43 -0400 Subject: [PATCH 3/3] Trim whitespace and newlines from `name` and `language` --- .../ViewModels/ConversationFromTemplateViewModel.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/firebaseai/ChatExample/ViewModels/ConversationFromTemplateViewModel.swift b/firebaseai/ChatExample/ViewModels/ConversationFromTemplateViewModel.swift index ffd657567..7f060aa57 100644 --- a/firebaseai/ChatExample/ViewModels/ConversationFromTemplateViewModel.swift +++ b/firebaseai/ChatExample/ViewModels/ConversationFromTemplateViewModel.swift @@ -68,8 +68,8 @@ class ConversationFromTemplateViewModel: ObservableObject { func sendMessage(_ text: String, name: String, language: String) async { error = nil - let name = name.isEmpty ? nil : name - let language = language.isEmpty ? nil : language + let name = name.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty ? nil : name + let language = language.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty ? nil : language await internalSendMessage(text, name: name, language: language) }