Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate Atlas Cloud images and videos through its asynchronous media API with schema-first model selection and credential-safe polling.
.claude/skills/sickn33-atlas-cloud-media/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 3 |
| gemini-3.1-pro-preview | 100% | 1 |
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 66% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 14% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 107% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 86% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 235% | 0% |
Use Atlas Cloud's asynchronous media API to generate images or videos. This source-only skill describes model discovery, schema validation, task submission, bounded polling, and safe output retrieval; it does not bundle an SDK, executable, or hosted runtime.
Cloud.
request and can make HTTPS calls.
different base URL and contract.
to a third-party service.
billable request.
ATLASCLOUD_API_KEY to be present in the environment. Never ask theuser to paste it into chat, source files, command history, or logs.
video generation, or both.
| Operation | Method and endpoint | | --- | --- | | List models | GET https://api.atlascloud.ai/api/v1/models | | Generate image | POST https://api.atlascloud.ai/api/v1/model/generateImage | | Generate video | POST https://api.atlascloud.ai/api/v1/model/generateVideo | | Poll task | GET https://api.atlascloud.ai/api/v1/model/prediction/{id} |
Generation and polling requests use these headers:
textAuthorization: Bearer $ATLASCLOUD_API_KEY Content-Type: application/json
The model catalog is public. Each catalog entry includes a schema URL; fetch that schema and validate parameters against it before sending a paid request. Do not guess parameters from another model, because names such as size, ratio, aspect_ratio, image, and image_url are model-specific.
Run the remaining shell snippets in the same shell session. Create a private directory before writing prompts, responses, prediction IDs, or signed URLs; the parameter expansion in later steps fails closed when this setup was skipped.
bashumask 077 atlas_tmp_dir=$(mktemp -d "${TMPDIR:-/tmp}/atlas-cloud-media.XXXXXXXX") || exit 1 chmod 700 -- "$atlas_tmp_dir" trap 'rm -rf -- "$atlas_tmp_dir"' EXIT
Fetch the catalog, filter by type (Image or Video), and match the user's requested capability. Read the selected entry's schema, verify that all required fields are present, and show the model and billable action to the user before submission.
Example discovery request:
bashcurl --fail --silent --show-error \ "https://api.atlascloud.ai/api/v1/models" \ --output "${atlas_tmp_dir:?run private workspace setup first}/models.json" jq -r '.data[] | select(.type == "Image") | [.model, .displayName, .schema] | @tsv' \ "$atlas_tmp_dir/models.json"
Build the JSON body in a file so that quoting is deterministic and request details can be reviewed without exposing the API key.
Image example using a catalog-confirmed model:
bashjq -n \ --arg model "qwen-image-3.0/text-to-image" \ --arg prompt "A paper-cut city map in blue and white, clean editorial style" \ '{model: $model, prompt: $prompt, size: "1024*1024", n: 1}' \ > "${atlas_tmp_dir:?run private workspace setup first}/request.json" curl --fail --silent --show-error \ --request POST \ "https://api.atlascloud.ai/api/v1/model/generateImage" \ --header "Authorization: Bearer $ATLASCLOUD_API_KEY" \ --header "Content-Type: application/json" \ --data @"$atlas_tmp_dir/request.json" \ --output "$atlas_tmp_dir/submit.json"
Video example using a catalog-confirmed model:
bashjq -n \ --arg model "bytedance/seedance-2.0-fast/text-to-video" \ --arg prompt "A small paper boat crossing a calm pond, locked camera" \ '{ model: $model, prompt: $prompt, duration: 4, resolution: "480p", ratio: "16:9", generate_audio: false, watermark: false }' > "${atlas_tmp_dir:?run private workspace setup first}/request.json" curl --fail --silent --show-error \ --request POST \ "https://api.atlascloud.ai/api/v1/model/generateVideo" \ --header "Authorization: Bearer $ATLASCLOUD_API_KEY" \ --header "Content-Type: application/json" \ --data @"$atlas_tmp_dir/request.json" \ --output "$atlas_tmp_dir/submit.json"
Check that .data.id is a non-empty string before polling. Treat a non-2xx response or a missing ID as submission failure; do not retry a billable request automatically because the original task may still have been accepted.
Poll every three seconds. Accept completed or succeeded as success, stop on failed or timeout, and stop after ten minutes. Preserve the prediction ID for diagnostics, but never log request headers or the API key.
bashprediction_id=$(jq -er '.data.id | select(type == "string" and length > 0)' \ "${atlas_tmp_dir:?run private workspace setup first}/submit.json") for attempt in $(seq 1 200); do sleep 3 curl --fail --silent --show-error \ "https://api.atlascloud.ai/api/v1/model/prediction/$prediction_id" \ --header "Authorization: Bearer $ATLASCLOUD_API_KEY" \ --output "$atlas_tmp_dir/prediction.json" status=$(jq -r '.data.status // "unknown"' "$atlas_tmp_dir/prediction.json") case "$status" in completed|succeeded) break ;; failed|timeout) jq -r '.data.error // "Atlas Cloud generation failed"' \ "$atlas_tmp_dir/prediction.json" >&2 exit 1 ;; esac done test "$status" = "completed" || test "$status" = "succeeded"
Read the first HTTPS URL from .data.outputs. Atlas output URLs are temporary, so download promptly. Do not send Authorization or any other Atlas request headers to the output host. Reject non-HTTPS URLs and inspect the downloaded file's content type and size before treating it as a valid deliverable.
bashoutput_url=$(jq -er '.data.outputs[0] | select(startswith("https://"))' \ "${atlas_tmp_dir:?run private workspace setup first}/prediction.json") curl --fail --silent --show-error --location \ "$output_url" \ --output "$atlas_tmp_dir/output.bin" test -s "$atlas_tmp_dir/output.bin" file "$atlas_tmp_dir/output.bin" # ATLAS_OUTPUT_DIR must be the user-approved destination. Resolve it to a # physical directory, copy into an exclusive same-directory temporary file, # then create the final name with one atomic hard-link operation. `ln` fails if # any target already exists, including a dangling symlink. atlas_output_dir=$(cd -- "${ATLAS_OUTPUT_DIR:?set the approved output directory}" && pwd -P) || exit 1 atlas_output_path="$atlas_output_dir/atlas-output.bin" if ! ( set -eu umask 077 atlas_publish_tmp=$(mktemp "$atlas_output_dir/.atlas-output.XXXXXXXX") trap 'rm -f -- "$atlas_publish_tmp"' EXIT cp -- "$atlas_tmp_dir/output.bin" "$atlas_publish_tmp" chmod 644 -- "$atlas_publish_tmp" ln -- "$atlas_publish_tmp" "$atlas_output_path" ); then printf '%s\n' "Refusing to overwrite or redirect $atlas_output_path" >&2 exit 1 fi
Rename the file only after its detected type is known. Report the local path, model ID, dimensions or duration, and whether the output passed basic playback or decode validation.
401 or 403: stop and ask the user to verify access. Do not print or rotatethe key automatically.
400 or 422: fetch the model's current schema and correct the payload. Donot blindly resubmit.
429: stop and report rate limiting; respect any Retry-After value.5xx or network timeout: first poll a known prediction ID. Do not create asecond paid task unless the user approves the possible duplicate charge.
failed or timeout: report the sanitized service error and prediction ID;do not claim an output was generated.
overwrite an existing destination, and do not mark the task complete.
the exit trap remove them, especially prediction payloads with signed URLs.
cost.
in the approval step.
deadline.
Atlas Cloud client, bundled script, queue worker, or retry service.
catalog is authoritative.
accuracy, rights, or safety.
consent first and avoid unnecessary personal or confidential information.
hosting or unrelated file transfer.
Solution: Fetch the selected catalog entry's current schema and rebuild the request from that schema.
Solution: Preserve and poll the original prediction ID before considering a resubmission.
Solution: Check the HTTP status, content type, file signature, and size before renaming or publishing it.
Solution: Use a fresh download request with no Atlas authorization header.
@video-router - Decide whether a request should use generated video beforesubmitting a billable task.
@image-studio - Plan and review image-production work around generatedassets.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 16,819 | 20,133 | +20% | 1 | 1 | 0% | 400 | 3,669 | +817% | 0 | 0 | — |
case-02 | fail→pass | 22,573 | 24,201 | +7% | 1 | 1 | 0% | 4,257 | 7,070 | +66% | 0 | 0 | — |
case-03 | fail→pass | 32,111 | 21,304 | -34% | 1 | 1 | 0% | 5,388 | 6,138 | +14% | 0 | 0 | — |
case-04 | pass→pass | 9,950 | 13,975 | +40% | 1 | 1 | 0% | 1,005 | 4,671 | +365% | 0 | 0 | — |
case-05 | fail→fail | 19,664 | 18,854 | -4% | 1 | 1 | 0% | 2,783 | 5,441 | +96% | 0 | 0 | — |
case-06 | pass→pass | 22,281 | 20,087 | -10% | 1 | 1 | 0% | 2,820 | 5,342 | +89% | 0 | 0 | — |
case-07 | fail→pass | 15,354 | 10,281 | -33% | 1 | 1 | 0% | 1,864 | 3,852 | +107% | 0 | 0 | — |
case-08 | pass→pass | 16,023 | 10,578 | -34% | 1 | 1 | 0% | 1,992 | 3,897 | +96% | 0 | 0 | — |
case-09 | fail→pass | 15,535 | 10,211 | -34% | 1 | 1 | 0% | 2,078 | 3,858 | +86% | 0 | 0 | — |
case-10 | fail→pass | 11,890 | 9,457 | -20% | 1 | 1 | 0% | 1,109 | 3,713 | +235% | 0 | 0 | — |
case-11 | fail→pass | 16,393 | 6,678 | -59% | 1 | 1 | 0% | 1,990 | 3,177 | +60% | 0 | 0 | — |
case-12 | fail→fail | 17,514 | 7,702 | -56% | 1 | 1 | 0% | 2,123 | 3,363 | +58% | 0 | 0 | — |
case-13 | fail→pass | 17,965 | 11,639 | -35% | 1 | 1 | 0% | 2,322 | 4,083 | +76% | 0 | 0 | — |
case-14 | pass→pass | 33,040 | 7,709 | -77% | 1 | 1 | 0% | 1,956 | 3,265 | +67% | 0 | 0 | — |
case-15 | fail→fail | 14,050 | 8,352 | -41% | 1 | 1 | 0% | 1,518 | 3,454 | +128% | 0 | 0 | — |
case-16 | pass→pass | 19,460 | 12,355 | -37% | 1 | 1 | 0% | 2,529 | 4,239 | +68% | 0 | 0 | — |
case-17 | fail→pass | 68,499 | 10,162 | -85% | 1 | 1 | 0% | 2,079 | 3,783 | +82% | 0 | 0 | — |
case-18 | fail→pass | 13,778 | 9,033 | -34% | 1 | 1 | 0% | 1,427 | 3,716 | +160% | 0 | 0 | — |
case-19 | fail→pass | 18,258 | 8,951 | -51% | 1 | 1 | 0% | 2,151 | 3,593 | +67% | 0 | 0 | — |
case-20 | fail→pass | 8,672 | 6,969 | -20% | 1 | 1 | 0% | 596 | 3,217 | +440% | 0 | 0 | — |
case-21 | fail→pass | 29,922 | 11,967 | -60% | 1 | 1 | 0% | 4,430 | 4,467 | +1% | 0 | 0 | — |
case-22 | fail→pass | 14,421 | 9,345 | -35% | 1 | 1 | 0% | 1,628 | 3,714 | +128% | 0 | 0 | — |
case-23 | fail→pass | 15,634 | 8,167 | -48% | 1 | 1 | 0% | 1,873 | 3,347 | +79% | 0 | 0 | — |
case-24 | pass→pass | 21,670 | 10,923 | -50% | 1 | 1 | 0% | 2,574 | 3,857 | +50% | 0 | 0 | — |
case-25 | fail→pass | 20,503 | 13,476 | -34% | 1 | 1 | 0% | 2,475 | 4,244 | +71% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted, and 24 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +60 percentage points is the difference between those two pass rates over the 24 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.