AI uygulaması geliştirmek, model API'sini çağırmaktan çok daha fazlası. Prompt yönetimi, model değerlendirme, retrieval pipeline'ları, observability, deployment ve testing — bunların hepsini düzgün yapman gerekiyor. İşte Firebase Genkit, tam da bu karmaşıklığı yönetmek için Google tarafından geliştirilen açık kaynak bir AI framework. Node.js'te GA (General Availability), Go ve Python desteği ile production-ready AI uygulamaları oluşturmanı sağlıyor. Haydi, Genkit'in mimarisini, flow-based yaklaşımını, prompt management sistemini ve production best practice'lerini derinlemesine inceleyelim.
💡 Not: Genkit, Firebase'in bir parçası olarak sunuluyor ama bağımsız olarak da kullanılabilir. Herhangi bir Node.js/Go/Python projesiyle çalışır — Firebase zorunlu değil. Resmi kaynak: Genkit Docs, açık kaynak: GitHub, model entegrasyonları: Google AI.
İçindekiler
- Genkit Nedir?
- Flow-Based Mimari
- Model Entegrasyonları
- Prompt Management
- RAG ve Retriever Pattern
- Evaluation ve Test
- Observability ve Monitoring
- Production Deployment
- Sonuç ve Öneriler
Genkit Nedir?
Genkit, AI özellikli uygulamalar geliştirmek için tasarlanmış bir framework. LangChain veya LlamaIndex ile aynı problem alanında ama Google'ın yaklaşımı farklı: type-safe, observable ve test edilebilir. Claude Code MCP yazımızda ele aldığımız MCP protokolü ile de entegre çalışabiliyor.
Framework Karşılaştırması
Özellik | Genkit | LangChain | LlamaIndex |
|---|---|---|---|
Dil | TypeScript, Go, Python | Python, JS | Python, TS |
Type Safety | Zod schema, tam tip | Gevşek tipler | Orta |
Flow System | Birinci sınıf | Chain/Agent | Pipeline |
Observability | Yerleşik (OpenTelemetry) | Opsiyonel | Opsiyonel |
Evaluation | Yerleşik eval framework | Ayrı paket | Ayrı paket |
Model Agnostic | Evet (plugin sistemi) | Evet | Evet |
UI | Dev UI (dashboard) | LangSmith (ücretli) | Yok |
Deployment | Firebase, Cloud Run, herhangi yer | Herhangi yer | Herhangi yer |
Test | Jest/Vitest entegre | Ayrı setup | Ayrı setup |
Geliştirici | Google (açık kaynak) | LangChain Inc. | LlamaIndex Inc. |
Genkit Flow Tanımı — Hızlı Başlangıç
typescript
1// Firebase Genkit — temel flow tanımı2import { genkit, z } from 'genkit';3import { googleAI, gemini20Flash } from '@genkit-ai/googleai';4 5const ai = genkit({ plugins: [googleAI()] });6 7const chatFlow = ai.defineFlow(8 {9 name: 'chat',10 inputSchema: z.object({ message: z.string(), userId: z.string() }),11 outputSchema: z.object({ reply: z.string(), tokensUsed: z.number() }),12 },13 async ({ message, userId }) => {14 const response = await ai.generate({15 model: gemini20Flash,16 prompt: message,17 config: { temperature: 0.7, maxOutputTokens: 512 },18 });19 return { reply: response.text, tokensUsed: response.usage?.totalTokens ?? 0 };20 }21);22 23// Flow çalıştır24const result = await chatFlow({ message: 'SwiftUI nedir?', userId: 'user123' });Flow'ların type-safe olması, çalışma zamanında hata yakalamayı kolaylaştırır. inputSchema ve outputSchema Zod ile tanımlanır — hem validation hem de TypeScript tip çıkarımı otomatik olarak gelir.
Kurulum
bash
1# Node.js projesi oluştur2npm init -y3npm install genkit @genkit-ai/googleai4 5# Veya Firebase Cloud Functions ile6npm install genkit @genkit-ai/firebaseFlow-Based Mimari
Genkit'in en güçlü konsepti flow. Flow, bir AI işlem zincirinin type-safe, observable ve test edilebilir bir temsili.
İlk Flow
typescript
1import { genkit, z } from 'genkit';2import { googleAI, gemini20Flash } from '@genkit-ai/googleai';3 4const ai = genkit({5 plugins: [googleAI()],6});7 8// Type-safe flow tanımı9const summarizeFlow = ai.defineFlow(10 {11 name: 'summarize',12 inputSchema: z.object({13 text: z.string().min(100),14 language: z.enum(['tr', 'en', 'de']).default('tr'),15 maxSentences: z.number().min(1).max(10).default(3),16 }),17 outputSchema: z.object({18 summary: z.string(),19 keyPoints: z.array(z.string()),20 wordCount: z.number(),21 }),22 },23 async (input) => {24 const prompt = `Aşağıdaki metni ${input.language} dilinde ${input.maxSentences} cümlede özetle.25Ayrıca anahtar noktaları listele.26 27Metin:28${input.text}29 30JSON formatında cevap ver:31{32 "summary": "...",33 "keyPoints": ["...", "..."],34 "wordCount": <özetteki kelime sayısı>35}`;36 37 const response = await ai.generate({38 model: gemini20Flash,39 prompt,40 output: { format: 'json' },41 });42 43 return response.output as {44 summary: string;45 keyPoints: string[];46 wordCount: number;47 };48 }49);50 51// Kullanım52const result = await summarizeFlow({53 text: 'Çok uzun bir makale metni...',54 language: 'tr',55 maxSentences: 3,56});Flow Zinciri
Birden fazla flow'u birleştirebilirsin:
typescript
1// 1. Metin analiz flow2const analyzeFlow = ai.defineFlow(3 {4 name: 'analyze',5 inputSchema: z.string(),6 outputSchema: z.object({7 sentiment: z.enum(['positive', 'negative', 'neutral']),8 topics: z.array(z.string()),9 language: z.string(),10 }),11 },12 async (text) => {13 const response = await ai.generate({14 model: gemini20Flash,15 prompt: `Metni analiz et: "${text}"16JSON: { sentiment, topics, language }`,17 output: { format: 'json' },18 });19 return response.output;20 }21);22 23// 2. Çeviri flow24const translateFlow = ai.defineFlow(25 {26 name: 'translate',27 inputSchema: z.object({28 text: z.string(),29 targetLang: z.string(),30 }),31 outputSchema: z.string(),32 },33 async (input) => {34 const response = await ai.generate({35 model: gemini20Flash,36 prompt: `"${input.text}" metnini ${input.targetLang} diline çevir.`,37 });38 return response.text;39 }40);41 42// 3. Zincirleme: Analiz → Çeviri → Özetleme43const fullPipelineFlow = ai.defineFlow(44 {45 name: 'fullPipeline',46 inputSchema: z.string(),47 outputSchema: z.object({48 analysis: z.object({49 sentiment: z.string(),50 topics: z.array(z.string()),51 language: z.string(),52 }),53 translation: z.string(),54 summary: z.object({55 summary: z.string(),56 keyPoints: z.array(z.string()),57 wordCount: z.number(),58 }),59 }),60 },61 async (text) => {62 const analysis = await analyzeFlow(text);63 const translation = analysis.language !== 'tr'64 ? await translateFlow({ text, targetLang: 'tr' })65 : text;66 const summary = await summarizeFlow({67 text: translation,68 language: 'tr',69 maxSentences: 3,70 });71 return { analysis, translation, summary };72 }73);🔍 Pro Tip: Flow'ları küçük ve tek sorumlu tut. Büyük bir "her şeyi yapan" flow yerine, küçük flow'ları zincirleme. Bu hem test edilebilirliği hem de yeniden kullanımı artırır. Flutter Clean Architecture yazımızdaki repository pattern ile benzer mantık.
Model Entegrasyonları
Genkit plugin sistemi ile birçok model provider destekler:
Desteklenen Modeller
Plugin | Modeller | Kurulum |
|---|---|---|
@genkit-ai/googleai | Gemini 2.0 Flash/Pro | npm i @genkit-ai/googleai |
@genkit-ai/vertexai | Gemini + Imagen | npm i @genkit-ai/vertexai |
genkitx-openai | GPT-4o, GPT-4o-mini | npm i genkitx-openai |
genkitx-anthropic | Claude 3.5 Sonnet | npm i genkitx-anthropic |
genkitx-ollama | Llama, Mistral (local) | npm i genkitx-ollama |
genkitx-cohere | Command R+ | npm i genkitx-cohere |
Multi-Model Strateji
typescript
1import { googleAI, gemini20Flash, gemini20Pro } from '@genkit-ai/googleai';2 3// Basit sorular: Flash (hızlı, ucuz)4const quickAnswer = await ai.generate({5 model: gemini20Flash,6 prompt: 'TypeScript nedir?',7});8 9// Karmaşık analiz: Pro (güçlü, pahalı)10const deepAnalysis = await ai.generate({11 model: gemini20Pro,12 prompt: 'Bu kodun mimari sorunlarını analiz et...',13});Prompt Management
Genkit'in Dotprompt sistemi, prompt'ları kod dışında yönetmeni sağlar:
Dotprompt Dosyası
text
1---2model: googleai/gemini-2.0-flash3input:4 schema:5 productName: string6 category: string7 features(array): string8 targetAudience?: string9output:10 format: json11 schema:12 title: string13 description: string14 highlights(array): string15 seoKeywords(array): string16config:17 temperature: 0.718 maxOutputTokens: 102419---20 21Sen bir e-ticaret ürün açıklaması uzmanısın.22 23{{productName}} ürünü için {{category}} kategorisinde24profesyonel bir ürün açıklaması yaz.25 26Özellikler:27{{#each features}}28- {{this}}29{{/each}}30 31{{#if targetAudience}}32Hedef kitle: {{targetAudience}}33{{/if}}34 35JSON formatında döndür.Dotprompt Kullanımı
typescript
1// prompts/product-description.prompt dosyasından yükle2const productPrompt = ai.prompt('product-description');3 4const result = await productPrompt({5 productName: 'AirPods Pro 3',6 category: 'Kulaklık',7 features: ['ANC', 'Spatial Audio', 'USB-C', '30 saat pil'],8 targetAudience: 'Müzik tutkunları ve profesyoneller',9});10 11console.log(result.output);12// { title: "...", description: "...", highlights: [...], seoKeywords: [...] }Prompt Versiyonlama
Dotprompt dosyaları git ile versiyonlanır. A/B test yapmak kolay — iki farklı prompt versiyonunu evaluation ile karşılaştır. N8N AI Agent yazımızdaki workflow otomasyonu ile prompt versiyonlarını pipeline'a bağlayabilirsin.
RAG ve Retriever Pattern
Genkit, retriever abstraction'ı ile RAG pipeline'larını kolaylaştırır:
typescript
1import { defineRetriever, retrieve } from 'genkit';2 3// Custom retriever tanımla4const myRetriever = defineRetriever(5 {6 name: 'supabase-docs',7 configSchema: z.object({8 limit: z.number().default(5),9 namespace: z.string().optional(),10 }),11 },12 async (query, config) => {13 const embedding = await ai.embed({14 embedder: textEmbedding004,15 content: query.text,16 });17 18 const { data } = await supabase.rpc('match_documents', {19 query_embedding: embedding,20 match_count: config.limit,21 });22 23 return {24 documents: data.map((doc: { content: string; metadata: Record<string, unknown> }) => ({25 content: [{ text: doc.content }],26 metadata: doc.metadata,27 })),28 };29 }30);31 32// RAG flow33const ragFlow = ai.defineFlow(34 { name: 'rag-chat', inputSchema: z.string(), outputSchema: z.string() },35 async (question) => {36 const docs = await retrieve({37 retriever: myRetriever,38 query: question,39 options: { limit: 5 },40 });41 42 const context = docs.documents43 .map(d => d.content.map(c => c.text).join(''))44 .join('\n\n');45 46 const response = await ai.generate({47 model: gemini20Flash,48 prompt: `Bağlam: ${context}\n\nSoru: ${question}\n\nCevap:`,49 });50 51 return response.text;52 }53);Evaluation ve Test
Genkit'in yerleşik evaluation sistemi, AI çıktılarını değerlendirmeni sağlar:
typescript
1import { evaluate } from 'genkit';2 3// Evaluator tanımla4const faithfulnessEvaluator = ai.defineEvaluator(5 {6 name: 'faithfulness',7 displayName: 'Bağlama Sadakat',8 definition: 'Cevabın verilen bağlamla tutarlılığını ölçer',9 },10 async (datapoint) => {11 const response = await ai.generate({12 model: gemini20Flash,13 prompt: `Bağlam: ${datapoint.context}14Cevap: ${datapoint.output}15 16Bu cevap bağlamdaki bilgilerle tutarlı mı? 0-1 arası puan ver.17JSON: { "score": 0.0-1.0, "reasoning": "..." }`,18 output: { format: 'json' },19 });20 21 return {22 score: response.output.score,23 details: { reasoning: response.output.reasoning },24 };25 }26);27 28// Batch evaluation29const evalResults = await evaluate({30 evaluator: faithfulnessEvaluator,31 dataset: testCases.map(tc => ({32 input: tc.question,33 output: tc.generatedAnswer,34 context: tc.retrievedContext,35 reference: tc.expectedAnswer,36 })),37});38 39console.log(`Ortalama skor: ${evalResults.averageScore}`);🔍 Pro Tip: Her prompt değişikliğinde evaluation çalıştır. "Bu prompt daha iyi çalışıyor gibi hissettim" güvenilir değil — metriklerle doğrula. Genkit Dev UI'da evaluation sonuçlarını görselleştirebilirsin.
Observability ve Monitoring
Genkit, OpenTelemetry ile entegre tracing sunuyor. Her flow çalıştırması otomatik olarak trace edilir:
Dev UI
bash
1# Genkit Dev UI'ı başlat2npx genkit start3 4# http://localhost:4000 adresinde:5# - Flow listesi ve çalıştırma6# - Trace görüntüleme7# - Prompt playground8# - Evaluation dashboardProduction Tracing
typescript
1import { enableGoogleCloudTelemetry } from '@genkit-ai/google-cloud';2 3// Google Cloud ile entegre monitoring4enableGoogleCloudTelemetry({5 projectId: 'my-project',6 telemetryConfig: {7 forceDevExport: false,8 sampler: {9 ratio: 0.1, // %10 sampling10 },11 },12});Metrikler
Her flow çalıştırmasında otomatik toplanan metrikler:
- Latency — Her adımın süresi
- Token kullanımı — Input/output token sayısı
- Hata oranı — Başarısız çalıştırmalar
- Model dağılımı — Hangi model ne kadar kullanıldı
- Maliyet — Tahmini API maliyeti
Production Deployment
Firebase Cloud Functions
typescript
1import { onCallGenkit } from 'firebase-functions/https';2import { genkit } from 'genkit';3 4// Flow'u Cloud Function olarak deploy et5export const chatFunction = onCallGenkit(6 {7 authPolicy: (auth) => {8 if (!auth) throw new Error('Kimlik doğrulama gerekli');9 },10 },11 summarizeFlow12);Cloud Run
bash
1# Dockerfile2FROM node:20-slim3WORKDIR /app4COPY package*.json ./5RUN npm ci --production6COPY . .7EXPOSE 34008CMD ["npx", "genkit", "flow:serve", "summarize", "--port", "3400"]Sonuç ve Öneriler
Firebase Genkit, AI uygulama geliştirmenin karmaşıklığını önemli ölçüde azaltıyor. Flow-based mimari ile type-safe pipeline'lar, Dotprompt ile yönetilebilir prompt'lar, yerleşik evaluation ile ölçülebilir kalite ve OpenTelemetry ile production observability — bunlar production-ready AI uygulaması için gereken temel yapı taşları. Firebase Advanced yazımızdaki backend pattern'lerle birleştirdiğinde güçlü bir AI altyapısı elde edersin.
Öneriler
- Flow'ları küçük tut — Tek sorumluluk prensibi. DeepSeek R1 gibi açık kaynak modelleri de Genkit plugin ile kullanabilirsin
- Dotprompt kullan — Prompt'ları koddan ayır
- Evaluation zorunlu — Her prompt değişikliğinde. Cursor AI ile hızlı iterasyon yap
- Dev UI'ı kullan — Debugging ve prototyping için muazzam
- Multi-model strateji — Basit = Flash, karmaşık = Pro
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ü
Genkit + Supabase + Vercel combo'su: Genkit flow'larını Vercel Edge Functions'da çalıştır, retriever olarak Supabase pgvector kullan, front-end'de Vercel AI SDK'nın useChat hook'unu kullan. Bu stack ile full-stack AI uygulaması 1 günde production'a çıkar. Genkit'in @genkit-ai/googleai plugin'i Edge runtime'da çalışıyor — cold start 50ms altında.

