محتوا
ویدیوی motion graphics با HTML و Opus 5.5 بسازید
یک beat sheet بنویسید، از Opus 5.5 بخواهید صحنه HTML قطعی را از طریق Felo API بنویسد، فریمها را با Playwright بگیرید و MP4 را با ffmpeg کدگذاری کنید. در WorkBuddy، ChatGPT با اجرای کد، Codex، Pi Agent یا Claude Code کار میکند.
کپی پرامپت
فیلدهای داخل قلاب را جایگزین کنید و در Claude Code، Codex یا هوش مصنوعی با دسترسی ترمینال بچسبانید. مهارت Felo را نصب میکند، پیش از خرج اعتبار میپرسد و گردشکار را اجرا میکند.
ویدیویی [مدت] ثانیهای، قالب [عمودی / افقی]، درباره [ایده] بسازید. سبک: [سبک]. مخاطب: [مخاطب]. صدا: [بدون صدا / آهنگ دارای مجوز در ./audio.mp3 / TTS]. شما در پوشهای با ترمینال و [WorkBuddy / ChatGPT با اجرای کد / Codex / Pi Agent / Claude Code] کار میکنید. اگر نمیتوانید Node و مرورگر headless را اجرا کنید، متوقف شوید و به من بگویید، وانمود نکنید که رندر کردهاید. به این ترتیب پیش بروید: 1. یک استوریبورد ۳ تا ۶ بیتی با ثانیه شروع و پایان دقیق بنویسید. 2. مرحله HTML: Claude Opus 5.5 را از طریق Felo API صدا بزنید. از شناسه مدل claude-opus-5-5 و FELO_API_KEY من استفاده کنید. از من اشتراک Claude یا کلید Anthropic دیگر نخواهید. 3. از Opus یک فایل HTML خودکفا بخواهید: window.DURATION را تنظیم کند و async window.seek(t) را ارائه دهد. بدون دارایی خارجی، CDN، Date.now()، requestAnimationFrame()، انتقال CSS یا تایمر. همه مقادیر تصادفی را seed کنید تا همان t همیشه همان فریم را رسم کند. 4. در t = 0، ۲۵٪، ۵۰٪، ۷۵٪ و فریم آخر پیشنمایش بگیرید. پیش از رندر کامل، سرریز، برش، فونت و نواحی امن را بررسی کنید. 5. هر فریم را با Playwright رندر کنید، با ffmpeg به H.264 کدگذاری کنید و اگر مسیر صوتی دارد آن را mux کنید. 6. فریم اول، فریم آخر و مسیر فایل نهایی را نشان دهید. منتشر نکنید. قواعد: - پیش از مصرف اعتبار، فراخوانیهای Felo API و برآورد توکن را نشان دهید. - فقط از متن من استفاده کنید، یا متن جایگزین ساختگی را واضح علامت بزنید. - از مواد، موسیقی، لوگو یا فونت دارای حق نشر استفاده نکنید. فقط فونت سیستم و شکلهای تولیدشده. - مگر اینکه صریحاً نسخه بلند بخواهم، ویدیوی نهایی زیر ۳۰ ثانیه باشد. - همه چیز را در ./video/ بنویسید و دستورهای اجراشده را خلاصه کنید.
نسخه شامل مراحل نصب و قواعد ایمنی نیز هست.
چه دریافت میکنید
خروجی نمونه یک اجرا. نه تولید زنده.
گزارش رندر
صحنه: video/scene.html (18 KB) مدت: ۱۲ ثانیه · 1080x1920 · 30fps · ۳۶۰ فریم بررسی: window.DURATION = 12 · seek(t) موجود · بدون Date.now / rAF / تایمر
پیشنمایش: preview-0ms.png · preview-3000ms.png · preview-6000ms.png · preview-9000ms.png کدگذاری: video/video.mp4 (H.264، ۳۶۰ فریم) صدا: video/final.mp4 (AAC، ۱۲.۰ ثانیه)
فراخوانیهای دقیق
برای توسعهدهندگان: همان گردشکار بهصورت کد، به ترتیب اجرا.
نمایش فراخوانیهای واقعی API
اول beat sheet بنویسید
مدت و ۳ تا ۶ بیت را تعیین کنید، هر بیت با شروع، پایان، متن روی صفحه و تغییر بصری اصلی.
صحنه HTML را با Opus 5.5 بسازید
Anthropic SDK را به base URL فلو هدایت کنید،
claude-opus-5-5را به کار ببرید و فقط HTML باwindow.DURATIONوasync seek(t)بخواهید.generate-scene.ts import { mkdir, writeFile } from "node:fs/promises"; import Anthropic from "@anthropic-ai/sdk"; const SYSTEM = `You write a single, self-contained HTML video scene. Requirements: - 1080x1920 (or 1920x1080), no external assets, system fonts only. - set window.DURATION = <seconds>. - expose async window.seek(t) that draws the frame for time t. - no Date.now(), no requestAnimationFrame(), no CSS transitions, no timers. - seed every random value; the same t must always produce the same frame. - return only the HTML file, no markdown fences.`; const brief = `12-second vertical motion graphic about [idea]. Beats: [0-3s hook], [3-7s point], [7-10s proof], [10-12s CTA]. Palette: [colors]. Type: system sans. Keep text inside a 64px safe area.`; const anthropic = new Anthropic({ apiKey: process.env.FELO_API_KEY, baseURL: "https://openapi.felo.ai/api", }); const message = await anthropic.messages.create({ model: "claude-opus-5-5", max_tokens: 32000, system: SYSTEM, messages: [{ role: "user", content: brief }], }); const raw = message.content .filter((block) => block.type === "text") .map((block) => block.text) .join(""); const html = raw.replace(/^```(?:html)?\s*/i, "").replace(/```\s*$/, "").trim(); await mkdir("video", { recursive: true }); await writeFile("video/scene.html", html); console.log(`scene.html: ${html.length} bytes`);خروجی نمونه
scene.html: 18432 bytes
قطعیت و پیشنمایش را بررسی کنید
در t=0، ۲۵٪، ۵۰٪، ۷۵٪ و فریم آخر اسکرینشات بگیرید و سرریز متن، فونت و نواحی امن را بررسی کنید.
preview.ts import { chromium } from "playwright"; import { pathToFileURL } from "node:url"; const browser = await chromium.launch(); const page = await browser.newPage({ viewport: { width: 1080, height: 1920 }, deviceScaleFactor: 1, }); await page.goto(pathToFileURL("video/scene.html").href); await page.waitForFunction(() => typeof (window as any).seek === "function"); const duration = await page.evaluate(() => (window as any).DURATION as number); for (const t of [0, duration * 0.25, duration * 0.5, duration * 0.75]) { await page.evaluate(async (time) => { await (window as any).seek(time); }, t); await page.screenshot({ path: `video/preview-${Math.round(t * 1000)}ms.png` }); } await browser.close(); console.log(`duration ${duration}s`);خروجی نمونه
duration 12s video/preview-0ms.png video/preview-3000ms.png video/preview-6000ms.png video/preview-9000ms.png
همه فریمها را رندر و کدگذاری کنید
seek(t)را باt = frame / fpsصدا بزنید، فریمها را بگیرید و H.264 را با ffmpeg کدگذاری کنید.render.ts import { spawn } from "node:child_process"; import { mkdir, rm } from "node:fs/promises"; import { pathToFileURL } from "node:url"; import { chromium } from "playwright"; const FPS = 30; const browser = await chromium.launch(); const page = await browser.newPage({ viewport: { width: 1080, height: 1920 }, deviceScaleFactor: 1, }); await page.goto(pathToFileURL("video/scene.html").href); await page.waitForFunction(() => typeof (window as any).seek === "function"); const duration = await page.evaluate(() => (window as any).DURATION as number); const frames = Math.ceil(duration * FPS); await rm("video/frames", { recursive: true, force: true }); await mkdir("video/frames", { recursive: true }); for (let frame = 0; frame < frames; frame++) { await page.evaluate(async (time) => { await (window as any).seek(time); }, frame / FPS); await page.screenshot({ path: `video/frames/${String(frame).padStart(5, "0")}.png`, }); } await browser.close(); const ffmpeg = spawn("ffmpeg", [ "-y", "-framerate", String(FPS), "-i", "video/frames/%05d.png", "-c:v", "libx264", "-pix_fmt", "yuv420p", "-movflags", "+faststart", "video/video.mp4", ], { stdio: "inherit" }); await new Promise<void>((resolve, reject) => { ffmpeg.on("exit", (code) => { if (code === 0) resolve(); else reject(new Error(`ffmpeg exited with ${code}`)); }); }); console.log(`${frames} frames -> video/video.mp4`);خروجی نمونه
360 frames -> video/video.mp4
صدا را mux و کامل تماشا کنید
مسیر دارای مجوز را با
-c:v copyاضافه کنید، مدت و صدا را بررسی کنید و از ابتدا تا انتها ببینید.mux.sh ffmpeg -i video/video.mp4 -i video/audio.wav \ -c:v copy -c:a aac -b:a 192k -shortest \ video/final.mp4 ffprobe -v error -show_entries format=duration \ -of default=nw=1:nk=1 video/final.mp4خروجی نمونه
12.000000
با همان مدل تکرار کنید
فقط فریم اشتباه و تغییر دلخواه را توضیح دهید، HTML فعلی را به Opus بدهید و پیش از رندر کامل پیشنمایش را دوباره اجرا کنید.
چه چیزی دارد
- استوریبورد و تایملاین نوشتهشده در ابتدا
- صحنه HTML قطعی از Opus 5.5
- اسکریپت رندر Playwright و کدگذاری ffmpeg
- MP4 نهایی با مسیر صوتی اختیاری
- حلقه بررسی و اصلاح فریمبهفریم
چه کاری نمیکند
- Opus 5.5 کد میدهد نه فریم ویدیو؛ رندرر مرورگر فریمها را میگیرد
- بدون اشتراک Claude اما استفاده مدل Felo بر اساس مصرف محاسبه میشود
- Node، Playwright Chromium و ffmpeg هنوز لازماند
- بدون دارایی خارجی یا CDN؛ فقط HTML/CSS/SVG/Canvas یا فایل محلی
- ویدیوی بلند نیاز به تقسیم صحنه دارد؛ این ضبط صفحه بیدرنگ نیست
- روایت و موسیقی گامهای جداست؛ گردشکار فقط صدای دادهشده را mux میکند
پرسشها
آیا Opus 5.5 مستقیم ویدیو میسازد؟
نه. متن و کد میسازد و صحنه HTML را مینویسد؛ مرورگر و ffmpeg آن را به فریم و MP4 تبدیل میکنند.
اشتراک Claude لازم است؟
نه. با کلید Felo `claude-opus-5-5` را از Felo API صدا بزنید، بر اساس مصرف؛ اشتراک جداگانه Claude لازم نیست.
در کدام عاملها کار میکند؟
WorkBuddy، ChatGPT با اجرای کد، Codex، Pi Agent، Claude Code یا هر عاملی که Node و مرورگر headless اجرا کند.
چرا seek(t)?
گرفتن فریم بیدرنگ نیست: فریم 400 ممکن است خیلی بعد از 399 گرفته شود، پس هر فریم باید تابع خالص t باشد.
HyperFrames یا Remotion استفاده شود؟
بله برای ترکیبهای بلند و پروژههای ساختاریافته. این دستور یک HTML نگه میدارد تا فراخوانی مدل و حلقه رندر قابل بررسی باشد.
هزینه ویدیوی ۱۲ ثانیه چقدر است؟
به پرامپت، توکن خروجی و تکرارها بستگی دارد. مدل Felo بر اساس توکن محاسبه میکند؛ پیش از رندر بلند قیمت را ببینید.
موسیقی و روایت خودم را استفاده کنم؟
بله اگر حق دارید. اول ویدیو را رندر کنید سپس مسیر دارای مجوز یا TTS خود را با ffmpeg mux کنید. گردشکار روایت نمیسازد.
مراجع
آموزشها و پروژههایی که این گردشکار بر آنها استوار است.
گردشکارهای مرتبط
یک صفحه پژوهش را به ارائه تبدیل کنید
صفحه را استخراج کنید، بهعنوان زمینه LiveDoc ذخیره کنید، بگذارید PPT Task API ارائه را بسازد و بپرسید تا پیوند آماده شود.
باز کردن گردشکارمحتواخلاصه محصول را به صفحه فرود تبدیل کنید
مخاطب را بررسی کنید، خلاصه را در LiveDoc ذخیره کنید، از این زمینه یک وظیفه Landing Page بسازید و بپرسید تا صفحه میزبانیشده آماده شود.
باز کردن گردشکارمحتوایک ماه محتوا را با پرسشهای مخاطبان پر کنید
موضوعات را با Chat نقشه کنید، پرسشهای مخاطبان را در X پیدا کنید، زاویه واقعی از متن ویدیو بگیرید و تقویم چهار هفتهای بسازید که هر ردیف شاهدش را میگوید.
باز کردن گردشکارآن را از خود کنید
همان دستور، متناسب با روش واقعی تحویل شما.
پروژه HyperFrames یا Remotion
برای ترکیبهای بلند از این چارچوبها استفاده کنید؛ فراخوانی مدل همان است و فقط دستور رندر عوض میشود.
نسخه مربعی برای شبکهها
beat sheet را نگه دارید، به 1080x1080 بروید و تایپوگرافی و نواحی امن را تنظیم کنید.
سه نسخه از یک خلاصه
سه صحنه با رنگ و ریتم متفاوت بسازید، پیشنمایشها را ببینید و فقط بهترین را رندر کنید.
ادامه دهید
صفحات مرجع پشت این دستور و گامهای بعدی.