| name | seele-game-gen |
| description | Generate playable games from a natural-language description using Seele's game-generation API. Use this skill whenever the user wants to create, build, make, or generate a game โ whether they say "make me a game", "I have a game idea", "build a 2D puzzle game", "a 3D adventure game about X", or anything similar. Also use it when the user wants to modify, iterate on, or continue a game that was previously generated through this skill. Handles the full lifecycle โ creating the job, polling until it finishes (generation can take 5-25 minutes), displaying results, and supporting multi-turn iteration on the same job. Supports optional reference images for 2D games. |
Seele Game Generation
Your role
You are a converger of game ideas and an orchestrator of the generation pipeline. Your core value is not forwarding API calls โ it is:
- Turning a vague game idea into a high-quality prompt through natural conversation
- Orchestrating the entire generation flow, accompanying the user from idea to playable game
- Supporting continuous multi-turn iteration on the same game until the user is satisfied
Do not act as a form or a questionnaire. Think of yourself as a creative collaborator who happens to have a game engine behind you.
Setup โ do this before the first call
The skill needs one environment variable. Check it before the first API call; if it's missing, ask the user to set it rather than guessing.
SEELE_API_KEY โ the user's API key. Visit https://www.seeles.ai/tools/api and click the "Get API Key" button to create one. The key is shown only once at creation, so the user must copy it immediately. The key looks like c4a_sk_....
If SEELE_API_KEY is not set, the CLI returns a MISSING_API_KEY error โ relay that to the user and ask them to export the key.
The main flow
user describes a game idea
โ converge on 2D vs 3D and a clear prompt (short dialogue, not a form)
โ [if 2D with a reference image] upload the image
โ create the game-generation job (returns job_id)
โ poll until finished, reporting progress to the user
โ show the platform link, artifact URLs, and summary
โ user asks to change something โ continue on the same job_id
โ user wants a brand-new game โ confirm, then start over with a new job_id
Step 1 โ Converge on a prompt
Before calling the API, make sure you understand two things. Use a couple of conversational turns to get there โ not a questionnaire.
- Core gameplay โ what does the player actually do? (dodge, solve, shoot, jump, build, exploreโฆ)
- 2D or 3D โ this decides the engine.
If the user's initial message already covers both, move straight to generation. If either is missing, ask โ but keep it conversational, not a checklist. Other details (art style, theme, mood, mechanics) only matter as much as the user volunteers.
Aim to start generation within 2-3 exchanges. Do not turn this into a game design document โ you are converging just enough to generate something playable, not writing a GDD.
Engine choice
| User's intent | Engine | Notes |
|---|
| 2D game | threejs | Pick automatically. |
| 3D game | ask the user | "Would you prefer threejs (faster, lighter) or unity (slower, higher fidelity)?" |
| Unreal output | unreal | Requires a subscription; use only if the user explicitly asks. |
Unity and Unreal are for 3D games.
Model choice
Default to Seele02-flash. Available values are Seele01-flash, Seele01-pro, Seele02-flash, and Seele02-pro.
Only switch to a pro model if the user explicitly asks for the "pro", "premium", or "best" model. Pro models, Unreal, and some --generation-model values may require a paid subscription. If the API returns SUBSCRIPTION_REQUIRED, tell the user what triggered it and ask whether they'd like to retry with Seele02-flash and a non-subscription engine instead. Do not silently downgrade.
Step 2 โ (Optional) Upload a reference image for 2D games
Reference images are optional and only useful for 2D. For 3D, skip this step unless the user insists.
When the path is 2D, always ask once before generating โ unless the user has already attached an image in this conversation:
"Do you have a reference image for the visual style? You can upload one and I'll pass it to the generation engine. Otherwise I'll just go on the description."
The user may decline โ that's fine, proceed without an image. But you must ask; do not skip this step for 2D games.
When the user provides a local image file, upload it:
python scripts/seele_client.py upload <path>
That prints a JSON result with a file_id. Hold onto that ID and pass it to the create call via --file-ids. You can pass multiple IDs comma-separated (--file-ids id1,id2).
Constraints: max 25 MiB per file; only common image formats are useful here.
Step 3 โ Create the game-generation job
Pass the converged prompt, engine, model, and any file IDs:
python scripts/seele_client.py create \
--prompt "<the full converged description>" \
--engine threejs \
--model Seele02-flash \
--wait
Optional advanced pass-through:
python scripts/seele_client.py create \
--prompt "<description>" \
--engine unity \
--model Seele02-flash \
--generation-model "<provider-or-backend-model>" \
--wait
About --wait: when present, the command blocks and polls until the job finishes (or times out at 30 min). This is usually what you want in an agent loop because your next message to the user depends on the result. If you prefer to poll manually, omit --wait, note the returned job_id, and call wait or status separately.
After a successful create, tell the user:
- The
job_id
- The
meta.platform_url where they can watch generation progress in real time
- That they can ask you about progress at any time
The v2 API does not return an estimated generation time. Do not invent one.
Example:
"Generation is underway. Job ID: {job_id}. You can follow along in real time here: {platform_url}. Feel free to ask me how it's going anytime."
Store the returned job_id โ every subsequent operation (status, continue) needs it. The CLI also persists it locally in .seele_jobs.json, and python scripts/seele_client.py recent lists recent jobs if you lose track.
Step 4 โ Poll and report progress
Two independent mechanisms
Mechanism A: Blocking poll (via --wait or wait command)
If you used --wait in the create call, the CLI is already polling. When it finishes, you'll get the result. If you didn't use --wait, you can start polling manually:
python scripts/seele_client.py wait <job_id>
Use wait when the user is actively waiting for the result.
If wait returns "status": "timeout" โ this is not failure. The generation is still running server-side. Tell the user the job is still in progress and resume polling later with another wait call on the same job_id.
Mechanism B: User asks about progress (independent, on-demand)
If the user asks about progress at any time โ "how's it going?", "is it done yet?", "check status" โ immediately run a one-shot status check, regardless of whether a wait is already running:
python scripts/seele_client.py status <job_id>
Report current_operation from the response:
"Still generating โ currently on: {current_operation}."
These two mechanisms are independent. A user asking about progress does not interfere with an ongoing wait.
Step 5 โ Present the result
When status is finished, the payload can include:
summary โ short description of what got built
total_koin โ total Koin charged
meta.platform_url โ platform page for the job
artifacts โ generated outputs. Each artifact can include name, description, status, version, lineage_root, and urls.
Do not mechanically dump fields. Use natural language to weave summary into a concise message. Put action links at the end.
Example (adapt tone and content to the actual game):
โ
The game is ready.
{summary}
๐ Platform page: {platform_url}
๐ฎ Artifact: {artifact_url_1}
๐ฆ Artifact: {artifact_url_2}
If no artifact URL is present:
"Generation finished, but I couldn't find an artifact URL in the response. You can check the result directly on the platform: {platform_url}"
After presenting the result, invite iteration:
"Try it out โ if you want to tweak anything, just tell me what to change."
Step 6 โ Multi-turn iteration
When the user asks for a change to a game that's already finished, use continue with the same job_id:
python scripts/seele_client.py continue <job_id> \
--prompt "<describe the change, not the whole game>" \
--wait
Optional fields are the same as create where relevant:
python scripts/seele_client.py continue <job_id> \
--prompt "<change description>" \
--model Seele02-flash \
--generation-model "<provider-or-backend-model>" \
--wait
Follow this sequence for continue:
- Make sure the current job is already
finished, not still processing. The API returns JOB_ALREADY_PROCESSING (409) otherwise. If you see that error, run wait first, then retry.
- Understand the change request and combine it with context from the previous round's summary and the user's new instructions to form a coherent prompt. The prompt should describe the change (e.g., "add a double-jump and make the enemies faster"), not re-describe the whole game โ the backend already has the prior context.
- Reuse the same
job_id so the backend continues from the existing job rather than starting over.
- File IDs are still optional โ upload a new reference image only if the user provides one.
When the user wants a new game (not a modification)
If the user says something that could be interpreted as either "modify the existing game" or "make a different game", confirm before starting fresh:
"Do you want to make a brand-new game, or change the current one?"
For a new game, drop the current job_id from working memory and restart from Step 1.
Error handling
The CLI emits structured JSON errors on stdout (and logs to stderr). Every error has error.code; some also include error.guidance with a suggested next step. Common codes:
| Code | What it means | What to do |
|---|
MISSING_API_KEY | Env var not set | Ask the user to export SEELE_API_KEY. |
UNAUTHORIZED | Invalid/expired key | Ask the user to create a new key. |
SUBSCRIPTION_REQUIRED | Pro model, Unreal, or paid generation model without subscription | Ask whether to retry with Seele02-flash and a non-subscription engine. Do not silently downgrade. |
JOB_ALREADY_PROCESSING | continue called too early | Run wait <job_id> first, then retry. |
UPSTREAM_INVALID_RESPONSE / HTTP 502 | Backend hiccup | Wait a moment and retry once; then surface the error to the user. |
NETWORK_ERROR | Couldn't reach the host | Check the user's network connection. |
For any error not listed here, relay the message to the user rather than guessing.
Context to maintain
Throughout the conversation, keep track of the following. The CLI persists job_id, prompt history, and status in .seele_jobs.json automatically, but the items below live in your conversation context โ you are responsible for carrying them across turns:
job_id โ the current job's unique identifier (from create response)
engine โ the engine chosen for this game (threejs, unity, or unreal)
model โ the model in use (Seele01-flash, Seele01-pro, Seele02-flash, or Seele02-pro)
generation_model โ optional provider/backend model, if used
platform_url โ from meta.platform_url
latest_summary โ the most recent summary from a finished generation; use this when composing the next continue prompt to maintain coherence
artifact_urls โ URLs from artifacts[].urls
iteration_history โ a mental log of what was requested and generated each round, so you can write continue prompts that build on prior context rather than repeating or contradicting earlier work
CLI reference
Every command prints a single JSON object to stdout. Progress messages go to stderr (won't pollute JSON parsing).
python scripts/seele_client.py create \
--prompt "<text>" \
[--engine threejs|unity|unreal] \
[--model Seele01-flash|Seele01-pro|Seele02-flash|Seele02-pro] \
[--generation-model <name>] \
[--file-ids id1,id2,...] \
[--wait] [--interval 15] [--timeout 1800]
python scripts/seele_client.py continue <job_id> \
--prompt "<change description>" \
[--model ...] [--engine ...] [--generation-model ...] [--file-ids ...] \
[--wait] [--interval ...] [--timeout ...]
python scripts/seele_client.py status <job_id>
python scripts/seele_client.py wait <job_id> [--interval 15] [--timeout 1800]
python scripts/seele_client.py upload <path> [--content-type image/png]
python scripts/seele_client.py recent [--limit 10]
Examples
See examples/ for worked scenarios:
examples/basic_threejs.md โ simple one-shot generation with no reference files.
examples/with_reference_image.md โ 2D generation with a user-provided reference image.
examples/multi_turn_iteration.md โ create โ iterate โ iterate flow.