165 lines
4.7 KiB
Markdown
165 lines
4.7 KiB
Markdown
---
|
|
name: firebase-ai
|
|
description: "Integrate Firebase AI Logic into Flutter apps using the Gemini Developer API. Use when setting up the firebase_ai plugin, generating text or chat responses with Gemini models, streaming AI output, implementing multimodal prompts, handling AI service errors, or applying security and privacy considerations for AI features."
|
|
---
|
|
|
|
# Firebase AI Skill
|
|
|
|
This skill defines how to correctly use Firebase AI Logic in Flutter applications.
|
|
|
|
## When to Use
|
|
|
|
Use this skill when:
|
|
|
|
* Setting up and configuring Firebase AI in a Flutter project.
|
|
* Generating text content or chat responses with Gemini models.
|
|
* Implementing streaming AI responses for real-time UI updates.
|
|
* Sending multimodal prompts (text + images) to Gemini.
|
|
* Handling errors, offline scenarios, and rate limits for AI operations.
|
|
* Applying security and privacy considerations for AI features.
|
|
|
|
---
|
|
|
|
## 1. Setup and Configuration
|
|
|
|
```
|
|
flutter pub add firebase_ai
|
|
```
|
|
|
|
```dart
|
|
import 'package:firebase_ai/firebase_ai.dart';
|
|
import 'package:firebase_core/firebase_core.dart';
|
|
import 'firebase_options.dart';
|
|
|
|
// Initialize FirebaseApp
|
|
await Firebase.initializeApp(
|
|
options: DefaultFirebaseOptions.currentPlatform,
|
|
);
|
|
|
|
// Initialize the Gemini Developer API backend service
|
|
final model =
|
|
FirebaseAI.googleAI().generativeModel(model: 'gemini-2.5-flash');
|
|
```
|
|
|
|
- Ensure the Firebase project is configured for AI services via the Firebase AI Logic page in the Firebase Console.
|
|
- Initialize Firebase before using any Firebase AI features.
|
|
- Use `FirebaseAI.googleAI()` for the **Gemini Developer API** backend (recommended starting point).
|
|
- Implement **App Check** to prevent abuse of Firebase AI endpoints.
|
|
|
|
**Platform support:**
|
|
|
|
| Platform | Support |
|
|
|---|---|
|
|
| iOS | Full |
|
|
| Android | Full |
|
|
| Web | Full |
|
|
| macOS / other Apple | Beta |
|
|
| Windows | Not supported |
|
|
|
|
---
|
|
|
|
## 2. Generating Content
|
|
|
|
### Single-turn text generation
|
|
|
|
```dart
|
|
final response = await model.generateContent([
|
|
Content.text('Summarize the benefits of Flutter for mobile development'),
|
|
]);
|
|
final text = response.text; // The generated summary string
|
|
```
|
|
|
|
### Multi-turn chat
|
|
|
|
```dart
|
|
final chat = model.startChat();
|
|
final response = await chat.sendMessage(
|
|
Content.text('What is the difference between StatelessWidget and StatefulWidget?'),
|
|
);
|
|
print(response.text);
|
|
|
|
// Follow-up in the same conversation
|
|
final followUp = await chat.sendMessage(
|
|
Content.text('When should I use StatefulWidget?'),
|
|
);
|
|
print(followUp.text);
|
|
```
|
|
|
|
### Streaming responses
|
|
|
|
Use streaming to display partial results as they arrive:
|
|
|
|
```dart
|
|
final stream = model.generateContentStream([
|
|
Content.text('Write a step-by-step guide to implementing dark mode in Flutter'),
|
|
]);
|
|
|
|
await for (final chunk in stream) {
|
|
// Append chunk.text to the UI progressively
|
|
setState(() => _output += chunk.text ?? '');
|
|
}
|
|
```
|
|
|
|
### Multimodal prompts (text + image)
|
|
|
|
```dart
|
|
final imageBytes = await File('photo.jpg').readAsBytes();
|
|
final response = await model.generateContent([
|
|
Content.multi([
|
|
TextPart('Describe what you see in this image'),
|
|
InlineDataPart('image/jpeg', imageBytes),
|
|
]),
|
|
]);
|
|
```
|
|
|
|
---
|
|
|
|
## 3. Error Handling
|
|
|
|
Wrap AI calls in structured error handling:
|
|
|
|
```dart
|
|
try {
|
|
final response = await model.generateContent([Content.text(prompt)]);
|
|
return response.text;
|
|
} on FirebaseAIException catch (e) {
|
|
if (e.message?.contains('quota') ?? false) {
|
|
// Handle rate limiting — show retry message or queue the request
|
|
return 'Service is busy. Please try again shortly.';
|
|
}
|
|
return 'AI service error: ${e.message}';
|
|
} catch (e) {
|
|
return 'Unexpected error: $e';
|
|
}
|
|
```
|
|
|
|
- Provide meaningful error messages to users when AI operations fail.
|
|
- Handle **offline scenarios** with appropriate fallback behavior (e.g., cached responses).
|
|
- Implement **exponential backoff** for rate-limited or transient errors.
|
|
|
|
---
|
|
|
|
## 4. Security and Privacy
|
|
|
|
- Follow Firebase Security Rules best practices when using AI services alongside other Firebase products.
|
|
- Ensure proper **authentication and authorization** for AI feature access.
|
|
- Sanitize user input before sending it to the model to prevent prompt injection.
|
|
- Be mindful of **data privacy requirements** when processing user content with AI services.
|
|
- Implement appropriate **content filtering and moderation** using safety settings:
|
|
|
|
```dart
|
|
final model = FirebaseAI.googleAI().generativeModel(
|
|
model: 'gemini-2.5-flash',
|
|
safetySettings: [
|
|
SafetySetting(HarmCategory.harassment, HarmBlockThreshold.medium),
|
|
SafetySetting(HarmCategory.dangerousContent, HarmBlockThreshold.high),
|
|
],
|
|
);
|
|
```
|
|
|
|
---
|
|
|
|
## References
|
|
|
|
- [Firebase AI Logic Flutter documentation](https://firebase.google.com/docs/ai-logic/get-started?platform=flutter)
|