onebox

Guide 22 of 27

For your agent: .md · all guides

On this page
  1. kie.ai: the default, has an adapter
  2. fal.ai: has an adapter
  3. Replicate: has an adapter
  4. Others: no adapter yet
  5. How pricing is quoted
  6. Where the values go

Media providers (image and video generation)

Runs on: your Mac, where the content:image and content:video skills run.

Used by: content:image (plugins/content/skills/image) and content:video (plugins/content/skills/video).

Both skills call a provider: a paid API that runs the actual model. This page helps you pick one. Read it only if you want a provider other than the default, kie.ai. kie-ai.md covers the account and the key for the default.

Every number below is a snapshot from the date it was checked, not a live quote. Check the provider’s own pricing page when you generate. These prices move. A router resells compute, and its margin changes.

kie.ai: the default, has an adapter

One API key and one wallet in front of 30+ models (Kling, Veo, Seedance, Runway, Hailuo/MiniMax, and more). All of them use one async flow: jobs/createTask, then jobs/recordInfo. Pricing is in credits. kie.ai’s own pages put video tasks at roughly 100-500 credits per clip, and stills at a few cents each (checked 2026-09-28). probe in either skill’s script reports your balance, not a price per call. The model’s own market page on kie.ai has the current rate.

Pick kie.ai when you want one key for both image and video, and you do not need one provider’s exact model. kie.ai re-hosts most popular models, sometimes at a different price than the model’s own provider.

fal.ai: has an adapter

A queue-based REST API: queue.fal.run/<model>, then status, then result. Each model has its own endpoint path. You pick the exact model id (for example fal-ai/kling-video/v2.1/standard/image-to-video), with no router in between. Auth is Authorization: Key <FAL_KEY> (checked against fal’s docs on 2026-09-28). Pricing is quoted per model, often per second of video or per image. For example, fal’s own Kling tiers ranged from about $0.056/s to $0.42/s, depending on version and resolution (checked 2026-09-28).

fal’s raw REST upload endpoint is not publicly documented. Only its SDKs use it. So the adapter here sends small reference images inline, as a base64 data URI. fal’s model docs list that as an accepted form for an image_url field.

Pick fal.ai when you want a specific model that fal hosts directly, or lower latency than a router adds.

Replicate: has an adapter

POST /v1/predictions with { version, input }, where version is owner/model:version_id. Replicate’s generic API needs a model’s specific version id, not only its name (checked against Replicate’s docs on 2026-09-28). Auth is Authorization: Bearer <REPLICATE_API_TOKEN>.

Uploads: a file under 256KB can go inline as a data URI. A larger file goes to Replicate’s /v1/files upload endpoint. You pass the URL it returns as the input field. Pricing is quoted per model, usually per second of compute or as a flat price per run, shown on the model’s own Replicate page.

Pick Replicate when the model you want is hosted only there, or best there. Of the three, it has the widest catalog of community and research models.

Others: no adapter yet

None of these has a scripts/providers.mjs adapter. Each one is still an API with the same shape as the three above: submit a job, poll for status, fetch the result. To add one later, write the same three functions (submit, poll, uploadLocal) against that provider’s docs.

How pricing is quoted

Three shapes show up across these providers. If you mix them up, you can misjudge the cost of a batch:

Whatever the shape, treat any number in this guide, in kie-ai.md or in either skill’s SKILL.md as a ballpark from the date it was checked. Before a batch that matters, run --dry-run (video) or probe (either skill, kie.ai only), and read the provider’s own current pricing page.

Where the values go

Set your choice in ~/.config/onebox/config.json under media, or override it for one call with --provider:

{
  "media": {
    "imageProvider": "kie",
    "videoProvider": "kie",
    "providers": {
      "kie": { "keyRef": "KIE_AI_API_KEY" },
      "fal": { "keyRef": "FAL_KEY" },
      "replicate": { "keyRef": "REPLICATE_API_TOKEN" }
    }
  }
}

Each keyRef is a secret reference, not the key itself. See CONFIG.md.

Wrong or out of date? Fix it on GitHub.