Felo API PlatformFelo API Platform

สำนักงาน

เปลี่ยนหน้างานวิจัยเป็นงานนำเสนอ

สกัดหน้า เก็บเป็นบริบท LiveDoc ให้ PPT Task API สร้างเด็ค และถามจนได้ลิงก์ที่เสร็จ

เวลา15 นาทีระดับพื้นฐานอัปเดต2026-10-29
สำหรับใครที่ปรึกษาการขายและการตลาดเครื่องมือภายใน

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

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

เปลี่ยนแหล่งนี้เป็นสไลด์: [URL สาธารณะหรือพาธ PDF]

ผู้อ่าน: [ใครดู] จำนวนสไลด์: [6–10] ภาษา: [ภาษา] ธีม: [ชื่อธีมหรือ “default”]

ใช้ Web Fetch กับหน้าสาธารณะ (หรือไฟล์ที่อัปโหลด) เก็บแหล่งเป็นบริบท LiveDoc สร้างงาน PPT และสอบถามจนสไลด์เสร็จ

สร้าง:
1. โครงหนึ่งบรรทัดต่อสไลด์
2. ลิงก์สไลด์ที่สร้าง
3. ลิงก์ LiveDoc ที่ใช้เป็นบริบท

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

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

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

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

ตัวอย่างโครงสไลด์ (ตัดตอน)

แหล่ง -> โครงสไลด์

  1. ทำไมรายงานนี้สำคัญ
  2. ไตรมาสนี้เปลี่ยนอะไร
  3. สามกลุ่มลูกค้า
  4. จุดที่หลักฐานบาง
  5. สิ่งที่ต้องทดสอบต่อไป

สไลด์: https://felo.ai/slides/... บริบท: https://felo.ai/livedoc/...

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

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

แสดงการเรียก API จริง
  1. สกัดหน้าต้นทาง

    ด้วย Web Fetch เปลี่ยนหน้าสาธารณะเป็น Markdown โดยเก็บหัวเรื่องและเนื้อหา

    deck.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 ExtractData = { data: { content: string } };
    
    const page = await felo<ExtractData>("/v2/web/extract", {
      url: "https://example.com/research",
      output_format: "markdown",
      with_readability: true,
    });
  2. เก็บเป็นบริบท LiveDoc

    สร้าง LiveDoc เพิ่มต้นทางเป็นเอกสาร และรับ short_id

    deck.ts
    type LiveDocData = { data: { short_id: string } };
    type ResourceData = { data: { id: string } };
    
    const doc = await felo<LiveDocData>("/v2/livedocs", {
      name: "Quarterly research deck",
      description: "Source material for the next deck",
    });
    
    const resource = await felo<ResourceData>(
      `/v2/livedocs/${doc.data.short_id}/resources/doc`,
      {
        title: "Source page",
        content: page.data.content,
      },
    );
  3. ส่งงานสไลด์

    เรียก PPT Task API พร้อมเนื้อหาและ LiveDoc short_id เพื่อรับ task_id

    deck.ts
    type PptTaskData = {
      data: { task_id: string; livedoc_short_id: string };
    };
    
    const task = await felo<PptTaskData>("/v2/ppts", {
      query: "Six slides for a product review: findings, evidence, next steps",
      livedoc_short_id: doc.data.short_id,
    });
    
    console.log(task.data.task_id);

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

    {
      "data": {
        "livedoc_short_id": "PvyKouzJirXjFdst4uKRK3",
        "ppt_business_id": "BfLPuQKmChk9SPmyQawxgr",
        "task_id": "019cad6d-e874-55ef-d577-686344b5a7e9"
      }
    }
  4. ถามจนเสร็จ

    ตรวจสถานะจนเสร็จและอ่านลิงก์สไลด์

    deck.ts
    type TaskState = {
      data: { task_status: string; ppt_url?: string; live_doc_url?: string };
    };
    
    async function waitForDeck(taskId: string) {
      for (let attempt = 0; attempt < 40; attempt++) {
        const state = await felo<TaskState>(`/v2/tasks/${taskId}/historical`);
        if (state.data.task_status === "COMPLETED") return state.data;
        if (["FAILED", "EXPIRED", "CANCELED"].includes(state.data.task_status)) {
          throw new Error(`Deck task ${state.data.task_status}`);
        }
        await new Promise((resolve) => setTimeout(resolve, 3000));
      }
      throw new Error("Deck task timed out");
    }
    
    const result = await waitForDeck(task.data.task_id);
    console.log(result.ppt_url);

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

    {
      "task_status": "COMPLETED",
      "ppt_url": "https://felo.ai/slides/oM8A9iJHg8dT4ZKgHThQTx",
      "live_doc_url": "https://felo.ai/livedoc/oM8A9iJHg8dT4ZKgHThQTx"
    }

รวมอะไรบ้าง

  • สกัดหน้าต้นทางเป็น Markdown สะอาด
  • LiveDoc เป็นบริบทใช้ซ้ำ
  • งาน PPT อะซิงโครนัสและลิงก์ที่เสร็จ
  • โครงสไลด์เพื่อตรวจก่อนแชร์

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

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

คำถาม

ใช้ PDF แทน URL ได้ไหม?

ได้ ส่งงาน PPT เป็น multipart form data พร้อมไฟล์ แพลตฟอร์มเก็บเป็นรีซอร์ส LiveDoc และสร้างเด็ค

เลือกธีมได้ไหม?

ได้ ระบุธีมแล้วส่ง id ธีมตอนสร้างงาน

เด็คหนึ่งใช้เวลานานเท่าไร?

เป็นงานอะซิงโครนัส ถามประวัติจนเสร็จ เด็คยาวใช้เวลามากกว่า

แก้เด็คที่มีอยู่ไหม?

ไม่ สร้างเด็คใหม่จากต้นทาง การแก้เด็คที่มีอยู่เป็นเวิร์กโฟลว์อื่น

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

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

ใช้ต้นทางซ้ำได้ไหม?

ได้ LiveDoc เก็บต้นทาง เด็คหรือ mindmap ถัดไปใช้ short_id ได้

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

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

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

ต้นทาง PDF

อัปโหลด PDF ผ่าน multipart แพลตฟอร์มเก็บเป็นรีซอร์ส LiveDoc ก่อน

กำหนดธีม

ระบุธีมที่ใช้ได้และส่ง id ตอนสร้างงาน

ใช้ซ้ำในเด็คถัดไป

สร้างงาน PPT ใหม่ด้วย LiveDoc short_id เดิม

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