Raw schema
{
"type": "object",
"properties": {
"form": {
"type": "string",
"description": "the form menu pick (see description) β the routing field"
},
"form_description": {
"type": "string"
},
"headline": {
"type": "string",
"description": "the assertion-style slide title"
},
"context": {
"type": "string",
"description": "one-line subtitle/standfirst"
},
"subject": {
"type": "string",
"description": "central entity for forms that have one β hub label, org root, section #, fork origin, media label (per-form)."
},
"blocks": {
"type": "array",
"items": {
"type": "object"
},
"description": "list: [{\"label\",\"sub\",\"detail\":[str],\"emphasis\",\"icon\":lucide-name,\"metric\":{value,label}}]"
},
"metric": {
"type": "object"
},
"data": {
"type": "object",
"description": "family-specific payload β see the documented shapes"
},
"takeaway": {
"type": "string",
"description": "optional verdict band (per-form). Put the so-what in the headline; add only for a verdict the title can't carry β not every slide."
},
"caution": {
"type": "string",
"description": "one-line risk / caveat callout (per-form)."
},
"highlight": {
"type": "string",
"description": "one-line emphasis callout (per-form)."
},
"source_note": {
"type": "string",
"description": "source / footnote line (per-form)."
},
"date": {
"type": "string",
"description": "date callout (per-form)."
},
"image_src": {
"type": "string",
"description": "https URL | asset:<id> for image-bearing forms"
},
"image_prompt": {
"type": "string",
"description": "generate an image when no image_src (+$0.05)"
},
"brief": {
"type": "string",
"description": "prose fallback / extra context for fills"
},
"theme_id": {
"type": "string",
"description": "Optional theme id from browse_catalog(type=themes). Omit for Default (slideforge_standard)."
},
"name": {
"type": "string"
},
"variant": {
"type": "string",
"description": "pin a specific variant within the form (list them via browse_catalog). Unknown variant -> rejected ($0) with the valid list; set allow_variant_fallback to render the family default instead."
},
"allow_variant_fallback": {
"type": "boolean",
"description": "If the pinned variant is unknown, render the form's default variant (with a warning) instead of rejecting. Default false."
},
"variant_policy": {
"type": "string",
"enum": [
"best_semantic_match",
"production_safe"
],
"description": "Routed-variant maturity policy: production_safe = if the ROUTED variant is draft/beta, render the family's demo-safe sibling instead (warning names both). Never overrides an explicit variant=. Default best_semantic_match."
},
"allow_low_confidence": {
"type": "boolean",
"description": "Brief routing only: by default a brief that doesn't match a form clearly returns status=needs_confirmation + candidates at cost:0 (no guessed render). Set true to render the top guess and bill it. Default false."
},
"allow_fabrication": {
"type": "boolean",
"description": "Brief mode only: by default a bare brief on a DATA form (kpi/funnel/comparison/β¦) returns status=would_fabricate at cost:0 rather than INVENT the numbers/entities. Supply the data as typed fields to render verbatim, or set true to let the brief author them (fidelity=ai_completed). Default false."
},
"allow_truncation": {
"type": "boolean",
"description": "By default, supplying MORE items than a form holds is a blocking error (it would drop your data) β the response names the dropped count + a suggested_split. Set true to render the capacity subset anyway (fidelity=verbatim_truncated, never verbatim). Default false."
},
"dry_run": {
"type": "boolean",
"description": "Free pre-commit check (intent or mode=code), cost:0, no PPTX: status + warnings/errors, plus fidelity_forecast (verbatim|mixed|ai_completed|would_reject) and which fields bind vs get authored. Fix errors, re-call with dry_run=false to render."
},
"quality_profile": {
"type": "string",
"enum": [
"executive",
"technical",
"appendix"
],
"description": "Thresholds layout.presentation_ready is judged against (executive strictest). Measurement only β never blocks a render or changes cost."
},
"min_font_pt": {
"type": "number",
"minimum": 6,
"maximum": 40,
"description": "Binding type floor for prose (exhibit furniture has its own). Type grows to meet it; content that can't fit is a $0 min_font_not_met naming the size needed β allow_truncation renders the fitting subset. Typical: 12."
},
"imagery": {
"type": "string",
"enum": [
"photo",
"wash",
"off"
],
"description": "Cover/section-divider imagery: photo (default β curated stock photo, half-bleed), wash (abstract color wash), off (typographic only). Content slides are never photo-decorated."
},
"imagery_tag": {
"type": "string",
"enum": [
"general",
"agriculture",
"construction",
"education",
"energy",
"finance",
"government",
"healthcare",
"logistics",
"manufacturing",
"retail",
"technology",
"travel"
],
"description": "Industry bucket for cover/section photos. Omit for the general pool."
},
"styling": {
"type": "string",
"enum": [
"topical",
"clean"
],
"description": "Subject-informed palette + designed cover on default themes (on by default; the design note names the choice). clean = neutral look. Pinned themes never take it."
},
"force_render": {
"type": "boolean",
"description": "On completed_with_errors, pptx_url is null (broken slide). Set true to get it anyway. No cost/status effect."
},
"code": {
"type": "string",
"description": "Python code defining build(prs). Canvas 13.33Γ7.5\", coords in inches. Pre-imported: Presentation, Inches, Pt, Emu, RGBColor, MSO_ANCHOR, PP_ALIGN. Helpers: add_text_box(slide, left, top, w, h, text, font_size=12, bold=False, color=None), add_box(slide, left, top, w, h, fill_color=None, line_color=None, corner_radius=0.05), add_icon, add_image (src = path or https://); theme_color(name) β RGBColor. add_widget(slide, name, x, y, w, h, params=|content=, theme=THEME) draws board-grade SSG widgets/charts (cards, waterfall, gantt, funnelβ¦) β names via `browse_catalog(type=widgets)`. Use font_size=, not size=; use fill_color=, not fill=. When chrome is supplied, use `build(prs, slide)` β chrome is pre-rendered. Helper signatures: `browse_catalog(type=helpers)`."
},
"job_id": {
"type": "string",
"description": "Previous job ID (for mode=status, or mode=code patching)"
},
"replacements": {
"type": "array",
"description": "String replacements on loaded code [{old, new}] (for mode=code with job_id)",
"items": {
"type": "object",
"properties": {
"old": {
"type": "string",
"description": "Exact string to find"
},
"new": {
"type": "string",
"description": "Replacement string"
}
},
"required": [
"old",
"new"
]
}
},
"language": {
"type": "string",
"enum": [
"en",
"de",
"fr",
"es",
"it",
"pt",
"nl",
"pl"
],
"description": "Target language (default: en)"
},
"include_preview": {
"type": "string",
"enum": [
"none",
"small",
"default",
"full"
],
"description": "Inline-preview PAYLOAD only (not execution). Default: default (768px). none omits the inline image and returns just the URLs β it does NOT change sync/async. Use `wait` to control execution."
},
"detail": {
"type": "string",
"enum": [
"compact",
"full"
],
"description": "Response verbosity. Default `compact`: status, form/variant, fidelity (verbatim|mixed|ai_completed), warnings[]/errors[] (only when present), urls, cost. `full` adds a debug object (engine internals, verify events, latency buckets)."
},
"verify": {
"type": "string",
"enum": [
"off",
"lint",
"lint+vlm",
"full"
],
"description": "mode=code tier. Default `lint`: static geometry linter (overlap/off-canvas/zero-size) + composer content validators β no LLM. `lint+vlm` adds a VLM second-look (~+3s) and makes a blank/contentless render a $0 error, not a billed warning. `off` skips checks."
},
"wait": {
"type": "string",
"enum": [
"auto",
"true",
"false"
],
"description": "AI-image slides block ~10-15s; `false` returns a job_id to poll, not block (mode=brief)."
},
"logo_id": {
"type": "string",
"description": "Optional brand logo (from upload_asset purpose=logo) drawn as chrome on content slides; covers/section breaks stay clean."
},
"mode": {
"type": "string",
"enum": [
"safe",
"brief",
"code",
"status"
],
"description": "Default: structured intent / brief. safe = validate-then-render in ONE call (renders + bills only if faithful; else $0 invalid report with the fix β recommended, no dry_run round-trip). code = python-pptx escape. status = poll."
}
}
}