Packages/RbnPipeline — yapay zekâ içerik hattı (prompt kuralları, preset'ler, otomasyon)
Doğrulanan kod tabanı: d49b4413 (dal feat/fw-license-master) · Tarih: 2026-10-05 · Yayın: 0.9.7 = bu commit + sonrası; belge yalnız doğrulama anındaki kodu anlatır
Kaynak klasör: Packages/RbnPipeline/ — 31 *.php
(3 Builders/ + 3 Builders/Tasks/ + 4 Concerns/ + 2 Contracts/ +
6 Presets/ + 3 Rules/Blog/ + 7 Rules/Prompt/ + 1 Rules/Youtube/ + 2 Services/).
Envanter: 31 dosyanın 31'i aşağıda anlatıldı.
Bu paket spek eşiğini (≥20 php) aştığı için alt dal belgeleri de üretildi:
Rules.md.
1. Ne işe yarar, kim kullanır
"RSS/Trends'ten haber al → yapay zekâ ile metin üret → görsel üret → taslak
kaydet → yayınla → sosyal medyaya dağıt" zincirinin tamamıdır. Tasarım
kural tabanlıdır: her beceri (Rules/) küçük bir sınıftır, her hazır
kombinasyon (Presets/) bu kuralları birleştirir, PromptBuilder hepsini
tek metne derler.
Kimler çağırır: cron/queue motoru → Builders/Tasks/* (görev sınıfları) →
AbstractTaskBuilder::autopilot() → Services/AutoTaskManager.php ve
Services/ExternalFetchManager.php (PackageData.php:44).
2. Alt klasör haritası
| Alt klasör |
*.php |
İçerik |
Builders/ |
3 |
PromptBuilder + iki soyut taban |
Builders/Tasks/ |
3 |
Somut görev inşacıları |
Concerns/ |
4 |
Paylaşılan trait'ler (çözümleme, temizleme, yaşam döngüsü) |
Contracts/ |
2 |
İki arayüz |
Presets/ |
6 |
Hazır kural kombinasyonları |
Rules/ |
11 |
Kural sınıfları (Blog/ 3, Prompt/ 7, Youtube/ 1) — ayrıntı Rules.md |
Services/ |
2 |
AutoTaskManager, ExternalFetchManager |
3. Klasör/dosya envanteri (31/31)
3.1 Builders/ (3)
| Dosya |
Görev |
Önemli public yöntemler |
Builders/PromptBuilder.php |
Sıvı (fluent) inşacı: kuralları + görev metnini derler ve yanıtı temizler. |
reset(), applyRule(PromptRuleInterface $rule), json(?array $schema = null), seo(), image(), imagePrompt(), innerLinking(), blogStructure(), writingTone(), identity(), contentQuality(), preset(string $name, array $context = []), youtube(), task(string $taskInstruction), withContext(array $context), compile(), sanitize(string $response) |
Builders/AbstractPresetBuilder.php |
Ortak şema ve zenginleştirme sağlayan preset tabanı. |
— (soyut; alt sınıflar apply() uygular) |
Builders/AbstractTaskBuilder.php |
Tüm otomatik görev inşacılarının şablonu: yaşam döngüsü doğrulaması, cron zaman eşleşmesi, günlük kota, AI/görsel/yayın kısayolları. |
autopilot(array $params = []) (:37), abstract protected executeAutopilot(array $params): array (:29), protected: getProjectKey(): string (:75), resolveCandidate(array $params = []): array (:87), buildContext(array $extraContext = []): array (:142), generateText(...) (:249), savePost(...) (:274), generateImage(...) (:288), finalizePost(...) (:308), finishTask(...) (:350) |
3.2 Builders/Tasks/ (3)
| Dosya |
Görev |
Önemli public yöntemler |
Builders/Tasks/BaseContentTaskBuilder.php |
Tüm metin/ içerik görevlerinin 6 adımlı standart boru hattı. |
— (soyut; executeAutopilot() uygular) |
Builders/Tasks/ContentTaskBuilder.php |
Standart içerik görevi (en ince somut sınıf). |
— |
Builders/Tasks/ContentRewriteTaskBuilder.php |
Yeniden yazım (rewrite) görevi. |
— |
3.3 Concerns/ (4)
| Dosya |
Görev |
Önemli public yöntemler |
Concerns/AutoTaskTrait.php |
Tüm otomatik görevler için ortak yaşam döngüsü: proje anahtarı, günlük yayın sayacı, yayınlama, önbellek temizleme, yayın bağlantısı çözümü. |
getProjectKey(?string $key = null, bool $throwOnEmpty = false), getTodayPublishedCount(array $params), publishPost(int $postId, string $modelAlias), clearSitemapCache(), clearFeedCache(), clearContentCache(), resolvePublishedPostLink(?string $projectKey = null, string $typePrefixOrUrl = '', string $postSlug = '', string $categorySlug = '', bool $asHtmlLink = true) |
Concerns/PipelineResolverTrait.php |
Kaynak kipi çözümü, taslak/RSS havuzu, kategori eşleme, dengeli aday seçimi, kara liste GUID çözümü. |
resolveCategories(mixed $categoriesOrModel = null, mixed $selectedId = null, ?array $candidateRes = null, bool $returnSlug = false), resolveRecentPosts(mixed $postModelOrName = null, int $limit = 50), fetchDraftCandidate(array $params), getNextBalancedItem(array $candidates, array $posts = [], array $categories = []), resolveGuidsForBlacklist(array $candidateRes, array $newsData = []) |
Concerns/PipelineSanitizerTrait.php |
AI yanıtı normalizasyonu, SSS temizleme, HTML temizliği, mevcut bağlantıların AI için biçimlenmesi. |
normalizeAiResponse(array $aiResult), formatFaqs($faqsRaw), formatExistingLinksForAi(array $rawPosts, array $categoryMap = [], string $type = 'blog') |
Concerns/SanitizesResponseTrait.php |
Markdown JSON sarmalayıcı sökme, iç içe çözme, kontrol karakteri temizliği, kaçırılmamış tırnak onarımı, dizi çözme. |
cleanJsonWrapper(string $rawText), repairJson(string $json), extractBalancedJson(string $text) |
3.4 Contracts/ (2)
| Dosya |
Görev |
Önemli public yöntemler |
Contracts/PromptRuleInterface.php |
Modüler kural sözleşmesi. |
compileInstructions(array $context = []): string, sanitizeResponse(string $response, array $context = []) |
Contracts/PromptPresetInterface.php |
Yeniden kullanılabilir preset sözleşmesi. |
apply(PromptBuilder $builder, array $context = []) |
3.5 Presets/ (6)
| Dosya |
Görev |
Önemli public yöntemler |
Presets/BlogPreset.php |
Blog/makale standart kural kümesi. |
apply(PromptBuilder $builder, array $context = []) |
Presets/NewsPreset.php |
Haber / RSS standart kümesi. |
apply(PromptBuilder $builder, array $context = []) |
Presets/TrendsPreset.php |
Google Trends tabanlı üretim kümesi. |
apply(PromptBuilder $builder, array $context = []) |
Presets/YoutubePreset.php |
YouTube senaryosu kümesi. |
apply(PromptBuilder $builder, array $context = []) |
Presets/ImagePreset.php |
Doğrudan görsel üretimi için temiz küme. |
apply(PromptBuilder $builder, array $context = []) |
Presets/CustomPreset.php |
Anında uygulanan özel kural kümesi. |
apply(PromptBuilder $builder, array $context = []) |
3.6 Rules/ (11) — ayrıntılı liste Rules.md
| Dosya |
Görev (tek cümle) |
Rules/Prompt/JsonResponseRule.php |
JSON biçimlendirme ve otonom onarım kuralı. |
Rules/Prompt/SeoMetaRule.php |
SEO meta alanları, anahtar öbekleri ve otonom yedek üretimi. |
Rules/Prompt/ImagePromptRule.php |
Imagen 3 için İngilizce/Türkçesiz karakterden arındırılmış görsel prompt'u. |
Rules/Prompt/ImageSafetyRule.php |
Görsel prompt güvenlik sınırları ve yasaklı kelimeler. |
Rules/Prompt/ImageCompilerRule.php |
Standart stil şablonlarıyla temiz görsel prompt derlemesi. |
Rules/Prompt/WritingToneRule.php |
Projeye özel yazım tonu, anlatıcı bakış açısı, marka kişiliği. |
Rules/Prompt/IdentityRule.php |
Proje kimliği ve özel persona kurallarını dinamik kurar. |
Rules/Blog/BlogStructureRule.php |
Blog makalesi için standart HTML yapısı, uzunluk, alıntı, SSS. |
Rules/Blog/ContentQualityRule.php |
Makine kalitesi ("AI slop") karşıtı ana kalıcı. |
Rules/Blog/InnerLinkingRule.php |
Katı üst sınırlı dinamik iç bağlantılandırma. |
Rules/Youtube/YoutubeScriptRule.php |
YouTube senaryosu standartları. |
3.7 Services/ (2)
| Dosya |
Görev |
Önemli public yöntemler |
Services/AutoTaskManager.php |
Yayın hattının yürütücüsü: metin üretimi, taslak kaydetme, görsel üretimi, yayınlama, sosyal dağıtım. |
generateText(string $type, string $title, array $context = [], $taskLog = null) (:23), saveDraftPost(string $modelAlias, array $postData, ?array $draft = null, $taskLog = null, array $taskParams = []) (:89), generateAndSavePostImage(string $prompt, string $type, $taskLog = null, array $context = [], ?int $postId = null, ?string $modelAlias = null) (:194), finalizeAndPublishPost(int $postId, string $modelAlias, string $categorySlug, string $postSlug, string $typePrefix, $taskLog = null, $guids = null, ?string $projectKey = null) (:250), dispatchSocialShares(int $postId, string $modelAlias, string $publishedUrl, $taskLog = null, ?string $projectKey = null) (:386) |
Services/ExternalFetchManager.php |
Dış kaynak (Trends/RSS) aday toplama, tekilleştirme, kara liste ve mevcut içerik karşılaştırması. |
fetchTrendsCandidate(array $params), fetchRssCandidate(array $params), filterUniqueCandidates(array $candidates, string $projectKey, string $modelAlias, string $type = 'generic'), getBlacklistedGuids(string $projectKey), getExistingGuids(string $modelAlias, string $projectKey), getPublishedTitles(string $modelAlias, int $limit = 200), blacklistCandidate(string $projectKey, string $guid, string $title = '') |
Kapsama: 31/31.
4. Akış
4.1 Otomatik görev (cron → yayın)
Cron/queue motoru → ContentTaskBuilder::autopilot($params) AbstractTaskBuilder.php:37
├─ 1) category_type türetilir (params → preset adı) :45-51
├─ 2) ZORUNLU parametre denetimi :54-59
│ project_key yok → CronTaskException::missingParameter
│ local_model yok → CronTaskException::missingParameter
├─ 3) executeAutopilot($taskParams) :62
│ ├─ resolveCandidate() (1. adım) :87
│ │ ├─ source 'trends' → fetchTrendsCandidate() :105-106
│ │ ├─ source 'rss' → fetchRssCandidate() :107-108
│ │ ├─ hiçbiri değilse fetchDraftCandidate() :111-113
│ │ └─ aday yoksa → CronTaskException::candidateNotFound :115-121
│ │ (taskLog->skipped() ile "atlandı" olarak loglanır)
│ ├─ buildContext() (2. adım) :142
│ │ taskParams + generation_options + categories + eski haberler
│ ├─ generateText() → service('app.gemini') :249
│ │ AutoTaskManager::generateText() AutoTaskManager.php:23
│ │ ├─ yayınlanmış yazılar + kategoriler bağlama eklenir :41-61
│ │ ├─ $geminiApp->generateText($type,$title,$context) :64
│ │ ├─ normalizeAiResponse() :73
│ │ └─ formatFaqs() :76
│ ├─ generateImage() → FileService (Packages/RbnFile) :288
│ ├─ savePost() → taslak kayıt :274
│ ├─ finalizePost() → publishPost() :308
│ │ ├─ publishPost() AutoTaskManager.php:263
│ │ ├─ clearSitemapCache() / clearFeedCache() / clearContentCache() :316-318
│ │ └─ resolvePublishedPostLink(..., asHtmlLink=false) :371
│ └─ dispatchSocialShares() → Facebook + Instagram :376, 386
└─ CronTaskException yakalanır → success=true + status döner :63-69
Kritik davranış: CronTaskException hata değildir; görev "atlandı"
olarak başarıyla kapanır (success=true, status dolu) — böylece cron
motoru bunu hata saymaz (:63-69).
4.2 Prompt derleme
PromptBuilder
├─ json($schema)? → JsonResponseRule (aynı sınıf ikinci kez eklenmez)
│ applyRule() sınıf bazlı tekilleştirme yapar PromptBuilder.php:28
├─ seo() / image() / innerLinking() / … → ilgili kural sınıfı
├─ preset('blog') → BlogPreset::apply($this) (kuralları tek tek ekler)
├─ task('...') → görev metni
├─ withContext([...]) → context
├─ compile() → kuralların compileInstructions() + görev metni
└─ sanitize($response) → kuralların sanitizeResponse() zinciri
4.3 Dış kaynak aday toplama
ExternalFetchManager::fetchRssCandidate($params)
├─ service('rssParser')->parse($url) RbnUtility
├─ getBlacklistedGuids($projectKey) → daha önce işlenenler
├─ getExistingGuids($modelAlias, $projectKey) → sitede yayınlananlar
├─ getPublishedTitles($modelAlias, 200) → başlık benzerliği
└─ filterUniqueCandidates($candidates, ...) → kalan adaylar
5. Yapılandırma / ayar anahtarları
| Anahtar / parametre |
Yer |
Varsayılan / not |
project_key |
AbstractTaskBuilder.php:54 |
Zorunlu; yoksa CronTaskException::missingParameter |
local_model |
:57 |
Zorunlu; "tek ve gerçek model parametresi" standardı (:53) |
category_type / content_type |
:45-51 |
Verilmezse preset/type adından türetilir |
source |
:100 |
Varsayılan 'draft'; trends ve rss özel dallar |
generation_options |
:144 |
buildContext() içinde görev parametreleriyle birleştirilir |
image_prompt_mode |
PromptBuilder.php:62 |
'metadata' — imagePrompt() bu context'i ekler |
| Günlük kota |
AutoTaskTrait::getTodayPublishedCount() |
autopilot() yaşam döngüsü denetiminde kullanılır |
6. Tuzaklar ve kurallar
- Aynı kural iki kez eklenmez.
applyRule() sınıf adına göre tekilleştirir
(PromptBuilder.php:30) — image() ve imagePrompt() aynı
ImagePromptRule sınıfını ekler, ikinci çağrı yok sayılır.
- Aday bulunamazsa hata fırlatılmaz.
CronTaskException::candidateNotFound
atılır ve autopilot() bunu success=true + status ile karşılar
(:115-121, :63-69). Bu, "bugün yeni içerik yok" durumunu hata gibi
göstermemenin yoludur.
- Zorunlu parametre denetimi baştan yapılır (
:54-59); yarım kalan
görev yarım içerik üretmez.
- Kategori hiyerarşisi: görev içinde
category_type açıkça verilmişse
o kazanılır; verilmemişse preset adından türetilir (:45-51).
- Yayın sonrası üç önbellek temizlenir — sitemap, feed, içerik
(AutoTaskManager.php:316). Biri unutulursa yeni yazı sitemap'te
görünmez.
resolvePublishedPostLink(..., $asHtmlLink) bayrağı belirleyicidir:
false ile ham URL alınır ve sosyal caption'a konur (:371).
- JSON onarımı merkezidir:
SanitizesResponseTrait::cleanJsonWrapper/ repairJson/extractBalancedJson tüm framework'te tek kopyadır; kural
sınıfları kendi kopyasını yazmaz, bu trait'i kullanır.
ContentQualityRule "AI slop" karşıtıdır; metin üretimi sonrası
sanitize aşamasında devreye girer — üretilen içeriği olduğu gibi
yayınlamak bu kuralın varlık nedenidir.
7. Örnek (gerçek koddan)
// Prompt derleme
$prompt = $this->builder('prompt')
->json(['baslik' => 'string', 'icerik' => 'string'])
->seo()
->blogStructure()
->identity()
->preset('blog', $context)
->task('Türkçe bir blog yazısı yaz.')
->withContext($context)
->compile();
$metin = $prompt->sanitize($aiYanit);
8. İlgili belgeler
- RbnPipeline/Rules.md — 11 kural sınıfının ayrıntılı listesi
- PackageData.md —
rules.*, presets.*, builders.* kayıt adları
- RbnApi.md —
app.gemini, FacebookService, InstagramService, rssParser tüketicisi
- RbnUtility.md — RSS ve Google Trends kaynakları
- RbnFile.md — görsel üretimi sonrası depolama
- Core/Services (
../Core/Services/) — cron/queue motoru (⏳ ayrı görev; belgesi henüz yazılmadı)