How to Migrate Prose Prompts to GPT-Image2 JSON Templates: A Complete Guide
Convert your free-form prompt descriptions into structured JSON templates that GPT-Image2 can parse, store, and render reproducibly.
GPT-Image2 expects prompts in a standardized JSON format rather than raw prose strings. Migrating your existing text-based prompts unlocks template reusability, parameter precision through explicit fields like cfgScale and seed, and seamless integration with the repository's generation pipeline. This guide walks through the exact transformation process using the repository's actual tooling.
1. Understand the Target JSON Schema
Before migration, you must know the schema that GPT-Image2 consumes. The canonical structure is defined in docs/templates.md and implemented in data/style-library.json:
{
"name": "tpl-cyberpunk-portrait",
"title": "Cyberpunk Portrait",
"description": "Futuristic character with neon accents",
"prompt": "A close-up portrait of a cybernetically enhanced woman, glowing cyan neural implants, rain-slicked streets reflected in her irises, volumetric fog, 8k detail",
"style": "photorealistic",
"cfgScale": 7.5,
"steps": 60,
"seed": 42,
"type": "image"
}
| Field | Type | Purpose |
|---|---|---|
name |
string | Unique identifier used in API calls and UI references |
title |
string | Human-readable display label |
description |
string | Tooltip or documentation string |
prompt |
string | The core natural-language description passed to the diffusion model |
style |
string | Preset selector (e.g., photorealistic, illustration, low-poly) |
cfgScale |
number | Classifier-free guidance scale (typically 6–12) |
steps |
integer | Inference steps count (20–150) |
seed |
integer || null | Reproducibility seed; null yields random generation |
type |
string | Content category (always "image" in current implementation) |
The api/generate-image.js endpoint validates these fields before forwarding them to the Stable Diffusion backend. Invalid or missing cfgScale or steps values default to repository-defined constants.
2. Parse Your Prose Prompt into Semantic Components
A typical prose prompt embeds multiple instructions that must be teased apart:
"Make a fantasy book cover showing a dragon rising from molten gold, dramatic rim lighting, oil painting style, high detail, seed 777 for consistency."
Extract the structured data:
| Source Fragment | JSON Field | Value |
|---|---|---|
| "fantasy book cover…" | prompt |
Core description minus style/syntax markers |
| "oil painting style" | style |
illustration (mapped from natural description) |
| "seed 777" | seed |
777 |
| (implicit) | cfgScale |
7 (default) |
| "high detail" | steps |
60 (inferred from quality descriptor) |
The repository provides no automated prose parser, but you can implement extraction logic in scripts/generate-style-skill.mjs style:
// scripts/parse-prose.mjs
import fs from 'fs';
const PROSE = `Make a fantasy book cover showing a dragon rising from molten gold,
dramatic rim lighting, oil painting style, high detail, seed 777 for consistency.`;
function extractTemplate(prose, id) {
// Pattern matching for explicit parameters
const seedMatch = prose.match(/seed\s*[:=]?\s*(\d+)/i);
const styleMap = {
'oil painting': 'illustration',
'photorealistic': 'photorealistic',
'anime': 'anime',
'3d render': '3d-render'
};
// Detect style keyword
const detectedStyle = Object.keys(styleMap)
.find(k => prose.toLowerCase().includes(k)) || 'photorealistic';
// Strip metadata markers from prompt body
const cleanPrompt = prose
.replace(/seed\s*[:=]?\s*\d+/gi, '')
.replace(/,? (oil painting|photorealistic|anime|3d render) style/gi, '')
.replace(/high detail/gi, '')
.trim();
return {
name: `tpl-parsed-${id}`,
title: `Parsed Template ${id}`,
description: 'Auto-extracted from prose',
prompt: cleanPrompt,
style: styleMap[detectedStyle],
cfgScale: 7,
steps: prose.match(/high detail|8k|intricate/i) ? 60 : 30,
seed: seedMatch ? parseInt(seedMatch[1], 10) : null,
type: 'image'
};
}
const template = extractTemplate(PROSE, Date.now());
console.log(JSON.stringify(template, null, 2));
Run this to preview your extracted structure before committing.
3. Persist Templates to the Style Library
The runtime source of truth is data/style-library.json. Append your migrated template:
# Using Node for safe JSON manipulation
node -e "
const fs = require('fs');
const lib = JSON.parse(fs.readFileSync('data/style-library.json', 'utf8'));
const newTpl = $(cat /tmp/extracted-template.json);
lib.templates = lib.templates || [];
lib.templates.push(newTpl);
fs.writeFileSync('data/style-library.json', JSON.stringify(lib, null, 2));
"
The lib.templates array is what src/main.jsx enumerates when rendering the template gallery. Each entry becomes a selectable card in the UI.
4. Regenerate Style Skill Assets
After updating data/style-library.json, rebuild the derived assets so the UI and documentation stay synchronized:
node scripts/generate-style-skill.mjs
This script performs three critical operations:
- Validates every template name against anchors in
docs/templates.md(line 53) - Generates thumbnail metadata and preview configurations
- Updates cached skill definitions consumed by the frontend state management
The anchor-check ensures that each name field has corresponding documentation. If you see validation errors, add a section to docs/templates.md:
### tpl-parsed-1693502400000
**Category**: Fantasy & Book Covers
**Prompt**: A dragon rising from molten gold, dramatic rim lighting...
**Style**: illustration
**CFG Scale**: 7
**Steps**: 60
**Seed**: 777 (fixed)
**Migration Source**: Original prose prompt, 2023-08-31
5. Verify End-to-End Integration
Test the migrated template through the API:
curl -X POST http://localhost:3000/api/generate-image \
-H "Content-Type: application/json" \
-d '{
"templateId": "tpl-parsed-1693502400000",
"variations": 1
}'
The api/generate-image.js handler (around lines where p_prompt is destructured) resolves the templateId to the full JSON object from data/style-library.json, then forwards prompt, cfgScale, steps, and seed to the diffusion pipeline.
For UI verification, start the development server:
npm run dev
Navigate to the template gallery; your migrated entry appears with its title and description rendered from the JSON fields.
6. Batch Migration Workflow
For dozens or hundreds of prose prompts, orchestrate the pipeline:
// scripts/batch-migrate.mjs
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const PROSE_DIR = path.join(__dirname, '../prose-inputs');
const LIB_PATH = path.join(__dirname, '../data/style-library.json');
const library = JSON.parse(fs.readFileSync(LIB_PATH, 'utf8'));
library.templates = library.templates || [];
const proseFiles = fs.readdirSync(PROSE_DIR).filter(f => f.endsWith('.txt'));
proseFiles.forEach((file, idx) => {
const prose = fs.readFileSync(path.join(PROSE_DIR, file), 'utf8');
const id = `${Date.now()}-${idx}`;
// Reuse extraction logic from Step 2
const template = extractTemplate(prose, id);
library.templates.push(template);
console.log(`✅ Migrated: ${file} → ${template.name}`);
});
fs.writeFileSync(LIB_PATH, JSON.stringify(library, null, 2));
console.log(`\n🔄 Run: node scripts/generate-style-skill.mjs`);
Execute:
mkdir prose-inputs
# Copy your .txt prompt files into prose-inputs/
node scripts/batch-migrate.mjs
node scripts/generate-style-skill.mjs
Summary
- Extract semantic fields (prompt text, style, seed, quality hints) from prose using pattern matching
- Structure the extracted data into the JSON schema defined in
docs/templates.md - Persist templates to
data/style-library.jsonfor runtime consumption - Validate by running
scripts/generate-style-skill.mjsto ensure documentation parity - Test via
api/generate-image.jsendpoints or thesrc/main.jsxfrontend - Document new templates in
docs/templates.mdfor discoverability
Frequently Asked Questions
What happens if I omit the seed field in my JSON template?
The api/generate-image.js handler treats null or missing seed as a signal to generate a random seed per request. For reproducible outputs, always provide an explicit integer.
Can I nest templates or reference one template from another?
The current schema in data/style-library.json does not support composition or inheritance. Each template must be self-contained. For variant generation, duplicate the base template and modify specific fields.
How does scripts/generate-style-skill.mjs know if my template is documented?
The script performs an anchor check at line 53: it scans docs/templates.md for ### {template.name} headers. If missing, the build warns and skips asset generation for that template until documentation is added.
What cfgScale and steps values should I use for migrated prompts?
Default to cfgScale: 7 and steps: 50 as conservative starting points. Increase steps to 60–80 for prompts containing "high detail," "intricate," or "8k." Raise cfgScale to 8–10 for stronger prompt adherence, or lower to 5–6 for more creative interpretation.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →