Eğitmen AI Araçları (Instructor Tools)
Eğitmen panelinde AI destekli araçlar — Sosyal medya (X, LinkedIn, Reels), pazar öngörüleri, AI quiz ve AI müfredat. Cloudflare Workers AI (Llama 3.1) kullanımı ve her aracın akışı.
Eğitmen panelinde Araçlar menüsü altında, kurs pazarlaması ve içerik üretimi için yapay zeka destekli araçlar sunulur. Tüm araçlar Cloudflare Workers AI (Meta Llama 3.1 8B Instruct) kullanır; harici API anahtarı gerekmez. Bu sayfa her bir aracın route’u, kullanıcı akışı, GraphQL API’si, AI prompt yapısı ve yanıt işleme detaylarını açıklar.
Genel Bakış
Section titled “Genel Bakış”| Özellik | Açıklama |
|---|---|
| Giriş | Sidebar: Araçlar → /:lang/instructor/tools. Sadece eğitmen ve admin erişebilir. |
| Hub | instructor.tools._index.tsx — Kartlar: AI Müfredat, Pazar Öngörüleri, AI Quiz, Sosyal Medya İçerik Fabrikası; Promosyon aracı “Yakında” olarak devre dışı. |
| Backend | İçerik üretimi GraphQL mutation/query’leri ile; resolver’lar app/graphql/schema.ts içinde. |
| AI model | Cloudflare Workers AI: @cf/meta/llama-3.1-8b-instruct. Binding: context.cloudflare.env.AI. |
Route’lar
Section titled “Route’lar”| Path | Dosya | Açıklama |
|---|---|---|
/:lang/instructor/tools | instructor.tools.tsx + instructor.tools._index.tsx | Araçlar merkezi (kart listesi). |
/:lang/instructor/tools/social-media | instructor.tools.social-media.tsx | X, LinkedIn, Reels içerik üretimi. |
/:lang/instructor/tools/market-insights | instructor.tools.market-insights.tsx | Pazar öngörüleri (talep/rekabet analizi). |
/:lang/instructor/tools/ai-quiz | instructor.tools.ai-quiz.tsx | Konu bazlı AI quiz; müfredata kaydetme. |
/:lang/instructor/tools/ai-syllabus | instructor.tools.ai-syllabus.tsx | Konu/hedef kitle/seviye ile müfredat taslağı. |
Detaylı path listesi için Route Haritası sayfasına bakın.
Ortak AI Altyapısı
Section titled “Ortak AI Altyapısı”Model ve binding
Section titled “Model ve binding”- Model:
@cf/meta/llama-3.1-8b-instruct(Cloudflare Workers AI). - Erişim: Resolver içinde
const AI = context.cloudflare?.env?.AI. Binding yoksa veyaAI.runbaşarısızsa kullanıcıya “Yapay zeka servisi şu an kullanılamıyor.” benzeri hata dönülür. - Çağrı:
await AI.run("@cf/meta/llama-3.1-8b-instruct", { messages: [{ role: "user", content: prompt }], max_tokens: ... }). Yanıt metni(response as any).response?.trim()ile alınır.
JSON yanıt temizleme (tüm AI araçlarında)
Section titled “JSON yanıt temizleme (tüm AI araçlarında)”Model bazen markdown kod bloğu veya ek metin döndürür. Tüm JSON dönen resolver’larda aynı adımlar uygulanır:
- Yanıttan
\“jsonve```` kaldırılır; trim. - İlk
{ile son}arasındaki alt string alınır (sadece JSON objesi kalır). - (Sadece Sosyal Medya) String literal içindeki hatalar
sanitizeAIJsonString()ile düzeltilir: kaçışsız kontrol karakterleri (satır sonu, tab) ve string içindeki kaçışsız çift tırnak ("→\"). Böylece “Bad control character” ve “Expected ’,’ or ’]’ after array element” hataları önlenir. JSON.parse(cleanJsonStr)ile doğrulama; hata olursa kullanıcıya Türkçe hata mesajı atılır.
Bu yardımcı fonksiyon schema.ts içinde tanımlıdır; sadece çift tırnak içindeki karakterleri escape eder, yapıyı bozmaz.
1. Sosyal Medya İçerik Fabrikası (/instructor/tools/social-media)
Section titled “1. Sosyal Medya İçerik Fabrikası (/instructor/tools/social-media)”Eğitmenin seçtiği kursun başlık ve açıklamasına göre X (eski Twitter), LinkedIn ve Instagram Reels için kullanıma hazır metinler üretmek.
Kullanıcı akışı
Section titled “Kullanıcı akışı”- Sayfa açılır;
myCoursesGraphQL query ile eğitmenin kursları listelenir. - Eğitmen dropdown’dan bir kurs seçer ve “Pazarlama Paketi Üret” butonuna tıklar.
- Açıklamadaki HTML etiketleri kaldırılarak düz metin elde edilir;
generateSocialMediaContent(title, description)mutation’ı çağrılır. - Yanıt gelince JSON parse edilir; X, LinkedIn, Reels sekmelerinde içerik gösterilir. Her sekmede “Tümünü Kopyala” / “Kopyala” ile panoya kopyalanır.
GraphQL
Section titled “GraphQL”- Mutation:
generateSocialMediaContent(title: String!, description: String!): String! - Dönüş: Ham JSON string (frontend’de parse edilir).
AI prompt özeti
Section titled “AI prompt özeti”- Rol: “Kıdemli Sosyal Medya ve Pazarlama Uzmanı”; kurs başlığı ve açıklaması verilir.
- Kurallar: Sadece geçerli JSON dön; markdown veya ek açıklama yok; doğrudan
{ile başla. - max_tokens: 1500.
İstenen JSON formatı (model’e verilen şablon)
Section titled “İstenen JSON formatı (model’e verilen şablon)”{ "twitterFlood": ["1. Tweet: ...", "2. Tweet: ...", "3. Tweet: ..."], "linkedinPost": "Profesyonel LinkedIn paylaşım metni.", "reelsScript": { "hook": "İlk 3 saniyede kanca.", "body": "15-20 sn ana konuşma.", "callToAction": "CTA cümlesi." }}Backend işleme
Section titled “Backend işleme”sanitizeAIJsonString(cleanJsonStr)çağrılır (string içinde satır sonu veya kaçışsız çift tırnak varsa düzeltilir).- Parse başarılıysa aynı
cleanJsonStrstring olarak döndürülür; frontendJSON.parseile kullanır.
Arayüz ve marka
Section titled “Arayüz ve marka”- Arayüzde ve çevirilerde yalnızca “X” kullanılır; “Twitter” metni yok. Sekme ve başlık anahtarları:
tabLabelX,twitterTitlevb. - X logosu:
Footer.tsxile aynı XIcon SVG (X şeklinde logo); kuş ikonu kullanılmaz. Bileşen social-media sayfasında yerel tanımlıdır.
Locale
Section titled “Locale”app/locales/*.json→instructorTools.socialMedia.*(tabLabelX, twitterTitle, copyAllLabel, copiedLabel, toastSuccess, toastError, vb.).
2. Pazar Öngörüleri (/instructor/tools/market-insights)
Section titled “2. Pazar Öngörüleri (/instructor/tools/market-insights)”Eğitmenin girdiği konu (topic) için platformdaki mevcut kurs verilerine dayanarak talep, rekabet, ortalama fiyat, anahtar kelimeler ve fırsat puanı üretmek. Veri + AI hibrit: önce DB’den gerçek veri, sonra AI ile yorum.
Kullanıcı akışı
Section titled “Kullanıcı akışı”- Eğitmen bir konu (örn. “React”, “Python”) yazar ve Analiz Et butonuna tıklar.
- GraphQL query
analyzeMarketplaceDemand(topic)çağrılır. - Sonuç ekranda kartlar ve metin olarak gösterilir: talep seviyesi, rekabet seviyesi, ortalama fiyat, top keywords, stratejik öneri, opportunity score.
GraphQL
Section titled “GraphQL”- Query:
analyzeMarketplaceDemand(topic: String!): MarketInsightsResponse! - Tip:
MarketInsightsResponse:topic,studentDemand(level, label, score),competition(level, label, score),averagePrice,topKeywords,recommendation,opportunityScore.
Veri akışı (backend)
Section titled “Veri akışı (backend)”- Platform verisi: Konuya göre
coursestablosundan sorgu (başlık/açıklamada konu geçen,status = published,isMarketplaceVisible = true,deletedAt IS NULL). Kurs sayısı, ortalama fiyat, örnek başlıklar (ilk 10) hesaplanır. - Kurs yoksa: AI çağrılmaz; sabit bir yanıt döner: “Veri bulunamadı”, öneri metni, opportunityScore 0.
- Kurs varsa: Prompt’ta kurs sayısı, ortalama fiyat ve örnek başlıklar verilir; modelden sadece JSON istenir.
AI prompt özeti
Section titled “AI prompt özeti”- Rol: “Pazar ve Veri Analisti”; konu ve platform verileri (kurs sayısı, ortalama fiyat, örnek başlıklar) verilir.
- Kurallar: Sadece geçerli JSON;
studentDemandvecompetitioniçinlevel: “low” | “medium” | “high”,score: 1–10;opportunityScore: 1–100. - max_tokens: 1000.
- Doğrudan parsed object döndürülür (string değil); GraphQL tipi
MarketInsightsResponseile eşleşir.
3. AI Quiz Oluşturucu (/instructor/tools/ai-quiz)
Section titled “3. AI Quiz Oluşturucu (/instructor/tools/ai-quiz)”Eğitmenin girdiği konu veya ders notlarına göre çoktan seçmeli quiz üretmek; isteğe bağlı olarak belirli bir kursun bölümüne quiz olarak kaydetmek.
Kullanıcı akışı
Section titled “Kullanıcı akışı”- Sayfa açılır;
instructorCoursesWithSectionsquery ile eğitmenin kursları ve bölümleri (sections) listelenir. - Eğitmen konu/not metnini girer; zorluk (örn. orta), soru sayısı ve dil seçer; “Sınav Üret” butonuna tıklar.
generateAIQuiz(topic, questionCount, difficulty, lang)mutation çağrılır; dönen JSON parse edilir, ekranda sorular ve şıklar gösterilir.- İstenirse Kurs / Bölüm seçilip “Müfredata Kaydet” ile
saveAIQuizToSection(sectionId, title, questionsJSON)çağrılır; quiz ilgili bölüme eklenir, kullanıcı eğitmen ana sayfaya yönlendirilir.
GraphQL
Section titled “GraphQL”- Mutation (üretim):
generateAIQuiz(topic: String!, questionCount: Int!, difficulty: String!, lang: String!): String!— JSON string döner. - Mutation (kaydetme):
saveAIQuizToSection(sectionId: ID!, title: String!, questionsJSON: String!): Boolean
AI prompt özeti
Section titled “AI prompt özeti”- Rol: “Sınav (Quiz) Tasarımcısı”; konu/ders notları, zorluk, soru sayısı verilir.
- Tüm metinler (soru, şıklar, açıklama) seçilen dilde (Türkçe, İngilizce, İspanyolca, Almanca, Fransızca, Japonca) yazılır.
- max_tokens: 2500.
İstenen JSON formatı (model’e verilen şablon)
Section titled “İstenen JSON formatı (model’e verilen şablon)”{ "title": "Quiz başlığı", "questions": [ { "text": "Soru metni", "options": ["A", "B", "C", "D"], "correctOption": 1, "explanation": "Cevap açıklaması" } ]}saveAIQuizToSection (kaydetme)
Section titled “saveAIQuizToSection (kaydetme)”questionsJSONparse edilir; her soru içinquiz_questionsvequiz_optionstablolarına insert yapılır; sıra (order) otomatik hesaplanır. Quiz başlığı ve açıklama (sabit: “Bu sınav yapay zeka asistanı tarafından otomatik oluşturulmuştur.”) ilequizzestablosuna kayıt atılır.
4. AI Müfredat Oluşturucu (/instructor/tools/ai-syllabus)
Section titled “4. AI Müfredat Oluşturucu (/instructor/tools/ai-syllabus)”Konu, hedef kitle ve zorluk seviyesi (başlangıç / orta / ileri / tümü) ile profesyonel bir kurs müfredat taslağı (başlık, özet, bölümler ve ders başlıkları) üretmek. Çıktı kopyalanabilir; şu an doğrudan platforma import edilmez.
Kullanıcı akışı
Section titled “Kullanıcı akışı”- Eğitmen konu, hedef kitle (serbest metin) ve seviye (beginner / intermediate / advanced / all) girer; Üret butonuna tıklar.
generateCourseSyllabus(topic, audience, level)mutation çağrılır; dönen JSON parse edilir.- Ekranda kurs başlığı, açıklama ve modüller (bölüm başlığı + ders listesi) gösterilir; Kopyala ile panoya metin olarak alınabilir.
GraphQL
Section titled “GraphQL”- Mutation:
generateCourseSyllabus(topic: String!, audience: String!, level: String!): String!— JSON string döner.
AI prompt özeti
Section titled “AI prompt özeti”- Rol: “Master seviyesinde kurs müfredat tasarımcısı”; konu, hedef kitle, zorluk seviyesi verilir.
- Kurallar: Sadece geçerli JSON; markdown kullanma; doğrudan
{ile başla. - max_tokens: 1500.
İstenen JSON formatı (model’e verilen şablon)
Section titled “İstenen JSON formatı (model’e verilen şablon)”{ "title": "Kurs başlık önerisi", "description": "2-3 cümlelik özet", "modules": [ { "title": "Bölüm 1: ...", "lessons": ["Ders 1: ...", "Ders 2: ..."] }, { "title": "Bölüm 2: ...", "lessons": ["Ders 3: ...", "Ders 4: ..."] } ]}Frontend çıktı
Section titled “Frontend çıktı”SyllabusOutput:title,description,modules: { title, lessons: string[] }[]. Kopyala butonu ile kurs adı, özet ve müfredat metni birleştirilip panoya yazılır.
5. Promosyon / Kupon Aracı
Section titled “5. Promosyon / Kupon Aracı”Hub sayfasında “Promosyon” kartı Yakında (coming soon) olarak gösterilir; link # ve active: false. Henüz route ve backend tanımlı değildir.
Özet tablo: Araç ↔ API ve model
Section titled “Özet tablo: Araç ↔ API ve model”| Araç | GraphQL | AI kullanımı | max_tokens | Özel işlem |
|---|---|---|---|---|
| Sosyal Medya | generateSocialMediaContent (mutation) | Evet | 1500 | sanitizeAIJsonString (kontrol karakteri + iç tırnak) |
| Pazar Öngörüleri | analyzeMarketplaceDemand (query) | Veri varsa evet | 1000 | Önce DB’den kurs verisi |
| AI Quiz | generateAIQuiz (mutation), saveAIQuizToSection (mutation) | Evet | 2500 | Kaydetme DB insert |
| AI Müfredat | generateCourseSyllabus (mutation) | Evet | 1500 | — |
Tüm AI çağrıları: Cloudflare Workers AI, Llama 3.1 8B Instruct; JSON yanıtlar için ortak temizleme (markdown kaldırma, ilk { – son } arası alma) uygulanır.
İlgili sayfalar
Section titled “İlgili sayfalar”- Eğitmen ve Kurs Yönetimi (Instructor Engine) — Kurs oluşturma, müfredat, performans.
- Eğitmen Asistanı (Instructor Copilot) — Eğitmen paneli AI chatbot (aynı model).
- Yapay Zeka Destekli Moderasyon (AI Moderation) — Admin tarafında AI kullanımı.
- Route Haritası — Tüm instructor/tools path’leri.