generate-illustration
activev2026.08.22Generate a full-scene illustration (detailed background, environment, lighting) in one of 25 styles, plus classifier-produced catalog metadata and an OCR text gate.
This page renders the template’s published registry entry — the contract itself, not a description of it. Immutable versions; sealed properties exist but are not public.
What you provide — intake contract
How it runs — step topology
1
Render illustrationimageimageGenerator
promptTemplate
2
Classify assetllmclassifier
systempromptTemplatemaxTokens
3
Text gatellmtextGategate
Hard gate: the run fails unless pass — OCR text gate rejected the render
systempromptTemplatemaxTokens
Model roles: imageGenerator classifier textGate bindings budgetPolicy
What you get — artifact
illustrationvisual
Version lineage
2026.08.22rev 67current2026-08-22
sha256:787da6fca…
2026.07.04rev 522026-08-06
sha256:76366421c…
2026.07.04rev 262026-07-26
sha256:5ed1aa5aa…
2026.07.04rev 12026-07-04
sha256:2323a12ce…
Full contract (as served)
GET /v1/catalog/workflows/generate-illustration
{
"_comment": "SYNCED SNAPSHOT — do not hand-edit. Regenerate with: node scripts/sync-workflow-catalog.mjs (pulls api.esy.com GET /v1/catalog/workflows/{id}).",
"generatedAt": "2026-09-07T04:32:14.515090Z",
"id": "generate-illustration",
"name": "Generate Illustration",
"description": "Generate a full-scene illustration (detailed background, environment, lighting) in one of 25 styles, plus classifier-produced catalog metadata and an OCR text gate.",
"shortDescription": "Full-scene styled illustration with classification.",
"artifactClass": "visual",
"outputType": "visual",
"status": "active",
"supersededById": null,
"version": "2026.08.22",
"stages": [
{
"name": "Render",
"description": "Compose the styled scene prompt and call the image model.",
"stepCount": 1
},
{
"name": "Classify",
"description": "Produce catalog metadata, then run the OCR text gate.",
"stepCount": 2
}
],
"intakeSchema": {
"fields": [
{
"name": "prompt",
"type": "string",
"required": true,
"description": "Scene to illustrate"
},
{
"name": "style",
"type": "enum",
"required": true,
"description": "Illustration style",
"default": "flat",
"options": [
"flat",
"cartoon",
"watercolor",
"vintage",
"3d",
"doodle",
"kawaii",
"storybook",
"digital-art",
"fantasy",
"anime",
"collage",
"gouache",
"paper-art",
"chalk-pastel",
"retro",
"isometric",
"line-art",
"pencil-sketch",
"comic",
"pixel-art",
"pop-art",
"minimalist",
"botanical",
"cinematic"
]
},
{
"name": "aspectRatio",
"type": "enum",
"required": true,
"description": "Aspect ratio",
"default": "4:3",
"options": [
"4:3",
"1:1",
"3:4",
"16:9"
]
},
{
"name": "quality",
"type": "enum",
"required": false,
"description": "Render quality tier",
"default": "medium",
"options": [
"low",
"medium",
"high"
]
},
{
"name": "categories",
"type": "string",
"required": true,
"description": "Comma-separated category slugs the classifier must choose from (empty fails the run in preflight)"
},
{
"name": "textPolicy",
"type": "enum",
"required": false,
"default": "",
"options": [
"",
"none",
"exact",
"freeform"
],
"description": "Per-item text contract: none = text forbidden; exact = must match expectedText; freeform = text allowed, judged on legibility/spelling only. Empty derives from textBearing (true=exact, false=freeform). Use 'none' deliberately, for assets that must carry no characters at all."
},
{
"name": "textBearing",
"type": "boolean",
"required": false,
"default": false,
"description": "True when the asset must carry legible text (the OCR gate then checks it)"
},
{
"name": "expectedText",
"type": "string",
"required": false,
"default": "",
"description": "The EXACT text the asset must carry; leave empty unless textPolicy is 'exact'"
}
]
},
"runtimeSteps": [
{
"id": "step-1",
"name": "Render illustration",
"kind": "image",
"role": "imageGenerator",
"promptTemplate": "redacted"
},
{
"id": "step-2",
"name": "Classify asset",
"kind": "llm",
"capability": "text",
"role": "classifier",
"jsonSchema": {
"type": "object",
"properties": {
"title": {
"type": "string",
"description": "Catalog-ready title, <= 60 chars"
},
"slug": {
"type": "string",
"description": "kebab-case URL slug"
},
"description": {
"type": "string",
"description": "1-2 sentence SEO-friendly description"
},
"category": {
"type": "string",
"description": "Exactly one of the provided category slugs"
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "3-8 search tags"
}
},
"required": [
"title",
"slug",
"description",
"category"
],
"additionalProperties": false
},
"system": "redacted",
"promptTemplate": "redacted",
"maxTokens": "redacted"
},
{
"id": "step-3",
"name": "Text gate",
"kind": "llm",
"capability": "text",
"role": "textGate",
"requireTrue": "pass",
"failMessage": "OCR text gate rejected the render",
"jsonSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"foundText": {
"type": "string",
"description": "All legible text read from the image; empty if none"
},
"pass": {
"type": "boolean"
},
"reason": {
"type": "string"
}
},
"required": [
"foundText",
"pass",
"reason"
]
},
"system": "redacted",
"promptTemplate": "redacted",
"maxTokens": "redacted"
}
],
"gates": [
{
"id": "gate-render",
"name": "Provider execution",
"type": "quality",
"inputs": [
"intake"
],
"outputs": [
"illustration"
],
"unlocks": [
"step-2"
]
},
{
"id": "gate-text",
"name": "Text gate",
"type": "quality",
"inputs": [
"illustration"
],
"outputs": [
"verified-image"
]
}
],
"artifactSchema": {
"artifactClass": "visual",
"artifactType": "illustration",
"files": [
"image/webp"
],
"metadata": {
"style": "string",
"aspectRatio": "enum [4:3, 1:1, 3:4, 16:9]",
"quality": "enum [low, medium, high]",
"classification": "object"
}
},
"providers": {
"imageGenerator": "redacted",
"classifier": "redacted",
"textGate": "redacted"
},
"budgetPolicy": "redacted",
"versions": [
{
"version": "2026.07.04",
"revision": 1,
"contentHash": "sha256:2323a12ce55302e72eddc3ba89db53af3ea5a8d443091fcd39cb5d1cbeae6c65",
"createdAt": "2026-07-04T21:49:03.297839Z"
},
{
"version": "2026.07.04",
"revision": 26,
"contentHash": "sha256:5ed1aa5aad23c2b43db13e5c40c0af58db7f49cbbfb7f34b847410b5430b495b",
"createdAt": "2026-07-26T00:51:06.773051Z"
},
{
"version": "2026.07.04",
"revision": 52,
"contentHash": "sha256:76366421cec4ea973a76b1eb715b7bc9a598ed8bf836e6c4d0cc928ff09cb573",
"createdAt": "2026-08-06T22:08:47.634152Z"
},
{
"version": "2026.08.22",
"revision": 67,
"contentHash": "sha256:787da6fca183754ea2ca7ae3aaba5aa55d10c29e8194e58b11644acf62595e65",
"createdAt": "2026-08-22T21:33:33.982946Z"
}
],
"updatedAt": "2026-09-06T00:04:41.840544Z"
}Snapshot generated 2026-09-07 from the live registry.
