@sogni-ai/sogni-protocol 1.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +80 -0
  2. package/catalogs/audio-models.json +34 -0
  3. package/catalogs/quality-presets.json +30 -0
  4. package/enums/chat-run-status.json +12 -0
  5. package/enums/chat-run-waiting-reasons.json +10 -0
  6. package/enums/token-types.json +7 -0
  7. package/enums/tool-names.json +85 -0
  8. package/manifests/app-tools.json +297 -0
  9. package/manifests/composition-tools.json +228 -0
  10. package/manifests/generation-tools.json +1263 -0
  11. package/manifests/openai-tools.json +1818 -0
  12. package/package.json +44 -0
  13. package/prompts/tools/add_subtitles.json +12 -0
  14. package/prompts/tools/analyze_image.json +12 -0
  15. package/prompts/tools/analyze_video.json +11 -0
  16. package/prompts/tools/animate_photo.json +13 -0
  17. package/prompts/tools/apply_style.json +11 -0
  18. package/prompts/tools/ask_clarifying_question.json +10 -0
  19. package/prompts/tools/change_angle.json +11 -0
  20. package/prompts/tools/compose_instrumental.json +11 -0
  21. package/prompts/tools/compose_lyrics.json +12 -0
  22. package/prompts/tools/compose_script.json +21 -0
  23. package/prompts/tools/compose_workflow.json +17 -0
  24. package/prompts/tools/compose_workflow_template.json +23 -0
  25. package/prompts/tools/create_asset_manifest.json +9 -0
  26. package/prompts/tools/dance_montage.json +9 -0
  27. package/prompts/tools/edit_image.json +11 -0
  28. package/prompts/tools/enhance_prompt.json +20 -0
  29. package/prompts/tools/extend_video.json +11 -0
  30. package/prompts/tools/extract_metadata.json +9 -0
  31. package/prompts/tools/finalize_response.json +10 -0
  32. package/prompts/tools/generate_image.json +11 -0
  33. package/prompts/tools/generate_music.json +7 -0
  34. package/prompts/tools/generate_video.json +10 -0
  35. package/prompts/tools/inspect_asset.json +10 -0
  36. package/prompts/tools/label_asset.json +13 -0
  37. package/prompts/tools/manage_memory.json +12 -0
  38. package/prompts/tools/map_assets_for_model.json +9 -0
  39. package/prompts/tools/orbit_video.json +13 -0
  40. package/prompts/tools/overlay_video.json +10 -0
  41. package/prompts/tools/refine_result.json +11 -0
  42. package/prompts/tools/replace_video_segment.json +14 -0
  43. package/prompts/tools/resolve_personas.json +9 -0
  44. package/prompts/tools/restore_photo.json +12 -0
  45. package/prompts/tools/set_content_filter.json +9 -0
  46. package/prompts/tools/sound_to_video.json +9 -0
  47. package/prompts/tools/stitch_video.json +9 -0
  48. package/prompts/tools/validate_asset_references.json +10 -0
  49. package/prompts/tools/video_to_video.json +13 -0
  50. package/schemas/errors/error.schema.json +21 -0
  51. package/schemas/errors/repair-control.schema.json +40 -0
  52. package/schemas/events/artifact-reference.schema.json +22 -0
  53. package/schemas/events/progress-event.schema.json +28 -0
  54. package/schemas/events/workflow-event.schema.json +22 -0
  55. package/schemas/prompt-contract.schema.json +42 -0
  56. package/schemas/storyboards/storyboard-planning-contract.schema.json +108 -0
  57. package/schemas/tools/add_subtitles.schema.json +77 -0
  58. package/schemas/tools/animate_photo.schema.json +104 -0
  59. package/schemas/tools/apply_style.schema.json +37 -0
  60. package/schemas/tools/change_angle.schema.json +30 -0
  61. package/schemas/tools/compose_instrumental.schema.json +24 -0
  62. package/schemas/tools/compose_lyrics.schema.json +28 -0
  63. package/schemas/tools/compose_script.schema.json +68 -0
  64. package/schemas/tools/compose_workflow.schema.json +67 -0
  65. package/schemas/tools/compose_workflow_template.schema.json +156 -0
  66. package/schemas/tools/dance_montage.schema.json +47 -0
  67. package/schemas/tools/edit_image.schema.json +74 -0
  68. package/schemas/tools/enhance_prompt.schema.json +76 -0
  69. package/schemas/tools/extend_video.schema.json +42 -0
  70. package/schemas/tools/generate_image.schema.json +104 -0
  71. package/schemas/tools/generate_music.schema.json +62 -0
  72. package/schemas/tools/generate_video.schema.json +97 -0
  73. package/schemas/tools/manage_memory.schema.json +28 -0
  74. package/schemas/tools/orbit_video.schema.json +70 -0
  75. package/schemas/tools/overlay_video.schema.json +126 -0
  76. package/schemas/tools/refine_result.schema.json +43 -0
  77. package/schemas/tools/replace_video_segment.schema.json +60 -0
  78. package/schemas/tools/resolve_personas.schema.json +15 -0
  79. package/schemas/tools/restore_photo.schema.json +47 -0
  80. package/schemas/tools/set_content_filter.schema.json +14 -0
  81. package/schemas/tools/sound_to_video.schema.json +70 -0
  82. package/schemas/tools/stitch_video.schema.json +52 -0
  83. package/schemas/tools/video_to_video.schema.json +77 -0
  84. package/schemas/workflows/durable-workflow-run.schema.json +165 -0
  85. package/schemas/workflows/durable-workflow-step.schema.json +141 -0
  86. package/version.json +4 -0
@@ -0,0 +1,30 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.sogni.ai/creative-agent/2026-04-27.1/tools/change_angle.schema.json",
4
+ "title": "change_angle arguments",
5
+ "schemaVersion": "2026-04-27.1",
6
+ "description": "Generate the photo from a different camera angle or perspective. Uses AI to create a new view of the subject as if photographed from a different position. Use when the user wants to see the subject from another angle, generate a different view, create a portrait from a specific direction, or get a closeup/wide shot. Examples: \"show me from the left side\", \"generate a 3/4 portrait view\", \"closeup from slightly above\". IMPORTANT: When previous results exist, this tool automatically uses the LATEST result image unless you specify a different sourceImageIndex or the user explicitly says \"original\".",
7
+ "type": "object",
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "description": {
11
+ "type": "string",
12
+ "description": "EXACT camera angle string. You MUST construct this by concatenating exactly one value from each category below, separated by single spaces. No commas, no extra words.\n\nFormat: \"[azimuth] [elevation] [distance]\"\n\nAzimuth (pick one): \"front view\", \"front-right quarter view\", \"right side view\", \"back-right quarter view\", \"back view\", \"back-left quarter view\", \"left side view\", \"front-left quarter view\"\nElevation (pick one): \"low-angle shot\", \"eye-level shot\", \"elevated shot\", \"high-angle shot\"\nDistance (pick one): \"close-up\", \"medium shot\", \"wide shot\"\n\nExamples:\n- \"front-right quarter view eye-level shot medium shot\"\n- \"left side view eye-level shot close-up\"\n- \"front view low-angle shot wide shot\"\n- \"right side view elevated shot medium shot\"\n\nMap user requests: \"from the left\" → \"left side view\", \"looking up at\" → \"low-angle shot\", \"closeup\" → \"close-up\", \"3/4 view\" → \"front-right quarter view\" or \"front-left quarter view\", \"portrait\" → \"front-right quarter view eye-level shot medium shot\".\nDefault elevation to \"eye-level shot\" and distance to \"medium shot\" when not specified."
13
+ },
14
+ "sourceImageIndex": {
15
+ "type": "number",
16
+ "description": "Which result image to use as source (0-based index). Omit to use the latest result automatically (or the original if no results exist). Only set explicitly when the user specifies a particular image number or explicitly says \"original\" (use -1 for original)."
17
+ },
18
+ "loraStrength": {
19
+ "type": "number",
20
+ "description": "LoRA strength for angle generation (0.1-1.0). Default: 0.9. Lower values preserve more of the original appearance, higher values produce stronger angle changes. Only set when the user wants to control the transformation intensity."
21
+ },
22
+ "aspectRatio": {
23
+ "type": "string",
24
+ "description": "Do NOT set unless the user explicitly requests an aspect ratio, format, orientation, or exact pixel dimensions. When a reference/source image is used and the user did not ask to change its shape, omit this field so the handler preserves the selected source image's own ratio.\n\nFormats: \"16:9\", \"9:16\", \"4:5\", \"1:1\", \"4:3\", \"3:2\", \"21:9\", or exact pixels like \"1920x1080\".\n\nCRITICAL: When the user specifies exact pixel dimensions (e.g., \"1280x720\", \"1080x1920\", \"1920x1080\", \"3840x2160\") or an orientation-qualified named resolution (e.g., \"720p landscape\", \"720p portrait\"), use the exact pixel format, NOT a ratio like \"16:9\" or \"9:16\". Exact user-requested dimensions override the selected default media quality, including Pro/HQ defaults. A bare named video resolution like \"720p resolution\" is only a resolution tier/short-side request; do not turn it into landscape pixels and do not set aspectRatio unless the user also states landscape, portrait, vertical, horizontal, or exact pixels. If requested pixels are in bounds but not on the model's pixel step, still pass the user's exact pixel request; the handler snaps to the nearest supported size internally. Only use ratio format when the user says a generic format name without pixel dimensions.\n\nMappings (use ONLY when user does NOT specify pixel dimensions): landscape/widescreen/YouTube/cinematic → \"16:9\". portrait → \"9:16\". TikTok/Reels/IG Reels → \"1080x1920\". ultrawide/cinema scope → \"21:9\". Instagram post → \"4:5\". square → \"1:1\". standard/TV → \"4:3\". 720p landscape → \"1280x720\". 720p portrait → \"720x1280\". 1080p landscape → \"1920x1080\". 1080p portrait/HD portrait → \"1080x1920\". 4K landscape → \"3840x2160\". 4K portrait → \"2160x3840\". Never set for generic requests like \"make a video\"."
25
+ }
26
+ },
27
+ "required": [
28
+ "description"
29
+ ]
30
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "title": "compose_instrumental tool schema",
3
+ "schemaVersion": "2026-05-14.1",
4
+ "description": "Synchronous instrumental music structure composition utility.",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["prompt"],
8
+ "properties": {
9
+ "prompt": {
10
+ "type": "string",
11
+ "description": "The instrumental music topic, mood, genre, scene, campaign, or composition request."
12
+ },
13
+ "music_prompt": {
14
+ "type": "string",
15
+ "description": "Optional musical style context, instrumentation, mood, or production direction."
16
+ },
17
+ "duration_seconds": {
18
+ "type": "number",
19
+ "minimum": 10,
20
+ "maximum": 600,
21
+ "description": "Optional desired track duration in seconds."
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "title": "compose_lyrics tool schema",
3
+ "schemaVersion": "2026-05-14.1",
4
+ "description": "Synchronous song lyric composition utility for vocal music.",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["prompt"],
8
+ "properties": {
9
+ "prompt": {
10
+ "type": "string",
11
+ "description": "The song topic, mood, genre, scene, campaign, or lyric request."
12
+ },
13
+ "language": {
14
+ "type": "string",
15
+ "description": "Optional language code or language name for the lyrics."
16
+ },
17
+ "music_prompt": {
18
+ "type": "string",
19
+ "description": "Optional musical style context, genre, instrumentation, mood, or production direction."
20
+ },
21
+ "duration_seconds": {
22
+ "type": "number",
23
+ "minimum": 10,
24
+ "maximum": 600,
25
+ "description": "Optional desired song duration in seconds."
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,68 @@
1
+ {
2
+ "title": "compose_script tool schema",
3
+ "schemaVersion": "2026-05-14.1",
4
+ "description": "Synchronous creative writing utility for scripts, storyboards, video prompts, ad concepts, trailers, social shorts, campaign beats, and talking-head plans.",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["brief"],
8
+ "properties": {
9
+ "brief": {
10
+ "type": "string",
11
+ "description": "The creative writing brief, story idea, product concept, video idea, or revision request."
12
+ },
13
+ "script_type": {
14
+ "type": "string",
15
+ "enum": ["video_prompt", "screenplay", "storyboard", "ad_script", "trailer", "social_short", "talking_head", "campaign", "revision"],
16
+ "description": "The kind of script or creative writing artifact to produce."
17
+ },
18
+ "destination_model": {
19
+ "type": "string",
20
+ "description": "Optional destination video model selector, such as ltx23, wan22, or seedance2."
21
+ },
22
+ "destination_tool": {
23
+ "type": "string",
24
+ "description": "Optional downstream tool, such as generate_video, animate_photo, sound_to_video, or video_to_video."
25
+ },
26
+ "duration_seconds": {
27
+ "type": "number",
28
+ "minimum": 1,
29
+ "maximum": 300,
30
+ "description": "Requested runtime for a video prompt, social short, ad, or talking-head script."
31
+ },
32
+ "scene_count": {
33
+ "type": "integer",
34
+ "minimum": 1,
35
+ "maximum": 12,
36
+ "description": "Requested number of scenes, shots, beats, or storyboard panels."
37
+ },
38
+ "aspect_ratio": {
39
+ "type": "string",
40
+ "description": "Optional target aspect ratio, such as 16:9, 9:16, 1:1, 4:5, or 21:9."
41
+ },
42
+ "platform": {
43
+ "type": "string",
44
+ "description": "Optional target platform or context, such as TikTok, YouTube Shorts, Instagram Reels, broadcast, landing page, game trailer, or pitch deck."
45
+ },
46
+ "style": {
47
+ "type": "string",
48
+ "description": "Optional style, genre, tone, visual treatment, or brand voice to preserve."
49
+ },
50
+ "first_frame_description": {
51
+ "type": "string",
52
+ "description": "Optional description of the starting frame when composing an image-to-video prompt without attached vision content."
53
+ },
54
+ "first_frame_data_url": {
55
+ "type": "string",
56
+ "description": "Optional inline image data URI for the starting frame when composing an image-to-video or first-frame video prompt."
57
+ },
58
+ "last_frame_data_url": {
59
+ "type": "string",
60
+ "description": "Optional inline image data URI for the ending frame when composing an image-to-video transition prompt."
61
+ },
62
+ "return_format": {
63
+ "type": "string",
64
+ "enum": ["script", "markdown", "json"],
65
+ "description": "Requested output format. Use script unless structured planning output is explicitly needed."
66
+ }
67
+ }
68
+ }
@@ -0,0 +1,67 @@
1
+ {
2
+ "title": "compose_workflow tool schema",
3
+ "schemaVersion": "2026-05-14.1",
4
+ "description": "Synchronous planner that emits a validated durable creative workflow plan from a brief.",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["brief"],
8
+ "properties": {
9
+ "brief": {
10
+ "type": "string",
11
+ "description": "Creative brief describing what the workflow should produce. Free-form natural language. Required."
12
+ },
13
+ "scene_count": {
14
+ "type": "integer",
15
+ "minimum": 1,
16
+ "maximum": 12,
17
+ "description": "Suggested number of distinct shots/scenes. The planner may produce more steps than scenes (e.g., keyframe + clip per scene)."
18
+ },
19
+ "duration_seconds": {
20
+ "type": "number",
21
+ "minimum": 1,
22
+ "maximum": 120,
23
+ "description": "Target total duration in seconds for video-bearing plans."
24
+ },
25
+ "aspect_ratio": {
26
+ "type": "string",
27
+ "enum": ["1:1", "4:3", "3:4", "16:9", "9:16", "21:9"],
28
+ "description": "Output aspect ratio."
29
+ },
30
+ "style": {
31
+ "type": "string",
32
+ "description": "Optional stylistic guidance (e.g., 'cinematic, neon, low-key', 'whiteboard illustration')."
33
+ },
34
+ "destination_models": {
35
+ "type": "object",
36
+ "additionalProperties": false,
37
+ "properties": {
38
+ "image": {
39
+ "type": "string",
40
+ "description": "Preferred image model (e.g., 'flux2', 'gpt-image-2')."
41
+ },
42
+ "video": {
43
+ "type": "string",
44
+ "description": "Preferred video model (e.g., 'ltx23', 'wan22', 'seedance2')."
45
+ },
46
+ "music": {
47
+ "type": "string",
48
+ "description": "Preferred music model."
49
+ }
50
+ }
51
+ },
52
+ "max_estimated_capacity_units": {
53
+ "type": "integer",
54
+ "minimum": 1,
55
+ "description": "If set, the planner attempts to keep total estimated cost at or below this value and returns `fits_budget: false` if it cannot."
56
+ },
57
+ "include_audio": {
58
+ "type": "boolean",
59
+ "description": "If true, include a music generation step. Defaults to false."
60
+ },
61
+ "return_format": {
62
+ "type": "string",
63
+ "enum": ["json"],
64
+ "description": "Currently `json` is the only supported value. Reserved for future."
65
+ }
66
+ }
67
+ }
@@ -0,0 +1,156 @@
1
+ {
2
+ "title": "compose_workflow_template tool schema",
3
+ "schemaVersion": "2026-05-14.1",
4
+ "description": "Synchronous planner that emits a savable, parameterized workflow template plus a concrete example plan from a brief.",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["brief", "name"],
8
+ "properties": {
9
+ "brief": {
10
+ "type": "string",
11
+ "description": "Creative brief describing what the workflow should produce. Free-form natural language. Required."
12
+ },
13
+ "name": {
14
+ "type": "string",
15
+ "minLength": 1,
16
+ "maxLength": 200,
17
+ "description": "Human-readable template name (e.g. \"My Plastic Dream — TikTok/Reels\"). Required."
18
+ },
19
+ "description": {
20
+ "type": "string",
21
+ "description": "Optional template description. If omitted, the planner may derive one from the brief."
22
+ },
23
+ "category": {
24
+ "type": "string",
25
+ "enum": ["portrait", "video-social", "makeover", "cinematic", "music", "analysis", "custom", "other"],
26
+ "description": "Optional category for surfacing the template in the library. Defaults to 'custom' when omitted."
27
+ },
28
+ "visibility": {
29
+ "type": "string",
30
+ "enum": ["private", "public"],
31
+ "description": "Persistence visibility. Defaults to 'private'. The 'team' visibility is reserved for a later milestone."
32
+ },
33
+ "inputs": {
34
+ "type": "array",
35
+ "maxItems": 16,
36
+ "description": "Optional typed input declarations. When omitted, the planner LLM proposes inputs based on the brief.",
37
+ "items": {
38
+ "type": "object",
39
+ "additionalProperties": false,
40
+ "required": ["name", "type"],
41
+ "properties": {
42
+ "name": {
43
+ "type": "string",
44
+ "minLength": 1,
45
+ "maxLength": 64,
46
+ "description": "Input name; used as the placeholder key (e.g. $inputs.motion_source_video)."
47
+ },
48
+ "type": {
49
+ "type": "string",
50
+ "enum": ["image", "audio", "video", "text", "number", "select", "boolean"],
51
+ "description": "Input value type. URL string for image/audio/video; primitive for the rest."
52
+ },
53
+ "required": {
54
+ "type": "boolean",
55
+ "description": "Whether the input must be supplied at run time. Defaults to false."
56
+ },
57
+ "description": {
58
+ "type": "string",
59
+ "description": "Human-readable description shown in the launcher UI."
60
+ },
61
+ "default": {
62
+ "description": "Optional default value. Type must match `type`."
63
+ },
64
+ "options": {
65
+ "type": "array",
66
+ "description": "Allowed enum values for `select` inputs.",
67
+ "items": {
68
+ "type": "object",
69
+ "additionalProperties": false,
70
+ "required": ["value", "label"],
71
+ "properties": {
72
+ "value": { "type": "string" },
73
+ "label": { "type": "string" }
74
+ }
75
+ }
76
+ },
77
+ "multiple": {
78
+ "type": "object",
79
+ "additionalProperties": false,
80
+ "required": ["min", "max"],
81
+ "description": "Set when the input accepts an array of values.",
82
+ "properties": {
83
+ "min": { "type": "integer", "minimum": 0 },
84
+ "max": { "type": "integer", "minimum": 1 }
85
+ }
86
+ },
87
+ "internal": {
88
+ "type": "boolean",
89
+ "description": "Internal inputs are seeded at run-create time and hidden from the launcher UI."
90
+ }
91
+ }
92
+ }
93
+ },
94
+ "scene_count": {
95
+ "type": "integer",
96
+ "minimum": 1,
97
+ "maximum": 12,
98
+ "description": "Suggested number of distinct shots/scenes. The planner may produce more steps than scenes (e.g., keyframe + clip per scene)."
99
+ },
100
+ "duration_seconds": {
101
+ "type": "number",
102
+ "minimum": 1,
103
+ "maximum": 120,
104
+ "description": "Target total duration in seconds for video-bearing plans."
105
+ },
106
+ "aspect_ratio": {
107
+ "type": "string",
108
+ "enum": ["1:1", "4:3", "3:4", "16:9", "9:16", "21:9"],
109
+ "description": "Output aspect ratio."
110
+ },
111
+ "style": {
112
+ "type": "string",
113
+ "description": "Optional stylistic guidance (e.g., 'cinematic, neon, low-key', 'whiteboard illustration')."
114
+ },
115
+ "destination_models": {
116
+ "type": "object",
117
+ "additionalProperties": false,
118
+ "properties": {
119
+ "image": { "type": "string", "description": "Preferred image model (e.g., 'flux2', 'gpt-image-2')." },
120
+ "video": { "type": "string", "description": "Preferred video model (e.g., 'ltx23', 'wan22', 'seedance2')." },
121
+ "music": { "type": "string", "description": "Preferred music model." }
122
+ }
123
+ },
124
+ "max_estimated_capacity_units": {
125
+ "type": "integer",
126
+ "minimum": 1,
127
+ "description": "If set, the planner attempts to keep total estimated cost at or below this value and returns `fits_budget: false` if it cannot."
128
+ },
129
+ "include_audio": {
130
+ "type": "boolean",
131
+ "description": "If true, include a music generation step. Defaults to false."
132
+ },
133
+ "return_format": {
134
+ "type": "string",
135
+ "enum": ["json"],
136
+ "description": "Currently `json` is the only supported value. Reserved for future."
137
+ },
138
+ "existing_template": {
139
+ "type": "object",
140
+ "additionalProperties": true,
141
+ "description": "Optional. The full WorkflowTemplate JSON (id, name, description, brief, category, visibility, inputs, stages, etc.) the caller wants the planner to edit. When supplied, the planner treats the existing template as the starting point and the brief as the modification request — preserve unchanged stages and inputs, apply the requested edits, and bump the template version. Stage ids and input names remain stable unless the brief explicitly renames them. Use this for 'add a music step', 'change the dance choreography', 'switch the storyboard model to GPT Image 2', etc.",
142
+ "properties": {
143
+ "id": { "type": "string", "description": "Existing template id; preserved on the returned template_draft.id." },
144
+ "version": { "type": "string", "description": "Existing semver-ish version. The planner returns a bumped value." },
145
+ "name": { "type": "string" },
146
+ "description": { "type": "string" },
147
+ "brief": { "type": "string" },
148
+ "category": { "type": "string" },
149
+ "stability": { "type": "string" },
150
+ "visibility": { "type": "string" },
151
+ "inputs": { "type": "array" },
152
+ "stages": { "type": "array" }
153
+ }
154
+ }
155
+ }
156
+ }
@@ -0,0 +1,47 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.sogni.ai/creative-agent/2026-04-27.1/tools/dance_montage.schema.json",
4
+ "title": "dance_montage arguments",
5
+ "schemaVersion": "2026-04-27.1",
6
+ "description": "REQUIRED for ALL dance video requests — do NOT use animate_photo or generate_video for dances. Uses real choreography reference videos to transfer dance motion onto a photo via WAN 2.2 Animate Move. Output is always 9:16 480p portrait. Do NOT use this for bare TikTok/Reels/Shorts/social-video requests unless the user explicitly asks for a dance, choreography, dance trend, or named dance preset. UPLOADED PHOTO: When the user asks for a dance \"using this photo\" or \"with this photo\", call dance_montage directly on the uploaded photo; do NOT call edit_image/generate_image first just to prepare, stylize, restyle, reframe, make full-body, or reinterpret the subject. Words that identify a dance preset or vibe, such as \"Barbie\", \"Metric\", \"Black Sheep\", \"Rasputin\", or \"TikTok dance trend\", are NOT requests for image prep. Only create image prep first when the user explicitly asks for a new look, outfit, variation set, multiple characters, or loaded persona identity preservation. IMAGE PREP: When generating images for dance (via edit_image or generate_image), ALWAYS use aspectRatio=\"9:16\". CRITICAL — IMAGE COUNT: Generate exactly 1 image (numberOfVariations=1) for dance requests UNLESS the user explicitly asks for variations, different looks, or multiple characters (e.g. \"4 different outfits\", \"alternate between a cat and a dog\"). A single consistent image is used for ALL video segments to ensure visual consistency in the final stitched dance video. When the user DOES request multiple variations, batch them into ONE tool call using numberOfVariations + Dynamic Prompts — never split into multiple batches. PERSONAS: When personas are loaded, ALWAYS generate images via edit_image FIRST (using the persona reference photos for identity preservation), then call dance_montage — it will automatically use all generated images. Never use imagePrompt for persona dance requests — edit_image with persona context photos produces far better likeness. USING GENERATED IMAGES: When images have already been generated earlier in the conversation, simply call dance_montage WITHOUT sourceImageIndex — all previously generated images are used automatically as alternating montage segments. Do NOT tell the user to \"upload\" images that were already generated. Requires at least one uploaded photo, previously generated image, or loaded personas. Best results with photos of people.",
7
+ "type": "object",
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "dance": {
11
+ "type": "string",
12
+ "enum": [
13
+ "rasputin",
14
+ "big-guy",
15
+ "keep-it-gangsta",
16
+ "this-is-america",
17
+ "chinese-new-year",
18
+ "spongebob",
19
+ "chanel",
20
+ "crystal-light-aerobics-1988",
21
+ "plastic-dream-sequence"
22
+ ],
23
+ "description": "Which dance choreography to use. \"rasputin\": Boney M - Rasputin (Viral Russian TikTok Dance, max 32s). \"big-guy\": Ice Spice - Big Guy (From \"The SpongeBob Movie: Search for SquarePants\" movie, max 11s). \"keep-it-gangsta\": Nhale ft. Dezzy Hollow - Keep it Gangsta (Hip-hop gangsta dance, max 21s). \"this-is-america\": Childish Gambino - This Is America (Iconic choreography from the This Is America music video, max 22s). \"chinese-new-year\": 弥渡山歌 (Midu Echoing) - Dan Thy (Chinese New Year Dance, Chinese Military Dance Trend, max 18s). \"spongebob\": SpongeBob - Stadium Rave (Jellyfish Jam Dance from SpongeBob SquarePants, max 27s). \"chanel\": Tyla - Chanel (Put me in Chanel dance, max 14s). \"crystal-light-aerobics-1988\": Crystal Light National Aerobics Championship 1988 (80s aerobics dance from the 1988 Crystal Light National Aerobics Championship, max 52s). \"plastic-dream-sequence\": Metric - Black Sheep (Barbie plastic dream sequence dance, max 28s).."
24
+ },
25
+ "duration": {
26
+ "type": "number",
27
+ "description": "Total video duration in seconds. Range: 8-30. OMIT this parameter unless the user explicitly requests a specific length — the handler defaults to the chosen dance's reference video length (capped at 30s) so the full choreography plays through. Each dance has its own max based on its reference video; the handler caps automatically.",
28
+ "minimum": 8,
29
+ "maximum": 30
30
+ },
31
+ "sourceImageIndex": {
32
+ "type": "number",
33
+ "description": "Which previously generated result image to use (0-based index). Use -1 for the original uploaded image. When omitted, all previously generated images are used automatically as alternating montage segments."
34
+ },
35
+ "imagePrompt": {
36
+ "type": "string",
37
+ "description": "Creative style/look for auto-generated images when no pre-generated images are available and no personas are loaded. For persona requests, always generate images via edit_image first — it preserves identity far better. This is a fallback only. If omitted, uses a default full-body portrait style."
38
+ },
39
+ "singleClip": {
40
+ "type": "boolean",
41
+ "description": "When true, renders the entire dance as one continuous clip (no stitching). Only works for durations ≤ 20s. Use when the user explicitly asks for a single video or one unbroken clip. Default: false (splits into segments for faster concurrent rendering)."
42
+ }
43
+ },
44
+ "required": [
45
+ "dance"
46
+ ]
47
+ }
@@ -0,0 +1,74 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.sogni.ai/creative-agent/2026-04-27.1/tools/edit_image.schema.json",
4
+ "title": "edit_image arguments",
5
+ "schemaVersion": "2026-04-27.1",
6
+ "description": "Generate images guided by reference photos. Supports GPT Image 2 up to 16 images, Flux.2 up to 6 images, and Qwen up to 3 images. Best for style-guided generation, combining elements from multiple images, ANY persona image creation, and any uploaded brand asset reuse — logos, brand marks, mascots, product shots, photos, screenshots, sketches, or character designs the user expects to appear in or guide the result. ALWAYS use this (never generate_image) when persona photos OR uploaded image assets meant for reuse are in context — even if a specific model is requested. Exception: explicit Z-image/Z-image Turbo uploaded-image enhancement uses generate_image with sourceImageIndex and starting_image_strength because edit_image does not expose Z-image models. If a previous edit_image attempt did not preserve the uploaded asset well, stay on edit_image and tighten the prompt or switch model — do not fall back to generate_image, which has no access to the upload at all. For direct edits (remove objects, enhance), use restore_photo or refine_result unless the user explicitly requested Z-image.",
7
+ "type": "object",
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "prompt": {
11
+ "type": "string",
12
+ "description": "Edit instruction describing what to generate using the reference images as guidance. 50-200 words recommended.\n\nLITERAL PROMPT OVERRIDE: If the user explicitly says not to modify the prompt, or to use it exactly/verbatim/as-is, copy the identified prompt text verbatim instead of applying these construction rules unless a hard requirement is missing.\n\nPROMPT CONSTRUCTION ORDER — build the prompt in this sequence:\n1. IDENTITY LOCK — state which picture owns the person's identity (GOLDEN RULE: never leave identity ambiguous when editing a person)\n2. REQUESTED EDIT — describe only what CHANGES (the delta), not the whole image\n3. REFERENCE ROLE MAPPING — assign each picture ONE primary role: base_identity (face/person), pose_reference, outfit_reference, style_reference, background_reference, or color_reference\n4. POSE / COMPOSITION — pose, framing, camera angle (omit if unchanged)\n5. STYLE — artistic style, genre, era (omit if unchanged)\n6. LIGHTING / REALISM — \"maintain realistic anatomy, perspective, and lighting integration\"\n7. PRESERVE clause — always end with \"preserve all unmentioned details\"\n\nIDENTITY LOCK (required when a person is in any reference image):\n\"Preserve the exact facial likeness from picture N — face structure, eye shape, nose shape, mouth shape, jawline, skin tone, hairline, apparent age, and overall recognizability.\"\nNever let a style, pose, or clothing reference silently override the face. If multiple images are provided, explicitly state \"identity comes only from picture N — do not borrow identity from other pictures.\"\n\nMINIMAL-CHANGE PRINCIPLE: The base image already contains the subject, composition, camera angle, expression, lighting, and background. Describe only the delta. Use positive constraints (\"preserve exact facial likeness\") not negative ones (\"don't change the face\").\n\nSINGLE-IMAGE PATTERN:\n\"Preserve the exact facial likeness and recognizability of the person from picture 1. [Describe only the requested change]. Keep the same pose, framing, camera angle, and expression unless the user specifically requests changes to these. Preserve all unmentioned details.\"\n\nMULTI-IMAGE PATTERN:\n\"Use the person from picture 1 as the final subject and preserve their exact facial likeness. [Requested edit]. Identity comes only from picture 1. Pose from picture 2. Outfit from picture 3. Do not borrow identity from pictures 2 or 3. Maintain realistic anatomy, perspective, and lighting integration. Preserve all unmentioned details.\"\n\nCREATIVE TRANSFORMATIONS — be vivid and reference-specific, name the artist, franchise, or era, but always anchor identity first:\n - \"Preserve the exact facial likeness from picture 1. Transform them into a Renaissance oil painting in the style of Vermeer — rich warm tones, dramatic chiaroscuro lighting, ornate period clothing. Maintain realistic anatomy. Preserve all unmentioned details.\"\n - \"Preserve the exact facial likeness from picture 1. Reimagine them as a Marvel superhero — cinematic dramatic lighting, heroic pose, detailed costume with cape, glowing energy effects. Preserve all unmentioned details.\"\n - \"Preserve the exact facial likeness from picture 1. Transform them into a Studio Ghibli anime character — soft watercolor backgrounds, gentle Ghibli-style rendering, whimsical atmosphere. Preserve all unmentioned details.\"\n - \"Preserve the exact facial likeness from picture 1. Place them into a Star Wars scene — Jedi robes, lightsaber glow, dramatic sci-fi backdrop. Preserve all unmentioned details.\"\n - \"Preserve the exact facial likeness from picture 1. Turn them into a GTA loading screen character — bold outlines, saturated colors, attitude-filled pose, urban backdrop. Preserve all unmentioned details.\"\n\nFAILURE MODES TO AVOID:\n- Face drift: identity source not specified, or style/pose reference overrides the face\n- Over-editing: for simple edits, prompt rewrites the entire image instead of describing the delta (creative transformations may intentionally change more)\n- Reference confusion: multiple images provided without explicit role mapping\n\nCHARACTER / MASCOT SHEETS: When the user asks for a character sheet, mascot sheet, model sheet, turnaround, expression sheet, or reusable character reference board using uploaded references, create ONE comprehensive professional reference-board image, not separate variations. Map reference roles clearly first (for example: picture 1 = character identity/style reference, picture 2 = logo/brand asset) and keep the character identity consistent across every panel. Include a large hero pose, front / 3/4 / side / back turnaround views, an expression row, action/personality poses, accessories or props, color palette swatches, and compact notes such as personality, fun facts, or brand usage when appropriate. Preserve exact user-provided brand names, slogans, logo text, and requested copy verbatim; incidental tiny notes may be generated by the image model if the user did not provide exact wording. Use clean readable typography.\n\nBATCH VARIATIONS: When numberOfVariations > 1, the prompt must describe ONE subject in ONE scene — never mention counts, \"versions\", \"different\", or \"multiple\" in the prompt text. NEVER describe multiple copies or duplicates of the subject in a single image (no grids, collages, or side-by-side). Use Dynamic Prompt syntax to vary ONE dimension across separate images. For personas: vary scene, activity, expression, or environment — never vary identity. Example: user asks \"4 versions at the beach\" → numberOfVariations=4, prompt=\"[persona] at the beach {building a sandcastle|surfing a wave|reading under a palm tree|flying a kite}\" — each output is ONE person doing ONE activity. For direct edits: vary the approach, e.g., numberOfVariations=3, prompt=\"make the sky {a vibrant sunset|stormy and dramatic|clear blue}\". Preserve any requested orientation, aspect ratio, or exact pixel dimensions across every variation.\n\nSELECTION-GATED IMAGE STAGES: If the user asks for multiple reference-guided image options/takes/versions and says they will pick one before a later dance, animation, or video, this edit_image call is still the first step. Generate the complete image batch now with sourceImageIndex set to the relevant reference, the exact requested count, Dynamic Prompt options for each output, and the final video/image aspect ratio. Do not ask the user to choose before the images exist, and do not call video tools until after the user selects an image.\n\nLINKED VARIANTS: If multiple details must stay paired per output — visual style, identity cues, outfit, label text, symbols, setting, character, prop, location, or before/after keyframe details — use ONE top-level Dynamic Prompt branch with one complete prompt per output. Do NOT use separate Dynamic Prompt groups for details that must stay together; unpaired groups can mix attributes. If the user asks for per-variant facial, identity, or appearance changes, repeat that guidance inside EVERY option while also preserving recognizability. When the user names a subject or character, write that name or stable role inside every Dynamic Prompt option; a shared prefix outside the branch is not enough because each option must stand alone as a complete identity contract.\n\nEach option must be a fully concrete description — name the actual garment or styling, the actual setting, the actual accessories, and the literal text or symbol shown on screen when requested. Never use meta-placeholder phrasing such as \"style-specific outfit\", \"variant-specific background\", \"include the requested symbol\", \"include a humorous alternate name\", or \"bake the name and symbol into the image\" — those describe the task instead of the image.\n\nORIGINAL + VARIANT BATCHES: When one option is a remade/preserved original and the other options are themed variants, the original option still needs a concrete visual contract. Say to preserve the original clothing/wardrobe/outfit and original background/setting, then name any requested added text, label, flag, logo, symbol, or prop for that original option. Do not leave the original option as only \"unmodified original person\"; it must be as fully specified as every themed option.\n\nNEW SETTING PER OPTION: When the variant theme implies a new place, culture, era, or context, every option must name its own setting (location, props, lighting). Do NOT carry the source background forward, do NOT write \"in the same pose and placement as the original photo\" without also naming the new background, and do NOT rely on \"preserve all unmentioned details\" to handle the setting — the new setting IS a mentioned detail.\n\nRECOGNIZABILITY OVER FEATURE LOCK: For ethnic / age / character / art-style transformations, do NOT paste the strict IDENTITY LOCK feature list (\"face structure, eye shape, nose shape, mouth shape, jawline, skin tone, hairline\") inside each option — that list contradicts the requested face change and the source face will pass through unchanged. Anchor recognizability per option through apparent age, signature hair silhouette, build, posture, and expression, and explicitly allow skin tone, facial features, and proportions to shift toward the target.\n\nCorrect shape (each option self-contained, concrete, with a fresh setting and a recognizability anchor instead of a strict feature lock):\n\"{The subject wearing [specific garment, color, cut, and material], standing in [specific NEW setting with props and lighting — never the source background], bold text at the bottom reads [literal requested text], [specific requested visual symbol] appears as a sign or prop, [requested per-variant facial or appearance shift, e.g. \"skin tone, eye shape, and bone structure shift toward <target> features\"], recognizable through apparent age, signature hair silhouette, build, posture, and expression|The subject wearing [second specific garment, color, cut, and material], standing in [second specific NEW setting with props and lighting], bold text at the bottom reads [second literal requested text], [second requested visual symbol] appears as a sign or prop, [second requested facial or appearance shift], recognizable through apparent age, signature hair silhouette, build, posture, and expression|...}\"\n\nWrong shape (placeholder labels masquerading as prompts):\n\"{First variant with variant-specific facial features, placeholder wardrobe, alternate name, and requested symbol baked in|Second variant with different variant-specific facial features, placeholder wardrobe, alternate name, and requested symbol baked in|...}\"\n\nAlso wrong (strict feature lock + no new setting — the source face and source background pass through unchanged):\n\"{Preserve the exact facial likeness — face structure, eye shape, nose shape, mouth shape, jawline, skin tone, hairline. Reimagine as <variant>: [garment description], standing in the exact same pose and placement as the original photo. Preserve all unmentioned details.|Preserve the exact facial likeness — [same strict lock]. Reimagine as <other variant>: [other garment], standing in the exact same pose and placement as the original photo. Preserve all unmentioned details.|...}\"\n\nSCREENPLAY / STORYBOARD BATCHES: For multi-scene story, commercial, or longer-form video keyframes, use one Dynamic Prompt branch with one full scene prompt per option. Recurring characters must keep stable names and repeated visual anchors in every scene option where they appear: face/identity source if available, age range, build, hairstyle, outfit silhouette, color palette, signature prop/accessory, posture, and role. Do not let style, scene changes, or pose references alter identity. Include screenplay-style speaker tags when dialogue matters, e.g. CHARACTER: \"We made it.\"\n\nCOMPOSITE GPT IMAGE 2 STORYBOARD SHEETS: When numberOfVariations=1 and the user asks for one composite video storyboard/keyframe sheet using uploaded or generated references, the prompt must be a compiled storyboard prompt, not a concept summary. Include a SCENES: section with exactly the requested number of concrete entries named SCENE_01, SCENE_02, etc. Every scene entry must include Visual/Action, Camera/Motion, Dialogue/VO (or [no dialogue]), Audio/SFX, and any visible text or reference usage for that scene. Do not provide only the source brief or generic layout instructions; malformed compiled storyboard prompts are blocked by quality audit."
13
+ },
14
+ "model": {
15
+ "type": "string",
16
+ "enum": [
17
+ "gpt-image-2",
18
+ "qwen-lightning",
19
+ "qwen",
20
+ "flux2"
21
+ ],
22
+ "description": "DO NOT SET THIS PARAMETER unless the user names a specific edit model, asks for a very complex reference-guided image render, or asks for a video storyboard/storyboard sheet/contact sheet/panel layout image using references. The app auto-selects based on quality settings. Set \"gpt-image-2\" when the user asks for a ChatGPT, OpenAI, GPT, GPT-2, GPT Image, or gpt-image-2 reference-guided image/edit/model, or by default for complex single-image renders that need dense labels, crisp typography, multi-panel composition, timing notes, foley notes, professional storyboard-sheet layout, or a comprehensive character/mascot/model sheet with turnarounds, expressions, accessories, palette swatches, and brand notes. Z-image and Z-image Turbo are not edit_image models; route those explicit uploaded-image enhancement requests to generate_image with sourceImageIndex and starting_image_strength. If the user names another edit/image model, honor that requested model instead. GPT Image 2 always processes input images at high fidelity; do not set input_fidelity."
23
+ },
24
+ "sourceImageIndex": {
25
+ "type": "number",
26
+ "description": "Index of the primary image to use as the main reference. For follow-up edits when generated image results already exist, use the 0-based generated image result index; for example, editing the latest generated storyboard/image should use that generated result index so the model modifies the existing image instead of redrawing from uploads. When no generated image results exist, use sourceImageIndex=-1 to use the uploaded image references. The primary image and any additional uploaded images are passed as context images to guide generation."
27
+ },
28
+ "numberOfVariations": {
29
+ "type": "number",
30
+ "description": "Number of variations (1-16). Pass the user's EXACT requested count in ONE call — never split into multiple calls and never call edit_image again to \"add more\". \"4 variations\" → numberOfVariations=4 in a single call. Use the exact requested count for reference-guided images that will feed a later video after the user picks one. For screenplay/storyboard batches, the prompt must contain one Dynamic Prompt branch with one full scene prompt per scene; never set numberOfVariations=N with only scene 1's prompt. Use 1 unless the user explicitly asks for multiple. Default: 1.",
31
+ "minimum": 1,
32
+ "maximum": 16
33
+ },
34
+ "width": {
35
+ "type": "number",
36
+ "description": "Output image width in pixels. Defaults to the context image width. Supported range is 256-2560 for Qwen/Flux.2 edit models. For gpt-image-2, dimensions are flexible up to 3840px on either edge with max 3:1 aspect ratio and a total pixel budget from 655,360 to 8,294,400; the renderer snaps to the nearest valid multiple-of-16 size. Set when the user specifies a width, exact pixel dimensions, or a named resolution (e.g., \"1280 wide\", \"1280x720\", \"720p\", \"3840x2160\"). If the user gives only one dimension, set only that dimension and preserve/infer the sensible aspect ratio. User-requested dimensions override the default media quality, including Pro. Non-multiple-of-16 values are accepted when in bounds; the renderer snaps to the nearest supported size internally, so do not ask the user to adjust by a few pixels."
37
+ },
38
+ "height": {
39
+ "type": "number",
40
+ "description": "Output image height in pixels. Defaults to the context image height. Supported range is 256-2560 for Qwen/Flux.2 edit models. For gpt-image-2, dimensions are flexible up to 3840px on either edge with max 3:1 aspect ratio and a total pixel budget from 655,360 to 8,294,400; the renderer snaps to the nearest valid multiple-of-16 size. Set when the user specifies a height, exact pixel dimensions, or a named resolution (e.g., \"720 high\", \"1280x720\", \"720p\", \"2160x3840\"). If the user gives only one dimension, set only that dimension and preserve/infer the sensible aspect ratio. User-requested dimensions override the default media quality, including Pro. Non-multiple-of-16 values are accepted when in bounds; the renderer snaps to the nearest supported size internally, so do not ask the user to adjust by a few pixels."
41
+ },
42
+ "aspectRatio": {
43
+ "type": "string",
44
+ "description": "Do NOT set unless the user explicitly requests an aspect ratio, format, orientation, or exact pixel dimensions. When a reference/source image is used and the user did not ask to change its shape, omit this field so the handler preserves the selected source image's own ratio.\n\nFormats: \"16:9\", \"9:16\", \"4:5\", \"1:1\", \"4:3\", \"3:2\", \"21:9\", or exact pixels like \"1920x1080\".\n\nCRITICAL: When the user specifies exact pixel dimensions (e.g., \"1280x720\", \"1080x1920\", \"1920x1080\", \"3840x2160\") or an orientation-qualified named resolution (e.g., \"720p landscape\", \"720p portrait\"), use the exact pixel format, NOT a ratio like \"16:9\" or \"9:16\". Exact user-requested dimensions override the selected default media quality, including Pro/HQ defaults. A bare named video resolution like \"720p resolution\" is only a resolution tier/short-side request; do not turn it into landscape pixels and do not set aspectRatio unless the user also states landscape, portrait, vertical, horizontal, or exact pixels. If requested pixels are in bounds but not on the model's pixel step, still pass the user's exact pixel request; the handler snaps to the nearest supported size internally. Only use ratio format when the user says a generic format name without pixel dimensions.\n\nMappings (use ONLY when user does NOT specify pixel dimensions): landscape/widescreen/YouTube/cinematic → \"16:9\". portrait → \"9:16\". TikTok/Reels/IG Reels → \"1080x1920\". ultrawide/cinema scope → \"21:9\". Instagram post → \"4:5\". square → \"1:1\". standard/TV → \"4:3\". 720p landscape → \"1280x720\". 720p portrait → \"720x1280\". 1080p landscape → \"1920x1080\". 1080p portrait/HD portrait → \"1080x1920\". 4K landscape → \"3840x2160\". 4K portrait → \"2160x3840\". Never set for generic requests like \"make a video\".\n\nSet this whenever the user specifies an image or downstream video orientation/aspect ratio such as 9:16, 16:9, portrait, vertical, landscape, widescreen, TikTok/Reels/Shorts, or exact pixels. This includes selection-gated reference-guided image batches that will feed a later video or dance after the user picks one. For GPT Image 2 exact size requests, preserve exact pixel intent when possible and prefer popular GPT sizes such as 1536x1024, 1024x1536, 2048x1152, 3840x2160, and 2160x3840. GPT Image 2 does not support transparent-background output; do not promise a transparent result for this model."
45
+ },
46
+ "gptImageQuality": {
47
+ "type": "string",
48
+ "enum": [
49
+ "low",
50
+ "medium",
51
+ "high",
52
+ "auto"
53
+ ],
54
+ "description": "Optional GPT Image 2 rendering quality. Only set with model=\"gpt-image-2\" when the user explicitly asks for low/fast, medium/balanced, high/final, or auto quality. Otherwise omit it and let the host app media quality setting map Fast to low, HQ to medium, and Pro to high."
55
+ },
56
+ "outputFormat": {
57
+ "type": "string",
58
+ "enum": [
59
+ "png",
60
+ "jpg",
61
+ "jpeg",
62
+ "webp"
63
+ ],
64
+ "description": "Optional output file format for generated images. Set only when the user explicitly requests PNG, JPG/JPEG, or WebP. Hosts should normalize \"jpeg\" to the Sogni project format \"jpg\"."
65
+ },
66
+ "personaName": {
67
+ "type": "string",
68
+ "description": "RARE — only set this when the user EXPLICITLY asks for solo images of one specific person (\"a portrait of just [name]\", \"4 solos of [name] alone\"). When set, the handler filters context to ONLY that persona's reference photo, so any other personas in your prompt will be missing their reference. DEFAULT for multi-persona requests is to OMIT this and put both faces in one combined call. Never set this for \"make us as X\", \"the two of us\", \"my wife and I\", or any phrasing that puts both personas in the same scene — that's a single combined call with no personaName."
69
+ }
70
+ },
71
+ "required": [
72
+ "prompt"
73
+ ]
74
+ }
@@ -0,0 +1,76 @@
1
+ {
2
+ "title": "enhance_prompt tool schema",
3
+ "schemaVersion": "2026-05-14.1",
4
+ "description": "Synchronous prompt enhancement utility for expanding or adapting a source prompt into a model-ready image, video, music, or edit prompt.",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["prompt"],
8
+ "properties": {
9
+ "prompt": {
10
+ "type": "string",
11
+ "description": "The source prompt, rough idea, or prompt revision request to enhance."
12
+ },
13
+ "target_output": {
14
+ "type": "string",
15
+ "enum": ["image_prompt", "video_prompt", "music_prompt", "edit_prompt", "model_prompt", "general_prompt"],
16
+ "description": "The kind of prompt artifact to produce."
17
+ },
18
+ "destination_model": {
19
+ "type": "string",
20
+ "description": "Optional destination model selector, such as seedance2, ltx23, wan22, flux2, gpt-image-2, or sdxl."
21
+ },
22
+ "destination_tool": {
23
+ "type": "string",
24
+ "description": "Optional downstream generation tool, such as generate_image, edit_image, generate_video, animate_photo, sound_to_video, video_to_video, or generate_music."
25
+ },
26
+ "prompting_type": {
27
+ "type": "string",
28
+ "enum": ["flux", "sdxl", "sd15", "pony", "fast", "sd3", "editing", "video"],
29
+ "description": "Optional image-prompting family when producing an image prompt."
30
+ },
31
+ "model_title": {
32
+ "type": "string",
33
+ "description": "Optional human-readable target model name for image prompt guidance."
34
+ },
35
+ "style_prompt": {
36
+ "type": "string",
37
+ "description": "Optional current style, brand, or prompt context to complement without repeating."
38
+ },
39
+ "prompt_mode": {
40
+ "type": "string",
41
+ "enum": ["auto", "preserve", "expand", "compress", "validate", "payload"],
42
+ "description": "Optional model prompt adaptation mode."
43
+ },
44
+ "duration_seconds": {
45
+ "type": "number",
46
+ "minimum": 1,
47
+ "maximum": 300,
48
+ "description": "Requested runtime when enhancing a video or music prompt."
49
+ },
50
+ "aspect_ratio": {
51
+ "type": "string",
52
+ "description": "Optional target aspect ratio, such as 16:9, 9:16, 1:1, 4:5, or 21:9."
53
+ },
54
+ "assets": {
55
+ "type": "array",
56
+ "maxItems": 12,
57
+ "description": "Optional available assets the enhanced prompt may reference.",
58
+ "items": {
59
+ "type": "object",
60
+ "additionalProperties": false,
61
+ "required": ["media_type"],
62
+ "properties": {
63
+ "id": { "type": "string" },
64
+ "label": { "type": "string" },
65
+ "media_type": { "type": "string", "enum": ["image", "video", "audio"] },
66
+ "role": { "type": "string", "enum": ["first_frame", "last_frame", "reference", "identity", "style", "motion", "audio", "source_video"] },
67
+ "url": { "type": "string" }
68
+ }
69
+ }
70
+ },
71
+ "constraints": {
72
+ "type": "object",
73
+ "description": "Optional production, brand, model, or user constraints to preserve."
74
+ }
75
+ }
76
+ }