removedInput schema / $defs / GenerationCommand
Removed value: -{
- "additionalProperties": false,
- "description": "Versioned command shared by REST, Agent, MCP, jobs, and briefs.\n\nThe nested ``input`` is intentionally the API's public intent model. A\nfield added there therefore appears automatically in this command's JSON\nschema, serialization, and persisted brief representation.",
- "properties": {
- "input": {
- "$ref": "#/$defs/GenerationIntent"
- },
- "schema_version": {
- "const": 2,
- "type": "integer"
- },
- "source": {
- "default": null,
- "discriminator": {
- "propertyName": "type"
- },
- "oneOf": [
- {
- "properties": {
- "generation_result_id": {
- "minimum": 1,
- "type": "integer"
- },
- "type": {
- "const": "generation_result",
- "type": "string"
- }
- },
- "required": [
- "type",
- "generation_result_id"
- ],
- "type": "object"
- },
- {
- "properties": {
- "type": {
- "const": "uploaded_file",
- "type": "string"
- },
- "uploaded_file_id": {
- "minimum": 1,
- "type": "integer"
- }
- },
- "required": [
- "type",
- "uploaded_file_id"
- ],
- "type": "object"
- },
- {
- "properties": {
- "image_url": {
- "minLength": 1,
- "type": "string"
- },
- "type": {
- "const": "public_url",
- "type": "string"
- }
- },
- "required": [
- "type",
- "image_url"
- ],
- "type": "object"
- },
- {
- "description": "Durable identity for a source produced by an earlier pipeline step.",
- "properties": {
- "output_index": {
- "minimum": 0,
- "type": "integer"
- },
- "post_claim_reference": {
- "minLength": 1,
- "type": "string"
- },
- "step_index": {
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "pipeline_step",
- "type": "string"
- }
- },
- "required": [
- "type",
- "post_claim_reference",
- "step_index",
- "output_index"
- ],
- "type": "object"
- }
- ],
- "properties": {
- "generation_result_id": {
- "minimum": 1,
- "type": "integer"
- },
- "image_url": {
- "minLength": 1,
- "type": "string"
- },
- "output_index": {
- "minimum": 0,
- "type": "integer"
- },
- "post_claim_reference": {
- "minLength": 1,
- "type": "string"
- },
- "step_index": {
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "enum": [
- "generation_result",
- "uploaded_file",
- "public_url",
- "pipeline_step"
- ],
- "type": "string"
- },
- "uploaded_file_id": {
- "minimum": 1,
- "type": "integer"
- }
- },
- "type": "object"
- }
- },
- "required": [
- "schema_version",
- "input"
- ],
- "type": "object"
-}
removedInput schema / $defs / GenerationIntent
Removed value: -{
- "additionalProperties": false,
- "description": "Caller-owned model-generation intent shared by every public adapter.\n\nAuthentication-derived identity deliberately does not belong here. REST,\nAgent, MCP, batch, and integrations all submit this exact contract; the\ncommand planner combines it with server-owned execution context later. MCP omits webhook callback configuration, which remains API-only.",
- "properties": {
- "alignment": {
- "default": null,
- "enum": [
- "left",
- "center",
- "right",
- "top",
- "bottom"
- ],
- "type": "string"
- },
- "art_direction_id": {
- "default": null,
- "minimum": 1,
- "type": "integer"
- },
- "aspect_ratio": {
- "default": null,
- "type": "string"
- },
- "audio_ref_urls": {
- "default": null,
- "description": "Public audio URLs supplied as model references. Only models that declare a positive max_reference_audio capability accept them.",
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- "avatar_id": {
- "default": null,
- "minimum": 1,
- "type": "integer"
- },
- "backdrop_mode": {
- "default": null,
- "description": "Canonical Backdrop mode for new generation requests.",
- "enum": [
- "transparent",
- "solid",
- "image"
- ],
- "type": "string"
- },
- "background_image_url": {
- "default": null,
- "description": "Canonical Backdrop background image URL.",
- "type": "string"
- },
- "camera": {
- "default": "",
- "type": "string"
- },
- "camera_edit_id": {
- "default": null,
- "type": "string"
- },
- "children": {
- "default": null,
- "description": "Nested generation requests to run after this generation completes. Every child must provide model_slug.",
- "items": {
- "$ref": "#/$defs/GenerationIntent"
- },
- "type": "array"
- },
- "clothing_item_ids": {
- "default": null,
- "items": {
- "type": "integer"
- },
- "type": "array"
- },
- "color_hex": {
- "default": null,
- "description": "Canonical Backdrop solid or fallback color.",
- "type": "string"
- },
- "do_qa": {
- "default": null,
- "description": "When true, enqueue QA after result storage and gate acceptance on QA.",
- "type": "boolean"
- },
- "duration": {
- "default": null,
- "type": "integer"
- },
- "enhance_user_prompt": {
- "default": null,
- "deprecated": true,
- "description": "Deprecated REST compatibility alias. true is normalized at command preparation to the legacy prompt-enhancement ArtDirection ID; false has no effect. Prefer art_direction_id. Removal requires 90 consecutive days without production use; usage was last observed on 2026-07-26.",
- "type": "boolean",
- "ui": {
- "editable": false,
- "visibility": [
- "rest"
- ]
- }
- },
- "extra_params": {
- "additionalProperties": true,
- "default": null,
- "description": "Model-specific extension parameters. Backdrop controls are not accepted here; use backdrop_mode, color_hex, and background_image_url.",
- "type": "object"
- },
- "generate_audio": {
- "default": false,
- "description": "Include audio in the delivered video. False delivers a file with no audio stream; fixed-audio providers are muted after generation, without reducing native-generation credits.",
- "type": "boolean"
- },
- "generation_result_parent_id": {
- "default": null,
- "minimum": 1,
- "type": "integer"
- },
- "image_url": {
- "default": null,
- "type": "string"
- },
- "img_ref_urls": {
- "default": null,
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- "last_frame_attachment": {
- "$ref": "#/$defs/GenerationReferenceAttachmentInput",
- "default": null,
- "description": "Durable reference to the photo the clip closes on, resolved to a URL at dispatch. The durable form of last_frame_url, for callers that hold an id rather than a link — a workflow wiring a step's output into a later step's last frame cannot know the URL when the graph is authored."
- },
- "last_frame_url": {
- "default": null,
- "type": "string"
- },
- "location_id": {
- "default": null,
- "minimum": 1,
- "type": "integer"
- },
- "max_qa_retries": {
- "default": null,
- "description": "Maximum QA-triggered retry generations after the initial attempt.",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "model_slug": {
- "description": "Active AI model slug. Required for every generation command.",
- "minLength": 1,
- "type": "string"
- },
- "negative_prompt": {
- "default": null,
- "type": "string"
- },
- "num_images": {
- "minimum": 1,
- "type": "integer"
- },
- "outfit_id": {
- "default": null,
- "minimum": 1,
- "type": "integer"
- },
- "prompt": {
- "default": "",
- "description": "Scene brief for this shot: setting, lighting, mood, camera/framing, pose — 2-5 compact positive sentences. Without art_direction_id this prompt reaches the image model as-is and is the entire creative direction: carry the shoot's world, lighting, and atmosphere here. With art_direction_id, the saved direction carries reusable style; add only per-shot intent. Supplied garment/avatar/reference images carry product appearance: refer to them semantically ('the supplied jacket'), never by image number — the backend appends the numbered reference map at dispatch. Styling intent (fit, tuck, drape, opening state) belongs here when it matters; re-described garment construction, product-fidelity warnings, and negative 'do not ...' blocks do not — with good references they degrade output. Say what to show, not what to avoid. Video commands: describe motion and camera movement. Video does not inherit the source generation's ArtDirection; omit art_direction_id to use only the source frame and this prompt. May be empty for upscale; generation routes validate separately.",
- "type": "string"
- },
- "reference_attachments": {
- "default": null,
- "items": {
- "$ref": "#/$defs/GenerationReferenceAttachmentInput"
- },
- "type": "array"
- },
- "resolution": {
- "default": null,
- "description": "Model-defined output resolution. Legacy image tiers are normalized to 1K, 2K, or 4K; video and exact pixel presets retain their model-defined casing.",
- "maxLength": 32,
- "minLength": 2,
- "type": "string"
- },
- "seed": {
- "default": null,
- "type": "integer"
- },
- "tag_ids": {
- "default": null,
- "items": {
- "type": "integer"
- },
- "type": "array"
- },
- "target_resolution": {
- "default": null,
- "type": "string"
- },
- "upscale_factor": {
- "default": null,
- "type": "number"
- },
- "use_case": {
- "default": null,
- "type": "string"
- },
- "video_ref_urls": {
- "default": null,
- "description": "Public video URLs supplied as model references. Only models that declare a positive max_reference_videos capability accept them.",
- "items": {
- "type": "string"
- },
- "type": "array"
- }
- },
- "required": [
- "num_images",
- "model_slug"
- ],
- "type": "object"
-}
removedInput schema / $defs / GenerationReferenceAttachmentInput
Removed value: -{
- "properties": {
- "avatar_id": {
- "default": null,
- "minimum": 1,
- "type": "integer"
- },
- "clothing_item_asset_id": {
- "default": null,
- "description": "Exact durable clothing asset reference. Provide with clothing_item_id; preferred over the deprecated side selector for repeated detail assets.",
- "minimum": 1,
- "type": "integer"
- },
- "clothing_item_id": {
- "default": null,
- "minimum": 1,
- "type": "integer"
- },
- "generation_result_id": {
- "default": null,
- "minimum": 1,
- "type": "integer"
- },
- "location_id": {
- "default": null,
- "minimum": 1,
- "type": "integer"
- },
- "outfit_id": {
- "default": null,
- "description": "Outfit reference. The generation uses the front image of every garment in the outfit, as if each were attached as clothing_item.",
- "minimum": 1,
- "type": "integer"
- },
- "side": {
- "default": null,
- "enum": [
- "front",
- "back"
- ],
- "type": "string"
- },
- "type": {
- "enum": [
- "uploaded_file",
- "generation_result",
- "location",
- "avatar",
- "clothing_item",
- "outfit"
- ],
- "type": "string"
- },
- "uploaded_file_id": {
- "default": null,
- "minimum": 1,
- "type": "integer"
- }
- },
- "required": [
- "type"
- ],
- "type": "object"
-}
addedInput schema / $defs / LookInput
Added value: +{
+ "additionalProperties": false,
+ "description": "One look: one outfit worn in the shoot, with who wears it and where.",
+ "properties": {
+ "clothing_ids": {
+ "description": "Clothing worn together.",
+ "items": {
+ "minimum": 1,
+ "type": "integer"
+ },
+ "maxItems": 4,
+ "type": "array"
+ },
+ "key": {
+ "default": null,
+ "description": "update_brief: an existing look's key, to keep that look.",
+ "pattern": "^look_\\d{2,3}$",
+ "type": "string"
+ },
+ "label": {
+ "default": "",
+ "description": "The look's name, e.g. 'Linen summer set'.",
+ "maxLength": 120,
+ "type": "string"
+ },
+ "location_id": {
+ "default": null,
+ "description": "Where the look is shot.",
+ "minimum": 1,
+ "type": "integer"
+ },
+ "model_id": {
+ "default": null,
+ "description": "The Model who wears the look.",
+ "minimum": 1,
+ "type": "integer"
+ },
+ "outfit_id": {
+ "default": null,
+ "description": "A saved outfit.",
+ "minimum": 1,
+ "type": "integer"
+ },
+ "reference_ids": {
+ "description": "Reference photos (uploaded file ids from the board's References).",
+ "items": {
+ "minimum": 1,
+ "type": "integer"
+ },
+ "maxItems": 50,
+ "type": "array"
+ }
+ },
+ "type": "object"
+}
addedInput schema / $defs / RecipeSpec
Added value: +{
+ "additionalProperties": false,
+ "description": "The recipe a demand asks for: its shots and their steps.",
+ "properties": {
+ "image_model": {
+ "default": null,
+ "description": "A listed image model's slug, only when the user named it.",
+ "type": "string"
+ },
+ "name": {
+ "description": "What the automation is for, 1-3 words, e.g. 'PDP', 'Lookbook', 'Campaign': Uwear names it with its views and steps ('PDP · front, side, upper').",
+ "maxLength": 80,
+ "minLength": 1,
+ "type": "string"
+ },
+ "shots": {
+ "description": "One shot per view, in order.",
+ "items": {
+ "$ref": "#/$defs/ShotSpec"
+ },
+ "maxItems": 8,
+ "minItems": 1,
+ "type": "array"
+ },
+ "video_model": {
+ "default": null,
+ "description": "A listed video model's slug, only when the user named it.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "shots"
+ ],
+ "type": "object"
+}
addedInput schema / $defs / ShotSpec
Added value: +{
+ "additionalProperties": false,
+ "description": "One photo of each look, from one camera.",
+ "properties": {
+ "camera": {
+ "description": "The view, from the camera list.",
+ "enum": [
+ "auto",
+ "full_body_front",
+ "full_body_back",
+ "full_body_side",
+ "upper_body_front",
+ "upper_body_back",
+ "upper_body_side",
+ "lower_body_front",
+ "lower_body_back",
+ "lower_body_side",
+ "clothing_detail_front",
+ "clothing_detail_back",
+ "clothing_detail_side"
+ ],
+ "type": "string"
+ },
+ "then": {
+ "description": "Steps on this shot's photo, in order (a video ends the chain).",
+ "items": {
+ "$ref": "#/$defs/StepSpec"
+ },
+ "maxItems": 4,
+ "type": "array"
+ }
+ },
+ "required": [
+ "camera"
+ ],
+ "type": "object"
+}
addedInput schema / $defs / StepSpec
Added value: +{
+ "additionalProperties": false,
+ "description": "One step on a shot's photo (or on the step before it).",
+ "properties": {
+ "camera_edit_id": {
+ "default": null,
+ "description": "camera_edit only: the view, one of full_body_front, full_body_back, full_body_side, upper_body_front, upper_body_back, upper_body_side, lower_body_front, lower_body_back, lower_body_side, clothing_detail_front, clothing_detail_back, clothing_detail_side.",
+ "type": "string"
+ },
+ "kind": {
+ "description": "camera_edit: the same photo from another view (camera_edit_id); edit: a written change (prompt); upscale: a larger photo; video: a clip opening on the photo (prompt: the motion); remove_background: the subject on transparency.",
+ "enum": [
+ "camera_edit",
+ "edit",
+ "upscale",
+ "video",
+ "remove_background"
+ ],
+ "type": "string"
+ },
+ "prompt": {
+ "default": null,
+ "description": "edit: the change; video: the motion (optional).",
+ "maxLength": 1000,
+ "type": "string"
+ }
+ },
+ "required": [
+ "kind"
+ ],
+ "type": "object"
+}
addedInput schema / additionalProperties
Added value: +false
removedInput schema / description
Removed value: -"Propose a brief made exclusively of canonical generation commands."
addedInput schema / properties / art_direction_id
Added value: +{
+ "default": null,
+ "description": "The shoot's one art direction (a library id, or the id save_art_direction returns); omit it to keep the current one.",
+ "minimum": 1,
+ "type": "integer"
+}
addedInput schema / properties / board_id
Added value: +{
+ "description": "The open Shoot Board's board_id, from Open Shoot Board or your context.",
+ "type": "string"
+}
removedInput schema / properties / commands
Removed value: -{
- "description": "Canonical generation commands. Each command contains the MCP-safe GenerationIntent fields and a durable source reference. Write each input.prompt as a compact positive scene description (setting, lighting, mood, camera, pose — for video, motion and camera movement); without art_direction_id the prompt is the entire creative direction, so give it the full scene. The attached garment/avatar/reference images carry product appearance, so never pad prompts with restated garment construction details, product-fidelity warnings, or negative 'do not' instruction blocks; styling intent (fit, tuck, drape) is fine. For video commands, attach available full back or side garment assets that the camera may reveal through input.reference_attachments when capacity permits. Do not combine reference_attachments with img_ref_urls; uploaded garment assets are not attached automatically. Webhook callback configuration is API-only.",
- "items": {
- "$ref": "#/$defs/GenerationCommand"
- },
- "minItems": 1,
- "type": "array"
-}
removedInput schema / properties / creative_context
Removed value: -{
- "default": null,
- "description": "Required for photoshoot proposals and brief rewrites. Summarize the shoot-level creative approach that guided garment combos, avatars, prompts, and pipeline steps. By default prefer one cohesive art direction across the photoshoot, e.g. 'urban summer editorial', 'standard grey e-commerce', or 'sporty studio catalog'. Per-look prompts may differ for garment details, pose, framing, or avatar, but should feel part of the same shoot unless the user explicitly asks for multiple art directions, split concepts, A/B routes, or varied campaign directions. The assistant should explain this art direction to the user after proposing the brief and ask if they want changes.",
- "type": "string"
-}
removedInput schema / properties / execute_immediately
Removed value: -{
- "default": false,
- "description": "Set true only when the user explicitly asks to prepare/create/generate/run the photoshoot without another review step. When true, Uwear persists the brief, confirms it, and executes it directly if credits and validation allow; otherwise it falls back to the editable BriefProposal.",
- "type": "boolean"
-}
addedInput schema / properties / looks
Added value: +{
+ "description": "The looks to shoot, each one outfit worn in the shoot, with ids from read_shoot_board.",
+ "items": {
+ "$ref": "#/$defs/LookInput"
+ },
+ "maxItems": 50,
+ "minItems": 1,
+ "type": "array"
+}
addedInput schema / properties / recipe
Added value: +{
+ "$ref": "#/$defs/RecipeSpec",
+ "default": null,
+ "description": "The shots and steps the user described (views, crops, edits, upscale, video): Uwear builds them as a new automation. Not with recipe_workflow_id."
+}
addedInput schema / properties / recipe_workflow_id
Added value: +{
+ "default": null,
+ "description": "An automation from read_shoot_board's brief_inputs.automations that every look runs through as is (only when it matches what the user asked for). Not with recipe. Omitted while the board pins one (brief_inputs.pinned_automation): every look runs it.",
+ "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
+ "type": "string"
+}
addedInput schema / properties / title
Added value: +{
+ "default": "",
+ "description": "The shoot's name, only in the user's own words; otherwise leave it out.",
+ "maxLength": 80,
+ "type": "string"
+}
changedInput schema / required
Previous value: -[
- "commands"
-]New value: +[
+ "looks",
+ "board_id"
+]