| name | ai-generate |
| description | Reference for adding AI generation features using the Gemini pipeline. Covers field generation, article generation, and how to create new AI actions. Use when the user wants to add AI-powered functionality. |
| user-invocable | false |
Gemini AI Entegrasyon Referansı
Bu projede AI üretimi Gemini API + Server Actions ile yapılır.
Mevcut AI Altyapı
| Dosya | İşlev |
|---|
src/lib/gemini.ts | Gemini client (model: gemini-2.0-flash) |
src/actions/generate-field.ts | Tekil alan üretimi (slug, SEO, alt text, description) |
src/actions/generate-article.ts | 3-aşamalı makale pipeline |
src/components/ui/AiFieldButton.tsx | Inline AI buton komponenti |
src/components/posts/AiArticlePanel.tsx | Makale üretim paneli |
Yeni AI Action Ekleme Paterni
'use server'
import { geminiModel } from '@/lib/gemini'
import { logger } from '@/lib/logger'
export async function generate{Feature}Action(input: InputType): Promise<{
success: boolean
data?: OutputType
error?: string
}> {
try {
const prompt = `...`
const result = await geminiModel.generateContent(prompt)
const text = result.response.text()
return { success: true, data: parsedOutput }
} catch (error) {
logger.error('generate-{feature} failed', error)
return { success: false, error: 'Üretim sırasında bir hata oluştu.' }
}
}
Kurallar
- Server Action olarak yaz —
'use server' zorunlu, API key client'a gitmez
- Hata sanitizasyonu —
catch bloğunda ham error mesajını kullanıcıya dönme
- Logger kullan —
console.log yasak, logger.error() kullan
- Türkçe prompt — İçerik Türkçe üretilecekse prompt'ta belirt
- Yapılandırılmış çıktı — JSON istiyorsan prompt'ta format belirt,
JSON.parse ile ayrıştır
- AiFieldButton — Tekil alan üretimi için
<AiFieldButton onClick={handler} loading={loading} /> kullan
- Panel component — Çok aşamalı üretim için ayrı panel bileşeni oluştur (
AiArticlePanel referans)
3-Aşamalı Pipeline Pattern
Büyük içerik üretimlerinde kullan:
- Planlama Agent — Konu → yapılandırılmış outline (JSON)
- Üretim Agent — Outline → tam içerik (HTML/text)
- Temizlik Agent — Ham çıktı → sanitize edilmiş çıktı (XSS-safe, heading hiyerarşisi)
Her aşama ayrı generateContent çağrısı. Aşamalar arası veriyi server-side tut.
İzin Verilen HTML Tag'leri (Makale)
h1, h2, h3, p, ul, ol, li, strong, em, blockquote, img
Başka tag'ler (script, iframe, style, div, span) frontendAgent tarafından temizlenir.
Görsel Kuralları (Makale)
- Her makalede 2 (en fazla 3) görsel olmalı. 0 veya 1 olabilir ama 4+ kabul edilmez.
img etiketi yalnızca <p>...</p> içinde sarmalanmış olur.
img üzerinde izinli attribute'lar: src, alt, width, height, loading.
src formatı (zorunlu domain — Pollinations.ai, ücretsiz AI image proxy):
https://image.pollinations.ai/prompt/{ENCODED_PROMPT}?width=1200&height=675&nologo=true
{ENCODED_PROMPT} URL-encoded İngilizce görsel prompt (6-14 kelime, fotogerçekçi/illustration/diagram stilini belirt, marka veya kişi adı içermesin)
alt zorunlu, Türkçe, max ~12 kelime. Boşsa frontendAgent üretir.
- RichTextEditor
@tiptap/extension-image ile yüklü; başka bir TipTap extension'ı eklemeden önce StarterKit ile çakışma olmadığından emin ol.