Skip to content

Commit 4a4ddff

Browse files
authored
Cleaning up for open source release (#2)
1 parent 8bcdafe commit 4a4ddff

12 files changed

Lines changed: 629 additions & 116 deletions

File tree

Examples/AIChatDemo/AIChatDemo.xcodeproj/project.pbxproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,8 @@
104104
mainGroup = 889CF9A42E1C5BB4000EE62F;
105105
minimizedProjectReferenceProxies = 1;
106106
packageReferences = (
107-
889CF9BB2E1C5BED000EE62F /* XCLocalSwiftPackageReference "../../../ConversationKit" */,
108107
889CF9C22E1C6219000EE62F /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */,
108+
88156EF52E397722004CE19F /* XCLocalSwiftPackageReference "../../../ConversationKit" */,
109109
);
110110
preferredProjectObjectVersion = 77;
111111
productRefGroup = 889CF9AE2E1C5BB4000EE62F /* Products */;
@@ -345,7 +345,7 @@
345345
/* End XCConfigurationList section */
346346

347347
/* Begin XCLocalSwiftPackageReference section */
348-
889CF9BB2E1C5BED000EE62F /* XCLocalSwiftPackageReference "../../../ConversationKit" */ = {
348+
88156EF52E397722004CE19F /* XCLocalSwiftPackageReference "../../../ConversationKit" */ = {
349349
isa = XCLocalSwiftPackageReference;
350350
relativePath = ../../../ConversationKit;
351351
};
@@ -357,7 +357,7 @@
357357
repositoryURL = "https://github.com/firebase/firebase-ios-sdk";
358358
requirement = {
359359
kind = upToNextMajorVersion;
360-
minimumVersion = 11.15.0;
360+
minimumVersion = 12.0.0;
361361
};
362362
};
363363
/* End XCRemoteSwiftPackageReference section */

Examples/AIChatDemo/AIChatDemo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Examples/AIChatDemo/AIChatDemo/AIChatDemoApp.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ struct AIChatDemoApp: App {
2727
var body: some Scene {
2828
WindowGroup {
2929
TabView {
30-
ContentView()
30+
FoundationModelChatView()
3131
.tabItem {
3232
Label("On-Device", systemImage: "cpu")
3333
}

Examples/AIChatDemo/AIChatDemo/FirebaseAILogicChatView.swift

Lines changed: 46 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,56 @@
1717
// limitations under the License.
1818

1919
import ConversationKit
20-
import SwiftUI
2120
import FirebaseAI
21+
import SwiftUI
22+
23+
@Observable
24+
class FirebaseAILogicChatViewModel {
25+
var messages: [Message] = []
26+
27+
private let model: GenerativeModel
28+
private let chat: Chat
29+
30+
init() {
31+
let firstMessage = Message(
32+
content: "Hello! How can I help you today?",
33+
participant: .other
34+
)
35+
self.messages = [firstMessage]
36+
37+
model =
38+
FirebaseAI
39+
.firebaseAI(backend: .googleAI())
40+
.generativeModel(modelName: "gemini-2.5-flash")
41+
42+
let history = [
43+
ModelContent(role: "model", parts: firstMessage.content ?? "")
44+
]
45+
chat = model.startChat(history: history)
46+
}
47+
48+
func sendMessage(_ message: Message) async {
49+
if let content = message.content {
50+
var responseText: String
51+
do {
52+
let response = try await chat.sendMessage(content)
53+
responseText = response.text ?? ""
54+
} catch {
55+
responseText =
56+
"I'm sorry, I don't understand that. Please try again. \(error.localizedDescription)"
57+
}
58+
let response = Message(content: responseText, participant: .other)
59+
messages.append(response)
60+
}
61+
}
62+
}
2263

2364
struct FirebaseAILogicChatView: View {
24-
@State private var messages: [Message] = [
25-
Message(content: "Hello! How can I help you today?", participant: .other)
26-
]
27-
28-
let model = {
29-
let ai = FirebaseAI.firebaseAI(backend: .googleAI())
30-
let model = ai.generativeModel(modelName: "gemini-2.5-flash")
31-
return model
32-
}()
33-
65+
@State private var viewModel = FirebaseAILogicChatViewModel()
66+
3467
var body: some View {
3568
NavigationStack {
36-
ConversationView(messages: $messages)
69+
ConversationView(messages: $viewModel.messages)
3770
.attachmentActions {
3871
Button(action: {}) {
3972
Label("Photos", systemImage: "photo.on.rectangle.angled")
@@ -45,20 +78,7 @@ struct FirebaseAILogicChatView: View {
4578
.navigationTitle("Chat")
4679
.navigationBarTitleDisplayMode(.inline)
4780
.onSendMessage { message in
48-
Task {
49-
if let content = message.content {
50-
var responseText: String
51-
do {
52-
let response = try await model.generateContent(content)
53-
responseText = response.text ?? ""
54-
}
55-
catch {
56-
responseText = "I'm sorry, I don't understand that. Please try again. \(error.localizedDescription)"
57-
}
58-
let response = Message(content: responseText, participant: .other)
59-
messages.append(response)
60-
}
61-
}
81+
await viewModel.sendMessage(message)
6282
}
6383
}
6484
}

Examples/AIChatDemo/AIChatDemo/ContentView.swift renamed to Examples/AIChatDemo/AIChatDemo/FoundationModelChatView.swift

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,43 +17,41 @@
1717
// limitations under the License.
1818

1919
import ConversationKit
20-
import SwiftUI
2120
import FoundationModels
21+
import SwiftUI
2222

23-
struct ContentView: View {
23+
struct FoundationModelChatView {
2424
@State private var messages: [Message] = [
2525
Message(content: "Hello! How can I help you today?", participant: .other)
2626
]
2727

2828
let session = LanguageModelSession()
29+
}
2930

31+
extension FoundationModelChatView: View {
3032
var body: some View {
3133
NavigationStack {
3234
ConversationView(messages: $messages)
3335
.navigationTitle("Chat")
3436
.navigationBarTitleDisplayMode(.inline)
3537
.onSendMessage { message in
36-
Task {
37-
// In a real application, you would pass the message to your model
38-
// and handle the response. For now, we'll just echo it back.
39-
if let content = message.content {
40-
var responseText: String
41-
do {
42-
let response = try await session.respond(to: content)
43-
responseText = response.content
44-
}
45-
catch {
46-
responseText = "I'm sorry, I don't understand that. Please try again. \(error.localizedDescription)"
47-
}
48-
let response = Message(content: responseText, participant: .other)
49-
messages.append(response)
38+
if let content = message.content {
39+
var responseText: String
40+
do {
41+
let response = try await session.respond(to: content)
42+
responseText = response.content
43+
} catch {
44+
responseText =
45+
"I'm sorry, I don't understand that. Please try again. \(error.localizedDescription)"
5046
}
47+
let response = Message(content: responseText, participant: .other)
48+
messages.append(response)
5149
}
5250
}
5351
}
5452
}
5553
}
5654

5755
#Preview {
58-
ContentView()
56+
FoundationModelChatView()
5957
}

Examples/ConversationKitDemo/ConversationKitDemo/ContentView.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ struct ContentView: View {
4242
await generateResponse(for: userMessage)
4343
}
4444
}
45+
.attachmentActions {
46+
Button("Image", systemImage: "photo.on.rectangle.angled") {
47+
}
48+
Button("Camera", systemImage: "camera") {
49+
}
50+
}
4551
.navigationTitle("Chat")
4652
.navigationBarTitleDisplayMode(.inline)
4753
}

0 commit comments

Comments
 (0)