Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate images with Venice. Covers POST /image/generate (Venice-native), POST /images/generations (OpenAI-compatible), GET /image/styles (style presets), request fields (prompt, dimensions, cfg_scale, seed, variants, style_preset, aspect_ratio, resolution, safe_mode, watermark), and response formats.
.claude/skills/sediman-agent-venice-image-generate/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 100% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 71% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 136% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 91% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 80% | 0% |
Two text-to-image endpoints:
POST /api/v1/image/generate — Venice-native, full control (negative prompts, CFG, seed, up to 4 variants).POST /api/v1/images/generations — OpenAI-compatible, fewer knobs but drop-in for the OpenAI SDK.Plus:
GET /api/v1/image/styles — list of style preset names for style_preset.For editing / upscaling / multi-image / background removal, see venice-image-edit.
images.generate and want a zero-change SDK swap./image/generate — Venice-nativebashcurl https://api.venice.ai/api/v1/image/generate \ -H "Authorization: Bearer $VENICE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "z-image-turbo", "prompt": "A beautiful sunset over a mountain range", "width": 1024, "height": 1024, "cfg_scale": 7.5, "steps": 8, "seed": 123456789, "variants": 1, "format": "webp", "style_preset": "3D Model", "safe_mode": true }'
| Field | Type | Default | Notes | |---|---|---|---| | model | string | — | Required. Image model ID. GET /models?type=image. | | prompt | string | — | Required. Max promptCharacterLimit from the model's model_spec.constraints (typically 1500–7500). | | negative_prompt | string | — | Describe what not to show. Same character cap as prompt. | | width, height | int | 1024, 1024 | ≤ 1280 each. Must be divisible by constraints.widthHeightDivisor on the model's model_spec. | | aspect_ratio | string | — | "1:1", "16:9", "9:16", … — used by models like Nano Banana instead of width/height. | | resolution | string | — | "1K", "2K", "4K" — used by resolution-driven models. | | cfg_scale | number | model default | 0 < x ≤ 20. Higher = more prompt adherence. | | steps | int | 8 | Inference steps. Some models ignore it (e.g. Turbo). | | seed | int | 0 | -999999999..999999999. Use 0/omit for random. | | variants | int | 1 | 1–4. Only if return_binary: false. | | lora_strength | int | — | 0–100 when model uses Loras. | | style_preset | string | — | Value from GET /image/styles. | | format | "webp"/"png"/"jpeg" | webp | Response image format. | | return_binary | bool | false | true → binary image/* response; false → JSON with base64. | | embed_exif_metadata | bool | false | Embed prompt info in EXIF. | | hide_watermark | bool | false | Venice may still watermark certain content. | | safe_mode | bool | true | Blurs adult content. | | enable_web_search | bool | false | Only some models. Charges extra. | | inpaint | — | — | Deprecated since May 19 2025. A new inpaint API is forthcoming. |
return_binary: false)json{ "id": "...", "images": ["<base64>", "<base64>"], "timing": {...}, "request": {...} }
With return_binary: true, response is raw image/webp (or png/jpeg) with matching Content-Type.
/images/generations — OpenAI-compatibleUse this if you're already on the OpenAI SDK. Field names match openai.images.generate().
tsimport OpenAI from 'openai' const client = new OpenAI({ apiKey: process.env.VENICE_API_KEY, baseURL: 'https://api.venice.ai/api/v1', }) const res = await client.images.generate({ model: 'z-image-turbo', prompt: 'A beautiful sunset over mountain ranges', size: '1024x1024', response_format: 'b64_json', }) const b64 = res.data[0].b64_json
| Field | Values | Notes | |---|---|---| | model | string, default "default" | Unknown model IDs fall back to Venice's default. | | prompt | string, ≤ 1500 chars | Required. | | size | auto, 256x256, 512x512, 1024x1024, 1536x1024, 1024x1536, 1792x1024, 1024x1792 | — | | output_format | jpeg / png / webp | Defaults to png. | | response_format | b64_json / url | url returns a data: URL (not a hosted URL). | | moderation | auto (safe mode on) / low (safe mode off) | — | | n | 1 | Venice only supports a single image per call here. | | quality, style (vivid/natural), background, output_compression, user | — | Accepted for OpenAI compat, not used by Venice. |
If you need variants, seed, negative_prompt, cfg_scale, or style_preset, switch to /image/generate.
/image/styles — list presetsbashcurl https://api.venice.ai/api/v1/image/styles \ -H "Authorization: Bearer $VENICE_API_KEY"
Returns a list of styles[], each with a name you can pass to style_preset. Cache this — it's small and stable.
bashcurl "https://api.venice.ai/api/v1/models?type=image" \ -H "Authorization: Bearer $VENICE_API_KEY"
Inspect per-model model_spec:
constraints.widthHeightDivisor — width and height must both be divisible by this.constraints.aspectRatios[] + defaultAspectRatio — if present, the model supports aspect-ratio-driven sizing.constraints.resolutions[] + defaultResolution — if present, the model supports resolution (1K/2K/4K).constraints.steps.{default,max} — step bounds (some models ignore steps entirely).constraints.promptCharacterLimit — max prompt length (also applies to negative_prompt).pricing.generation.usd — flat USD per image, or pricing.resolutions[].usd for resolution-tiered models.Pick a model that matches the feature + size combo you plan to use.
json{"model": "z-image-turbo", "prompt": "...", "seed": 42, "variants": 4}
json{"model": "nano-banana-2", "prompt": "...", "aspect_ratio": "16:9", "resolution": "2K"}
(Other nano-banana variants: nano-banana-pro. Always verify the current ID via GET /models?type=image.)
json{ "model": "z-image-turbo", "prompt": "a red sports car in a parking lot", "negative_prompt": "blurry, people, clouds", "style_preset": "3D Model" }
tsconst res = await fetch('https://api.venice.ai/api/v1/image/generate', { method: 'POST', headers: { Authorization: `Bearer ${process.env.VENICE_API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'z-image-turbo', prompt: '...', return_binary: true }), }) if (!res.ok) throw new Error(await res.text()) const buf = Buffer.from(await res.arrayBuffer()) await fs.writeFile('out.webp', buf)
| Code | Meaning | |---|---| | 400 | Bad params (e.g. dimensions not divisible by widthHeightDivisor, prompt too long, variants>1 with return_binary). | | 401 | Auth or Pro-only model. | | 402 | Insufficient balance. Bearer: plain { "error": "Insufficient balance" }; x402: PAYMENT_REQUIRED body + PAYMENT-REQUIRED header. | | 415 | Wrong Content-Type (send application/json for this endpoint). | | 429 | Rate limited. | | 500 / 503 | Inference or capacity issue — retry with jitter. |
(Content-policy violations on /image/generate come back as 400 with an error string, not 422 — the 422 shape is specific to audio generation paths.)
width/height, aspect_ratio + resolution, or (OpenAI-compat) size. Match the model's constraints.variants > 1 requires return_binary: false (JSON with base64 array).steps is ignored by fast/turbo models; they hardcode step count internally.hide_watermark: true is advisory — Venice may still watermark content flagged by safety classifiers.inpaint field is deprecated; don't use it.response_format: "url" returns a data URL, not a hosted URL — plan for that if you're saving to storage.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 11,751 | 6,629 | -44% | 1 | 1 | 0% | 1,942 | 3,892 | +100% | 0 | 0 | — |
case-02 | fail→pass | 11,145 | 6,326 | -43% | 1 | 1 | 0% | 2,244 | 3,843 | +71% | 0 | 0 | — |
case-03 | fail→pass | 9,411 | 7,376 | -22% | 1 | 1 | 0% | 1,744 | 4,112 | +136% | 0 | 0 | — |
case-04 | fail→pass | 13,197 | 8,507 | -36% | 1 | 1 | 0% | 2,243 | 4,282 | +91% | 0 | 0 | — |
case-05 | fail→pass | 15,813 | 11,753 | -26% | 1 | 1 | 0% | 2,696 | 4,863 | +80% | 0 | 0 | — |
case-06 | pass→pass | 16,646 | 7,063 | -58% | 1 | 1 | 0% | 2,720 | 4,038 | +48% | 0 | 0 | — |
case-07 | fail→pass | 4,734 | 2,050 | -57% | 1 | 1 | 0% | 765 | 2,999 | +292% | 0 | 0 | — |
case-08 | pass→pass | 13,510 | 5,794 | -57% | 1 | 1 | 0% | 2,331 | 3,743 | +61% | 0 | 0 | — |
case-09 | pass→pass | 13,410 | 4,977 | -63% | 1 | 1 | 0% | 2,224 | 3,542 | +59% | 0 | 0 | — |
case-10 | fail→pass | 12,868 | 4,717 | -63% | 1 | 1 | 0% | 2,012 | 3,348 | +66% | 0 | 0 | — |
case-11 | fail→pass | 12,191 | 4,259 | -65% | 1 | 1 | 0% | 2,001 | 3,381 | +69% | 0 | 0 | — |
case-12 | pass→pass | 5,195 | 2,179 | -58% | 1 | 1 | 0% | 813 | 3,006 | +270% | 0 | 0 | — |
case-13 | fail→pass | 9,525 | 2,556 | -73% | 1 | 1 | 0% | 1,466 | 3,066 | +109% | 0 | 0 | — |
case-14 | pass→pass | 10,209 | 4,927 | -52% | 1 | 1 | 0% | 1,540 | 3,402 | +121% | 0 | 0 | — |
case-15 | pass→pass | 9,335 | 4,883 | -48% | 1 | 1 | 0% | 1,609 | 3,580 | +122% | 0 | 0 | — |
case-16 | fail→pass | 9,220 | 3,079 | -67% | 1 | 1 | 0% | 1,393 | 3,178 | +128% | 0 | 0 | — |
case-17 | pass→pass | 16,405 | 4,618 | -72% | 1 | 1 | 0% | 2,812 | 3,549 | +26% | 0 | 0 | — |
case-18 | fail→pass | 11,359 | 6,297 | -45% | 1 | 1 | 0% | 1,817 | 3,820 | +110% | 0 | 0 | — |
case-19 | fail→pass | 10,165 | 2,227 | -78% | 1 | 1 | 0% | 1,581 | 2,995 | +89% | 0 | 0 | — |
case-20 | fail→pass | 15,586 | 7,303 | -53% | 1 | 1 | 0% | 2,435 | 3,846 | +58% | 0 | 0 | — |
case-21 | fail→pass | 14,717 | 9,013 | -39% | 1 | 1 | 0% | 2,429 | 3,926 | +62% | 0 | 0 | — |
case-22 | fail→pass | 11,376 | 5,814 | -49% | 1 | 1 | 0% | 2,035 | 3,653 | +80% | 0 | 0 | — |
case-23 | pass→pass | 9,193 | 6,197 | -33% | 1 | 1 | 0% | 1,534 | 3,812 | +149% | 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. 23 cases were attempted. The headline lift of +65 percentage points is the difference between those two pass rates over the 23 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.