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..7f060aa57 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 @@ -41,18 +63,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.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty ? nil : name + let language = language.trimmingCharacters(in: .whitespacesAndNewlines).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 +85,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 +103,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