Bu serinin yazarı Güray: AI geliştirmecisi, prompt ve analiz mühendisi. Kodun büyük kısmını bir LLM ajanıyla pair programming yaparak yazıyorum; benim işim mimariyi, protokolleri ve kalite çıtasını tasarlamak. Bu seri, kafa1milyon.com'un perde arkasını mühendis gözüyle belgeliyor.
Tez: Bu bir web sitesi değil, kendi kendini yayınlayan bir sistem
kafa1milyon.com dışarıdan bakınca sıradan bir Türkçe içerik portalı: bilim, tarih, psikoloji yazıları, günlük tarot falı, arkeoloji haberleri, sesli anlatımlar, X ve Instagram'da video fragmanlar.
Perde arkasında ise insan müdahalesi olmadan şunları yapan bir sistem çalışıyor:
- RSS radarlarıyla dünya basınını ve bilimsel dergileri tarıyor
- Konu adaylarını kalite kriterlerine göre kendisi süzüyor (onay beklemiyor)
- Birincil kaynaklardan araştırıp 700-1.100 kelimelik yazılar üretiyor
- Her yazıya hero görseli, JSON-LD, sitemap kaydı, IndexNow ping'i ekliyor
- Yayın kalitesinde Türkçe seslendirme üretiyor (kota yönetimiyle birlikte)
- Sanal bir sunucu karakterin (Elif) dikey tanıtım videolarını üretiyor
- X ve Instagram'a günlük limitlere ve bekletme tarihlerine uyarak paylaşıyor
- Her adımı doğruluyor: HTTP 200 kontrolü, ffprobe, hatta ürettiği videoyu Whisper ile geri dinleyip metnin doğru söylenip söylenmediğini teyit ediyor
Bu yazı serinin ilki: sistemin genel mimarisi ve en önemli tasarım kararı olan "kural dosyaları = sistemin uzun süreli hafızası" yaklaşımı.
Mimari: LLM ajan + kural dosyaları + kuyruklar
Kaba şema şöyle:
┌─────────────────────────────────────────────────────┐
│ LLM AJAN (Cursor içinde çalışan agent) │
│ - araştırma, yazım, kod üretimi, tarayıcı kontrolü │
└──────────────┬──────────────────────────────────────┘
│ her oturumda okur
┌──────────────▼──────────────────────────────────────┐
│ KURAL DOSYALARI (.cursor/rules/*.mdc) │
│ yazım stili · SEO protokolü · seslendirme akışı │
│ X/Instagram standardı · tarot formatı · video │
│ standardı · taslak kuyruğu politikası │
└──────────────┬──────────────────────────────────────┘
│ üretir / günceller
┌──────────────▼──────────────────────────────────────┐
│ DURUM (dosya tabanlı, git'lenebilir) │
│ xpost/queue.json · instagram/queue.json │
│ tarot/gecmis.json · radar/son-tarama.json │
│ taslak-durum.json (VPS'te küçük bir API) │
└──────────────┬──────────────────────────────────────┘
│ rsync
┌──────────────▼──────────────────────────────────────┐
│ VPS (nginx, statik HTML) + Cloudflare │
└─────────────────────────────────────────────────────┘
Dikkat çekmek istediğim üç karar var.
1. Veritabanı yok, framework yok: dosya tabanlı durum
Sitenin tamamı statik HTML. Kuyruklar, geçmiş kayıtları ve radar çıktıları düz JSON dosyaları. Örneğin sosyal medya kuyruğundaki bir öğe:
{
"text": "Tıraş ettikçe kıl gürleşir diyorlar.\n\nBilim buna neredeyse yüz yıldır aynı cevabı veriyor.",
"url": "https://kafa1milyon.com/yazi/tiras-efsanesi/",
"kat": "Bilim",
"video": "video-lab/xvideo/elif-tiras-efsanesi.mp4",
"hold_until": "2026-08-12",
"posted": false
}
hold_until alanı sistemin tempo kontrolü: ajan istediği kadar içerik üretebilir ama X'in spam filtresine yakalanmamak için günde 2-3 paylaşım limiti var. Üretim ve yayın birbirinden ayrıştı; üretim hızlı, yayın sabırlı.
Bir LLM ajanla çalışırken dosya tabanlı durumun büyük avantajı şu: ajan durumu cat ile okuyabiliyor, python3 - ile güncelleyebiliyor, hata yaptığında diff'ten geri alınabiliyor. ORM'siz, migration'sız, şeffaf.
2. Kural dosyaları = derlenmiş deneyim
Sistemin asıl "zekâsı" modellerde değil, kural dosyalarında birikiyor. Her .mdc dosyası, yaşanmış bir problemin damıtılmış çözümü. Gerçek bir örnek, yazım stili kuralından:
## Uzunluk: KISA TUT (kullanıcı geri bildirimi, ZORUNLU)
Yazılar haddinden uzun olunca okur detaylarda boğulup yarıda bırakıyor.
- Hedef: 700-1.100 kelime (4-7 dk okuma).
- Giriş 2 paragrafı geçmez; ilk cümle doğrudan sahneye/soruya girer.
- Aynı iddiayı ikinci örnekle kanıtlama; en güçlü tek örneği seç, gerisini at.
Bu satırlar bir prompt değil, protokol. Okur yazıları yarıda bırakınca analiz ettik, kararı verdik, kurala işledik. Artık sistem her yeni yazıda bu dersi hatırlıyor. "Kendi kendine gelişen sistem" derken kastettiğim mekanizma bu: her hata ve her geri bildirim, bir kural dosyası güncellemesine dönüşüyor. Model unutur; dosya unutmaz.
Şu an ~10 kural dosyası var: yazım stili, SEO standardı, seslendirme akışı, X paylaşım formatı (fragman tarzı, spoiler yasağı), Instagram aynalama, günlük tarot formatı (üç kart + "bize ne olacak" bölümü), arkeoloji radarının görsel politikası, sanal sunucu Elif'in sabit karakter tanımı...
3. Doğrulama döngüleri: ajan kendi çıktısına güvenmez
LLM tabanlı otomasyonda en tehlikeli an, sistemin "bitti" dediği an. Bu yüzden her üretim adımının bir doğrulayıcısı var:
- Yayın: deploy sonrası her yeni URL'ye HTTP isteği, 200 kontrolü.
- Ses: üretilen MP3 ffprobe ile süre/bitrate kontrolünden geçiyor.
- Video: en sert kontrol burada. Görüntü-videoya (image-to-video) modeli sunucu karakterimize bir metin söyletiyor; ama model bazen metni değiştiriyor ya da eski bir çekimin sesini kullanıyor. Çözüm: üretilen her video faster-whisper ile transkript ediliyor ve söylenen metin, istenen metinle karşılaştırılıyor. Uymuyorsa video çöpe gidiyor, yayına giremiyor.
segments, info = model.transcribe("elif-clip.mp4", language="tr")
soylenen = " ".join(s.text for s in segments)
# istenen metinle benzerlik düşükse: RED, yeniden üret
Bu döngü bizi en az bir kez kurtardı: model, yeni konu için ürettiğimiz videoda eski bir çekimin kapanış cümlesini söylemişti. Transkript kontrolü olmasaydı yanlış video yayına girecekti.
Otonomi modeli: onay kuyruğundan onaysız üretime
Başta her konu adayı kullanıcı onayı bekliyordu. Bir taslak sayfası, VPS'te minik bir onay API'si ({"onayli": [], "yazildi": []}), seçilenlerin yazılması... Sonra fark ettik ki dar boğaz onay adımının kendisi. Kalite kriterleri zaten kurallarda yazılıysa, süzgeci ajan kendisi işletebilir.
Şimdiki model: ajan adayları bulur, kalite/etik süzgecinden geçirir (tıbbi tavsiye yok, siyaset yok, zayıf hikâye elenir), uygun olanları kuyruğa alır ve yazar. İnsan istediği an taslak sayfasından kuyruğa öncelik verebilir ama sistemin ilerlemesi insana bağlı değil. İnsan onayı bir kapı olmaktan çıkıp bir yönlendirme sinyaline dönüştü.
Bu, prompt mühendisliğinden çok analiz mühendisliği: hangi kararların gerçekten insan yargısı gerektirdiğini, hangilerinin yazılı kritere indirgenebileceğini ayrıştırmak. İndirgenebilen her karar, otonom sistemin bir parçası oluyor.
Başarısızlıklar da mimarinin parçası
Bu seride pembe tablo çizmeyeceğim; sistemin bugünkü hâli, çöpe giden denemelerin üstünde duruyor:
-
X'in ücretsiz API'si öldü (Şubat 2026, yazma uçları 402 dönüyor). Çözümü tarayıcı otomasyonu + intent URL'lerde bulduk; X'in React composer'ına programatik metin yazmak ise imkânsıza yakın çıktı. Video eklemek için Chrome DevTools Protocol ile
DataTransferenjeksiyonu gerekti. (Bölüm 2'nin konusu.) - Wav2Lip ile dudak senkronu teknik olarak çalıştı, kalite olarak reddedildi: robotik, bozuk. Bazen "çalışan çözüm" doğru çözüm değildir; onun yerine ses üretimini video modelinin kendisine bıraktık.
- Sinematik tanıtım filmi projesi tamamen iptal edildi. Uzun formda kesme/geçiş/senkron kalitesini otomasyonla tutturamadık. Ders: kısa dikey format (10 sn, tek çekim, tek karakter) otomasyonun bugünkü tatlı noktası; uzun form değil.
Sıradaki bölümler
-
X otomasyonu savaşı — ücretsiz API'nin ölümü, intent URL'ler, CDP ile dosya enjeksiyonu, nginx
^~CORS detayı - Seslendirme boru hattı — Türkçe TTS'te prozodi, request stitching, karakter kotası yönetimi
- Radar sistemleri — RSS + LLM süzgeciyle günlük konu keşfi, tekrar kontrolü
- Elif — sabit karakterli sanal sunucu: image-to-video, kimlik tutarlılığı, transkripsiyon doğrulama
- SEO otonomisi — JSON-LD, IndexNow, iç bağlantı otomasyonu
Sorusu olan yorumlara beklerim. Sistemin ürettiklerini görmek isterseniz: kafa1milyon.com
Top comments (0)