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. Використай ID моделі 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 й оцінку токенів.
- Використовуй лише текст, який я дав, або чітко познач вигаданий текст-заглушку.
- Не використовуй захищені авторським правом матеріали, музику, логотипи чи шрифти. Лише системні шрифти й згенеровані форми.
- Тримай фінальне відео коротше 30 секунд, якщо я явно не попросив довше.
- Запиши все в ./video/ і підсумуй виконані команди.

Копія також містить кроки встановлення й правила безпеки.

Що ви отримаєте

Приклад результату одного запуску. Не живе генерування.

Приклад звіту рендеру (фрагмент)

Звіт рендеру

Сцена: video/scene.html (18 КБ) Тривалість: 12 с · 1080x1920 · 30 fps · 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. Змікшуйте аудіо й подивіться повністю

    Додайте ліцензійну доріжку через -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 і запустіть превʼю перед повним рендером.

Що входить

  • Спочатку написаний storyboard і таймлайн
  • Детермінована HTML-сцена від Opus 5.5
  • Скрипт рендеру Playwright і кодування ffmpeg
  • Фінальний MP4 з опційною аудіодоріжкою
  • Цикл перегляду й правок кадр за кадром

Чого не робить

  • Opus 5.5 дає код, не кадри; рендерер браузера захоплює кадри
  • Без підписки Claude, але використання моделі Felo оплачується за використання
  • Node, Playwright Chromium і ffmpeg усе ще потрібні
  • Без зовнішніх ассетів і CDN; лише HTML/CSS/SVG/Canvas або локальні файли
  • Довгі відео потребують поділу сцен; це не запис екрана в реальному часі
  • Нарація й музика — окремі кроки; процес лише мікшує надане аудіо

Запитання

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 тарифікує за токен; перевірте ціни перед довгим рендером.

Чи можна використати власну музику й нарацію?

Так, якщо маєте права. Спершу відрендерте відео, потім змікшуйте ліцензійну доріжку або свій TTS через ffmpeg. Процес не генерує нарацію.

Довідка

Посібники й проєкти, на яких ґрунтується цей процес.

Пов’язані процеси

Адаптуйте

Той самий рецепт, підлаштований під те, як ви насправді працюєте.

Проєкт HyperFrames або Remotion

Для довгих композицій використайте ці фреймворки; виклик моделі той самий, змінюється лише команда рендеру.

Квадратна версія для соцмереж

Збережіть beat sheet, перейдіть на 1080x1080 і налаштуйте типографіку та безпечні зони.

Три варіанти з одного брифу

Згенеруйте три сцени з різними кольорами й ритмами, перегляньте превʼю й рендерте лише найкращу.

Довідкові сторінки за цим рецептом і наступні кроки.