Skip to content

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.


ÖzellikAçıklama
GirişSidebar: Araçlar/:lang/instructor/tools. Sadece eğitmen ve admin erişebilir.
Hubinstructor.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 modelCloudflare Workers AI: @cf/meta/llama-3.1-8b-instruct. Binding: context.cloudflare.env.AI.

PathDosyaAçıklama
/:lang/instructor/toolsinstructor.tools.tsx + instructor.tools._index.tsxAraçlar merkezi (kart listesi).
/:lang/instructor/tools/social-mediainstructor.tools.social-media.tsxX, LinkedIn, Reels içerik üretimi.
/:lang/instructor/tools/market-insightsinstructor.tools.market-insights.tsxPazar öngörüleri (talep/rekabet analizi).
/:lang/instructor/tools/ai-quizinstructor.tools.ai-quiz.tsxKonu bazlı AI quiz; müfredata kaydetme.
/:lang/instructor/tools/ai-syllabusinstructor.tools.ai-syllabus.tsxKonu/hedef kitle/seviye ile müfredat taslağı.

Detaylı path listesi için Route Haritası sayfasına bakın.


  • Model: @cf/meta/llama-3.1-8b-instruct (Cloudflare Workers AI).
  • Erişim: Resolver içinde const AI = context.cloudflare?.env?.AI. Binding yoksa veya AI.run baş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:

  1. Yanıttan \“jsonve```` kaldırılır; trim.
  2. İlk { ile son } arasındaki alt string alınır (sadece JSON objesi kalır).
  3. (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.
  4. 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.

  1. Sayfa açılır; myCourses GraphQL query ile eğitmenin kursları listelenir.
  2. Eğitmen dropdown’dan bir kurs seçer ve “Pazarlama Paketi Üret” butonuna tıklar.
  3. Açıklamadaki HTML etiketleri kaldırılarak düz metin elde edilir; generateSocialMediaContent(title, description) mutation’ı çağrılır.
  4. 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.
  • Mutation: generateSocialMediaContent(title: String!, description: String!): String!
  • Dönüş: Ham JSON string (frontend’de parse edilir).
  • 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."
}
}
  • 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ı cleanJsonStr string olarak döndürülür; frontend JSON.parse ile kullanır.
  • Arayüzde ve çevirilerde yalnızca “X” kullanılır; “Twitter” metni yok. Sekme ve başlık anahtarları: tabLabelX, twitterTitle vb.
  • X logosu: Footer.tsx ile aynı XIcon SVG (X şeklinde logo); kuş ikonu kullanılmaz. Bileşen social-media sayfasında yerel tanımlıdır.
  • app/locales/*.jsoninstructorTools.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.

  1. Eğitmen bir konu (örn. “React”, “Python”) yazar ve Analiz Et butonuna tıklar.
  2. GraphQL query analyzeMarketplaceDemand(topic) çağrılır.
  3. Sonuç ekranda kartlar ve metin olarak gösterilir: talep seviyesi, rekabet seviyesi, ortalama fiyat, top keywords, stratejik öneri, opportunity score.
  • Query: analyzeMarketplaceDemand(topic: String!): MarketInsightsResponse!
  • Tip: MarketInsightsResponse: topic, studentDemand (level, label, score), competition (level, label, score), averagePrice, topKeywords, recommendation, opportunityScore.
  1. Platform verisi: Konuya göre courses tablosundan 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.
  2. Kurs yoksa: AI çağrılmaz; sabit bir yanıt döner: “Veri bulunamadı”, öneri metni, opportunityScore 0.
  3. Kurs varsa: Prompt’ta kurs sayısı, ortalama fiyat ve örnek başlıklar verilir; modelden sadece JSON istenir.
  • Rol: “Pazar ve Veri Analisti”; konu ve platform verileri (kurs sayısı, ortalama fiyat, örnek başlıklar) verilir.
  • Kurallar: Sadece geçerli JSON; studentDemand ve competition için level: “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 MarketInsightsResponse ile 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.

  1. Sayfa açılır; instructorCoursesWithSections query ile eğitmenin kursları ve bölümleri (sections) listelenir.
  2. Eğitmen konu/not metnini girer; zorluk (örn. orta), soru sayısı ve dil seçer; “Sınav Üret” butonuna tıklar.
  3. generateAIQuiz(topic, questionCount, difficulty, lang) mutation çağrılır; dönen JSON parse edilir, ekranda sorular ve şıklar gösterilir.
  4. İ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.
  • 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
  • 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ı"
}
]
}
  • questionsJSON parse edilir; her soru için quiz_questions ve quiz_options tabloları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.”) ile quizzes tablosuna 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.

  1. Eğitmen konu, hedef kitle (serbest metin) ve seviye (beginner / intermediate / advanced / all) girer; Üret butonuna tıklar.
  2. generateCourseSyllabus(topic, audience, level) mutation çağrılır; dönen JSON parse edilir.
  3. 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.
  • Mutation: generateCourseSyllabus(topic: String!, audience: String!, level: String!): String! — JSON string döner.
  • 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: ..."] }
]
}
  • SyllabusOutput: title, description, modules: { title, lessons: string[] }[]. Kopyala butonu ile kurs adı, özet ve müfredat metni birleştirilip panoya yazılır.

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.


AraçGraphQLAI kullanımımax_tokensÖzel işlem
Sosyal MedyagenerateSocialMediaContent (mutation)Evet1500sanitizeAIJsonString (kontrol karakteri + iç tırnak)
Pazar ÖngörülerianalyzeMarketplaceDemand (query)Veri varsa evet1000Önce DB’den kurs verisi
AI QuizgenerateAIQuiz (mutation), saveAIQuizToSection (mutation)Evet2500Kaydetme DB insert
AI MüfredatgenerateCourseSyllabus (mutation)Evet1500

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.