hanshs474 / saymaker
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
Requires
- php: >=8.1
- ext-curl: *
- ext-json: *
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
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 deletedquota— the account is out of creditsplan— that model needs a paid plan or a credit packbusy— another run on this account is still rendering; free accounts run one at a timerejected— 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.