Felo API PlatformFelo API Platform

Konten

Ubah video YouTube menjadi artikel yang bisa diterbitkan

Ambil transkrip bertimestamp, bentuk menjadi blok mudah dibaca, buat kerangka dan draf dengan model yang Anda kendalikan, lalu tinggalkan hasilnya di LiveDoc untuk ditinjau.

Waktu25 menitTingkatMenengahDiperbarui2026-10-29
Untuk siapaTim kontenPenulis newsletterEditor video dan podcast

Salin prompt

Ganti kolom dalam kurung siku lalu tempel ke Claude Code, Codex, atau AI dengan akses terminal. Ia memasang skill Felo, bertanya sebelum memakai kredit, dan menjalankan alur kerja.

Ubah video ini menjadi artikel yang layak terbit: [URL YouTube atau ID video].

Audiens: [pembaca]. Nada: [gaya publikasi]. Panjang target: [800–1200 kata] dalam [bahasa].
Penanganan sumber: pertahankan judul, kanal, dan URL video. Kutip paling banyak bagian pendek, dengan stempel waktu.

Hasilkan:
1. Judul kerja.
2. Paragraf pembuka.
3. Bagian dengan paragraf pendek.
4. Dua atau tiga kutipan dengan stempel waktu.
5. Apa yang tidak dibahas video.
6. Daftar sumber dengan video dan halaman yang tertaut.

Aturan:
- Jangan mereproduksi transkrip lengkap. Ringkas dan kutip singkat.
- Setiap klaim faktual dari video membutuhkan stempel waktu; klaim dari halaman tertaut membutuhkan URL.
- Tandai sebagai “Belum terverifikasi” semua yang tidak bisa kamu cek.
- Tanya dulu sebelum memakai kredit untuk transkrip atau ekstraksi halaman.
- Jangan menerbitkan, menjadwalkan, atau mengirim apa pun.
- Tulis hasilnya ke ./video-article.md dan ringkas di chat.

Salinan juga menyertakan langkah pemasangan dan aturan keamanan.

Yang Anda dapatkan

Contoh keluaran dari satu eksekusi. Bukan pembuatan langsung.

Contoh artikel (kutipan)

Apa yang sebenarnya dikatakan talk agen 40 menit

Paragraf pembuka

Demonnya mengesankan; bagian bergunanya adalah penanganan kegagalan.

Klaim yang semua orang kutip

> “Agennya tidak jadi lebih pintar. Kami hanya berhenti membiarkannya mencoba ulang tanpa anggaran.” — [12:40]

Yang tidak dicakup video

Biaya per tugas berhasil, dan apa yang terjadi saat sumber yang diambil salah.

Sumber

  • Video: https://www.youtube.com/watch?v=...
  • Benchmark tertaut: https://example.com/benchmark

Panggilan persisnya

Untuk developer: alur kerja yang sama sebagai kode, sesuai urutan eksekusi.

Tampilkan panggilan API asli
  1. Ambil transkrip bertimestamp

    Gunakan YouTube Subtitling untuk subtitle bahasa target dan simpan waktu mulai serta durasi tiap baris.

    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;
    }

    Contoh keluaran

    {
      "title": "How we rebuilt onboarding",
      "contents": [
        { "text": "Welcome back to the channel.", "start": 0.32, "duration": 4.1 }
      ]
    }
  2. Bentuk blok mudah dibaca

    Bagi per tema, buang kata pengisi, dan pertahankan timestamp.

    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");
    }

    Contoh keluaran

    [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. Ambil sumber yang disebut

    Dengan Web Fetch baca halaman yang disebut di video dan tambahkan tautan serta fakta.

    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 };
        }),
      );
    }

    Contoh keluaran

    [
      {
        "url": "https://example.com/reference",
        "content": "# Reference\n\nExtracted page text…"
      }
    ]
  4. Buat kerangka lalu draf

    Minta kerangka ke Model API dulu, lalu tulis artikel mengikuti kerangka dengan kutipan singkat dan timestamp.

    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,
      };
    }

    Contoh keluaran

    {
      "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. Tinggalkan di LiveDoc untuk tinjauan

    Simpan draf dan kutipan di LiveDoc lalu serahkan ke editor untuk koreksi dan persetujuan.

    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;
    }

    Contoh keluaran

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

Termasuk

  • Transkrip YouTube bertimestamp
  • Halaman yang disebut video dalam Markdown
  • Kerangka dan draf dari Model API
  • LiveDoc berisi draf untuk tinjauan

Yang tidak dilakukan

  • Tidak menyalin seluruh transkrip; hanya kutipan singkat dan penulisan ulang
  • Video harus punya subtitle
  • Periksa hak dan batas kutipan sebelum terbit
  • Model membuat kerangka dan draf; keputusan akhir ada pada editor
  • Tidak menerbitkan atau menerjemahkan otomatis

Pertanyaan

Apakah video harus punya subtitle?

Ya. Alur dimulai dari subtitle; jika tidak ada, ia berhenti alih-alih menebak ucapan.

Bisa mengubah podcast menjadi artikel?

Alur ini untuk YouTube. Untuk podcast, siapkan transkrip dulu dan pakai aturan penulisan yang sama.

Bisa menulis dalam bahasa lain?

Bisa. Sebutkan bahasa target; kutipan tetap dalam asli dengan terjemahan bila perlu.

Siapa yang menulis artikel?

Agent AI tempat Anda menempel prompt menulis draf; Felo menyediakan transkrip, halaman, dan ruang tinjauan.

Boleh menerbitkan ulang seluruh transkrip?

Tidak. Alur membuat artikel baru dengan kutipan singkat dan tidak menyalin transkrip penuh.

Berapa biaya satu eksekusi?

Transkrip dan ekstraksi ditagih sesuai pemakaian; tarif saat ini di halaman harga dan prompt meminta persetujuan sebelum mengeluarkan biaya.

Alur kerja terkait

Sesuaikan

Resep yang sama, disesuaikan dengan cara Anda benar-benar mengirim.

Hanya kutipan bertimestamp

Tidak menulis artikel; berikan daftar kutipan yang bisa diperiksa untuk dipakai ulang.

Versi newsletter dulu

Ringkas artikel menjadi versi lebih pendek dan santai untuk newsletter.

Proses satu kanal secara batch

Ulangi langkah per video dan simpan LiveDoc terpisah.

Halaman referensi di balik resep ini dan langkah berikutnya.