@sogni-ai/sogni-protocol 1.0.0-alpha.32 → 1.0.0-alpha.34

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.
@@ -16,6 +16,7 @@
16
16
  "extend_video",
17
17
  "generate_image",
18
18
  "generate_music",
19
+ "generate_speech",
19
20
  "generate_video",
20
21
  "orbit_video",
21
22
  "overlay_video",
@@ -25,6 +26,7 @@
25
26
  "sound_to_video",
26
27
  "stitch_video",
27
28
  "upscale_image",
29
+ "upscale_video",
28
30
  "video_to_video"
29
31
  ],
30
32
  "app": [
@@ -61,6 +63,7 @@
61
63
  "finalize_response",
62
64
  "generate_image",
63
65
  "generate_music",
66
+ "generate_speech",
64
67
  "generate_video",
65
68
  "inspect_asset",
66
69
  "label_asset",
@@ -76,6 +79,7 @@
76
79
  "sound_to_video",
77
80
  "stitch_video",
78
81
  "upscale_image",
82
+ "upscale_video",
79
83
  "validate_asset_references",
80
84
  "video_to_video"
81
85
  ],
@@ -5,10 +5,12 @@
5
5
  "generate_image": "../schemas/tools/generate_image.schema.json",
6
6
  "generate_video": "../schemas/tools/generate_video.schema.json",
7
7
  "generate_music": "../schemas/tools/generate_music.schema.json",
8
+ "generate_speech": "../schemas/tools/generate_speech.schema.json",
8
9
  "edit_image": "../schemas/tools/edit_image.schema.json",
9
10
  "apply_style": "../schemas/tools/apply_style.schema.json",
10
11
  "restore_photo": "../schemas/tools/restore_photo.schema.json",
11
12
  "upscale_image": "../schemas/tools/upscale_image.schema.json",
13
+ "upscale_video": "../schemas/tools/upscale_video.schema.json",
12
14
  "refine_result": "../schemas/tools/refine_result.schema.json",
13
15
  "animate_photo": "../schemas/tools/animate_photo.schema.json",
14
16
  "change_angle": "../schemas/tools/change_angle.schema.json",
@@ -370,6 +372,88 @@
370
372
  }
371
373
  }
372
374
  },
375
+ {
376
+ "type": "function",
377
+ "function": {
378
+ "name": "generate_speech",
379
+ "description": "Turn written words into spoken audio. Use when the user wants something read aloud, a narration, a voiceover, a line of dialogue, an audiobook passage, or a voice cloned from a recording they uploaded. This tool speaks text; it does not compose music — use generate_music for songs and instrumentals.",
380
+ "parameters": {
381
+ "type": "object",
382
+ "properties": {
383
+ "prompt": {
384
+ "type": "string",
385
+ "description": "The exact words to be spoken, verbatim. This is NOT a description of the audio: whatever is written here is read aloud character for character. \"a calm woman reading the news\" would be spoken as those seven words — put that in voiceDescription instead and write the actual news copy here.\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\nPunctuation is prosody: full stops, commas, question marks and ellipses control pauses and intonation, so keep them. Write numbers, dates, currency and abbreviations the way they should be said (\"nineteen eighty-four\", \"twelve dollars fifty\", \"Doctor Chen\") when the plain form would be ambiguous. Line breaks are not pauses; use punctuation.\n\nLimit 4096 characters, roughly five minutes of speech. A longer script is refused rather than cut off mid-sentence, so split it across several calls at a natural break.",
386
+ "maxLength": 4096
387
+ },
388
+ "model": {
389
+ "type": "string",
390
+ "enum": [
391
+ "voice",
392
+ "clone",
393
+ "design"
394
+ ],
395
+ "description": "Which speech model to use, chosen by what the user gave you. \"voice\" (default): one of nine studio voices, optionally restyled by voiceDescription — the right choice for narration, voiceover and dialogue when no particular person is being imitated. \"clone\": reproduces a specific voice from a recording the user uploaded; requires voiceSourceIndex. \"design\": invents a speaker who does not exist from a written description; requires voiceDescription and takes no recording. Pick \"clone\" whenever the user uploads a voice clip and asks for that person, and \"design\" when they describe a speaker instead of choosing one."
396
+ },
397
+ "voice": {
398
+ "type": "string",
399
+ "enum": [
400
+ "serena",
401
+ "vivian",
402
+ "uncle_fu",
403
+ "ryan",
404
+ "aiden",
405
+ "ono_anna",
406
+ "sohee",
407
+ "eric",
408
+ "dylan"
409
+ ],
410
+ "description": "Studio voice to speak in. Only used when model=\"voice\". Female: serena (English), vivian (Chinese), ono_anna (Japanese), sohee (Korean). Male: ryan, aiden, eric, dylan (English), uncle_fu (older, Chinese). Every voice speaks all supported languages — the note above describes the accent it carries, not a limit on what it can read. Default: serena."
411
+ },
412
+ "voiceDescription": {
413
+ "type": "string",
414
+ "description": "How the line should be delivered, or who should deliver it. With model=\"voice\" this restyles the chosen voice without changing who it is: \"whispering, close to the microphone\", \"furious\", \"reading a bedtime story\", \"like a sports commentator\". With model=\"design\" this is required and describes a speaker to invent: age, gender, accent, timbre, pace, mood, and recording space — \"a warm, unhurried narrator in her forties with a faint Scottish lilt, close-miked in a quiet room\". Describe one coherent person; contradictory directions produce a voice that shifts mid-sentence. Not accepted with model=\"clone\", where the recording defines the voice. Limit 512 characters.",
415
+ "maxLength": 512
416
+ },
417
+ "voiceSourceIndex": {
418
+ "type": "number",
419
+ "description": "Index of the uploaded audio file holding the voice to clone (0-based, from the uploaded files list, the same numbering other tools use for audio). Required when model=\"clone\" and ignored otherwise. The clip should be three to thirty seconds of one person speaking cleanly, with no music, no second speaker and no heavy room echo; anything past thirty seconds is trimmed.",
420
+ "minimum": 0
421
+ },
422
+ "voiceTranscript": {
423
+ "type": "string",
424
+ "description": "The exact words spoken in the uploaded clip, when model=\"clone\". Supplying it lets the model condition on the recording itself rather than on a speaker fingerprint alone, which is markedly closer to the source — set it whenever the user tells you what the clip says or the transcript is otherwise known. Omitting it still produces a recognisable clone, just a looser one. Limit 1024 characters.",
425
+ "maxLength": 1024
426
+ },
427
+ "language": {
428
+ "type": "string",
429
+ "enum": [
430
+ "auto",
431
+ "english",
432
+ "chinese",
433
+ "japanese",
434
+ "korean",
435
+ "german",
436
+ "french",
437
+ "russian",
438
+ "portuguese",
439
+ "spanish",
440
+ "italian"
441
+ ],
442
+ "description": "Language of the script. Default \"auto\", which infers it from the text and is the only setting that reads a code-switched line correctly. Pin a language only when auto mis-reads a name, a loanword, or a passage that is ambiguous between two of them. Cloning is cross-lingual: an English reference clip can read Japanese in the same voice."
443
+ },
444
+ "numberOfVariations": {
445
+ "type": "number",
446
+ "description": "Number of takes (1-16). Each take is a separate read of the same script with the same voice, differing only in delivery. Use more than 1 when the user asks for options or alternate reads. Default: 1.",
447
+ "minimum": 1,
448
+ "maximum": 16
449
+ }
450
+ },
451
+ "required": [
452
+ "prompt"
453
+ ]
454
+ }
455
+ }
456
+ },
373
457
  {
374
458
  "type": "function",
375
459
  "function": {
@@ -582,6 +666,31 @@
582
666
  }
583
667
  }
584
668
  },
669
+ {
670
+ "type": "function",
671
+ "function": {
672
+ "name": "upscale_video",
673
+ "description": "Upscale an existing video to 1080p or 1440p with FlashVSR video super-resolution. This is promptless, deterministic enhancement, not a generative edit: it keeps every source frame, the exact frame rate, the full aspect ratio, and the original audio, and it never changes content, trims, crops, restyles, or interpolates frames. Use it when the user asks to upscale, enlarge, sharpen, or increase the resolution of an uploaded or previously generated video, or wants an HD, 1080p, 1440p, or 2K copy of it. Do not use it to create, restyle, extend, or edit a video; when the user explicitly asks a generative model such as Seedance to re-render the clip, use video_to_video. The output is at most twice the source size, so 1080p needs a source whose short edge is 540-768px and 1440p needs 720-768px, and the source can be at most about 1344x768 pixels (768x1344 in portrait). It must also be at most 362 frames and about 15 seconds long, 1-60 fps, and 100 MB. It cannot produce 4K or any size above 1440p; when the user asks for one, say so and offer 1440p. Each upscale costs credits based on the source video's size and length.",
674
+ "parameters": {
675
+ "type": "object",
676
+ "properties": {
677
+ "sourceVideoIndex": {
678
+ "type": "number",
679
+ "description": "Source video to upscale. Non-negative values select a prior generated video result by 0-based index. Negative values select uploaded videos: -1 is the first uploaded video, -2 the second, and so on. If omitted, use the latest generated video, falling back to the most recent uploaded video."
680
+ },
681
+ "targetResolution": {
682
+ "type": "number",
683
+ "enum": [
684
+ 1080,
685
+ 1440
686
+ ],
687
+ "description": "Output resolution of the short edge in pixels: 1440 for 1440p/2K or 1080 for 1080p/Full HD. The long edge follows the source aspect ratio, so portrait videos stay portrait. Default: 1440, or 1080 when the source's short edge is below 720px. Set 1080 when the user asks for 1080p or Full HD."
688
+ }
689
+ },
690
+ "required": []
691
+ }
692
+ }
693
+ },
585
694
  {
586
695
  "type": "function",
587
696
  "function": {
@@ -820,7 +929,7 @@
820
929
  "type": "function",
821
930
  "function": {
822
931
  "name": "video_to_video",
823
- "description": "Transform an existing video using AI. Uses WAN 2.2 Animate (move/replace) with a reference image, LTX 2.5 V2V controls by default (canny/pose/depth/detailer plus distilled inpaint/outpaint), LTX 2.3 as rollback, or Seedance V2V when explicitly requested. LTX 2.5 Fast, HQ, and Pro use the release-validated official Distilled workflow for canny/pose/depth/detailer/inpaint/outpaint; Dev is not publicly routed until upstream publishes and Sogni validates an official ComfyUI Dev recipe. Requires an uploaded video file. Use when the user wants to animate a photo with video motion, replace subjects, restyle footage, extend its canvas, regenerate a region, or enhance quality. Wan 3 is not a source-video editing model; its video inputs are loose references handled by generate_video.",
932
+ "description": "Transform an existing video using AI. Uses WAN 2.2 Animate (move/replace) with a reference image, LTX 2.5 V2V controls by default (canny/pose/depth/detailer plus distilled inpaint/outpaint), LTX 2.3 as rollback, or Seedance V2V when explicitly requested. LTX 2.5 Fast, HQ, and Pro use the release-validated official Distilled workflow for canny/pose/depth/detailer/inpaint/outpaint; Dev is not publicly routed until upstream publishes and Sogni validates an official ComfyUI Dev recipe. Requires an uploaded video file. Use when the user wants to animate a photo with video motion, replace subjects, restyle footage, extend its canvas, regenerate a region, or enhance quality. For a pure resolution upscale that keeps the same content (a sharper 1080p or 1440p copy), use upscale_video instead. Wan 3 is not a source-video editing model; its video inputs are loose references handled by generate_video.",
824
933
  "parameters": {
825
934
  "type": "object",
826
935
  "properties": {
@@ -332,6 +332,88 @@
332
332
  }
333
333
  }
334
334
  },
335
+ {
336
+ "type": "function",
337
+ "function": {
338
+ "name": "generate_speech",
339
+ "description": "Turn written words into spoken audio. Use when the user wants something read aloud, a narration, a voiceover, a line of dialogue, an audiobook passage, or a voice cloned from a recording they uploaded. This tool speaks text; it does not compose music — use generate_music for songs and instrumentals.",
340
+ "parameters": {
341
+ "type": "object",
342
+ "properties": {
343
+ "prompt": {
344
+ "type": "string",
345
+ "description": "The exact words to be spoken, verbatim. This is NOT a description of the audio: whatever is written here is read aloud character for character. \"a calm woman reading the news\" would be spoken as those seven words — put that in voiceDescription instead and write the actual news copy here.\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\nPunctuation is prosody: full stops, commas, question marks and ellipses control pauses and intonation, so keep them. Write numbers, dates, currency and abbreviations the way they should be said (\"nineteen eighty-four\", \"twelve dollars fifty\", \"Doctor Chen\") when the plain form would be ambiguous. Line breaks are not pauses; use punctuation.\n\nLimit 4096 characters, roughly five minutes of speech. A longer script is refused rather than cut off mid-sentence, so split it across several calls at a natural break.",
346
+ "maxLength": 4096
347
+ },
348
+ "model": {
349
+ "type": "string",
350
+ "enum": [
351
+ "voice",
352
+ "clone",
353
+ "design"
354
+ ],
355
+ "description": "Which speech model to use, chosen by what the user gave you. \"voice\" (default): one of nine studio voices, optionally restyled by voiceDescription — the right choice for narration, voiceover and dialogue when no particular person is being imitated. \"clone\": reproduces a specific voice from a recording the user uploaded; requires voiceSourceIndex. \"design\": invents a speaker who does not exist from a written description; requires voiceDescription and takes no recording. Pick \"clone\" whenever the user uploads a voice clip and asks for that person, and \"design\" when they describe a speaker instead of choosing one."
356
+ },
357
+ "voice": {
358
+ "type": "string",
359
+ "enum": [
360
+ "serena",
361
+ "vivian",
362
+ "uncle_fu",
363
+ "ryan",
364
+ "aiden",
365
+ "ono_anna",
366
+ "sohee",
367
+ "eric",
368
+ "dylan"
369
+ ],
370
+ "description": "Studio voice to speak in. Only used when model=\"voice\". Female: serena (English), vivian (Chinese), ono_anna (Japanese), sohee (Korean). Male: ryan, aiden, eric, dylan (English), uncle_fu (older, Chinese). Every voice speaks all supported languages — the note above describes the accent it carries, not a limit on what it can read. Default: serena."
371
+ },
372
+ "voiceDescription": {
373
+ "type": "string",
374
+ "description": "How the line should be delivered, or who should deliver it. With model=\"voice\" this restyles the chosen voice without changing who it is: \"whispering, close to the microphone\", \"furious\", \"reading a bedtime story\", \"like a sports commentator\". With model=\"design\" this is required and describes a speaker to invent: age, gender, accent, timbre, pace, mood, and recording space — \"a warm, unhurried narrator in her forties with a faint Scottish lilt, close-miked in a quiet room\". Describe one coherent person; contradictory directions produce a voice that shifts mid-sentence. Not accepted with model=\"clone\", where the recording defines the voice. Limit 512 characters.",
375
+ "maxLength": 512
376
+ },
377
+ "voiceSourceIndex": {
378
+ "type": "number",
379
+ "description": "Index of the uploaded audio file holding the voice to clone (0-based, from the uploaded files list, the same numbering other tools use for audio). Required when model=\"clone\" and ignored otherwise. The clip should be three to thirty seconds of one person speaking cleanly, with no music, no second speaker and no heavy room echo; anything past thirty seconds is trimmed.",
380
+ "minimum": 0
381
+ },
382
+ "voiceTranscript": {
383
+ "type": "string",
384
+ "description": "The exact words spoken in the uploaded clip, when model=\"clone\". Supplying it lets the model condition on the recording itself rather than on a speaker fingerprint alone, which is markedly closer to the source — set it whenever the user tells you what the clip says or the transcript is otherwise known. Omitting it still produces a recognisable clone, just a looser one. Limit 1024 characters.",
385
+ "maxLength": 1024
386
+ },
387
+ "language": {
388
+ "type": "string",
389
+ "enum": [
390
+ "auto",
391
+ "english",
392
+ "chinese",
393
+ "japanese",
394
+ "korean",
395
+ "german",
396
+ "french",
397
+ "russian",
398
+ "portuguese",
399
+ "spanish",
400
+ "italian"
401
+ ],
402
+ "description": "Language of the script. Default \"auto\", which infers it from the text and is the only setting that reads a code-switched line correctly. Pin a language only when auto mis-reads a name, a loanword, or a passage that is ambiguous between two of them. Cloning is cross-lingual: an English reference clip can read Japanese in the same voice."
403
+ },
404
+ "numberOfVariations": {
405
+ "type": "number",
406
+ "description": "Number of takes (1-16). Each take is a separate read of the same script with the same voice, differing only in delivery. Use more than 1 when the user asks for options or alternate reads. Default: 1.",
407
+ "minimum": 1,
408
+ "maximum": 16
409
+ }
410
+ },
411
+ "required": [
412
+ "prompt"
413
+ ]
414
+ }
415
+ }
416
+ },
335
417
  {
336
418
  "type": "function",
337
419
  "function": {
@@ -526,6 +608,31 @@
526
608
  }
527
609
  }
528
610
  },
611
+ {
612
+ "type": "function",
613
+ "function": {
614
+ "name": "upscale_video",
615
+ "description": "Upscale an existing video to 1080p or 1440p with FlashVSR video super-resolution. This is promptless, deterministic enhancement, not a generative edit: it keeps every source frame, the exact frame rate, the full aspect ratio, and the original audio, and it never changes content, trims, crops, restyles, or interpolates frames. Use it when the user asks to upscale, enlarge, sharpen, or increase the resolution of an uploaded or previously generated video, or wants an HD, 1080p, 1440p, or 2K copy of it. Do not use it to create, restyle, extend, or edit a video; when the user explicitly asks a generative model such as Seedance to re-render the clip, use video_to_video. The output is at most twice the source size, so 1080p needs a source whose short edge is 540-768px and 1440p needs 720-768px, and the source can be at most about 1344x768 pixels (768x1344 in portrait). It must also be at most 362 frames and about 15 seconds long, 1-60 fps, and 100 MB. It cannot produce 4K or any size above 1440p; when the user asks for one, say so and offer 1440p. Each upscale costs credits based on the source video's size and length.",
616
+ "parameters": {
617
+ "type": "object",
618
+ "properties": {
619
+ "sourceVideoIndex": {
620
+ "type": "number",
621
+ "description": "Source video to upscale. Non-negative values select a prior generated video result by 0-based index. Negative values select uploaded videos: -1 is the first uploaded video, -2 the second, and so on. If omitted, use the latest generated video, falling back to the most recent uploaded video."
622
+ },
623
+ "targetResolution": {
624
+ "type": "number",
625
+ "enum": [
626
+ 1080,
627
+ 1440
628
+ ],
629
+ "description": "Output resolution of the short edge in pixels: 1440 for 1440p/2K or 1080 for 1080p/Full HD. The long edge follows the source aspect ratio, so portrait videos stay portrait. Default: 1440, or 1080 when the source's short edge is below 720px. Set 1080 when the user asks for 1080p or Full HD."
630
+ }
631
+ },
632
+ "required": []
633
+ }
634
+ }
635
+ },
529
636
  {
530
637
  "type": "function",
531
638
  "function": {
@@ -764,7 +871,7 @@
764
871
  "type": "function",
765
872
  "function": {
766
873
  "name": "video_to_video",
767
- "description": "Transform an existing video using AI. Uses WAN 2.2 Animate (move/replace) with a reference image, LTX 2.5 V2V controls by default (canny/pose/depth/detailer plus distilled inpaint/outpaint), LTX 2.3 as rollback, or Seedance V2V when explicitly requested. LTX 2.5 Fast, HQ, and Pro use the release-validated official Distilled workflow for canny/pose/depth/detailer/inpaint/outpaint; Dev is not publicly routed until upstream publishes and Sogni validates an official ComfyUI Dev recipe. Requires an uploaded video file. Use when the user wants to animate a photo with video motion, replace subjects, restyle footage, extend its canvas, regenerate a region, or enhance quality. Wan 3 is not a source-video editing model; its video inputs are loose references handled by generate_video.",
874
+ "description": "Transform an existing video using AI. Uses WAN 2.2 Animate (move/replace) with a reference image, LTX 2.5 V2V controls by default (canny/pose/depth/detailer plus distilled inpaint/outpaint), LTX 2.3 as rollback, or Seedance V2V when explicitly requested. LTX 2.5 Fast, HQ, and Pro use the release-validated official Distilled workflow for canny/pose/depth/detailer/inpaint/outpaint; Dev is not publicly routed until upstream publishes and Sogni validates an official ComfyUI Dev recipe. Requires an uploaded video file. Use when the user wants to animate a photo with video motion, replace subjects, restyle footage, extend its canvas, regenerate a region, or enhance quality. For a pure resolution upscale that keeps the same content (a sharper 1080p or 1440p copy), use upscale_video instead. Wan 3 is not a source-video editing model; its video inputs are loose references handled by generate_video.",
768
875
  "parameters": {
769
876
  "type": "object",
770
877
  "properties": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sogni-ai/sogni-protocol",
3
- "version": "1.0.0-alpha.32",
3
+ "version": "1.0.0-alpha.34",
4
4
  "description": "Language-neutral protocol artifacts for the Sogni ecosystem: tool schemas, prompts, OpenAI tool manifests, and enums. Consumed by every Sogni SDK (TypeScript, Swift, and future Python/Kotlin/Rust SDKs) so contracts stay in lockstep across languages.",
5
5
  "keywords": [
6
6
  "sogni",
@@ -0,0 +1,10 @@
1
+ {
2
+ "contractId": "upscale_video_v1",
3
+ "version": "1.0.0",
4
+ "toolName": "upscale_video",
5
+ "baseDescription": "upscale_video performs promptless, deterministic FlashVSR super-resolution of exactly one\nuploaded or generated video. Use it when the user asks to upscale, enlarge, sharpen, or increase\nthe resolution of an existing video, or wants a 1080p, 1440p, 2K, or HD copy of it. The output\nkeeps every source frame, the exact frame rate, the full aspect ratio, and the original audio.\n\nDo not invent a prompt and do not route a pure video upscale through video_to_video,\ngenerate_video, extend_video, or replace_video_segment; those tools re-render or edit content.\nUse video_to_video only when the user explicitly names a generative model such as Seedance for\nthe re-render. Do not use upscale_image for videos.\n\nOmit sourceVideoIndex to use the latest generated video, falling back to the most recent upload.\nUse zero-based non-negative indices for generated videos; -1 selects the first uploaded video\nand -2 the second. targetResolution is the output short edge: omit it for 1440p (or 1080p when\nthe source is too small for 1440p), and set 1080 when the user asks for 1080p or Full HD.\nThe output is at most twice the source size, so 1440p needs a source short edge of 720-768px\nand 1080p needs 540-768px. Sources must also be at most about 1344x768 pixels (768x1344 in\nportrait), 362 frames (about 15 seconds), 1-60 fps, and 100 MB. If the tool reports the source\nis outside these limits, explain the limit to the user instead of switching to a generative\nvideo tool. It cannot produce 4K or any size above 1440p: when the user asks for one, say so and\noffer 1440p instead of silently delivering less.",
6
+ "parameterDocs": {
7
+ "sourceVideoIndex": "Omit for the latest generated video, then the most recent upload. Generated videos are zero-based; -1/-2 select uploaded videos.",
8
+ "targetResolution": "Output short edge in pixels: 1440 or 1080. Omit for the default (1440, or 1080 for sources under 720px); set 1080 when the user asks for 1080p or Full HD."
9
+ }
10
+ }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "contractId": "video_to_video_v1",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "toolName": "video_to_video",
5
- "baseDescription": "video_to_video transforms an uploaded video. LTX 2.5 is the default for canny, pose, depth, detailer, inpaint, and outpaint; use LTX 2.3 only for explicit rollback. LTX 2.5 Distilled supports all six controls, while Dev + Speed LoRA supports canny, pose, depth, and detailer. Use WAN Animate for motion transfer or subject replacement, and Seedance V2V only when explicitly requested.\n\nThis tool requires an uploaded video source. Do not use it for generated video indices. For generated or uploaded partial edits use replace_video_segment; for appended time use extend_video; for logos/text overlays use overlay_video; for stitching use stitch_video.\n\nChoose controlMode by intent. Use detailer for quality-only enhancement without restyling. For detailer, describe the original scene plus quality terms, not new content.",
5
+ "baseDescription": "video_to_video transforms an uploaded video. LTX 2.5 is the default for canny, pose, depth, detailer, inpaint, and outpaint; use LTX 2.3 only for explicit rollback. LTX 2.5 Distilled supports all six controls, while Dev + Speed LoRA supports canny, pose, depth, and detailer. Use WAN Animate for motion transfer or subject replacement, and Seedance V2V only when explicitly requested.\n\nFor a pure resolution upscale (a sharper 1080p, 1440p, 2K, or HD copy of the same video), use upscale_video instead; it is promptless and keeps every frame, the frame rate, and the audio.\n\nThis tool requires an uploaded video source. Do not use it for generated video indices. For generated or uploaded partial edits use replace_video_segment; for appended time use extend_video; for logos/text overlays use overlay_video; for stitching use stitch_video.\n\nChoose controlMode by intent. Use detailer for generative detail enhancement without restyling when the user wants the content re-rendered rather than only more resolution. For detailer, describe the original scene plus quality terms, not new content.",
6
6
  "parameterDocs": {
7
7
  "prompt": "Describe the target appearance in present tense. For detailer, describe the original content plus quality qualifiers only.",
8
8
  "videoSourceIndex": "Uploaded video index. Omit when there is one uploaded video; use 0 for first uploaded video or -1 if using negative upload notation.",
9
- "controlMode": "Pick from intent: detailer for enhance, inpaint/outpaint for masked or canvas edits, seedance-v2v for explicit Seedance V2V, canny/depth/pose for control-guided restyles, animate-move/replace for WAN Animate.",
9
+ "controlMode": "Pick from intent: detailer for generative enhancement, inpaint/outpaint for masked or canvas edits, seedance-v2v for explicit Seedance V2V, canny/depth/pose for control-guided restyles, animate-move/replace for WAN Animate.",
10
10
  "sourceImageIndex": "Required for animate-move and animate-replace. Ignored by canny, depth, and detailer.",
11
11
  "duration": "Set only when the user requests a different output length; otherwise let the tool match/cap the source duration."
12
12
  }
@@ -0,0 +1,81 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.sogni.ai/creative-agent/2026-09-07.1/tools/generate_speech.schema.json",
4
+ "title": "generate_speech arguments",
5
+ "schemaVersion": "2026-09-07.1",
6
+ "description": "Turn written words into spoken audio. Use when the user wants something read aloud, a narration, a voiceover, a line of dialogue, an audiobook passage, or a voice cloned from a recording they uploaded. This tool speaks text; it does not compose music — use generate_music for songs and instrumentals.",
7
+ "type": "object",
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "prompt": {
11
+ "type": "string",
12
+ "description": "The exact words to be spoken, verbatim. This is NOT a description of the audio: whatever is written here is read aloud character for character. \"a calm woman reading the news\" would be spoken as those seven words — put that in voiceDescription instead and write the actual news copy here.\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\nPunctuation is prosody: full stops, commas, question marks and ellipses control pauses and intonation, so keep them. Write numbers, dates, currency and abbreviations the way they should be said (\"nineteen eighty-four\", \"twelve dollars fifty\", \"Doctor Chen\") when the plain form would be ambiguous. Line breaks are not pauses; use punctuation.\n\nLimit 4096 characters, roughly five minutes of speech. A longer script is refused rather than cut off mid-sentence, so split it across several calls at a natural break.",
13
+ "maxLength": 4096
14
+ },
15
+ "model": {
16
+ "type": "string",
17
+ "enum": [
18
+ "voice",
19
+ "clone",
20
+ "design"
21
+ ],
22
+ "description": "Which speech model to use, chosen by what the user gave you. \"voice\" (default): one of nine studio voices, optionally restyled by voiceDescription — the right choice for narration, voiceover and dialogue when no particular person is being imitated. \"clone\": reproduces a specific voice from a recording the user uploaded; requires voiceSourceIndex. \"design\": invents a speaker who does not exist from a written description; requires voiceDescription and takes no recording. Pick \"clone\" whenever the user uploads a voice clip and asks for that person, and \"design\" when they describe a speaker instead of choosing one."
23
+ },
24
+ "voice": {
25
+ "type": "string",
26
+ "enum": [
27
+ "serena",
28
+ "vivian",
29
+ "uncle_fu",
30
+ "ryan",
31
+ "aiden",
32
+ "ono_anna",
33
+ "sohee",
34
+ "eric",
35
+ "dylan"
36
+ ],
37
+ "description": "Studio voice to speak in. Only used when model=\"voice\". Female: serena (English), vivian (Chinese), ono_anna (Japanese), sohee (Korean). Male: ryan, aiden, eric, dylan (English), uncle_fu (older, Chinese). Every voice speaks all supported languages — the note above describes the accent it carries, not a limit on what it can read. Default: serena."
38
+ },
39
+ "voiceDescription": {
40
+ "type": "string",
41
+ "description": "How the line should be delivered, or who should deliver it. With model=\"voice\" this restyles the chosen voice without changing who it is: \"whispering, close to the microphone\", \"furious\", \"reading a bedtime story\", \"like a sports commentator\". With model=\"design\" this is required and describes a speaker to invent: age, gender, accent, timbre, pace, mood, and recording space — \"a warm, unhurried narrator in her forties with a faint Scottish lilt, close-miked in a quiet room\". Describe one coherent person; contradictory directions produce a voice that shifts mid-sentence. Not accepted with model=\"clone\", where the recording defines the voice. Limit 512 characters.",
42
+ "maxLength": 512
43
+ },
44
+ "voiceSourceIndex": {
45
+ "type": "number",
46
+ "description": "Index of the uploaded audio file holding the voice to clone (0-based, from the uploaded files list, the same numbering other tools use for audio). Required when model=\"clone\" and ignored otherwise. The clip should be three to thirty seconds of one person speaking cleanly, with no music, no second speaker and no heavy room echo; anything past thirty seconds is trimmed.",
47
+ "minimum": 0
48
+ },
49
+ "voiceTranscript": {
50
+ "type": "string",
51
+ "description": "The exact words spoken in the uploaded clip, when model=\"clone\". Supplying it lets the model condition on the recording itself rather than on a speaker fingerprint alone, which is markedly closer to the source — set it whenever the user tells you what the clip says or the transcript is otherwise known. Omitting it still produces a recognisable clone, just a looser one. Limit 1024 characters.",
52
+ "maxLength": 1024
53
+ },
54
+ "language": {
55
+ "type": "string",
56
+ "enum": [
57
+ "auto",
58
+ "english",
59
+ "chinese",
60
+ "japanese",
61
+ "korean",
62
+ "german",
63
+ "french",
64
+ "russian",
65
+ "portuguese",
66
+ "spanish",
67
+ "italian"
68
+ ],
69
+ "description": "Language of the script. Default \"auto\", which infers it from the text and is the only setting that reads a code-switched line correctly. Pin a language only when auto mis-reads a name, a loanword, or a passage that is ambiguous between two of them. Cloning is cross-lingual: an English reference clip can read Japanese in the same voice."
70
+ },
71
+ "numberOfVariations": {
72
+ "type": "number",
73
+ "description": "Number of takes (1-16). Each take is a separate read of the same script with the same voice, differing only in delivery. Use more than 1 when the user asks for options or alternate reads. Default: 1.",
74
+ "minimum": 1,
75
+ "maximum": 16
76
+ }
77
+ },
78
+ "required": [
79
+ "prompt"
80
+ ]
81
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.sogni.ai/creative-agent/2026-09-10.1/tools/upscale_video.schema.json",
4
+ "title": "upscale_video arguments",
5
+ "schemaVersion": "2026-09-10.1",
6
+ "description": "Upscale an existing video to 1080p or 1440p with FlashVSR video super-resolution. This is promptless, deterministic enhancement, not a generative edit: it keeps every source frame, the exact frame rate, the full aspect ratio, and the original audio, and it never changes content, trims, crops, restyles, or interpolates frames. Use it when the user asks to upscale, enlarge, sharpen, or increase the resolution of an uploaded or previously generated video, or wants an HD, 1080p, 1440p, or 2K copy of it. Do not use it to create, restyle, extend, or edit a video; when the user explicitly asks a generative model such as Seedance to re-render the clip, use video_to_video. The output is at most twice the source size, so 1080p needs a source whose short edge is 540-768px and 1440p needs 720-768px, and the source can be at most about 1344x768 pixels (768x1344 in portrait). It must also be at most 362 frames and about 15 seconds long, 1-60 fps, and 100 MB. It cannot produce 4K or any size above 1440p; when the user asks for one, say so and offer 1440p. Each upscale costs credits based on the source video's size and length.",
7
+ "type": "object",
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "sourceVideoIndex": {
11
+ "type": "number",
12
+ "description": "Source video to upscale. Non-negative values select a prior generated video result by 0-based index. Negative values select uploaded videos: -1 is the first uploaded video, -2 the second, and so on. If omitted, use the latest generated video, falling back to the most recent uploaded video."
13
+ },
14
+ "targetResolution": {
15
+ "type": "number",
16
+ "enum": [
17
+ 1080,
18
+ 1440
19
+ ],
20
+ "description": "Output resolution of the short edge in pixels: 1440 for 1440p/2K or 1080 for 1080p/Full HD. The long edge follows the source aspect ratio, so portrait videos stay portrait. Default: 1440, or 1080 when the source's short edge is below 720px. Set 1080 when the user asks for 1080p or Full HD."
21
+ }
22
+ },
23
+ "required": []
24
+ }
@@ -3,7 +3,7 @@
3
3
  "$id": "https://schemas.sogni.ai/creative-agent/2026-07-18.1/tools/video_to_video.schema.json",
4
4
  "title": "video_to_video arguments",
5
5
  "schemaVersion": "2026-07-18.1",
6
- "description": "Transform an existing video using AI. Uses WAN 2.2 Animate (move/replace) with a reference image, LTX 2.5 V2V controls by default (canny/pose/depth/detailer plus distilled inpaint/outpaint), LTX 2.3 as rollback, or Seedance V2V when explicitly requested. LTX 2.5 Fast, HQ, and Pro use the release-validated official Distilled workflow for canny/pose/depth/detailer/inpaint/outpaint; Dev is not publicly routed until upstream publishes and Sogni validates an official ComfyUI Dev recipe. Requires an uploaded video file. Use when the user wants to animate a photo with video motion, replace subjects, restyle footage, extend its canvas, regenerate a region, or enhance quality. Wan 3 is not a source-video editing model; its video inputs are loose references handled by generate_video.",
6
+ "description": "Transform an existing video using AI. Uses WAN 2.2 Animate (move/replace) with a reference image, LTX 2.5 V2V controls by default (canny/pose/depth/detailer plus distilled inpaint/outpaint), LTX 2.3 as rollback, or Seedance V2V when explicitly requested. LTX 2.5 Fast, HQ, and Pro use the release-validated official Distilled workflow for canny/pose/depth/detailer/inpaint/outpaint; Dev is not publicly routed until upstream publishes and Sogni validates an official ComfyUI Dev recipe. Requires an uploaded video file. Use when the user wants to animate a photo with video motion, replace subjects, restyle footage, extend its canvas, regenerate a region, or enhance quality. For a pure resolution upscale that keeps the same content (a sharper 1080p or 1440p copy), use upscale_video instead. Wan 3 is not a source-video editing model; its video inputs are loose references handled by generate_video.",
7
7
  "type": "object",
8
8
  "additionalProperties": false,
9
9
  "properties": {
@@ -39,6 +39,7 @@
39
39
  "apply_style",
40
40
  "restore_photo",
41
41
  "upscale_image",
42
+ "upscale_video",
42
43
  "refine_result",
43
44
  "animate_photo",
44
45
  "change_angle",
package/version.json CHANGED
@@ -1,4 +1,4 @@
1
1
  {
2
- "protocolVersion": "4.2.0",
2
+ "protocolVersion": "4.4.0",
3
3
  "description": "Sogni protocol artifact version. SDKs may refuse to operate against a protocolVersion they were not built for. Bump the major when removing or renaming any schema / enum / manifest field; bump the minor when adding new optional fields or new tools; bump the patch for description / prose changes only."
4
4
  }