Felo API PlatformFelo API Platform

תוכן

צרו סרטון motion graphics עם HTML ו-Opus 5.5

כתבו beat sheet, בקשו מ-Opus 5.5 לכתוב סצנת HTML דטרמיניסטית דרך Felo API, תפסו פריימים עם Playwright וקודדו MP4 עם ffmpeg. עובד ב-WorkBuddy, ChatGPT עם הרצת קוד, Codex, Pi Agent או Claude Code.

זמן45 דקותרמהבינוניעודכן2026-10-30
למייוצריםמעצבי motionמפתחים עצמאיים

העתיקו את הפרומפט

החליפו את השדות בסוגריים מרובעים והדביקו ב-Claude Code, Codex או AI עם גישה לטרמינל. הוא מתקין את סקיל Felo, שואל לפני שריפת קרדיטים ומריץ את תהליך העבודה.

צור סרטון באורך [משך] שניות, בפורמט [אנכי / אופקי], על [רעיון].
סגנון: [סגנון]. קהל: [קהל]. אודיו: [ללא / רצועה ברישיון ב-./audio.mp3 / TTS].

אתה פועל בתיקייה עם מסוף ו[WorkBuddy / ChatGPT עם הרצת קוד / Codex / Pi Agent / Claude Code]. אם אינך יכול להריץ Node ודפדפן headless, עצור ואמור לי, אל תעמיד פנים שרינדרת.

פעל בסדר הזה:
1. כתוב סטוריבורד של 3–6 ביטים עם שניות התחלה וסיום מדויקות.
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, 25%, 50%, 75% ובפריימ האחרון. בדוק גלישה, חיתוך, גופנים ואזורים בטוחים לפני רינדור מלא.
5. רנדר כל פריימ עם Playwright, קודד ל-H.264 עם ffmpeg ומזג את רצועת האודיו אם קיימת.
6. הצג את הפריימ הראשון, האחרון ונתיב הקובץ הסופי. אל תפרסם.

כללים:
- לפני שימוש בקרדיטים, הצג את קריאות Felo API ואת אומדן הטוקנים.
- השתמש רק בטקסט שאני נותן, או סמן בבירור טקסט placeholder מומצא.
- אל תשתמש בחומר, מוזיקה, לוגו או גופן המוגנים בזכויות יוצרים. רק גופני מערכת וצורות שנוצרו.
- השאר את הסרטון הסופי מתחת ל-30 שניות, אלא אם ביקשתי במפורש גרסה ארוכה.
- כתוב הכל ל-./video/ וסכם את הפקודות שהופעלו.

ההעתקה כוללת גם שלבי התקנה וכללי בטיחות.

מה מקבלים

פלט לדוגמה של ריצה אחת. לא יצירה חיה.

דוגמת דוח רינדור (קטע)

דוח רינדור

סצנה: video/scene.html (18 KB) משך: 12 שניות · 1080x1920 · 30fps · 360 פריימים בדיקות: 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, 360 פריימים) אודיו: video/final.mp4 (AAC, 12.0 שניות)

הקריאות המדויקות

למפתחים: אותו תהליך עבודה כקוד, לפי סדר ההרצה.

הצג קריאות API אמיתיות
  1. כתבו קודם beat sheet

    קבעו משך ו-3–6 ביטים, כל אחד עם התחלה, סוף, טקסט על המסך ושינוי חזותי מרכזי.

  2. צרו סצנת HTML עם Opus 5.5

    כוונו את Anthropic SDK ל-base URL של Felo, השתמשו ב-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
  3. בדקו דטרמיניזם ותצוגה מקדימה

    צלמו ב-t=0, 25%, 50%, 75% ובפריים האחרון, ובדקו גלישת טקסט, פונטים ואזורים בטוחים.

    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
  4. רנדרו את כל הפריימים וקודדו

    קראו ל-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
  5. עשו 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
  6. עשו איטרציה עם אותו מודל

    תארו רק את הפריים השגוי ואת השינוי הרצוי, העבירו את ה-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 אחד כדי שקריאת המודל ולולאת הרנדור יהיו ניתנות לבדיקה.

כמה עולה וידאו של 12 שניות?

תלוי בפרומפט, בטוקני פלט ובאיטרציות. מודל Felo מחייב לפי טוקן; בדקו מחירים לפני רנדור ארוך.

אפשר להשתמש במוזיקה ובקריינות שלי?

כן אם יש לכם זכויות. רנדרו קודם את הווידאו ואז עשו mux לרצועה ברישיון או ל-TTS שלכם עם ffmpeg. התהליך לא יוצר קריינות.

מקורות

מדריכים ופרויקטים שהמתכון הזה נשען עליהם.

תהליכי עבודה קשורים

התאימו

אותו מתכון, מותאם לאיך שאתם באמת מספקים.

פרויקט HyperFrames או Remotion

לקומפוזיציות ארוכות השתמשו בפריימוורקים האלה; קריאת המודל זהה ורק פקודת הרנדור משתנה.

גרסה מרובעת לרשתות

שמרו על beat sheet, עברו ל-1080x1080 והתאימו טיפוגרפיה ואזורים בטוחים.

שלוש גרסאות מתקציר אחד

צרו שלוש סצנות בצבעים ובקצבים שונים, בדקו תצוגות מקדימות ורנדרו רק את הטובה ביותר.

עמודי העזר שמאחורי המתכון והשלבים הבאים.