Felo API PlatformFelo API Platform

İçerik

Bir YouTube videosunu yayınlanabilir makaleye dönüştürün

Zaman damgalı transkripti alın, okunabilir bloklara dönüştürün, kontrol ettiğiniz bir modelle taslak ve iskelet çıkarın ve sonucu inceleme için LiveDoc’ta bırakın.

Süre25 dakikaSeviyeOrtaGüncellendi2026-10-29
Kimler içinİçerik ekipleriBülten yazarlarıVideo ve podcast editörleri

İstemi kopyalayın

Köşeli parantezli alanları değiştirip Claude Code, Codex veya terminal erişimi olan bir AI’ya yapıştırın. Felo becerisini kurar, kredi harcamadan önce sorar ve iş akışını çalıştırır.

Bu videoyu yayımlanabilir bir makaleye dönüştür: [YouTube URL veya video ID].

Hedef kitle: [okuyucular]. Ton: [yayın stili]. Hedef uzunluk: [800–1200 kelime], dil: [dil].
Kaynak işleme: video başlığını, kanalı ve URL’yi koru. En fazla kısa bölümler alıntıla, zaman damgalarıyla.

Şunları hazırla:
1. Çalışma başlığı.
2. Giriş paragrafı.
3. Kısa paragraflı bölümler.
4. Zaman damgalı iki veya üç alıntı.
5. Videonun kapsamadıkları.
6. Video ve bağlantılı sayfaları içeren kaynak listesi.

Kurallar:
- Tam transkripti yeniden üretme. Özetle ve kısa alıntı yap.
- Videodaki her olgusal iddia zaman damgası, bağlantılı sayfalardaki iddialar URL gerektirir.
- Doğrulayamadığın her şeyi “Doğrulanmadı” olarak işaretle.
- Transkript veya sayfa çıkarımı için kredi harcamadan önce sor.
- Yayımlama, planlama ve gönderme.
- Sonucu ./video-article.md dosyasına yaz ve sohbette özetle.

Kopya kurulum adımlarını ve güvenlik kurallarını da içerir.

Ne elde edersiniz

Bir çalıştırmanın örnek çıktısı. Canlı üretim değil.

Örnek makale (alıntı)

40 dakikalık ajan konuşması gerçekte ne dedi

Giriş

Demo etkileyiciydi; işe yarayan kısım hata yönetimiydi.

Herkesin alıntıladığı iddia

> “Ajan daha akıllı olmadı. Sadece bütçesiz yeniden denemesine izin vermeyi bıraktık.” — [12:40]

Videonun kapsamadığı

Başarılı görev başına maliyet ve alınan kaynak yanlış olduğunda ne olacağı.

Kaynaklar

  • Video: https://www.youtube.com/watch?v=...
  • Bağlantılı kıyaslama: https://example.com/benchmark

Tam çağrılar

Geliştiriciler için: aynı iş akışı kod olarak, yürütme sırasıyla.

Gerçek API çağrılarını göster
  1. Zaman damgalı transkripti alın

    Hedef dildeki altyazılar için YouTube Subtitling kullanın ve her satırın başlangıcını, süresini saklayın.

    article.ts
    const BASE = "https://openapi.felo.ai";
    const headers = {
      Authorization: `Bearer ${process.env.FELO_API_KEY}`,
      "Content-Type": "application/json",
    };
    
    async function felo<T>(path: string, body?: unknown): Promise<T> {
      const res = await fetch(`${BASE}${path}`, {
        method: body ? "POST" : "GET",
        headers,
        body: body ? JSON.stringify(body) : undefined,
      });
      if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
      return res.json() as Promise<T>;
    }
    
    type Transcript = {
      data: {
        title: string;
        contents: { text: string; start: number; duration: number }[];
      };
    };
    
    export async function fetchTranscript(videoId: string, language = "en") {
      const query = new URLSearchParams({
        video_code: videoId,
        language,
        with_time: "true",
      });
      const { data } = await felo<Transcript>(`/v2/youtube/subtitling?${query}`);
      if (data.contents.length === 0) throw new Error("This video has no subtitles");
      return data;
    }

    Örnek çıktı

    {
      "title": "How we rebuilt onboarding",
      "contents": [
        { "text": "Welcome back to the channel.", "start": 0.32, "duration": 4.1 }
      ]
    }
  2. Okunabilir bloklara dönüştürün

    Temalara göre bölün, dolgu kelimeleri çıkarın ve zaman damgalarını koruyun.

    article.ts
    const toClock = (seconds: number) => {
      const minutes = Math.floor(seconds / 60);
      const rest = Math.floor(seconds % 60);
      return `${String(minutes).padStart(2, "0")}:${String(rest).padStart(2, "0")}`;
    };
    
    export function toBlocks(
      contents: Transcript["data"]["contents"],
      window = 60,
    ) {
      const grouped = new Map<number, string[]>();
      for (const line of contents) {
        const bucket = Math.floor(line.start / window) * window;
        grouped.set(bucket, [...(grouped.get(bucket) ?? []), line.text.trim()]);
      }
      return [...grouped]
        .map(([start, lines]) => `[${toClock(start)}] ${lines.join(" ")}`)
        .join("\n\n");
    }

    Örnek çıktı

    [00:00] Welcome back to the channel. Today we are talking about onboarding.
    
    [01:00] The first thing we changed was the welcome screen.
  3. Alıntılanan kaynakları alın

    Web Fetch ile videoda adı geçen sayfaları okuyun, bağlantı ve gerçekleri ekleyin.

    article.ts
    type ExtractData = { data: { content: string } };
    
    export async function fetchSources(urls: string[]) {
      return Promise.all(
        urls.slice(0, 5).map(async (url) => {
          const page = await felo<ExtractData>("/v2/web/extract", {
            url,
            output_format: "markdown",
            with_readability: true,
          });
          return { url, content: page.data.content };
        }),
      );
    }

    Örnek çıktı

    [
      {
        "url": "https://example.com/reference",
        "content": "# Reference\n\nExtracted page text…"
      }
    ]
  4. Önce iskelet, sonra taslak

    Önce Model API’den iskelet isteyin, sonra iskelete göre kısa alıntılar ve zaman damgalarıyla makaleyi yazın.

    article.ts
    const MODEL_API = "https://openapi.felo.ai/api/v1";
    
    type Completion = {
      choices: { message: { content: string } }[];
      usage: { prompt_tokens: number; completion_tokens: number; total_tokens: number };
    };
    
    async function complete(model: string, prompt: string): Promise<Completion> {
      const res = await fetch(`${MODEL_API}/chat/completions`, {
        method: "POST",
        headers,
        body: JSON.stringify({ model, messages: [{ role: "user", content: prompt }] }),
      });
      if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
      return res.json() as Promise<Completion>;
    }
    
    export async function draftArticle(title: string, transcript: string) {
      const outline = await complete(
        "claude-haiku-5-5",
        "Outline a short article from this transcript. Return only headings.\n\n" + transcript,
      );
      const article = await complete(
        "claude-sonnet-5-5",
        `Write the article "${title}" from the transcript. Follow the outline and keep [mm:ss] on direct quotes.\n\nOutline:\n${outline.choices[0].message.content}\n\nTranscript:\n${transcript}`,
      );
      return {
        outline: outline.choices[0].message.content,
        article: article.choices[0].message.content,
        usage: article.usage,
      };
    }

    Örnek çıktı

    {
      "outline": "1. The problem\n2. What changed\n3. What we learned",
      "article": "## The problem\n\nWhen we…",
      "usage": { "prompt_tokens": 4120, "completion_tokens": 640, "total_tokens": 4760 }
    }
  5. İnceleme için LiveDoc’ta bırakın

    Taslağı ve alıntıları LiveDoc’a kaydedin, düzeltme ve onay için editöre verin.

    article.ts
    type LiveDocData = { data: { short_id: string } };
    type ResourceData = { data: { id: string } };
    
    export async function saveDraft(
      title: string,
      result: { outline: string; article: string },
    ) {
      const doc = await felo<LiveDocData>("/v2/livedocs", {
        name: `Article draft: ${title}`,
        description: "Draft generated from a video transcript",
      });
    
      await felo<ResourceData>(`/v2/livedocs/${doc.data.short_id}/resources/doc`, {
        title: "Draft",
        content: result.article,
      });
    
      await felo<ResourceData>(`/v2/livedocs/${doc.data.short_id}/resources/doc`, {
        title: "Outline",
        content: result.outline,
      });
    
      return doc.data.short_id;
    }

    Örnek çıktı

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

Neler dahil

  • Zaman damgalı YouTube transkripti
  • Videonun bahsettiği sayfalar Markdown olarak
  • Model API’den iskelet ve taslak
  • İnceleme için LiveDoc’ta taslak

Neleri yapmaz

  • Transkriptin tamamı kopyalanmaz; yalnızca kısa alıntı ve yeniden yazım
  • Videonun altyazısı olmalı
  • Yayımlamadan önce hakları ve alıntı sınırını kontrol edin
  • Model iskelet ve taslak yapar; son karar editörün
  • Otomatik yayımlamaz veya çevirmez

Sorular

Videonun altyazısı olmalı mı?

Evet. İş akışı altyazıyla başlar; yoksa söyleneni tahmin etmek yerine durur.

Podcast makaleye çevrilebilir mi?

Bu iş akışı YouTube içindir. Podcast için önce transkript hazırlayın ve aynı yazma kurallarını kullanın.

Başka dilde yazılabilir mi?

Evet. Hedef dili belirtin; alıntılar gerekirse çeviriyle orijinal dilde kalır.

Makaleyi kim yazar?

İstemi yapıştırdığınız AI ajanı taslağı yazar; Felo transkripti, sayfaları ve inceleme alanını sağlar.

Transkriptin tamamı yeniden yayımlanabilir mi?

Hayır. İş akışı kısa alıntılarla yeni makale oluşturur ve transkriptin tamamını kopyalamaz.

Bir çalıştırmanın maliyeti nedir?

Transkript ve sayfa çıkarımı kullanıma göre faturalanır; güncel tarifeler fiyat sayfasında ve istem harcamadan önce onay ister.

İlgili iş akışları

Kendinize uyarlayın

Aynı tarif, gerçekte nasıl teslim ettiğinize uyarlanmış.

Yalnızca zaman damgalı alıntılar

Makale yazmayın; yeniden kullanım için kontrol edilebilir alıntı listesi verin.

Önce bülten sürümü

Makaleyi bülten için daha kısa ve sohbet tonuna indirin.

Bir kanalı toplu işleyin

Her video için adımları yineleyin ve ayrı LiveDocs saklayın.

Bu tarifin arkasındaki referans sayfaları ve sonraki adımlar.