เนื้อหา
เปลี่ยนวิดีโอ YouTube เป็นบทความที่เผยแพร่ได้
ดึงทรานสคริปต์พร้อมเวลาแสตมป์ จัดเป็นบล็อกอ่านง่าย ร่างโครงและฉบับด้วยโมเดลที่คุณควบคุม แล้วเก็บผลใน LiveDoc เพื่อตรวจ
คัดลอกพรอมป์ต์
แทนช่องในวงเล็บเหลี่ยมแล้ววางใน 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 จริง
ดึงทรานสคริปต์พร้อมเวลาแสตมป์
ใช้ 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 } ] }จัดเป็นบล็อกอ่านง่าย
แบ่งตามหัวข้อ ลบคำฟุ่มเฟือย และคงเวลาแสตมป์
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.
ดึงแหล่งที่อ้าง
ด้วย 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…" } ]ร่างโครงแล้วเขียนฉบับ
ขอโครงจาก 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 } }เก็บใน 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 ให้ทรานสคริปต์ หน้า และพื้นที่ตรวจ
เผยแพร่ทรานสคริปต์ทั้งหมดซ้ำได้ไหม?
ไม่ได้ เวิร์กโฟลว์สร้างบทความใหม่พร้อมคำอ้างสั้นและไม่คัดลอกทรานสคริปต์เต็ม
การรันหนึ่งครั้งมีค่าใช้จ่ายเท่าไร?
ทรานสคริปต์และการสกัดหน้าคิดตามการใช้งาน อัตราปัจจุบันที่หน้าค่าบริการ และพรอมป์ต์ขออนุมัติก่อนใช้จ่าย
เวิร์กโฟลว์ที่เกี่ยวข้อง
เผยแพร่สรุปข่าว AI รายวันที่ทีมอ่านจริง
รับสรุปข่าวพร้อมแหล่ง เพิ่มการพูดคุยของผู้ปฏิบัติบน X ดึงทรานสคริปต์วิดีโอ ประกอบฉบับเป็น Markdown และเก็บใน LiveDoc
เปิดเวิร์กโฟลว์สำนักงานเปลี่ยนหน้างานวิจัยเป็นงานนำเสนอ
สกัดหน้า เก็บเป็นบริบท LiveDoc ให้ PPT Task API สร้างเด็ค และถามจนได้ลิงก์ที่เสร็จ
เปิดเวิร์กโฟลว์สนับสนุนตอบคำถามฝ่ายสนับสนุนจากเอกสารของคุณเอง
สร้าง LiveDoc โหลดศูนย์ช่วยเหลือและ runbook ภายใน ดึงส่วนที่ตอบทิกเก็ต และให้โมเดลตอบจากหลักฐานนั้นเท่านั้น
เปิดเวิร์กโฟลว์ปรับให้เป็นของคุณ
สูตรเดิม ปรับตามวิธีที่คุณส่งมอบจริง
เฉพาะคำอ้างที่มีเวลาแสตมป์
ไม่เขียนบทความ ให้รายการคำอ้างที่ตรวจได้เพื่อใช้ซ้ำ
ฉบับจดหมายข่าวก่อน
ย่อบทความให้สั้นและเป็นกันเองขึ้นสำหรับจดหมายข่าว
ประมวลผลช่องเป็นชุด
ทำขั้นตอนซ้ำต่อวิดีโอและเก็บ LiveDoc แยก
ไปต่อ
หน้าเอกสารอ้างอิงเบื้องหลังสูตรนี้และก้าวต่อไป