Felo API PlatformFelo API Platform

Kandungan

Tukar video YouTube kepada artikel boleh terbit

Ambil transkrip bertimestamp, bentuk menjadi blok mudah dibaca, buat rangka dan draf dengan model yang anda kawal, lalu tinggalkan hasil dalam LiveDoc untuk semakan.

Masa25 minitTahapPertengahanDikemas kini2026-10-29
Untuk siapaPasukan kandunganPenulis surat beritaEditor video dan podcast

Salin prompt

Ganti medan dalam kurungan siku lalu tampal ke Claude Code, Codex atau AI dengan akses terminal. Ia memasang skill Felo, bertanya sebelum kredit digunakan dan menjalankan aliran kerja.

Tukar video ini menjadi artikel yang boleh diterbitkan: [URL YouTube atau ID video].

Audiens: [pembaca]. Nada: [gaya penerbitan]. Panjang sasaran: [800–1200 patah perkataan] dalam [bahasa].
Pengendalian sumber: kekalkan tajuk video, saluran dan URL. Petik paling banyak petikan pendek, dengan cap masa.

Hasilkan:
1. Tajuk kerja.
2. Perenggan pembuka.
3. Bahagian dengan perenggan pendek.
4. Dua atau tiga petikan bercap masa.
5. Apa yang video tidak liputi.
6. Senarai sumber dengan video dan halaman berpaut.

Peraturan:
- Jangan hasilkan semula transkrip penuh. Ringkaskan dan petik pendek.
- Setiap dakwaan fakta daripada video perlu cap masa; dakwaan daripada halaman berpaut perlu URL.
- Label “Belum disahkan” untuk apa-apa yang tidak dapat disemak.
- Tanya sebelum menggunakan kredit untuk transkrip atau pengekstrakan halaman.
- Jangan terbitkan, jadualkan atau hantar apa-apa.
- Tulis hasil ke ./video-article.md dan ringkaskan dalam chat.

Salinan turut menyertakan langkah pemasangan dan peraturan keselamatan.

Apa yang anda dapat

Contoh output daripada satu larian. Bukan penjanaan langsung.

Contoh artikel (petikan)

Apa yang sebenarnya dikatakan ceramah ejen 40 minit

Perenggan pembuka

Demo itu mengagumkan; bahagian berguna ialah pengendalian kegagalan.

Dakwaan yang semua orang petik

> “Ejen itu tidak menjadi lebih bijak. Kami hanya berhenti membiarkannya cuba semula tanpa bajet.” — [12:40]

Apa yang video tidak liputi

Kos setiap tugas berjaya, dan apa berlaku apabila sumber yang diambil salah.

Sumber

  • Video: https://www.youtube.com/watch?v=...
  • Penanda aras berpaut: https://example.com/benchmark

Panggilan sebenar

Untuk pembangun: aliran kerja sama sebagai kod, mengikut urutan pelaksanaan.

Tunjukkan panggilan API sebenar
  1. Ambil transkrip bertimestamp

    Gunakan YouTube Subtitling untuk sarikata bahasa sasaran dan simpan masa mula serta tempoh setiap 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 output

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

    Bahagi mengikut tema, buang kata pengisi dan kekalkan 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 output

    [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 dalam video dan tambah pautan 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 output

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

    Minta rangka dari Model API dahulu, lalu tulis artikel mengikut rangka dengan petikan pendek 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 output

    {
      "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 dalam LiveDoc untuk semakan

    Simpan draf dan petikan dalam LiveDoc lalu serahkan kepada editor untuk pembetulan dan kelulusan.

    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 output

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

Termasuk

  • Transkrip YouTube bertimestamp
  • Halaman yang disebut video sebagai Markdown
  • Rangka dan draf dari Model API
  • LiveDoc dengan draf untuk semakan

Apa yang tidak dilakukan

  • Tidak menyalin transkrip penuh; hanya petikan pendek dan penulisan semula
  • Video perlu sarikata
  • Semak hak dan had petikan sebelum terbit
  • Model membuat rangka dan draf; keputusan akhir pada editor
  • Tidak menerbitkan atau menterjemah automatik

Soalan

Perlu video ada sarikata?

Ya. Aliran bermula dari sarikata; jika tiada, ia berhenti daripada meneka ucapan.

Boleh tukar podcast kepada artikel?

Aliran ini untuk YouTube. Untuk podcast, sediakan transkrip dahulu dan guna peraturan penulisan sama.

Boleh tulis dalam bahasa lain?

Boleh. Nyatakan bahasa sasaran; petikan kekal dalam asal dengan terjemahan jika perlu.

Siapa menulis artikel?

Ejen AI tempat anda tampal prompt menulis draf; Felo menyediakan transkrip, halaman dan ruang semakan.

Boleh terbit semula seluruh transkrip?

Tidak. Aliran membuat artikel baharu dengan petikan pendek dan tidak menyalin transkrip penuh.

Berapa kos satu larian?

Transkrip dan pengekstrakan dibilkan mengikut penggunaan; kadar semasa di halaman harga dan prompt meminta kelulusan sebelum berbelanja.

Aliran kerja berkaitan

Sesuaikan

Resipi sama, disesuaikan dengan cara anda benar-benar menyampaikan.

Petikan bertimestamp sahaja

Jangan tulis artikel; berikan senarai petikan boleh disemak untuk guna semula.

Versi surat berita dahulu

Ringkaskan artikel menjadi versi lebih pendek dan santai untuk surat berita.

Proses satu saluran secara kelompok

Ulang langkah setiap video dan simpan LiveDoc berasingan.

Halaman rujukan di sebalik resipi ini dan langkah seterusnya.