Felo API PlatformFelo API Platform

เนื้อหา

เปลี่ยนวิดีโอ YouTube เป็นบทความที่เผยแพร่ได้

ดึงทรานสคริปต์พร้อมเวลาแสตมป์ จัดเป็นบล็อกอ่านง่าย ร่างโครงและฉบับด้วยโมเดลที่คุณควบคุม แล้วเก็บผลใน LiveDoc เพื่อตรวจ

เวลา25 นาทีระดับระดับกลางอัปเดต2026-10-29
สำหรับใครทีมเนื้อหาผู้เขียนจดหมายข่าวบรรณาธิการวิดีโอและพอดแคสต์

คัดลอกพรอมป์ต์

แทนช่องในวงเล็บเหลี่ยมแล้ววางใน Claude Code, Codex หรือ AI ที่เข้าถึงเทอร์มินัล ระบบจะติดตั้งสกิล Felo ถามก่อนใช้เครดิต และรันเวิร์กโฟลว์

เปลี่ยนวิดีโอนี้เป็นบทความที่เผยแพร่ได้: [URL YouTube หรือ ID วิดีโอ]

ผู้อ่าน: [ผู้อ่าน] โทน: [สไตล์สิ่งพิมพ์] ความยาวเป้าหมาย: [800–1200 คำ] เป็นภาษา[ภาษา]
การจัดการแหล่ง: เก็บชื่อวิดีโอ ช่อง และ URL อ้างได้สูงสุดเฉพาะข้อความสั้นๆ พร้อมเวลา

สร้าง:
1. ชื่อเรื่องชั่วคราว
2. คำนำ
3. หัวข้อพร้อมย่อหน้าสั้น
4. คำพูดสองหรือสามคำพูดพร้อมเวลา
5. สิ่งที่วิดีโอไม่ได้ครอบคลุม
6. รายการแหล่งอ้างอิงพร้อมวิดีโอและหน้าที่ลิงก์

กฎ:
- ห้ามทำสำเนาบทถอดเสียงทั้งหมด สรุปและอ้างสั้นๆ
- ทุกข้อกล่าวอ้างจากวิดีโอต้องมีเวลา ข้อกล่าวอ้างจากหน้าที่ลิงก์ต้องมี URL
- ติดป้าย “ยังไม่ตรวจสอบ” สำหรับสิ่งที่ตรวจไม่ได้
- ถามก่อนใช้เครดิตในการดึงบทถอดเสียงหรือเนื้อหาเว็บ
- ห้ามเผยแพร่ ตั้งเวลา หรือส่งสิ่งใด
- เขียนผลลัพธ์ลง ./video-article.md และสรุปในแชท

สำเนายังรวมขั้นตอนติดตั้งและกฎความปลอดภัย

สิ่งที่คุณได้รับ

ตัวอย่างผลลัพธ์จากการรันหนึ่งครั้ง ไม่ใช่การสร้างสด

ตัวอย่างบทความ (ตัดตอน)

ทอล์กเอเจนต์ 40 นาทีพูดจริงว่าอะไร

คำนำ

เดโมสร้างความประทับใจ แต่ส่วนที่มีประโยชน์คือการจัดการความล้มเหลว

ข้อกล่าวอ้างที่ทุกคนอ้าง

> “เอเจนต์ไม่ได้ฉลาดขึ้น เราแค่เลิกให้มันลองใหม่โดยไม่มีงบ” — [12:40]

สิ่งที่วิดีโอไม่ได้ครอบคลุม

ต้นทุนต่องานที่สำเร็จ และเกิดอะไรเมื่อแหล่งที่ค้นคืนมาผิด

แหล่งข้อมูล

  • วิดีโอ: https://www.youtube.com/watch?v=...
  • เบนช์มาร์กที่ลิงก์: https://example.com/benchmark

การเรียกที่แน่นอน

สำหรับนักพัฒนา: เวิร์กโฟลว์เดียวกันในรูปโค้ดตามลำดับการทำงาน

แสดงการเรียก API จริง
  1. ดึงทรานสคริปต์พร้อมเวลาแสตมป์

    ใช้ YouTube Subtitling สำหรับคำบรรยายภาษาปลายทางและเก็บเวลาเริ่มกับระยะเวลาของแต่ละบรรทัด

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

    ตัวอย่างผลลัพธ์

    {
      "title": "How we rebuilt onboarding",
      "contents": [
        { "text": "Welcome back to the channel.", "start": 0.32, "duration": 4.1 }
      ]
    }
  2. จัดเป็นบล็อกอ่านง่าย

    แบ่งตามหัวข้อ ลบคำฟุ่มเฟือย และคงเวลาแสตมป์

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

    ตัวอย่างผลลัพธ์

    [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. ดึงแหล่งที่อ้าง

    ด้วย Web Fetch อ่านหน้าที่ระบุในวิดีโอและเพิ่มลิงก์กับข้อเท็จจริง

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

    ตัวอย่างผลลัพธ์

    [
      {
        "url": "https://example.com/reference",
        "content": "# Reference\n\nExtracted page text…"
      }
    ]
  4. ร่างโครงแล้วเขียนฉบับ

    ขอโครงจาก Model API ก่อน แล้วเขียนบทความตามโครงพร้อมคำอ้างสั้นและเวลาแสตมป์

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

    ตัวอย่างผลลัพธ์

    {
      "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. เก็บใน LiveDoc เพื่อตรวจ

    เก็บฉบับและคำอ้างใน LiveDoc แล้วส่งบรรณาธิการแก้และอนุมัติ

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

    ตัวอย่างผลลัพธ์

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

รวมอะไรบ้าง

  • ทรานสคริปต์ YouTube พร้อมเวลาแสตมป์
  • หน้าที่วิดีโออ้างถึงเป็น Markdown
  • โครงและฉบับจาก Model API
  • LiveDoc พร้อมฉบับเพื่อตรวจ

สิ่งที่ไม่ทำ

  • ไม่คัดลอกทรานสคริปต์ทั้งหมด ใช้คำอ้างสั้นและเขียนใหม่
  • วิดีโอต้องมีคำบรรยาย
  • ตรวจสิทธิ์และขอบเขตการอ้างก่อนเผยแพร่
  • โมเดลทำโครงและฉบับ การตัดสินสุดท้ายอยู่ที่บรรณาธิการ
  • ไม่เผยแพร่หรือแปลอัตโนมัติ

คำถาม

วิดีโอต้องมีคำบรรยายไหม?

ต้อง เวิร์กโฟลว์เริ่มจากคำบรรยาย หากไม่มีจะหยุดแทนการเดาสิ่งที่พูด

เปลี่ยนพอดแคสต์เป็นบทความได้ไหม?

เวิร์กโฟลว์นี้สำหรับ YouTube สำหรับพอดแคสต์ให้เตรียมทรานสคริปต์ก่อนและใช้กฎการเขียนเดิม

เขียนภาษาอื่นได้ไหม?

ได้ ระบุภาษาปลายทาง คำอ้างคงภาษาเดิมพร้อมคำแปลเมื่อจำเป็น

ใครเขียนบทความ?

เอเจนต์ AI ที่คุณวางพรอมป์ต์เขียนฉบับ Felo ให้ทรานสคริปต์ หน้า และพื้นที่ตรวจ

เผยแพร่ทรานสคริปต์ทั้งหมดซ้ำได้ไหม?

ไม่ได้ เวิร์กโฟลว์สร้างบทความใหม่พร้อมคำอ้างสั้นและไม่คัดลอกทรานสคริปต์เต็ม

การรันหนึ่งครั้งมีค่าใช้จ่ายเท่าไร?

ทรานสคริปต์และการสกัดหน้าคิดตามการใช้งาน อัตราปัจจุบันที่หน้าค่าบริการ และพรอมป์ต์ขออนุมัติก่อนใช้จ่าย

เวิร์กโฟลว์ที่เกี่ยวข้อง

ปรับให้เป็นของคุณ

สูตรเดิม ปรับตามวิธีที่คุณส่งมอบจริง

เฉพาะคำอ้างที่มีเวลาแสตมป์

ไม่เขียนบทความ ให้รายการคำอ้างที่ตรวจได้เพื่อใช้ซ้ำ

ฉบับจดหมายข่าวก่อน

ย่อบทความให้สั้นและเป็นกันเองขึ้นสำหรับจดหมายข่าว

ประมวลผลช่องเป็นชุด

ทำขั้นตอนซ้ำต่อวิดีโอและเก็บ LiveDoc แยก

หน้าเอกสารอ้างอิงเบื้องหลังสูตรนี้และก้าวต่อไป