Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -104,7 +121,7 @@ struct ConversationFromTemplateScreen: View {
Task {
let prompt = userPrompt
userPrompt = ""
await viewModel.sendMessage(prompt)
await viewModel.sendMessage(prompt, name: userName, language: preferredLanguage)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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()
}

Expand All @@ -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 {
Expand All @@ -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
Expand Down