Felo API PlatformFelo API Platform

Kandungan

Bina video motion graphics dengan HTML dan Opus 5.5

Tulis beat sheet, minta Opus 5.5 menulis adegan HTML deterministik melalui Felo API, tangkap bingkai dengan Playwright dan encode MP4 dengan ffmpeg. Berjalan di WorkBuddy, ChatGPT dengan pelaksanaan kod, Codex, Pi Agent atau Claude Code.

Masa45 minitTahapPertengahanDikemas kini2026-10-30
Untuk siapaPenciptaMotion designerPembangun bebas

Salin prompt

Ganti medan dalam kurungan siku lalu tampal ke Claude Code, Codex atau AI dengan akses terminal. Ia memasang skill Felo, bertanya sebelum kredit digunakan dan menjalankan aliran kerja.

Buat video [durasi] saat, format [menegak / mendatar], tentang [idea].
Gaya: [gaya]. Audiens: [audiens]. Audio: [tiada / trek berlesen di ./audio.mp3 / TTS].

Anda berjalan dalam folder dengan terminal dan [WorkBuddy / ChatGPT dengan pelaksanaan kod / Codex / Pi Agent / Claude Code]. Jika tidak boleh menjalankan Node dan pelayar headless, berhenti dan beritahu saya, jangan berpura-pura telah render.

Ikut urutan ini:
1. Tulis storyboard 3–6 beat dengan saat mula dan tamat yang tepat.
2. Langkah HTML: panggil Claude Opus 5.5 melalui Felo API. Gunakan ID model claude-opus-5-5 dan FELO_API_KEY saya. Jangan minta saya melanggan Claude atau guna kunci Anthropic lain.
3. Minta Opus hasilkan satu fail HTML serba lengkap: set window.DURATION dan dedahkan async window.seek(t). Tiada aset luar, CDN, Date.now(), requestAnimationFrame(), peralihan CSS atau pemasa. Seed semua nilai rawak supaya t yang sama sentiasa melukis bingkai yang sama.
4. Pratonton pada t = 0, 25%, 50%, 75% dan bingkai terakhir. Semak limpahan, pemotongan, fon dan kawasan selamat sebelum render semua.
5. Render setiap bingkai dengan Playwright, encode H.264 dengan ffmpeg dan mux trek audio jika ada.
6. Tunjukkan bingkai pertama, terakhir dan laluan akhir. Jangan terbitkan.

Peraturan:
- Sebelum menggunakan kredit, tunjukkan panggilan Felo API dan anggaran token.
- Gunakan hanya teks yang saya beri, atau label jelas teks placeholder yang direka.
- Jangan guna bahan, muzik, logo atau fon berhak cipta. Hanya fon sistem dan bentuk yang dijana.
- Pastikan video akhir bawah 30 saat, kecuali saya minta versi panjang.
- Tulis semua ke ./video/ dan ringkaskan arahan yang dijalankan.

Salinan turut menyertakan langkah pemasangan dan peraturan keselamatan.

Apa yang anda dapat

Contoh output daripada satu larian. Bukan penjanaan langsung.

Contoh laporan render (petikan)

Laporan render

Adegan: video/scene.html (18 KB) Tempoh: 12 saat · 1080x1920 · 30fps · 360 bingkai Semakan: window.DURATION = 12 · seek(t) ada · tiada Date.now / rAF / pemasa

Pratonton: preview-0ms.png · preview-3000ms.png · preview-6000ms.png · preview-9000ms.png Pengekodan: video/video.mp4 (H.264, 360 bingkai) Audio: video/final.mp4 (AAC, 12.0 saat)

Panggilan sebenar

Untuk pembangun: aliran kerja sama sebagai kod, mengikut urutan pelaksanaan.

Tunjukkan panggilan API sebenar
  1. Tulis beat sheet dahulu

    Tetapkan tempoh dan 3–6 beat, setiap satu dengan mula, akhir, teks di skrin dan perubahan visual utama.

  2. Bina adegan HTML dengan Opus 5.5

    Halakan Anthropic SDK ke base URL Felo, guna claude-opus-5-5 dan minta HTML sahaja dengan window.DURATION dan 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`);

    Contoh output

    scene.html: 18432 bytes
  3. Semak determinisme dan pratonton

    Tangkap skrinshot pada t=0, 25%, 50%, 75% dan bingkai akhir, semak teks melimpah, fon dan kawasan selamat.

    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`);

    Contoh output

    duration 12s
    video/preview-0ms.png
    video/preview-3000ms.png
    video/preview-6000ms.png
    video/preview-9000ms.png
  4. Render semua bingkai dan encode

    Panggil seek(t) dengan t = frame / fps, tangkap bingkai dan encode H.264 dengan 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`);

    Contoh output

    360 frames -> video/video.mp4
  5. Mux audio dan tonton penuh

    Tambah trek berlesen dengan -c:v copy, semak tempoh dan kelantangan, lalu tonton dari awal hingga akhir.

    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

    Contoh output

    12.000000
  6. Iterasi dengan model sama

    Terangkan hanya bingkai salah dan perubahan diingini, beri HTML semasa kepada Opus dan jalankan semula pratonton sebelum render penuh.

Termasuk

  • Storyboard dan garis masa ditulis dahulu
  • Adegan HTML deterministik dari Opus 5.5
  • Skrip render Playwright dan pengekodan ffmpeg
  • MP4 akhir dengan trek audio pilihan
  • Gelung semakan dan pembetulan setiap bingkai

Apa yang tidak dilakukan

  • Opus 5.5 menghasilkan kod, bukan bingkai; renderer pelayar menangkap bingkai
  • Tiada langganan Claude, tetapi penggunaan model Felo dibilkan mengikut penggunaan
  • Node, Playwright Chromium dan ffmpeg masih diperlukan
  • Tiada aset luar atau CDN; hanya HTML/CSS/SVG/Canvas atau fail setempat
  • Video panjang perlu pembahagian adegan; ini bukan rakaman skrin masa nyata
  • Naratif dan muzik langkah berasingan; aliran hanya mux audio yang diberi

Soalan

Adakah Opus 5.5 terus membuat video?

Tidak. Ia menghasilkan teks dan kod dengan menulis adegan HTML; pelayar dan ffmpeg menukar adegan kepada bingkai dan MP4.

Perlu langganan Claude?

Tidak. Guna kunci Felo untuk memanggil `claude-opus-5-5` melalui Felo API dengan bil penggunaan; tiada langganan Claude berasingan.

Berjalan di ejen mana?

WorkBuddy, ChatGPT dengan pelaksanaan kod, Codex, Pi Agent, Claude Code atau ejen yang boleh menjalankan Node dan pelayar headless.

Kenapa seek(t)?

Penangkapan bingkai bukan masa nyata: bingkai 400 mungkin ditangkap jauh selepas 399, jadi setiap bingkai mesti fungsi tulen t.

Boleh guna HyperFrames atau Remotion?

Boleh untuk komposisi panjang atau projek berstruktur. Resipi ini menyimpan satu HTML supaya panggilan model dan gelung render mudah diperiksa.

Berapa kos video 12 saat?

Bergantung pada prompt, token output dan iterasi. Model Felo mengebil per token; semak harga sebelum render panjang.

Boleh guna muzik dan naratif sendiri?

Boleh jika ada hak. Render video dahulu, kemudian mux trek berlesen atau TTS dengan ffmpeg. Aliran tidak menghasilkan naratif.

Rujukan

Tutorial dan projek yang menjadi asas aliran kerja ini.

Aliran kerja berkaitan

Sesuaikan

Resipi sama, disesuaikan dengan cara anda benar-benar menyampaikan.

Projek HyperFrames atau Remotion

Untuk komposisi panjang guna rangka kerja ini; panggilan model sama, hanya arahan render berubah.

Versi persegi untuk sosial

Kekalkan beat sheet, tukar ke 1080x1080 dan laraskan tipografi serta kawasan selamat.

Tiga varian dari satu brief

Jana tiga adegan dengan warna dan rentak berbeza, semak pratonton dan render yang terbaik sahaja.

Halaman rujukan di sebalik resipi ini dan langkah seterusnya.