Tüm Yazılar
KategoriAI
Okuma Süresi
23 dk
Yayın Tarihi
2026-02-13
Kelime Sayısı
1.954kelime

Kahveni hazırla - bu içerikli bir makale!

Firebase Genkit: AI Uygulama Framework'ü

Özet

Node.js GA, Go/Python desteği, flow-based mimari, prompt management, model evaluation ve production-ready AI uygulamaları geliştirme framework'ü rehberi.

  • Firebase Genkit, Node.js'te GA olan, Go ve Python destekli açık kaynak bir AI framework'ü.
  • Flow sistemi Zod ile inputSchema/outputSchema tanımlayarak type-safe AI pipeline'ları kuruyor.
  • Dotprompt sistemi promptları koddan ayrı dosyalarda yönetip versiyonlamayı git ile mümkün kılıyor.
  • Yerleşik evaluation sistemi ve OpenTelemetry tabanlı tracing ile production observability sağlanıyor.
Firebase Genkit: AI Uygulama Framework'ü

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?

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ır
24const 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ştur
2npm init -y
3npm install genkit @genkit-ai/googleai
4 
5# Veya Firebase Cloud Functions ile
6npm install genkit @genkit-ai/firebase

Flow-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ım
52const 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 flow
2const 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 flow
24const 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 → Özetleme
43const 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-flash
3input:
4 schema:
5 productName: string
6 category: string
7 features(array): string
8 targetAudience?: string
9output:
10 format: json
11 schema:
12 title: string
13 description: string
14 highlights(array): string
15 seoKeywords(array): string
16config:
17 temperature: 0.7
18 maxOutputTokens: 1024
19---
20 
21Sen bir e-ticaret ürün açıklaması uzmanısın.
22 
23{{productName}} ürünü için {{category}} kategorisinde
24profesyonel 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ükle
2const 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ımla
4const 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 flow
33const 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.documents
43 .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ımla
4const 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 evaluation
29const 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şlat
2npx genkit start
3 
4# http://localhost:4000 adresinde:
5# - Flow listesi ve çalıştırma
6# - Trace görüntüleme
7# - Prompt playground
8# - Evaluation dashboard

Production Tracing

typescript
1import { enableGoogleCloudTelemetry } from '@genkit-ai/google-cloud';
2 
3// Google Cloud ile entegre monitoring
4enableGoogleCloudTelemetry({
5 projectId: 'my-project',
6 telemetryConfig: {
7 forceDevExport: false,
8 sampler: {
9 ratio: 0.1, // %10 sampling
10 },
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 et
5export const chatFunction = onCallGenkit(
6 {
7 authPolicy: (auth) => {
8 if (!auth) throw new Error('Kimlik doğrulama gerekli');
9 },
10 },
11 summarizeFlow
12);

Cloud Run

bash
1# Dockerfile
2FROM node:20-slim
3WORKDIR /app
4COPY package*.json ./
5RUN npm ci --production
6COPY . .
7EXPOSE 3400
8CMD ["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

  1. Flow'ları küçük tut — Tek sorumluluk prensibi. DeepSeek R1 gibi açık kaynak modelleri de Genkit plugin ile kullanabilirsin
  2. Dotprompt kullan — Prompt'ları koddan ayır
  3. Evaluation zorunlu — Her prompt değişikliğinde. Cursor AI ile hızlı iterasyon yap
  4. Dev UI'ı kullan — Debugging ve prototyping için muazzam
  5. 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.

Etiketler

#Firebase#Genkit#AI#Node.js#Framework#LLM#Prompt Engineering
Muhittin Çamdalı

Muhittin Çamdalı

Lead Mobile Engineer

12+ yıllık deneyime sahip Lead Mobile Engineer. Swift, SwiftUI, Kotlin ve Flutter ile iOS, Android ve cross-platform mimarilerde uzman. Performanslı ve kullanıcı dostu mobil uygulamalar geliştiriyorum.

iOS Geliştirme Haberleri

Haftalık Swift tips, SwiftUI tricks ve iOS best practices. Spam yok, sadece değerli içerik.

Onay e-postasındaki bağlantıyı açıp “Aboneliğimi onayla” düğmesine bastığında aboneliğin başlar. Bültende açılma/tıklama istatistikleri tutulur; dilediğin an tek tıkla ayrılabilirsin. Gizlilik

Paylaş

İlgili İçerik