
Videoagent Image Studio
- 5.5k installs
- 762 repo stars
- Updated July 21, 2026
- pexoai/pexo-skills
videoagent-image-studio is an agent skill for >
About
name videoagent-image-studio version 2 0 0 author wells emoji tags video image-generation midjourney flux gemini fal ideogram recraft description Tired of juggling 8 API keys This skill gives you one-command access to Midjourney Flux Ideogram and more with zero setup Use when you want to generate any image without worrying about API keys homepage https github com pexoai image-studio-skill metadata openclaw emoji install id node kind node label No dependencies needed all calls go through the hosted proxy VideoAgent Image Studio Use when User asks to generate draw create or make any kind of image photo illustration icon logo or artwork Generate images with 8 state-of-the-art AI models This skill automatically picks the best model for the job and handles all the complexity including Midjourney's async polling so you can focus on the conversation Quick Reference User Intent Model Speed Artistic cinematic painterly midjourney 15s Photorealistic portrait product flux-pro 8s General purpose balanced flux-dev 10s Quick draft fast iteration flux-schnell 2s Image with text logo poster ideogram 10s Vector art
- 🎨 VideoAgent Image Studio
- **Midjourney**: Add `cinematic lighting`, `ultra detailed`, `--v 7`, `--style raw`
- **Flux**: Add `masterpiece`, `highly detailed`, `sharp focus`, `professional photography`
- **Ideogram**: Be explicit about text content, font style, and layout
- **Recraft**: Specify `vector illustration`, `flat design`, `icon style`
Videoagent Image Studio by the numbers
- 5,531 all-time installs (skills.sh)
- +7 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #132 of 1,879 Marketing & SEO skills by installs in the Skillselion catalog
- Security screen: HIGH risk (skills.sh audit)
- Data as of Aug 5, 2026 (Skillselion catalog sync)
videoagent-image-studio capabilities & compatibility
- Capabilities
- 🎨 videoagent image studio · **midjourney**: add `cinematic lighting`, `ultra · **flux**: add `masterpiece`, `highly detailed`, · **ideogram**: be explicit about text content, fo · **recraft**: specify `vector illustration`, `fla
- Use cases
- documentation
What videoagent-image-studio says it does
This skill gives you one-command access to Midjourney, Flux, Ideogram, and more, with zero setup.
Use when you want to generate any image without worrying about API keys.
Generate images with 8 state-of-the-art AI models.
npx skills add https://github.com/pexoai/pexo-skills --skill videoagent-image-studioAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 5.5k |
|---|---|
| repo stars | ★ 762 |
| Security audit | 3 / 3 scanners passed |
| Last updated | July 21, 2026 |
| Repository | pexoai/pexo-skills ↗ |
When should developers use videoagent-image-studio and what problem does it solve?
>
Who is it for?
Developers working with videoagent-image-studio patterns described in the skill documentation.
Skip if: Skip when cached docs are empty or the task is outside the skill's documented scope.
When should I use this skill?
>
What you get
Grounded guidance and workflows from SKILL.md for videoagent-image-studio.
- Agent-generated images
- Multi-provider proxy configuration
By the numbers
- Supports five fal.ai model families: Flux, SDXL, Nano Banana, Ideogram, Recraft
- Integrates Midjourney via Legnext.ai alongside fal.ai through one proxy
Files
🎨 VideoAgent Image Studio
Use when: User asks to generate, draw, create, or make any kind of image, photo, illustration, icon, logo, or artwork.
Generate images with 8 state-of-the-art AI models. This skill automatically picks the best model for the job and handles all the complexity — including Midjourney's async polling — so you can focus on the conversation.
---
Quick Reference
| User Intent | Model | Speed |
|---|---|---|
| Artistic, cinematic, painterly | midjourney | ~15s |
| Photorealistic, portrait, product | flux-pro | ~8s |
| General purpose, balanced | flux-dev | ~10s |
| Quick draft, fast iteration | flux-schnell | ~2s |
| Image with text, logo, poster | ideogram | ~10s |
| Vector art, icon, flat design | recraft | ~8s |
| Anime, stylized illustration | sdxl | ~5s |
| Gemini-powered, consistent style | nano-banana | ~12s |
---
How to Generate an Image
Step 1 — Enhance the prompt
Before calling the script, expand the user's prompt with style, lighting, and quality descriptors appropriate for the chosen model.
- Midjourney: Add
cinematic lighting,ultra detailed,--v 7,--style raw - Flux: Add
masterpiece,highly detailed,sharp focus,professional photography - Ideogram: Be explicit about text content, font style, and layout
- Recraft: Specify
vector illustration,flat design,icon style
Step 2 — Run the script
node {baseDir}/tools/generate.js \
--model <model_id> \
--prompt "<enhanced prompt>" \
--aspect-ratio <ratio>All parameters:
| Parameter | Default | Description |
|---|---|---|
--model | flux-dev | Model ID from the table above |
--prompt | (required) | The image generation prompt |
--aspect-ratio | 1:1 | 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 21:9 |
--num-images | 1 | Number of images (1–4; Midjourney always returns 4) |
--negative-prompt | — | Things to avoid (not supported by Midjourney) |
--seed | — | Seed for reproducibility |
Step 3 — Return the result
The script always waits and returns the final image URL(s). No polling required.
{
"success": true,
"model": "flux-pro",
"imageUrl": "https://...",
"images": ["https://..."]
}Send the imageUrl to the user.
---
Midjourney Actions
After generating a 4-image grid with Midjourney, offer the user these options:
# Upscale image #2 (subtle, preserves details)
node {baseDir}/tools/generate.js \
--model midjourney \
--action upscale \
--index 2 \
--job-id <job_id>
# Create a strong variation of image #3
node {baseDir}/tools/generate.js \
--model midjourney \
--action variation \
--index 3 \
--job-id <job_id> \
--variation-type 1
# Regenerate with same prompt
node {baseDir}/tools/generate.js \
--model midjourney \
--action reroll \
--job-id <job_id>Upscale types: 0 = Subtle (default, best for photos), 1 = Creative (best for illustrations)
Variation types: 0 = Subtle (default), 1 = Strong (dramatic changes)
---
Example Conversations
User: "Draw a snow leopard on a snowy mountain with cinematic lighting"
# Choose midjourney for artistic quality
node {baseDir}/tools/generate.js \
--model midjourney \
--prompt "a majestic snow leopard on a snowy mountain peak, cinematic lighting, dramatic atmosphere, ultra detailed --ar 16:9 --v 7" \
--aspect-ratio 16:9🎨 Done! Which one to upscale? (U1-U4) Or create a variant? (V1-V4)
---
User: "Use Flux to generate a perfume product poster, white background"
# Choose flux-pro for photorealistic product shots
node {baseDir}/tools/generate.js \
--model flux-pro \
--prompt "a luxury perfume bottle on a clean white background, professional product photography, soft shadows, 8k, highly detailed" \
--aspect-ratio 3:4---
User: "Show me a quick draft"
# flux-schnell for instant previews
node {baseDir}/tools/generate.js \
--model flux-schnell \
--prompt "..." \
--aspect-ratio 1:1---
User: "Make me an App icon, flat style, blue theme"
# recraft for vector/icon style
node {baseDir}/tools/generate.js \
--model recraft \
--prompt "a minimal flat design app icon, blue color scheme, simple geometric shapes, vector style, white background"---
Setup
Zero API keys needed! All requests go through a hosted proxy that handles authentication server-side.
The skill works out of the box — just install and use.
Advanced: Custom proxy or token
If you want to use your own proxy or a persistent token, set these environment variables:
{
"skills": {
"entries": {
"videoagent-image-studio": {
"enabled": true,
"env": {
"IMAGE_STUDIO_PROXY_URL": "https://your-proxy.vercel.app",
"IMAGE_STUDIO_TOKEN": "your_token_here"
}
}
}
}
}| Variable | Required | Description |
|---|---|---|
IMAGE_STUDIO_PROXY_URL | No | Custom proxy base URL (default: https://image-gen-proxy.vercel.app) |
IMAGE_STUDIO_TOKEN | No | Persistent token (auto-obtained if not set, 100 free uses per token) |
To deploy your own proxy, see the videoagent-audio-studio proxy as a reference implementation. You'll need FAL_KEY and LEGNEXT_KEY as Vercel environment variables.
---
Changelog
v2.0.0
- Simplified async: The script now blocks until Midjourney completes. No more
--async/--pollflags needed in SKILL.md instructions. - Unified output format: All models return the same
{ success, imageUrl, images }shape. - Reference images for Nano Banana: Pass
--reference-images "url1,url2"for character/style consistency across generations.
v1.3.0
- Added non-blocking async mode for Midjourney (
--async+--poll).
v1.2.0
- Midjourney turbo mode enabled by default (~10-20s).
v1.1.0
- Switched Midjourney provider from TTAPI to Legnext.ai for better stability.
v1.0.0
- Initial release with Midjourney, Flux, SDXL, Nano Banana, Ideogram, Recraft.
# ── Client-side (optional) ──────────────────────────────────────────────────
# Custom proxy URL — leave empty to use the default hosted proxy
# IMAGE_STUDIO_PROXY_URL=https://your-proxy.vercel.app/api/image
# Pro access key for custom proxy authentication
# IMAGE_STUDIO_API_KEY=your_pro_key_here
# ── Server-side (only needed if self-hosting the proxy) ─────────────────────
# fal.ai API Key — required for Flux, SDXL, Nano Banana, Ideogram, Recraft
# Get it at: https://fal.ai/dashboard/keys
# FAL_KEY=your_fal_key_here
# Legnext.ai API Key — required for Midjourney
# Get it at: https://legnext.ai/dashboard
# LEGNEXT_KEY=your_legnext_key_here
# Comma-separated list of valid pro keys for access control (leave empty for open access)
# VALID_PRO_KEYS=key1,key2,key3
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[2.0.0] - 2026-03-03
Changed
- Simplified SKILL.md: Removed the complex 3-step async/poll workflow from the main instructions. The script already handles all polling internally — the SKILL.md now reflects this with a single, clean "run and get result" pattern.
- Unified output format: All models now return a consistent
{ success, model, imageUrl, images, jobId }shape, making it easier to handle results uniformly. - Clearer model selection table: Added "Speed" column so agents can make better trade-off decisions.
- Added "Use when" trigger: SKILL.md now starts with a clear activation condition so the agent knows exactly when to invoke this skill.
- Documented `--reference-images` for Nano Banana: Pass comma-separated URLs for character/style consistency across sequential image generations.
---
[1.3.0] - 2026-02-25
Added
- Non-blocking async mode for Midjourney (
--asyncflag). Submit a job and return immediately withjob_id, without waiting for completion. This prevents the bot from being blocked while waiting for image generation. - Status poll mode (
--poll --job-id <id>). Check job status once and return immediately — no waiting. Returnsstatus: "completed","pending","processing", or"failed". - Updated SKILL.md with mandatory async workflow documentation. All Midjourney requests should now use
--async+ periodic--pollto avoid blocking the bot.
Changed
--asyncflag is supported for all Midjourney actions:imagine,upscale,variation,reroll.
---
[1.2.0] - 2026-02-25
Changed
- Midjourney Turbo mode enabled by default. The
--turboflag is now automatically appended to all Midjourney prompts, reducing generation time from ~30-60s to ~10-20s (requires Midjourney Pro or Mega subscription). - Added
--modeparameter:turbo(default),fast,relax.
---
[1.1.0] - 2026-02-25
Changed
- Midjourney provider switched from TTAPI to Legnext.ai for faster generation speed and higher stability.
- Environment variable renamed from
TTAPI_KEYtoLEGNEXT_KEY. Please update your OpenClaw config. - Upscale now supports
--upscale-typeparameter:0= Subtle (default),1= Creative. - Variation now supports
--variation-typeparameter:0= Subtle (default),1= Strong. - Added
--action rerollsupport for Midjourney. - Added
--action describesupport for Midjourney. - Response now includes
imageUrlsarray (4 individual image URLs) in addition to the gridimageUrl.
Migration Guide
If you were using TTAPI_KEY, please: 1. Register at legnext.ai and get your API key. 2. Update ~/.openclaw/openclaw.json: rename TTAPI_KEY to LEGNEXT_KEY and set your new key.
---
[1.0.0] - 2026-02-25
Added
- Initial release of the unified image generation skill.
- Midjourney support via TTAPI (imagine, upscale U1-U4, variation V1-V4, reroll, zoom, pan).
- Flux 1.1 Pro support via fal.ai (
fal-ai/flux-pro/v1.1). - Flux Dev support via fal.ai (
fal-ai/flux/dev). - Flux Schnell support via fal.ai (
fal-ai/flux/schnell). - SDXL Lightning support via fal.ai (
fal-ai/lightning-models/sdxl-lightning-4step). - Nano Banana Pro (Gemini-powered) support via fal.ai (
fal-ai/nano-banana-pro). - Ideogram v3 support via fal.ai (
fal-ai/ideogram/v3). - Recraft v3 support via fal.ai (
fal-ai/recraft-v3). - Aspect ratio support:
1:1,16:9,9:16,4:3,3:4,3:2,2:3,21:9. - Multi-image generation support (1-4 images per request).
- Negative prompt support for fal.ai models.
- Seed parameter support for reproducible results.
- Automatic job polling for Midjourney tasks (up to 5 minutes).
- Published to ClawHub as
pexoai/image-studio@1.0.0.
Contributing Guide
This document explains how to participate in the development and iteration of the videoagent-image-studio Skill.
Project Structure
videoagent-image-studio/
├── SKILL.md # Skill core definition file (read by OpenClaw)
├── tools/
│ └── generate.js # Image generation core script (Node.js ESM)
├── package.json # Dependencies (@fal-ai/client)
├── .env.example # Environment variables example
├── CONTRIBUTING.md # This file
└── CHANGELOG.md # Version historyDevelopment Environment Setup
# 1. Clone the repository
git clone https://github.com/pexoai/videoagent-image-studio.git
cd videoagent-image-studio
# 2. Install dependencies
npm install
# 3. Configure environment variables
cp .env.example .env
# Edit .env and add your API Keys:
# FAL_KEY=your_fal_key
# LEGNEXT_KEY=your_legnext_keyLocal Testing
# Test Flux Dev (fast, only needs FAL_KEY)
FAL_KEY=your_key node tools/generate.js \
--model flux-dev \
--prompt "a cute cat, photorealistic" \
--aspect-ratio 1:1
# Test Midjourney (requires LEGNEXT_KEY)
LEGNEXT_KEY=your_key node tools/generate.js \
--model midjourney \
--prompt "a majestic snow leopard, cinematic" \
--aspect-ratio 16:9Supported Models
| Model Key | Provider | Description |
|---|---|---|
midjourney | Legnext.ai | Strongest artistic style, requires LEGNEXT_KEY |
flux-pro | fal.ai | Highest quality photorealistic |
flux-dev | fal.ai | General-purpose high quality |
flux-schnell | fal.ai | Fastest, good for drafts |
sdxl | fal.ai | SDXL Lightning 4-step |
nano-banana | fal.ai | Gemini-powered |
ideogram | fal.ai | Best text layout |
recraft | fal.ai | Vector/icon style |
Development Guidelines
- Branch naming:
feature/xxx,fix/xxx,chore/xxx - Commit format: Use Conventional Commits
feat: add xxx model supportfix: fix Midjourney polling timeout issuedocs: update SKILL.md usage instructions- PR workflow: Create PR from
featurebranch tomain, requires at least 1 review
Publishing New Version to ClawHub
# Install clawhub CLI (if not installed)
npm i -g clawhub
# Login (using Token)
clawhub login --token <your_clawhub_token>
# Publish new version
clawhub publish . \
--slug videoagent-image-studio \
--name "Image Gen" \
--version 2.x.x \
--changelog "Release notes..." \
--tags "latest,image,midjourney,flux,sdxl,fal,generation,ai"FAQ
Q: Where do I get FAL_KEY? A: Create an API Key at fal.ai/dashboard/keys.
Q: Where do I get LEGNEXT_KEY? A: Get an API Key at legnext.ai/dashboard.
Q: How do I add a new model? A: Add the new model ID to the FAL_MODELS object in tools/generate.js, then add input construction logic in the corresponding generateFal() function, and finally update the model selection guide in SKILL.md.
{
"name": "videoagent-image-studio",
"version": "2.1.0",
"description": "OpenClaw skill for unified image generation — zero API keys needed. Supports Midjourney, Flux, SDXL, Ideogram, Recraft and more via hosted proxy.",
"type": "module",
"engines": {
"node": ">=18"
},
"dependencies": {
"undici": "^7.22.0"
}
}
#!/usr/bin/env node
/**
* videoagent-image-studio — generate.js
* Unified image generation CLI that calls the image-gen-proxy.
* Users never need their own API keys — the proxy holds them server-side.
*
* Usage:
* node generate.js --model <id> --prompt "<text>" [options]
* node generate.js --model midjourney --action upscale --index 2 --job-id <id>
*/
import { parseArgs } from "util";
// ── Proxy configuration ────────────────────────────────────────────────────
const PROXY_BASE = process.env.IMAGE_STUDIO_PROXY_URL || "https://image-gen-proxy.vercel.app";
const TOKEN = process.env.IMAGE_STUDIO_TOKEN || "";
// ── Parse CLI arguments ────────────────────────────────────────────────────
const { values: args } = parseArgs({
options: {
model: { type: "string", default: "flux-dev" },
prompt: { type: "string", default: "" },
"aspect-ratio": { type: "string", default: "1:1" },
"num-images": { type: "string", default: "1" },
"negative-prompt": { type: "string", default: "" },
action: { type: "string", default: "" },
index: { type: "string", default: "1" },
"job-id": { type: "string", default: "" },
"upscale-type": { type: "string", default: "0" },
"variation-type": { type: "string", default: "0" },
mode: { type: "string", default: "turbo" },
seed: { type: "string", default: "" },
},
strict: false,
});
// ── Output helpers ─────────────────────────────────────────────────────────
function output(data) {
console.log(JSON.stringify(data, null, 2));
}
function error(msg, details) {
console.error(JSON.stringify({ success: false, error: msg, details }, null, 2));
process.exit(1);
}
// ── Token management ───────────────────────────────────────────────────────
async function getToken() {
if (TOKEN) return TOKEN;
process.stderr.write("[ImageStudio] No token found, requesting free token...\n");
const res = await fetch(`${PROXY_BASE}/api/token`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({}),
});
const data = await res.json().catch(() => ({}));
if (!res.ok || !data.token) {
error("Failed to obtain free token", data);
}
process.stderr.write(`[ImageStudio] Got free token (${data.free_limit || 100} uses)\n`);
return data.token;
}
// ── Midjourney generation ──────────────────────────────────────────────────
async function generateMidjourney(token) {
const action = args["action"] || "imagine";
const payload = { action };
if (action === "imagine") {
if (!args["prompt"]) error("--prompt is required for Midjourney generation.");
payload.prompt = args["prompt"];
payload.mode = args["mode"] || "turbo";
const ar = args["aspect-ratio"];
if (ar && ar !== "1:1") payload.aspectRatio = ar;
} else if (action === "upscale" || action === "variation") {
if (!args["job-id"]) error("--job-id is required for Midjourney actions.");
payload.jobId = args["job-id"];
payload.index = parseInt(args["index"], 10) || 1;
if (action === "upscale") payload.type = parseInt(args["upscale-type"], 10) || 0;
if (action === "variation") payload.type = parseInt(args["variation-type"], 10) || 0;
if (args["prompt"]) payload.prompt = args["prompt"];
} else if (action === "reroll" || action === "describe") {
if (!args["job-id"]) error("--job-id is required for Midjourney actions.");
payload.jobId = args["job-id"];
} else if (action === "poll") {
if (!args["job-id"]) error("--job-id is required for polling.");
payload.jobId = args["job-id"];
}
const headers = { "Content-Type": "application/json" };
if (token) headers["Authorization"] = `Bearer ${token}`;
process.stderr.write(`[ImageStudio] Midjourney ${action}...\n`);
const res = await fetch(`${PROXY_BASE}/api/midjourney`, {
method: "POST",
headers,
body: JSON.stringify(payload),
});
return res.json().catch(() => ({}));
}
// ── fal.ai model generation ────────────────────────────────────────────────
async function generateFal(token) {
if (!args["prompt"]) error("--prompt is required.");
const payload = {
model: args["model"],
prompt: args["prompt"],
aspect_ratio: args["aspect-ratio"] || "1:1",
num_images: parseInt(args["num-images"], 10) || 1,
};
if (args["negative-prompt"]) payload.negative_prompt = args["negative-prompt"];
if (args["seed"]) payload.seed = parseInt(args["seed"], 10);
const headers = { "Content-Type": "application/json" };
if (token) headers["Authorization"] = `Bearer ${token}`;
process.stderr.write(`[ImageStudio] Generating with ${payload.model}...\n`);
const res = await fetch(`${PROXY_BASE}/api/generate`, {
method: "POST",
headers,
body: JSON.stringify(payload),
});
return res.json().catch(() => ({}));
}
// ── Main ───────────────────────────────────────────────────────────────────
async function main() {
const model = args["model"];
let token;
try {
token = await getToken();
} catch (err) {
process.stderr.write(`[ImageStudio] Warning: token request failed (${err.message}), proceeding without token\n`);
token = "";
}
try {
let result;
if (model === "midjourney") {
result = await generateMidjourney(token);
} else {
result = await generateFal(token);
}
if (result.success === false || result.error) {
error(result.error || "Generation failed", result);
}
output(result);
} catch (err) {
error(err.message, err.code);
}
}
main();
Related skills
FAQ
What does videoagent-image-studio do?
>
When should I invoke videoagent-image-studio?
>
Where is the source documentation?
Ground claims in SKILL.md excerpts and linked reference files from the cached docs.
Is Videoagent Image Studio safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.