# Firebase AI Logic: Gemini Entegrasyonu ile Mobil AI
Google, 2025'te Firebase AI Logic'i duyurarak mobil geliştiricilerin Gemini modellerine doğrudan Firebase SDK üzerinden erişmesini sağladı. Artık ayrı bir Vertex AI hesabı açmana, API key yönetimi yapmanaa veya karmaşık backend proxy'ler kurmana gerek yok. Firebase projenin içinden, App Check koruması altında, Gemini'nin tüm gücünü kullanabilirsin. Gelin, Firebase AI Logic'in mimarisini, function calling yeteneklerini, güvenlik ayarlarını ve iOS/Android/Flutter'da nasıl kullanacağını detaylıca inceleyelim.
💡 Not: Firebase AI Logic, eski adıyla "Vertex AI in Firebase" olarak biliniyordu. Google, Mayıs 2025'te Gemini Developer API desteği ekleyerek adını Firebase AI Logic olarak güncelledi. Resmi dokümantasyon: Firebase AI Logic Docs, kaynak kod: GitHub.
İçindekiler
- Firebase AI Logic Nedir?
- Mimari ve API Seçimi
- iOS'ta Gemini Entegrasyonu
- Flutter'da Gemini Entegrasyonu
- Function Calling ile Tool Use
- Safety Settings ve Content Filtering
- Streaming ve Multimodal
- Production Best Practices
- Sonuç ve Öneriler
Firebase AI Logic Nedir?
Firebase AI Logic, Gemini API'ye Firebase SDK üzerinden erişim sağlayan bir servis. İki API backend'i destekliyor:
Özellik | Gemini Developer API | Vertex AI Gemini API |
|---|---|---|
**Fiyat** | Ücretsiz tier var | Kullanıma göre |
**Rate Limit** | 15 RPM (ücretsiz) | Yüksek limitler |
**Model Seçimi** | Gemini 2.0 Flash, Pro | Tüm Gemini modelleri |
**Grounding** | Google Search | Google Search + özel |
**Enterprise** | Hayır | Evet, SLA dahil |
**Data Governance** | Standart | VPC, CMEK desteği |
Ne Zaman Hangisi?
- Prototipleme / Hobi:: Gemini Developer API (ücretsiz)
- Production / Enterprise:: Vertex AI Gemini API (ölçeklenebilir)
Firebase AI Logic'in güzelliği, ikisi arasında tek satır kod değişikliği ile geçiş yapabilmen. Backend'i değiştirirsin, istemci kodu aynı kalır. Vertex AI detayları için Google Cloud AI sayfasına göz atabilirsin. Claude Opus gibi rakip modeller de benzer API yapısı sunuyor — farklılıkları bilmek entegrasyon kararlarında faydalı.
Mimari ve API Seçimi
Firebase AI Logic'in mimarisi şöyle çalışır:
- Mobil uygulama → Firebase SDK → Firebase AI Logic servisi
- Firebase AI Logic → App Check doğrulama → API seçimi
- Gemini Developer API veya Vertex AI → Model çalıştırma
- Sonuç → Firebase SDK → Mobil uygulama
Bu mimari sayesinde API key'lerin asla istemci tarafında açığa çıkmaz. Firebase App Check, her isteğin gerçek bir uygulamadan geldiğini doğrular.
Firebase + Gemini Hızlı Entegrasyon
\\\`typescript
// Firebase AI Logic — Gemini entegrasyonu (minimal başlangıç)
import { initializeApp } from 'firebase/app';
import { getAI, getGenerativeModel, GoogleAIBackend } from 'firebase/ai';
const app = initializeApp(firebaseConfig);
const ai = getAI(app, { backend: new GoogleAIBackend() });
const model = getGenerativeModel(ai, { model: 'gemini-2.0-flash' });
// Basit text generation
const result = await model.generateContent('iOS 18 yeniliklerini özetle');
console.log(result.response.text());
// Streaming response için
const stream = await model.generateContentStream('Swift Concurrency nedir?');
for await (const chunk of stream.stream) {
process.stdout.write(chunk.text());
}
\\\`
Bu entegrasyonun en önemli avantajı: API key client'ta hiç açığa çıkmaz, Firebase App Check tüm isteklerin gerçek uygulamadan geldiğini doğrular.
Kurulum
\\\`typescript
// Firebase Console'da AI Logic'i etkinleştir
// 1. Firebase Console > AI Logic
// 2. Gemini Developer API veya Vertex AI seç
// 3. Billing etkinleştir (Vertex AI için)
// Web SDK kurulumu
import { initializeApp } from 'firebase/app';
import { getAI, getGenerativeModel, GoogleAIBackend } from 'firebase/ai';
const app = initializeApp(firebaseConfig);
const ai = getAI(app, { backend: new GoogleAIBackend() });
const model = getGenerativeModel(ai, {
model: 'gemini-2.0-flash',
});
// Basit kullanım
const result = await model.generateContent('Merhaba! Nasılsın?');
console.log(result.response.text());
\\\`
🔍 Pro Tip: Gemini Developer API ile başla, production'a geçtiğinde backend'i \VertexAIBackend\ olarak değiştir. Tüm istemci kodu aynı kalır, sadece backend class'ını değiştirirsin.iOS'ta Gemini Entegrasyonu
Swift ile Firebase AI Logic entegrasyonu oldukça temiz. iOS Security yazımızdaki güvenlik prensiplerini burada da uyguluyoruz.
Swift Implementasyonu
\\\`swift
import FirebaseAI
// Singleton AI Service
final class AIService {
static let shared = AIService()
private let model: GenerativeModel
private init() {
let ai = FirebaseAI.firebaseAI(backend: .googleAI())
self.model = ai.generativeModel(modelName: "gemini-2.0-flash")
}
// Basit text generation
func generateText(prompt: String) async throws -> String {
let response = try await model.generateContent(prompt)
guard let text = response.text else {
throw AIError.emptyResponse
}
return text
}
// Streaming response
func streamText(prompt: String) -> AsyncThrowingStream<String, Error> {
AsyncThrowingStream { continuation in
Task {
do {
let stream = try model.generateContentStream(prompt)
for try await chunk in stream {
if let text = chunk.text {
continuation.yield(text)
}
}
continuation.finish()
} catch {
continuation.finish(throwing: error)
}
}
}
}
// Multimodal: Görsel + Text
func analyzeImage(_ image: UIImage, prompt: String) async throws -> String {
guard let imageData = image.jpegData(compressionQuality: 0.8) else {
throw AIError.invalidImage
}
let imagePart = ModelContent.Part.data(
mimetype: "image/jpeg",
imageData
)
let textPart = ModelContent.Part.text(prompt)
let response = try await model.generateContent([imagePart, textPart])
return response.text ?? ""
}
}
enum AIError: LocalizedError {
case emptyResponse
case invalidImage
var errorDescription: String? {
switch self {
case .emptyResponse: return "AI boş yanıt döndü"
case .invalidImage: return "Geçersiz görsel formatı"
}
}
}
\\\`
SwiftUI View ile Kullanım
\\\`swift
import SwiftUI
struct AIChatView: View {
@State private var prompt = ""
@State private var response = ""
@State private var isLoading = false
@State private var streamedText = ""
var body: some View {
VStack(spacing: 16) {
ScrollView {
Text(streamedText.isEmpty ? response : streamedText)
.padding()
}
HStack {
TextField("Sorunuzu yazın...", text: $prompt)
.textFieldStyle(.roundedBorder)
Button("Gönder") {
Task { await sendPrompt() }
}
.disabled(prompt.isEmpty || isLoading)
}
.padding()
}
}
private func sendPrompt() async {
isLoading = true
streamedText = ""
let stream = AIService.shared.streamText(prompt: prompt)
do {
for try await chunk in stream {
streamedText += chunk
}
response = streamedText
} catch {
response = "Hata: \(error.localizedDescription)"
}
isLoading = false
prompt = ""
}
}
\\\`
Flutter'da Gemini Entegrasyonu
Flutter ile Firebase AI Logic kullanımı da benzer şekilde kolay. Flutter Clean Architecture prensipleri ile yapılandıralım.
Dart Implementasyonu
\\\`dart
import 'package:firebase_ai/firebase_ai.dart';
import 'package:firebase_core/firebase_core.dart';
class GeminiService {
late final GenerativeModel _model;
late final GenerativeModel _visionModel;
Future<void> initialize() async {
final ai = FirebaseAI.googleAI();
_model = ai.generativeModel(
model: 'gemini-2.0-flash',
generationConfig: GenerationConfig(
temperature: 0.7,
topP: 0.9,
topK: 40,
maxOutputTokens: 2048,
),
);
_visionModel = ai.generativeModel(
model: 'gemini-2.0-flash',
);
}
// Streaming chat
Stream<String> chatStream(String message, List<Content> history) async* {
final chat = _model.startChat(history: history);
final stream = chat.sendMessageStream(Content.text(message));
await for (final chunk in stream) {
if (chunk.text != null) {
yield chunk.text!;
}
}
}
// Token sayımı
Future<int> countTokens(String text) async {
final response = await _model.countTokens([Content.text(text)]);
return response.totalTokens;
}
}
\\\`
🔍 Pro Tip: Token sayımını her istek öncesi kontrol et. Gemini 2.0 Flash'ın context window'u 1M token ama maliyet token başına hesaplanıyor. Gereksiz uzun prompt'lardan kaçın. Flutter Riverpod ile state yönetimini de düzgün kur.
Function Calling ile Tool Use
Function calling, Gemini'nin en güçlü özelliklerinden biri. Model, doğal dil isteğini analiz edip uygun fonksiyonu çağırır.
Hava Durumu Örneği
\\\`typescript
import { getAI, getGenerativeModel, GoogleAIBackend } from 'firebase/ai';
import {
FunctionDeclarationSchemaType,
} from 'firebase/ai';
const weatherTool = {
functionDeclarations: [{
name: 'getWeather',
description: 'Belirtilen şehir için güncel hava durumunu getirir',
parameters: {
type: FunctionDeclarationSchemaType.OBJECT,
properties: {
city: {
type: FunctionDeclarationSchemaType.STRING,
description: 'Şehir adı (örn: İstanbul)',
},
unit: {
type: FunctionDeclarationSchemaType.STRING,
enum: ['celsius', 'fahrenheit'],
description: 'Sıcaklık birimi',
},
},
required: ['city'],
},
}],
};
const model = getGenerativeModel(ai, {
model: 'gemini-2.0-flash',
tools: [weatherTool],
});
// Kullanıcı: "İstanbul'da hava nasıl?"
const result = await model.generateContent(
"İstanbul'da bugün hava nasıl?"
);
const call = result.response.functionCalls()?.[0];
if (call?.name === 'getWeather') {
// API çağrısı yap
const weather = await fetchWeather(call.args.city, call.args.unit);
// Sonucu modele geri gönder
const finalResult = await model.generateContent([
{ role: 'user', parts: [{ text: "İstanbul'da bugün hava nasıl?" }] },
{ role: 'model', parts: [{ functionCall: call }] },
{ role: 'user', parts: [{ functionResponse: {
name: 'getWeather',
response: weather,
}}] },
]);
console.log(finalResult.response.text());
// "İstanbul'da bugün 18°C ve güneşli bir hava var..."
}
\\\`
Function Calling Kullanım Alanları
Kullanım | Fonksiyon | Açıklama |
|---|---|---|
E-ticaret | searchProducts | Ürün arama ve filtreleme |
Finans | getStockPrice | Anlık hisse fiyatı |
Sağlık | bookAppointment | Randevu oluşturma |
Seyahat | findFlights | Uçuş arama |
Destek | createTicket | Destek talebi açma |
Safety Settings ve Content Filtering
Production'da AI kullanırken güvenlik kritik. Firebase AI Logic, yerleşik safety settings sunuyor:
\\\`typescript
import {
HarmCategory,
HarmBlockThreshold,
} from 'firebase/ai';
const model = getGenerativeModel(ai, {
model: 'gemini-2.0-flash',
safetySettings: [
{
category: HarmCategory.HARM_CATEGORY_HARASSMENT,
threshold: HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
},
{
category: HarmCategory.HARM_CATEGORY_HATE_SPEECH,
threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
},
{
category: HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
threshold: HarmBlockThreshold.BLOCK_ONLY_HIGH,
},
{
category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
},
],
generationConfig: {
temperature: 0.3, // Düşük = daha tutarlı
topP: 0.8,
maxOutputTokens: 1024,
},
});
\\\`
App Check Entegrasyonu
\\\`swift
// iOS'ta App Check zorunlu
import FirebaseAppCheck
class AppCheckProviderFactory: NSObject, AppCheckProviderFactory {
func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
if #available(iOS 14.0, *) {
return AppAttestProvider(app: app)
} else {
return DeviceCheckProvider(app: app)
}
}
}
// AppDelegate'te
AppCheck.setAppCheckProviderFactory(AppCheckProviderFactory())
\\\`
🔍 Pro Tip: App Check olmadan Firebase AI Logic çağrılarını production'da AÇMA. Kötü niyetli kullanıcılar API'ni spam'leyerek fatura şişirebilir. Debug modunda App Check debug provider kullan.
Streaming ve Multimodal
Gemini'nin multimodal yetenekleri mobil uygulamalar için devrim niteliğinde:
Desteklenen Modlar
- Text → Text:: Soru-cevap, özetleme, çeviri
- Image → Text:: Görsel analiz, OCR, ürün tanıma
- Audio → Text:: Ses transkripsiyonu, duygu analizi
- Video → Text:: Video özetleme, sahne analizi
- Text → Image:: Imagen ile görsel üretme (Gemini 2.0)
- Document → Text:: PDF analiz, form çıkarma
Akış Yanıtı ile Kullanıcı Deneyimi
Kullanıcılar ChatGPT'de gördükleri "yazıyor..." efektini bekler. Streaming ile bunu sağlarsın:
\\\`typescript
// Web'de streaming
const result = await model.generateContentStream(prompt);
let fullText = '';
for await (const chunk of result.stream) {
const text = chunk.text();
fullText += text;
updateUI(fullText); // Her chunk'ta UI güncelle
}
\\\`
Production Best Practices
Maliyet Kontrolü
- Token limiti koy — maxOutputTokens ile sınırla
- Cache kullan — Aynı sorgu için tekrar API çağrısı yapma
- Model seçimi — Flash modeller Pro'dan 10x ucuz
- Batch processing — Toplu istekleri grupla
Hata Yönetimi
\\\`typescript
try {
const result = await model.generateContent(prompt);
return result.response.text();
} catch (error: unknown) {
if (error instanceof Error) {
if (error.message.includes('SAFETY')) {
// Safety filtre tetiklendi
return 'Bu içerik güvenlik filtresine takıldı.';
}
if (error.message.includes('QUOTA')) {
// Rate limit aşıldı
await delay(1000);
return retry(prompt);
}
}
throw error;
}
\\\`
Sonuç ve Öneriler
Firebase AI Logic, mobil geliştiriciler için AI entegrasyonunu demokratikleştiriyor. Firebase SDK'nın tanıdık yapısı, App Check güvenliği ve Gemini'nin multimodal gücü ile production-ready AI uygulamaları çok daha kolay. Firebase Advanced yazımızda ele aldığımız Firestore + Cloud Functions altyapısının üzerine AI Logic eklemek, uygulamanı bir sonraki seviyeye taşır.
Öneriler
- Gemini Developer API ile başla — Ücretsiz tier ile prototiple
- Function calling kullan — Modeli uygulamanın araçlarıyla bağla
- Streaming zorunlu — Kullanıcı deneyimi için şart
- Safety settings production'da sık — Minimum BLOCK_LOW_AND_ABOVE
- App Check AÇIK — Maliyet koruması için zorunlu
ALTIN İPUCU
Bu yazının en değerli bilgisi
Bu ipucu, yazının en önemli çıkarımını içeriyor.
Easter Egg
Gizli bir bilgi buldun!
Bu bölümde gizli bir bilgi var. Keşfetmek ister misin?
Okuyucu Ödülü
Firebase AI Logic + Cloud Functions combo'su: Edge'de (mobilde) basit sorguları Gemini Developer API ile işle, karmaşık veya batch işlemleri Cloud Functions'da Vertex AI ile yap. Bu "hibrit AI" mimarisi hem maliyeti düşürür hem de offline durumda graceful degradation sağlar. Cloud Functions'da \`@google-cloud/vertexai\` ile aynı modeli kullanabilirsin — böylece prompt engineering tek yerde kalır.

