-
Notifications
You must be signed in to change notification settings - Fork 1.5k
[FirebaseAI] Add Multimodal Analysis demos #1750
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 9 commits
d2d4f87
1d369bf
a6a7e8e
042c9c5
107e963
0bcee88
fe8ff0b
dd4ae93
401e983
48d537f
df3217f
5ba94ea
c76570d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
This file was deleted.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -36,24 +36,31 @@ class ChatViewModel: ObservableObject { | |
|
|
||
| private var model: GenerativeModel | ||
| private var chat: Chat | ||
| private var stopGenerating = false | ||
|
|
||
| private var chatTask: Task<Void, Never>? | ||
|
|
||
| private var sample: Sample? | ||
| private var backendType: BackendOption | ||
|
|
||
| init(firebaseService: FirebaseAI, sample: Sample? = nil) { | ||
| init(backendType: BackendOption, sample: Sample? = nil) { | ||
| self.sample = sample | ||
| self.backendType = backendType | ||
|
|
||
| let firebaseService: FirebaseAI | ||
|
||
| switch backendType { | ||
| case .googleAI: | ||
| firebaseService = FirebaseAI.firebaseAI(backend: .googleAI()) | ||
| case .vertexAI: | ||
| firebaseService = FirebaseAI.firebaseAI(backend: .vertexAI()) | ||
| } | ||
|
|
||
| // create a generative model with sample data | ||
| model = firebaseService.generativeModel( | ||
| modelName: "gemini-2.0-flash-001", | ||
| tools: sample?.tools, | ||
| modelName: sample?.modelName ?? "gemini-2.5-flash", | ||
| generationConfig: sample?.generationConfig, | ||
| systemInstruction: sample?.systemInstruction | ||
| ) | ||
|
|
||
| if let chatHistory = sample?.chatHistory, !chatHistory.isEmpty { | ||
| // Initialize with sample chat history if it's available | ||
| messages = ChatMessage.from(chatHistory) | ||
| chat = model.startChat(history: chatHistory) | ||
| } else { | ||
|
|
@@ -112,13 +119,14 @@ class ChatViewModel: ObservableObject { | |
| .content = (messages[messages.count - 1].content ?? "") + text | ||
| } | ||
|
|
||
| if let candidate = chunk.candidates.first { | ||
| if let groundingMetadata = candidate.groundingMetadata { | ||
| self.messages[self.messages.count - 1].groundingMetadata = groundingMetadata | ||
| if let inlineDataPart = chunk.inlineDataParts.first { | ||
| if let uiImage = UIImage(data: inlineDataPart.data) { | ||
| messages[messages.count - 1].image = uiImage | ||
| } else { | ||
| print("Failed to convert inline data to UIImage") | ||
| } | ||
| } | ||
|
Comment on lines
+118
to
124
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
| } | ||
|
|
||
| } catch { | ||
| self.error = error | ||
| print(error.localizedDescription) | ||
|
|
@@ -156,11 +164,13 @@ class ChatViewModel: ObservableObject { | |
| // replace pending message with backend response | ||
| messages[messages.count - 1].content = responseText | ||
| messages[messages.count - 1].pending = false | ||
| } | ||
|
|
||
| if let candidate = response?.candidates.first { | ||
| if let groundingMetadata = candidate.groundingMetadata { | ||
| self.messages[self.messages.count - 1].groundingMetadata = groundingMetadata | ||
| } | ||
| if let inlineDataPart = response?.inlineDataParts.first { | ||
| if let uiImage = UIImage(data: inlineDataPart.data) { | ||
| messages[messages.count - 1].image = uiImage | ||
| } else { | ||
| print("Failed to convert inline data to UIImage") | ||
| } | ||
| } | ||
| } catch { | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.