Generate logos, social posts, app screenshots, comic panels & visual-novel assets from prompts.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Browse the DesignForYou template catalog. Optionally filter by category (e.g. 'instagram', 'app-store', 'logo', 'living-panels'). Returns template IDs, names, and previews.
Filter by category (e.g. 'instagram', 'app-store', 'logo')
Optional subcategory filter (e.g. 'lettermark', 'wordmark', 'app_icon')
Browse the DesignForYou template catalog. Optionally filter by category (e.g. 'instagram', 'app-store', 'logo', 'living-panels'). Returns template IDs, names, and previews.
| Argument | Type | Description |
|---|---|---|
| category | any | Filter by category (e.g. 'instagram', 'app-store', 'logo') |
| subcategory | any | Optional subcategory filter (e.g. 'lettermark', 'wordmark', 'app_icon') |
{
"type": "object",
"required": [],
"properties": {
"category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Category",
"description": "Filter by category (e.g. 'instagram', 'app-store', 'logo')"
},
"subcategory": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Subcategory",
"description": "Optional subcategory filter (e.g. 'lettermark', 'wordmark', 'app_icon')"
}
}
}Return the no-server-LLM Living Panels authoring brief: PanelScript instructions, schema, unit templates, and success criteria. Use this when the MCP client will do the creative direction with its own model, then call comic_submit_design with the authored Story JSON.
| Argument | Type | Description |
|---|---|---|
| premise* | string | Premise the client will use to author the Living Panels PanelScript JSON itself. |
{
"type": "object",
"required": [
"premise"
],
"properties": {
"premise": {
"type": "string",
"title": "Premise",
"minLength": 10,
"description": "Premise the client will use to author the Living Panels PanelScript JSON itself."
}
}
}Return the current Story JSON, stale-write hash, allowed patch paths, and dirty-node contract for a client-authored Living Panels revision. Use this when the client will decide the edit with its own model, then call comic_submit_revision.
| Argument | Type | Description |
|---|---|---|
| comic_id* | string | Comic id to revise. |
{
"type": "object",
"required": [
"comic_id"
],
"properties": {
"comic_id": {
"type": "string",
"title": "Comic Id",
"minLength": 1,
"description": "Comic id to revise."
}
}
}Check asset-production progress for a comic created with create_comic: panels, motion clips, and voice lines done vs total, plus ready=true when the whole comic is live at its reader_url. Free to call.
| Argument | Type | Description |
|---|---|---|
| comic_id* | string | Comic id returned by create_comic |
{
"type": "object",
"required": [
"comic_id"
],
"properties": {
"comic_id": {
"type": "string",
"title": "Comic Id",
"minLength": 1,
"description": "Comic id returned by create_comic"
}
}
}Accept a client-authored Living Panels Story JSON and start artifact production without using a server story LLM. The client does direction; DesignForYou validates, saves, generates character sheets, panel/unit art, motion clips, voice-over, and assembles the public reader.
| Argument | Type | Description |
|---|---|---|
| story* | object | Client-authored Living Panels Story JSON. The server validates it, clears any producer-owned asset fields, then produces art, motion, and voices. |
| premise* | string | Original premise the client used while authoring the submitted PanelScript story. |
| client_name | any | Host app or client name, for provenance. |
| client_model | any | Model or agent that authored the story, for provenance. |
| start_production | boolean | Start artifact generation immediately after validation. |
{
"type": "object",
"required": [
"premise",
"story"
],
"properties": {
"story": {
"type": "object",
"title": "Story",
"description": "Client-authored Living Panels Story JSON. The server validates it, clears any producer-owned asset fields, then produces art, motion, and voices.",
"additionalProperties": true
},
"premise": {
"type": "string",
"title": "Premise",
"minLength": 10,
"description": "Original premise the client used while authoring the submitted PanelScript story."
},
"client_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Client Name",
"description": "Host app or client name, for provenance."
},
"client_model": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Client Model",
"description": "Model or agent that authored the story, for provenance."
},
"start_production": {
"type": "boolean",
"title": "Start Production",
"default": true,
"description": "Start artifact generation immediately after validation."
}
}
}Apply a client-authored Living Panels revision without using a server revision LLM. Targeted changes regenerate only inferred dirty producer nodes such as panel:<id>, motion:<id>, or tts:<bubble_id>.
| Argument | Type | Description |
|---|---|---|
| story | any | Optional full replacement Story JSON. Targeted changes are cheaper/faster when possible. |
| changes | array | Targeted changes. Prefer this over full story replacement for small edits. |
| summary | string | Client-authored one-line revision summary. |
| comic_id* | string | Comic id to revise. |
| client_name | any | Host app or client name, for provenance. |
| dirty_nodes | any | Optional extra producer nodes, e.g. panel:p2u1, motion:p2u1, tts:p2u1a-b0. |
| client_model | any | Model or agent that authored the revision, for provenance. |
| base_story_hash* | string | Hash from comic_revision_brief. Prevents applying a patch over a stale story. |
| start_production |
Write and produce a Living Panels interactive comic from a one-paragraph premise. One call writes a complete 5-page comic (panels, dialogue, motion plan, voice casting) and starts generating every asset in the background: character sheet, ~13 panels of art with character consistency, ambient image-to-video motion for the liveliest panels, and per-line voice-over. Returns immediately with the story summary and a public reader_url where the comic can be read, watched live, and heard. Production takes several minutes — poll comic_status until ready, then share the reader_url.
| Argument | Type | Description |
|---|---|---|
| premise* | string | The story premise, one paragraph is plenty: who, where, the hook, the tone. Example: 'A neo-noir time-loop short: a night-shift radio host takes a call from her own voice, one day ahead.' |
{
"type": "object",
"required": [
"premise"
],
"properties": {
"premise": {
"type": "string",
"title": "Premise",
"minLength": 10,
"description": "The story premise, one paragraph is plenty: who, where, the hook, the tone. Example: 'A neo-noir time-loop short: a night-shift radio host takes a call from her own voice, one day ahead.'"
}
}
}Create a private reusable DesignForYou template from a structured brief. The returned template_id works immediately with get_text_fields and generate. This stores a user-owned template in the canonical catalog collection; it does not publish it to the anonymous gallery.
| Argument | Type | Description |
|---|---|---|
| name* | string | Reusable template name; repeated identical names are idempotent. |
| width* | integer | Canvas width in pixels, matching aspect_ratio. |
| height* | integer | Canvas height in pixels, matching aspect_ratio. |
| best_for | array | Optional concise use-case labels. |
| category* | string | Supported category: Infographics, Instagram Posts, Instagram Stories, App Store Previews, Logos, Visual Novel, Cinematic Stills, Comic Panels, Living Panels Comics, Character References, Architecture Diagrams, or Developer Tools. |
| base_prompt* | string | Visual subject, style, and data-rendering requirements; plain layout text only. |
| subcategory | any | Optional narrower catalog label. |
| text_fields |
Generate one or more finished images from a template (get a template_id from recommend_template or browse_templates) plus a description. Use this after the user has selected or explicitly supplied a template_id; otherwise call `recommend_template` first so the visual gallery can collect the selection. Works for all categories (Instagram, logo, app-store, Visual Novel backgrounds/sprites, CG illustrations). Pass variants for multi-image output (expressions, time-of-day, etc.). Pass session_id to refine a prior result. Pass context_ids to ground a new image on prior designs (character consistency for VN CG scenes). Set model to 'minimax-h3-image-balanced' or 'minimax-h3-image-quality' (or use the 'h3 balanced'/'h3 quality' aliases) to render through the MiniMax H3 image service; context_ids are forwarded as ordered H3 reference images.
| Argument | Type | Description |
|---|---|---|
| model | any | Optional image model override, such as grok-imagine-image-quality, gemini-3.1-flash-image, gpt-image-2, minimax-h3-image-balanced, or minimax-h3-image-quality. H3 aliases are 'h3 balanced' and 'h3 quality'. |
| variants | array | For character sheets: expression names e.g. ['neutral','smile','angry']. For backgrounds: time variants e.g. ['day','sunset','night']. For single images: omit or pass ['default']. |
| edit_tier | any | Quality tier when reference images (context_ids) are supplied. 'expert' routes the edit to gpt-image-2 for high-fidelity output; 'fast'/'pro' use Gemini. Ignored when no references are present. |
| session_id | any | Pass the session_id from a prior generate call to continue refining. The model will edit the previous image instead of generating from scratch. |
| context_ids |
Return the authenticated user's current credit balance, usage, and Stripe subscription status. Free to call.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}List a template's editable text fields (headline, subhead, CTA, etc.) with their current values. Free. Use right after a template is chosen and BEFORE `generate` when you want to fill the template's fields precisely instead of relying on a freeform description.
| Argument | Type | Description |
|---|---|---|
| template_id* | string | The template ID to get text fields for |
{
"type": "object",
"required": [
"template_id"
],
"properties": {
"template_id": {
"type": "string",
"title": "Template Id",
"minLength": 1,
"description": "The template ID to get text fields for"
}
}
}Recommend the best matching templates for any use case. Describe what you need and the system auto-detects the category and ranks templates by relevance. Return the recommendations so the user can pick a template from the visual gallery; do not call `generate` in the same turn unless the user explicitly names a template_id or asks you to skip selection.
| Argument | Type | Description |
|---|---|---|
| needs | any | Optional explicit needs such as favicon, navbar, og-image |
| category | any | Optional category override. Auto-detected from use_case if not provided. |
| use_case* | string | Describe what you need the template for (e.g. 'Instagram post for a restaurant daily special', 'logo for a fitness brand') |
| subcategory | any | Optional subcategory constraint such as lettermark or app_icon |
{
"type": "object",
"required": [
"use_case"
],
"properties": {
"needs": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"title": "Needs",
"description": "Optional explicit needs such as favicon, navbar, og-image"
},
"category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Category",
"description": "Optional category override. Auto-detected from use_case if not provided."
},
"use_case": {
"type": "string",
"title": "Use Case",
"minLength": 1,
"description": "Describe what you need the template for (e.g. 'Instagram post for a restaurant daily special', 'logo for a fitness brand')"
},
"subcategory": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Subcategory",
"description": "Optional subcategory constraint such as lettermark or app_icon"
}
}
}Generate one fixed-grid visual-novel character sprite sheet, crop it into cell assets, remove the chroma-key background, validate transparent sprites, and return a VN Creator-ready manifest. Base cost: 3 credits. Optional quality.hi_res_cells=true adds a reference-grounded per-cell re-render at full native resolution (fixes cells being limited to ~1/N of the sheet resolution) and bills +2 credits per cell re-rendered. quality.hi_res_model optionally routes the hi-res pass to a specific model (e.g. gpt-image-2 for fabric fidelity).
| Argument | Type | Description |
|---|---|---|
| cells* | array | |
| model | any | Image model override for the source sheet, e.g. gemini-3.1-flash-image. |
| sheet* | object | |
| style* | object | |
| output | object | |
| quality | object | |
| provider | any | Image provider override for the source sheet, e.g. gemini, grok, or a known model alias. |
| character* | object |
Return a fixed, no-cost DesignForYou widget payload for ChatGPT Apps debugging. Use this only to verify the template gallery/result iframe renders correctly; it does not generate images, use an LLM, or charge credits.
| Argument | Type | Description |
|---|---|---|
| mode | string | Which widget payload shape to return without generation. |
{
"type": "object",
"required": [],
"properties": {
"mode": {
"type": "string",
"title": "Mode",
"default": "templates",
"pattern": "^(templates|recommendations|designs)$",
"description": "Which widget payload shape to return without generation."
}
}
}| boolean |
| Regenerate inferred dirty assets after saving. |
{
"type": "object",
"required": [
"comic_id",
"base_story_hash"
],
"properties": {
"story": {
"anyOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
],
"title": "Story",
"description": "Optional full replacement Story JSON. Targeted changes are cheaper/faster when possible."
},
"changes": {
"type": "array",
"items": {
"type": "object",
"title": "ClientComicChangeInput",
"required": [
"path",
"value"
],
"properties": {
"path": {
"type": "string",
"title": "Path",
"description": "Allowed Story JSON path from comic_revision_brief, e.g. pages[0].panels[1].cells[0].art."
},
"value": {
"title": "Value",
"description": "Replacement value for the target path."
}
}
},
"title": "Changes",
"description": "Targeted changes. Prefer this over full story replacement for small edits."
},
"summary": {
"type": "string",
"title": "Summary",
"default": "",
"description": "Client-authored one-line revision summary."
},
"comic_id": {
"type": "string",
"title": "Comic Id",
"minLength": 1,
"description": "Comic id to revise."
},
"client_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Client Name",
"description": "Host app or client name, for provenance."
},
"dirty_nodes": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"title": "Dirty Nodes",
"description": "Optional extra producer nodes, e.g. panel:p2u1, motion:p2u1, tts:p2u1a-b0."
},
"client_model": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Client Model",
"description": "Model or agent that authored the revision, for provenance."
},
"base_story_hash": {
"type": "string",
"title": "Base Story Hash",
"minLength": 8,
"description": "Hash from comic_revision_brief. Prevents applying a patch over a stale story."
},
"start_production": {
"type": "boolean",
"title": "Start Production",
"default": true,
"description": "Regenerate inferred dirty assets after saving."
}
}
}| array |
| Editable copy fields returned by get_text_fields. |
| aspect_ratio* | string | One of 16:9, 1:1, 4:5, or 9:16. |
| layout_rules* | string | Stable layout hierarchy and chart/diagram rules; plain text only. |
{
"type": "object",
"required": [
"name",
"category",
"aspect_ratio",
"width",
"height",
"base_prompt",
"layout_rules",
"text_fields"
],
"properties": {
"name": {
"type": "string",
"title": "Name",
"maxLength": 100,
"minLength": 3,
"description": "Reusable template name; repeated identical names are idempotent."
},
"width": {
"type": "integer",
"title": "Width",
"maximum": 4096,
"minimum": 320,
"description": "Canvas width in pixels, matching aspect_ratio."
},
"height": {
"type": "integer",
"title": "Height",
"maximum": 4096,
"minimum": 320,
"description": "Canvas height in pixels, matching aspect_ratio."
},
"best_for": {
"type": "array",
"items": {
"type": "string"
},
"title": "Best For",
"maxItems": 8,
"description": "Optional concise use-case labels."
},
"category": {
"type": "string",
"title": "Category",
"maxLength": 60,
"minLength": 3,
"description": "Supported category: Infographics, Instagram Posts, Instagram Stories, App Store Previews, Logos, Visual Novel, Cinematic Stills, Comic Panels, Living Panels Comics, Character References, Architecture Diagrams, or Developer Tools."
},
"base_prompt": {
"type": "string",
"title": "Base Prompt",
"maxLength": 6000,
"minLength": 40,
"description": "Visual subject, style, and data-rendering requirements; plain layout text only."
},
"subcategory": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
],
"title": "Subcategory",
"description": "Optional narrower catalog label."
},
"text_fields": {
"type": "array",
"items": {
"type": "object",
"title": "EditableTextFieldInput",
"required": [
"key",
"label",
"default_value"
],
"properties": {
"key": {
"type": "string",
"title": "Key",
"maxLength": 40,
"minLength": 1,
"description": "Stable snake_case field key, e.g. headline"
},
"label": {
"type": "string",
"title": "Label",
"maxLength": 60,
"minLength": 2,
"description": "Human-readable field label"
},
"max_length": {
"type": "integer",
"title": "Max Length",
"default": 120,
"maximum": 240,
"minimum": 1,
"description": "Maximum copy length for this field"
},
"default_value": {
"type": "string",
"title": "Default Value",
"maxLength": 240,
"minLength": 1,
"description": "Default editable copy"
}
}
},
"title": "Text Fields",
"maxItems": 12,
"minItems": 1,
"description": "Editable copy fields returned by get_text_fields."
},
"aspect_ratio": {
"type": "string",
"title": "Aspect Ratio",
"description": "One of 16:9, 1:1, 4:5, or 9:16."
},
"layout_rules": {
"type": "string",
"title": "Layout Rules",
"maxLength": 3000,
"minLength": 20,
"description": "Stable layout hierarchy and chart/diagram rules; plain text only."
}
}
}| array |
| Design IDs of prior outputs to use as visual context. Use for CG scenes that should match a previously generated character. |
| description* | string | What you want - describe the scene, asset, or design in as much detail as needed |
| template_id* | string | Template ID from browse_templates |
| context_labels | array | Optional human labels for each context_id, in the SAME order. When the edit routes to a multi-reference model (gpt-image-2), an ordered legend ('reference image 1 = <label>, ...') is appended to the prompt so the model binds each named subject to its own reference instead of blending identities. Ignored for single-reference edits. |
| reference_urls | array | Optional ordered inline or HTTPS image references for direct image-model grounding. Use with reference_labels and reference_roles when supplying cast or location images. |
| reference_roles | array | Optional roles aligned with reference_urls, such as identity or location. |
| reference_labels | array | Optional labels aligned with reference_urls. |
| skip_prompt_merge | boolean | Skip the smart prompt-merge step (which compresses to ~150 words) and send the description through verbatim, with the template's base prompt concatenated for style. Use when the description is already complete and precise — e.g. a multi-character scene where each subject's outfit and a reference->subject legend must survive intact. Ignored on refines. |
{
"type": "object",
"required": [
"template_id",
"description"
],
"properties": {
"model": {
"enum": [
"grok-imagine-image-quality",
"gemini-3.1-flash-image",
"gpt-image-2",
"minimax-h3-image-balanced",
"minimax-h3-image-quality",
"h3 balanced",
"h3 quality"
],
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Model",
"description": "Optional image model override, such as grok-imagine-image-quality, gemini-3.1-flash-image, gpt-image-2, minimax-h3-image-balanced, or minimax-h3-image-quality. H3 aliases are 'h3 balanced' and 'h3 quality'."
},
"variants": {
"type": "array",
"items": {
"type": "string"
},
"title": "Variants",
"default": [
"default"
],
"description": "For character sheets: expression names e.g. ['neutral','smile','angry']. For backgrounds: time variants e.g. ['day','sunset','night']. For single images: omit or pass ['default']."
},
"edit_tier": {
"anyOf": [
{
"type": "string",
"pattern": "^(fast|pro|expert)$"
},
{
"type": "null"
}
],
"title": "Edit Tier",
"description": "Quality tier when reference images (context_ids) are supplied. 'expert' routes the edit to gpt-image-2 for high-fidelity output; 'fast'/'pro' use Gemini. Ignored when no references are present."
},
"session_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Session Id",
"description": "Pass the session_id from a prior generate call to continue refining. The model will edit the previous image instead of generating from scratch."
},
"context_ids": {
"type": "array",
"items": {
"type": "string"
},
"title": "Context Ids",
"description": "Design IDs of prior outputs to use as visual context. Use for CG scenes that should match a previously generated character."
},
"description": {
"type": "string",
"title": "Description",
"minLength": 1,
"description": "What you want - describe the scene, asset, or design in as much detail as needed"
},
"template_id": {
"type": "string",
"title": "Template Id",
"minLength": 1,
"description": "Template ID from browse_templates"
},
"context_labels": {
"type": "array",
"items": {
"type": "string"
},
"title": "Context Labels",
"description": "Optional human labels for each context_id, in the SAME order. When the edit routes to a multi-reference model (gpt-image-2), an ordered legend ('reference image 1 = <label>, ...') is appended to the prompt so the model binds each named subject to its own reference instead of blending identities. Ignored for single-reference edits."
},
"reference_urls": {
"type": "array",
"items": {
"type": "string"
},
"title": "Reference Urls",
"maxItems": 6,
"description": "Optional ordered inline or HTTPS image references for direct image-model grounding. Use with reference_labels and reference_roles when supplying cast or location images."
},
"reference_roles": {
"type": "array",
"items": {
"type": "string"
},
"title": "Reference Roles",
"maxItems": 6,
"description": "Optional roles aligned with reference_urls, such as identity or location."
},
"reference_labels": {
"type": "array",
"items": {
"type": "string"
},
"title": "Reference Labels",
"maxItems": 6,
"description": "Optional labels aligned with reference_urls."
},
"skip_prompt_merge": {
"type": "boolean",
"title": "Skip Prompt Merge",
"default": false,
"description": "Skip the smart prompt-merge step (which compresses to ~150 words) and send the description through verbatim, with the template's base prompt concatenated for style. Use when the description is already complete and precise — e.g. a multi-character scene where each subject's outfit and a reference->subject legend must survive intact. Ignored on refines."
}
}
}{
"type": "object",
"required": [
"character",
"style",
"sheet",
"cells"
],
"properties": {
"cells": {
"type": "array",
"items": {
"type": "object",
"title": "VNSpriteCell",
"required": [
"id",
"pose",
"expression"
],
"properties": {
"id": {
"type": "string",
"title": "Id",
"minLength": 1
},
"pose": {
"type": "string",
"title": "Pose",
"minLength": 1
},
"notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Notes"
},
"props": {
"type": "array",
"items": {
"type": "string"
},
"title": "Props"
},
"camera": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Camera"
},
"direction": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Direction"
},
"expression": {
"type": "string",
"title": "Expression",
"minLength": 1
}
}
},
"title": "Cells",
"minItems": 1
},
"model": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Model",
"description": "Image model override for the source sheet, e.g. gemini-3.1-flash-image."
},
"sheet": {
"type": "object",
"title": "VNSpriteSheetConfig",
"required": [
"cell_width",
"cell_height"
],
"properties": {
"layout": {
"enum": [
"2x2",
"3x2",
"4x2"
],
"type": "string",
"title": "Layout",
"default": "3x2"
},
"padding": {
"type": "string",
"title": "Padding",
"default": "generous"
},
"full_body": {
"type": "boolean",
"title": "Full Body",
"default": true
},
"background": {
"type": "object",
"title": "VNSpriteBackground",
"properties": {
"mode": {
"type": "string",
"const": "chroma_key",
"title": "Mode",
"default": "chroma_key"
},
"color": {
"type": "string",
"title": "Color",
"default": "#00ff00"
}
}
},
"cell_width": {
"type": "integer",
"title": "Cell Width",
"minimum": 32
},
"cell_height": {
"type": "integer",
"title": "Cell Height",
"minimum": 32
}
}
},
"style": {
"type": "object",
"title": "VNSpriteStyle",
"required": [
"preset",
"rendering"
],
"properties": {
"preset": {
"type": "string",
"title": "Preset",
"minLength": 1
},
"rendering": {
"type": "string",
"title": "Rendering",
"minLength": 1
},
"consistency_reference_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Consistency Reference Url"
},
"consistency_reference_asset_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Consistency Reference Asset Id"
}
}
},
"output": {
"type": "object",
"title": "VNSpriteOutputOptions",
"properties": {
"format": {
"type": "string",
"const": "png",
"title": "Format",
"default": "png"
},
"include_crops": {
"type": "boolean",
"title": "Include Crops",
"default": true
},
"include_source_sheet": {
"type": "boolean",
"title": "Include Source Sheet",
"default": true
},
"include_alpha_sprites": {
"type": "boolean",
"title": "Include Alpha Sprites",
"default": true
},
"include_contact_sheets": {
"type": "boolean",
"title": "Include Contact Sheets",
"default": true
}
}
},
"quality": {
"type": "object",
"title": "VNSpriteQualityOptions",
"properties": {
"hi_res_cells": {
"type": "boolean",
"title": "Hi Res Cells",
"default": false,
"description": "Opt-in: after cropping each cell from the consistency grid, run a reference-grounded image-to-image re-render of that cell at full native model resolution (the crop is the identity/pose reference). Fixes cells being limited to ~1/N of the sheet resolution. Billed as an extra image call per cell (+2 credits each)."
},
"hi_res_model": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Hi Res Model",
"description": "Optional model override for the per-cell hi-res re-render, e.g. gpt-image-2 for fabric fidelity. Defaults to the source sheet's provider/model. Accepts gemini, grok, and gpt-image-2 aliases."
},
"validate_cells": {
"type": "boolean",
"title": "Validate Cells",
"default": true
},
"generation_quality": {
"type": "string",
"title": "Generation Quality",
"default": "high"
},
"regenerate_on_validation_failure": {
"type": "boolean",
"title": "Regenerate On Validation Failure",
"default": false
}
}
},
"provider": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Provider",
"description": "Image provider override for the source sheet, e.g. gemini, grok, or a known model alias."
},
"character": {
"type": "object",
"title": "VNSpriteCharacter",
"required": [
"id",
"name",
"role"
],
"properties": {
"id": {
"type": "string",
"title": "Id",
"minLength": 1
},
"name": {
"type": "string",
"title": "Name",
"minLength": 1
},
"role": {
"type": "string",
"title": "Role",
"minLength": 1
},
"age_range": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Age Range"
},
"description": {
"type": "object",
"title": "Description",
"additionalProperties": {
"type": "string"
}
}
}
}
}
}