Search by

hanshs474 / saymaker

hanshs474

Generate images and video from PHP on SayMaker: Veo 3.1, Kling 3.0, Seedance 2.0, Nano Banana 2, GPT Image 2.5 and more with one API key

v0.1.0 2026-10-05 12:53 UTC

This package is auto-updated.

Last update: 2026-10-05 13:02:41 UTC


README

Generate images and video on SayMaker from your own code: one API key runs Veo 3.1, Kling 3.0, Seedance 2.0, MiniMax H3, Nano Banana 2, GPT Image 2.5, Seedream 5.0 and the rest of the shelf on your own credits.

$sm = new SayMaker\SayMaker(getenv('SAYMAKER_API_KEY'));

$url  = $sm->generate('a paper-cut layered mountain range at dusk');
$clip = $sm->generateVideo('a paper boat drifting down a rain gutter, low angle');

Each call waits for the run and returns the URL of the finished file. Runs on a free account wait in a queue before they start, and the wait grows with each run of the day; a paid plan starts at once. The default timeouts cover the longest wait.

Install

composer require hanshs474/saymaker

PHP 8.1+, ext-curl and ext-json only. Pass the key to the constructor or set SAYMAKER_API_KEY.

API key

Sign up on saymaker.ai (new accounts get sign-up credits), create a key at saymaker.ai/settings/apikeys, then pass it or export it:

export SAYMAKER_API_KEY=sk-...

A key runs on your account exactly like the site does: same models, same credit prices, same plan, and every run lands in your library at saymaker.ai/history.

Images

$sm->generate('isometric diorama of a ramen shop at night', ['aspect_ratio' => '16:9']);
$sm->generate('product shot of a glass perfume bottle on wet slate', ['model' => 'gpt-image-2-5-flare']);

The default model is saymaker-image-v1, the cheapest text-to-image run. Pass a model id for nano-banana-2, gpt-image-2-5-flare, seedream-5-pro, qwen-image-3-pro and the rest; see the image models.

Editing a photo

Pass an image URL and the prompt describes the change rather than the picture:

$sm->generate(
    'change the jacket to dark green, keep the face, pose and background exactly as they are',
    ['image_url' => 'https://example.com/portrait.jpg'],
);

Naming what must stay is what decides whether the edit holds. Prompts that only name the change tend to drift the whole picture.

Video

$sm->generateVideo('a fox trotting through fresh snow at dawn, tracking shot', ['duration' => 6]);
$sm->generateVideo('the camera slowly orbits the statue', ['image_url' => 'https://example.com/statue.jpg']);
$sm->generateVideo('a street drummer in the rain', ['model' => 'veo-3-1', 'resolution' => '1080p']);

The default model is minimax-h3-fast, the one a free account can run (480p or 768p, 4 to 15 seconds). Veo 3.1, Kling 3.0, Seedance 2.0 and the other video models need a plan or a credit pack; see pricing. Each model's options are on its page: Veo 3.1, Kling 3.0, Seedance 2.0.

Errors worth catching

Every failure is a SayMaker\SayMakerException with a kind:

  • auth — no key, or the key is wrong or deleted
  • quota — the account is out of credits
  • plan — that model needs a paid plan or a credit pack
  • busy — another run on this account is still rendering; free accounts run one at a time
  • rejected — the content filter or the model refused the prompt; rewrite it rather than retrying

The API answers refusals with HTTP 200 and an error code in the body, so a client that only checks the status code reports a refusal as success. This one reads the body.

Free-account output carries a watermark; a paid plan returns the clean file.

MIT licensed. Made by SayMaker, the AI video generator agent.