Skill: bibaofeng/media-gen (version 1.0.0)

--- name: media-gen description: 'Generate images and videos with AIsa. Supports four image models (Google Gemini 3 Pro Image, Alibaba Wan 2.7 image and image-pro, ByteDance Seedream) and four Wan video variants (wan2.6/2.7 × t2v/i2v). One API key; the bundled client routes each model to the correct endpoint automatically. Use when: the user needs AI image or video generation workflows.' author: AIsa version: 1.0.0 license: MIT homepage: https://aisa.one source: https://github.com/baofeng-tech/agent-skills-io/tree/main/targetSkills/media-gen user-invocable: true primaryEnv: AISA_API_KEY requires: bins: - python3 env: - AISA_API_KEY metadata: aisa: emoji: 🎬 requires: bins: - python3 env: - AISA_API_KEY primaryEnv: AISA_API_KEY compatibility: - openclaw - claude-code - hermes openclaw: emoji: 🎬 requires: bins: - python3 env: - AISA_API_KEY primaryEnv: AISA_API_KEY --- # Media Gen 🎬 Generate images and videos with a single AIsa API key. Use when: - you want one skill that covers AIsa image and video generation - you need to switch between Gemini, Wan, and Seedream image models - you want a bundled client that routes each model to the correct AIsa endpoint automatically - you need to create Wan video tasks and then poll or download the finished result This skill covers the image and video models AIsa exposes here across three image endpoint patterns and one async video workflow. ## Compatibility Works with any [agentskills.io](https://agentskills.io)-compatible harness, including: - **Claude Code** and **Claude** - **OpenAI Codex** - **Cursor** - **Gemini CLI** - **OpenCode**, **Goose**, **OpenClaw**, **Hermes** - any other harness that implements the [Agent Skills specification](https://agentskills.io/specification) Requires Python 3, a POSIX shell, and `AISA_API_KEY` (available from [aisa.one](https://aisa.one)). ## What You Can Do ### Image — Gemini (base64 inline) ```text "Generate a cyberpunk-style city nightscape, neon lights, rainy night, cinematic feel" ``` ### Image — Wan 2.7 (URL in chat response) ```text "Generate an ultra-detailed product shot of a red panda, studio lighting, sharp focus" ``` ### Image — Seedream (OpenAI-compatible, large format) ```text "Generate a 2048×2048 magazine cover: neo-noir detective portrait, film grain" ``` ### Video — text-to-video (Wan t2v) ```text "Sweeping establishing shot of a neon cyberpunk skyline at dusk, 5 seconds" ``` ### Video — image-to-video (Wan i2v) ```text "Starting from this reference image, gentle camera push-in with parallax" ``` ## Supported Models ### Image generation — 4 models, 3 endpoints | Model | Developer | Endpoint | Notes | |---|---|---|---| | `gemini-3-pro-image-preview` | Google | `POST /v1/models/{model}:generateContent` | Images returned as base64 in `candidates[].parts[].inline_data` | | `wan2.7-image` | Alibaba | `POST /v1/chat/completions` | Images returned as URL parts in `choices[].message.content[]` (type=`image`). $0.030/image | | `wan2.7-image-pro` | Alibaba | `POST /v1/chat/completions` | Higher fidelity. $0.075/image | | `seedream-4-5-251128` | ByteDance | `POST /v1/images/generations` | OpenAI-compatible. **Minimum 3,686,400 pixels** (e.g. 1920×1920). $0.040/image | ### Video generation — 4 Wan variants, 1 endpoint | Model | Kind | Image field | Output SR | |---|---|---|---| | `wan2.6-t2v` | text-to-video | *none* | 1080 | | `wan2.6-i2v` | image-to-video | `input.img_url` (string) | 720 | | `wan2.7-t2v` | text-to-video | *none* | 720 | | `wan2.7-i2v` | image-to-video | **`input.media`** (array) ⚠ | 720 | > ⚠ **Schema trap on `wan2.7-i2v`.** It takes the reference image in > `input.media` (array of URLs), **not** `input.img_url` like > `wan2.6-i2v`. Submissions without `media` return HTTP 200 with a > `task_id`, then fail downstream with `InvalidParameter: Field required: > input.media`. The bundled client routes this automatically — just > pass `--img-url` and choose the model. ## Quick Start ```bash export AISA_API_KEY="your-key" # Any image model — client routes to the right endpoint python3 scripts/media_gen_client.py image \ --model gemini-3-pro-image-preview \ --prompt "A cute red panda, cinematic lighting" \ --out out.png python3 scripts/media_gen_client.py image \ --model wan2.7-image-pro \ --prompt "Ultra-detailed product shot of a red panda" \ --out out.png python3 scripts/media_gen_client.py image \ --model seedream-4-5-251128 \ --prompt "Neo-noir detective portrait, film grain" \ --size 2048x2048 \ --out out.png # Video — text-to-video (no image needed) python3 scripts/media_gen_client.py video-create \ --model wan2.7-t2v \ --prompt "Sweeping shot of a neon cyberpunk skyline" # Video — image-to-video on wan2.7-i2v (client routes to input.media[]) python3 scripts/media_gen_client.py video-create \ --model wan2.7-i2v \ --prompt "gentle zoom with parallax" \ --img-url "https://example.com/reference.jpg" \ --duration 5 # Wait and download python3 scripts/media_gen_client.py video-wait \ --task-id <task_id> --download --out out.mp4 ``` --- ## Image Generation Endpoint Reference ### Gemini family → `POST /v1/models/{model}:generateContent` Documentation: [Google Gemini Chat](https://aisa.one/docs/api-reference/chat/generatecontent). ```bash curl -X POST "https://api.aisa.one/v1/models/gemini-3-pro-image-preview:generateContent" \ -H "Authorization: Bearer $AISA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "contents":[ {"role":"user","parts":[{"text":"A cute red panda, cinematic lighting"}]} ] }' ``` Response contains `candidates[].parts[].inline_data` with `{mime_type, data}` where `data` is a base64 PNG. ### Wan 2.7 family → `POST /v1/chat/completions` Documentation: [Image Generation via Chat](https://aisa.one/docs/api-reference/chat/image-generation). **Critical rule:** `messages[].content` must be an **array of typed parts**. A plain string returns HTTP 400 `invalid_parameter_error`. ```bash curl -X POST "https://api.aisa.one/v1/chat/completions" \ -H "Authorization: Bearer $AISA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "wan2.7-image", "messages": [ {"role":"user","content":[ {"type":"text","text":"A cute red panda, ultra-detailed, cinematic lighting"} ]} ], "n": 1 }' ``` Images come back as `{type: "image", image: "<url>"}` parts inside `choices[].message.content[]`. ### Seedream → `POST /v1/images/generations` Documentation: [OpenAI-Compatible Image Generations](https://aisa.one/docs/api-reference/chat/openai-image-generations). ```bash curl -X POST "https://api.aisa.one/v1/images/generations" \ -H "Authorization: Bearer $AISA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "seedream-4-5-251128", "prompt": "A cute red panda, ultra-detailed, cinematic lighting", "n": 1, "size": "2048x2048" }' ``` Response: `data[].url` or `data[].b64_json`. **Upstream enforces a minimum of 3,686,400 pixels.** `1024×1024` and `1536×1536` are rejected. Any aspect ratio works as long as `width × height ≥ 3,686,400`. --- ## Video Generation Endpoint Reference ### Create task → `POST /apis/v1/services/aigc/video-generation/video-synthesis` Documentation: [Create video generation task](https://aisa.one/docs/api-reference/video/post_services-aigc-video-generation-video-synthesis). Header `X-DashScope-Async: enable` is required. ```bash # wan2.6-t2v — text-to-video curl -X POST "https://api.aisa.one/apis/v1/services/aigc/video-generation/video-synthesis" \ -H "Authorization: Bearer $AISA_API_KEY" \ -H "Content-Type: application/json" \ -H "X-DashScope-Async: enable" \ -d '{ "model":"wan2.6-t2v", "input":{"prompt":"cinematic close-up, slow push-in"}, "parameters":{"resolution":"720P","duration":5} }' # wan2.7-i2v — image-to-video (⚠ input.media not input.img_url) curl -X POST "https://api.aisa.one/apis/v1/services/aigc/video-generation/video-synthesis" \ -H "Authorization: Bearer $AISA_API_KEY" \ -H "Content-Type: application/json" \ -H "X-DashScope-Async: enable" \ -d '{ "model":"wan2.7-i2v", "input":{ "prompt":"gentle zoom with parallax", "media":["https://example.com/reference.jpg"] }, "parameters":{"resolution":"720P","duration":5} }' ``` ### Poll task → `GET /apis/v1/services/aigc/tasks/{task_id}` Documentation: [Get video generation task result](https://aisa.one/docs/api-reference/video/get_services-aigc-tasks). > `task_id` is a **path parameter**. The query-string form > `?task_id=...` returns HTTP 500 `unsupported uri`. ```bash curl "https://api.aisa.one/apis/v1/services/aigc/tasks/YOUR_TASK_ID" \ -H "Authorization: Bearer $AISA_API_KEY" ``` --- ## Python Client The bundled client at `scripts/media_gen_client.py` auto-routes each image model to the correct endpoint and normalizes the response to a saved file. ```bash # Image — model picks the endpoint python3 scripts/media_gen_client.py image \ --model <gemini-3-pro-image-preview | wan2.7-image | wan2.7-image-pro | seedream-4-5-251128> \ --prompt "..." \ --out out.png # Video — create task python3 scripts/media_gen_client.py video-create \ --model <wan2.6-t2v | wan2.6-i2v | wan2.7-t2v | wan2.7-i2v> \ --prompt "..." \ [--img-url https://... (required for -i2v models)] \ [--duration 5|10] \ [--resolution 720P|1080P] # Video — poll / wait / download python3 scripts/media_gen_client.py video-status --task-id <id> python3 scripts/media_gen_client.py video-wait --task-id <id> --poll 10 --timeout 600 python3 scripts/media_gen_client.py video-wait --task-id <id> --download --out out.mp4 ``` ## API Reference This skill calls the following AIsa endpoints directly: - [Google Gemini Chat — `generateContent`](https://aisa.one/docs/api-reference/chat/generatecontent) — Gemini image models - [Image Generation via Chat](https://aisa.one/docs/api-reference/chat/image-generation) — Wan 2.7 image family - [OpenAI-Compatible Image Generations](https://aisa.one/docs/api-reference/chat/openai-image-generations) — Seedream - [Create video generation task](https://aisa.one/docs/api-reference/video/post_services-aigc-video-generation-video-synthesis) — all 4 Wan video variants - [Get video generation task result](https://aisa.one/docs/api-reference/video/get_services-aigc-tasks) — async polling See the [full AIsa API Reference](https://aisa.one/docs/api-reference) for the complete catalog. ## License MIT — see [LICENSE](../LICENSE) at the repo root.


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal:  | SkillSpector:  ()