@kolbo/mcp 1.114.1 → 1.115.0
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.
- package/README.md +1 -1
- package/package.json +1 -1
- package/skill/GENERATED.md +1 -1
- package/skill/SKILL.md +13 -14
- package/skill/VERSION +1 -1
- package/skill/references/models/seedance.md +4 -2
- package/skill/references/models/seedance25.md +1 -1
- package/skill/references/workflows/prompt-structure.md +2 -0
- package/src/tools/generate.js +33 -9
package/README.md
CHANGED
|
@@ -148,7 +148,7 @@ Without the optional skill, the config block alone already exposes every tool
|
|
|
148
148
|
| `generate_creative_director` | One brief → N coordinated scenes (image or video) |
|
|
149
149
|
| `generate_music` | Text (+ optional lyrics) → song. Style, title, negative tags, length, and Suno fine-controls (style weight, weirdness, audio weight, persona / singing voice) |
|
|
150
150
|
| `generate_speech` | Text + voice → spoken audio. `eleven_model` (eleven_v4 / eleven_v3 / eleven_multilingual_v2) picks which ElevenLabs model speaks an ElevenLabs voice (stock or own clone; omit = the voice's default; same price; `turbo` needs v4). Full expressive/style control: Google/Gemini named voice-direction presets (`style_instructions_preset_id`: warm/dramatic/whisper/…) or free-form `style_instructions`, preset styles + emotions (DeepDub / MiniMax / Cartesia), speed, accent/`language`, and per-provider voice settings (ElevenLabs stability/similarity/style/speaker boost/seed, `enforce_language`, `output_format` mp3/wav, `text_normalization`; DeepDub accent/variance/tempo, MiniMax pitch/volume/intensity/timbre), plus `audio_effect` (phone/radio/megaphone/small_room/hall/distant) + `audio_effect_strength` for any voice at no extra credits. Status returns the same fields for reuse. |
|
|
151
|
-
| `generate_sound` | Text → sound effect. Duration, prompt influence, and per-provider controls (Stable Audio guidance, Kie loop/tempo/key, Seed-Audio voice/speed/volume/pitch + reference audio/image) |
|
|
151
|
+
| `generate_sound` | Text → sound effect. Duration, prompt influence, and per-provider controls (Stable Audio guidance, Kie loop/tempo/key, Seed-Audio voice/speed/volume/pitch + reference audio/image, output format, Mirelo SFX 2.0 negative prompt / variations / seed / bitrate) |
|
|
152
152
|
| `generate_3d` | Text or reference images → 3D model (GLB/FBX/OBJ/USDZ) |
|
|
153
153
|
| `transcribe_audio` | Audio/video URL or file → text + SRT subtitles. Language, speaker diarization, audio-event tagging, and SRT formatting (words/line, lines/subtitle, caption stretch) |
|
|
154
154
|
| `separate_audio_stems` | Audio/video URL (or a Kolbo `generation_id`) → Dialogue / Music / Effects / without-dialogue (M&E) layers. Kolbo's own masking pipeline with a speech classifier on top, so a centred engine or ambience is not handed back mislabelled as dialogue. 5 credits, runs inline |
|
package/package.json
CHANGED
package/skill/GENERATED.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# AUTO-GENERATED — do not edit
|
|
2
2
|
|
|
3
|
-
This tree is mirrored from kolbo-code@
|
|
3
|
+
This tree is mirrored from kolbo-code@f2ab5de, the single source of truth.
|
|
4
4
|
Canonical source: packages/opencode/skills/kolbo/
|
|
5
5
|
Distribution: .github/workflows/sync-skill-to-plugin.yml
|
|
6
6
|
|
package/skill/SKILL.md
CHANGED
|
@@ -1,19 +1,8 @@
|
|
|
1
1
|
---
|
|
2
|
-
version: 0.9.
|
|
2
|
+
version: 0.9.25
|
|
3
3
|
name: kolbo
|
|
4
4
|
description: |
|
|
5
|
-
Generate, edit, analyze, and direct creative media through Kolbo AI: images,
|
|
6
|
-
video (Seedance, Veo, Kling, Hailuo), music, speech, sound, 3D, transcription,
|
|
7
|
-
Visual DNA, Creative Director batches, marketing assets, HTML artifacts, and
|
|
8
|
-
AI Docs, Flow node workflows and session/system prompts, and approved Blender scene control. Use for sophisticated AI
|
|
9
|
-
filmmaking as well as individual media:
|
|
10
|
-
scripts, production bibles, recurring characters and locations, acting,
|
|
11
|
-
dialogue, music performance, blocking, physics, multi-shot continuity,
|
|
12
|
-
connected scenes, prompt audits, feature-length production planning, end-to-end vertical micro-drama series (Micro-Drama Studio), and
|
|
13
|
-
direct Blender scene building through the connected Kolbo Blender plugin.
|
|
14
|
-
|
|
15
|
-
NOT for: unrelated standalone video editing / FFmpeg (use video-production), motion graphics
|
|
16
|
-
(use remotion-best-practices), code editing, or general chat.
|
|
5
|
+
Generate, edit, analyze, and direct creative media through Kolbo AI: images, video (Seedance, Veo, Kling, Hailuo), music, speech, sound, 3D, transcription, Visual DNA, Creative Director batches, marketing assets, HTML artifacts, and AI Docs, Flow node workflows and session/system prompts, and approved Blender scene control. Use for sophisticated AI filmmaking as well as individual media: scripts, production bibles, recurring characters and locations, acting, dialogue, music performance, blocking, physics, multi-shot continuity, connected scenes, prompt audits, feature-length production planning, end-to-end vertical micro-drama series (Micro-Drama Studio), and direct Blender scene building through the connected Kolbo Blender plugin. NOT for: unrelated standalone video editing / FFmpeg (use video-production), motion graphics (use remotion-best-practices), code editing, or general chat.
|
|
17
6
|
argument-hint: "[prompt-or-command] [--model <name>] [--image <path>] [--video <path>]"
|
|
18
7
|
allowed-tools: Bash, Read, Write, Edit
|
|
19
8
|
---
|
|
@@ -280,7 +269,7 @@ Dependencies accumulate: narrative Elements work requires **Kolbo + filmmaking +
|
|
|
280
269
|
|
|
281
270
|
## ⚠️ Seedance / Elements prompt contract (HARD RULE)
|
|
282
271
|
|
|
283
|
-
`generate_elements`, Seedance 2 / 2.5, WAN, MiniMax H3, Gemini, and
|
|
272
|
+
Mode wins over model family. **Frames** (`generate_video_from_image`) and **First/Last Frame** (`generate_first_last_frame`) use ordinary motion/camera/transition prose grounded in the supplied composition, including on Seedance 2.5. Do not add Elements CAST/LOCATION blocks, invent DNA names, or enable cuts because a template says so. An ordinary uploaded frame is `@Image1`, not a DNA; an end frame is `@Image2`. For **Elements / text-driven multi-shot** work, `generate_elements`, Seedance 2 / 2.5, WAN, MiniMax H3, Gemini, and reference-composed video share the Locked Intro in `references/models/seedance.md`. Load `elements-prompting` first (craft, exact `@ImageN` mapping, eight elements), then compile:
|
|
284
273
|
|
|
285
274
|
`N connected cinematic shots, Xs total, AR, Multishot ON` → `Total: Xs / N shots / AR` → `[GLOBAL LOOK – LOCKED, APPLIES TO EVERY SHOT]` → `[CAST – IDENTICAL IN EVERY SHOT]` (each person is `@DNAName`) → `[LOCATION]` → LOCATION MAP / CONTINUITY / PHYSICS → `SHOT N — 0:00–0:02 — …` (ranges sum to Xs) → closing `Total: Xs / N shots / AR`. Pass MCP `duration: X` matching that Total. Omitting Total / Multishot is a failed compile — same contract as the Kolbo help widget.
|
|
286
275
|
|
|
@@ -341,6 +330,16 @@ A user-named tool — in any language — overrides every other rule. Recognized
|
|
|
341
330
|
|
|
342
331
|
Model types for `list_models`: `text_to_img`, `image_editing`, `text_to_video`, `img_to_video`, `draw_to_video`, `video_to_video`, `elements`, `firstlastgenerations`, `lipsync-image`, `lipsync-video`, `music_gen`, `text_to_speech`, `text_to_sound`, `stt`, `text`, `3d_text_to_model`, `3d_image_to_model`, `3d_multi_image_to_model`, `3d_world`.
|
|
343
332
|
|
|
333
|
+
### Practical iteration and prompt diagnosis
|
|
334
|
+
|
|
335
|
+
- Start from the final deliverable. For a video, intermediate stills need only serve their intended role. Elements references can establish identity, wardrobe, props, environment or style without fixing every camera angle. Frames are literal compositions to animate. Do not make the user perfect every intermediate still when the final video is what matters.
|
|
336
|
+
- Keep the original prompt, original references, model and settings when available. Repeatedly editing an imperfect derivative can compound drift. When a major viewpoint or composition edit keeps failing, compare a different edit wording with a fresh generation from the original reference. Preserve an explicit request to edit rather than silently switching routes.
|
|
337
|
+
- An image prompt describes one still moment. Remove video timelines from an image request and write the desired still. A video prompt describes visible motion, camera trajectory, timing and sound. For an unbroken take, write timed actions within one shot; do not turn intermediate poses into cuts or dissolves.
|
|
338
|
+
- Use economical trials only within the authorized scope and budget. A couple of samples can distinguish random variation from a repeated failure; a few genuinely different prompt approaches can test different mechanisms. These are options, not required extra spending. When comparing models, keep the prompt, references/order, duration and ratio comparable. Ratio affects composition and behavior; preserve the intended output format.
|
|
339
|
+
- Judge the actual result, not whether an LLM praised the prompt. Separate reference binding/delivery failures from a poor source, an unsuitable method, model behavior and mixed conversation context. When an unchanged method fails repeatedly, change the tested hypothesis rather than keep spending on it. Do not promise that a prompt rewrite guarantees success.
|
|
340
|
+
- Use exact numbered upload tokens in attachment order. A title, filename or invented subject name never becomes a registered DNA. Retain a supplied/selected DNA name verbatim, including Hebrew; never invent a DNA to fill a template's CAST block.
|
|
341
|
+
- Keep unrelated goals in separate sessions. When context becomes mixed, preserve a compact checkpoint with the accepted brief, source references, working prompts/settings and observed failures. Offer a supported fork/new session; do not claim to have moved or forked a session without a successful tool result.
|
|
342
|
+
|
|
344
343
|
## ⚠️ Generation lifecycle — source of truth, waiting, failures (HARD RULE — read this)
|
|
345
344
|
|
|
346
345
|
**How calls work:** each generation tool blocks until the job is fully complete. Images: seconds. Video: minutes. Multiple tool calls in one response run concurrently. On hosts with live widgets the tool instead returns `submitted` (or `_timed_out`) instantly — the card updates on its own.
|
package/skill/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.9.
|
|
1
|
+
0.9.25
|
|
@@ -7,10 +7,12 @@
|
|
|
7
7
|
|
|
8
8
|
Load this file when the user wants a **Seedance 2 / Seedance 2.0** (ByteDance) video. For any other video model, see `models/veo.md`, `models/prompt-copilot.md`, or generic video rules in `SKILL.md`.
|
|
9
9
|
|
|
10
|
-
**Kolbo MCP routing:**
|
|
10
|
+
**Kolbo MCP routing:** the selected inputs/mode choose the tool, not the Seedance name. Use `generate_video` for text-to-video, `generate_elements` for reference-composed scenes, `generate_video_from_image` to animate an opening still, and `generate_first_last_frame` for supplied opening/landing frames. Discover a matching variant and its constraints with the corresponding model type. First/last frames do not become Elements because they contain a recurring character.
|
|
11
11
|
|
|
12
12
|
**Elements uses this same file.** `generate_elements` is not a second prompt language. Do not write `SCENE CONTEXT` / `OPTICS` / `ACTION` department packs for Elements or Seedance — those are filmmaking audit contracts, not the generation compile shape.
|
|
13
13
|
|
|
14
|
+
**Frames format takes precedence:** on image-to-video or first/last-frame, write ordinary motion, camera and transition prose grounded in the supplied composition. Default to one continuous take; timed action beats are allowed. Omit Locked Intro/CAST/LOCATION blocks and multi-shot headers unless the user's selected route actually requires them. Use `@Image1` for the opening still and `@Image2` for a supplied landing still; never invent a DNA name or copy a placeholder identifier. Existing supplied DNA tags retain their exact spelling.
|
|
15
|
+
|
|
14
16
|
## Creative direction takes precedence
|
|
15
17
|
|
|
16
18
|
The current user brief overrides template defaults and illustrative examples. Keep the two-layer organization, but include only relevant locks. State concrete camera trajectory and visible action prominently; optics numbers, equipment names, repetition and word counts are not guarantees of fidelity. Preserve a continuous-shot exception even when other scenes are multishot. For one shot use `Single continuous shot`, `Total: Xs / 1 shot / AR`, one SHOT heading and `multi_shots: false`; for multiple shots use `Multishot ON` and matching counts. AR comes from the brief, never a copied example. Seedance does not speak Hebrew — use Latin transliteration in quotes or route native Hebrew to Gemini Omni. Narration reserved for post does not belong in the generation prompt.
|
|
@@ -128,7 +130,7 @@ FORBIDDEN: omitting Total / Multishot; "same character throughout" as the only l
|
|
|
128
130
|
|
|
129
131
|
### 6. Reference-Anchored Cinematic Sequence (multi-character / named references — highest-fidelity format)
|
|
130
132
|
|
|
131
|
-
Use
|
|
133
|
+
Use for **reference-composed Elements scenes** with named characters, Visual DNAs, or multiple reference assets (`@Image1`, `@Image2`, …). This is an Elements-mode prompt (`generate_elements`), not a replacement for explicitly selected Frames/first-last mode. Structure:
|
|
132
134
|
|
|
133
135
|
1. **Locked Intro FIRST** (GLOBAL LOOK / CAST / LOCATION). CAST is one line per person: `@Exact_DNA_name` or `Name @ImageN — wardrobe, position, what they carry`. End CAST with "All must match their character references exactly." Never "the man on the LEFT" without an `@tag`.
|
|
134
136
|
2. **REFERENCE CONSISTENCY block** — map every reference and pin what must NOT change: `@Zohar` / `Reference Image 1 is <X>. Preserve exact face, hair, anatomy, wardrobe, colors, props.`
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
Load this file when the user wants a **Seedance 2.5** video (they said "2.5" / "25", or they need longer than 15s, more than ~10 shots, or a large cast of references). Also load `models/seedance.md` for the shared craft layer.
|
|
9
9
|
|
|
10
|
-
**Kolbo MCP routing:** `generate_video`
|
|
10
|
+
**Kolbo MCP routing:** preserve the selected mode. `generate_video` is text-to-video; `generate_elements` composes reference assets; `generate_video_from_image` animates an opening still; `generate_first_last_frame` connects supplied opening/landing frames. Discover the compatible Seedance 2.5 variant using that tool's model type. Frames use ordinary motion/transition prose, not the Elements Locked Intro. An uploaded frame is `@Image1` (landing frame `@Image2`), never an invented DNA name.
|
|
11
11
|
|
|
12
12
|
**Audio:** Seedance 2.5 emits real synced audio. `list_models` shows `sound_generation_type: none` only because there is no in-app toggle (`sound_baked_in: true`) — it does NOT mean the model is silent, and it is never a reason to reach for TTS. Quoted dialogue is PERFORMED (synced voices, lip movement, room tone) alongside the SFX named in AUDIO, so scene dialogue never goes through `generate_speech` or `generate_lipsync`; write the lines in quotes inside their shot beats.
|
|
13
13
|
|
|
@@ -48,6 +48,8 @@ Rules that make it work rather than just look organised:
|
|
|
48
48
|
|
|
49
49
|
## 2. The reference contract — how an edit stops drifting
|
|
50
50
|
|
|
51
|
+
For iterative work, retain the original source prompt and reference as the baseline. An edit request should preserve only the properties that must survive. If a major camera/viewpoint change repeatedly resists the same edit method, offer a materially different prompt approach or a fresh generation grounded in the original reference; do not keep chaining degraded outputs. Preserve an explicitly selected edit route unless the user accepts changing it. Diagnose with comparable, budgeted samples, not unbounded retries. Image prompts describe one still moment; video timing/action belongs in the video prompt.
|
|
52
|
+
|
|
51
53
|
This is the highest-value pattern in the file. "Keep everything else the same" is too
|
|
52
54
|
vague to hold, and it is why a chain of edits quietly turns a person into someone else.
|
|
53
55
|
An edit prompt opens with an explicit contract:
|
package/src/tools/generate.js
CHANGED
|
@@ -1234,7 +1234,7 @@ function registerGenerateTools(server, client, options = {}) {
|
|
|
1234
1234
|
// ─── generate_sound ────────────────────────────────────────
|
|
1235
1235
|
server.tool(
|
|
1236
1236
|
'generate_sound',
|
|
1237
|
-
'Generate sound effects (not music, not speech) from a text description using Kolbo AI. Use this for ambient sounds, foley, impacts, atmospheres, UI sounds, etc. For music use generate_music; for voice use generate_speech. Beyond the core prompt/duration, per-provider controls are available (Stable Audio guidance, Kie loop/tempo/key, Seed-Audio voice/speed/volume/pitch + reference audio/image); the engine ignores controls that do not apply to the chosen model. Returns the final audio URL when complete.',
|
|
1237
|
+
'Generate sound effects (not music, not speech) from a text description using Kolbo AI. Use this for ambient sounds, foley, impacts, atmospheres, UI sounds, etc. For music use generate_music; for voice use generate_speech. Beyond the core prompt/duration, per-provider controls are available (Stable Audio guidance, Kie loop/tempo/key, Seed-Audio voice/speed/volume/pitch + reference audio/image, output audio_format, and Mirelo SFX 2.0 negative_prompt / num_samples / seed / audio_bitrate_kbps); the engine ignores controls that do not apply to the chosen model. Mirelo SFX 2.0 (model "mirelo-ai/sfx2.0/text-to-audio") makes up to 10 minutes of layered sound design and up to 4 variations per call (each variation is billed). Returns the final audio URL(s) when complete.',
|
|
1238
1238
|
{
|
|
1239
1239
|
prompt: z.string().describe('Text description of the sound effect (e.g., "thunder clap with rain", "door creaking open", "futuristic UI beep")'),
|
|
1240
1240
|
model: z.string().optional().describe('Model identifier. Use list_models type="text_to_sound" to see options. Default: elevenlabs-sound-effects-v1'),
|
|
@@ -1253,21 +1253,30 @@ function registerGenerateTools(server, client, options = {}) {
|
|
|
1253
1253
|
seed_pitch: z.number().optional().describe('FAL Seed-Audio: pitch shift in semitones.'),
|
|
1254
1254
|
seed_reference_audio_urls: z.array(z.string()).optional().describe('FAL Seed-Audio: up to 3 reference audio URLs to condition the sound.'),
|
|
1255
1255
|
seed_reference_image_url: z.string().optional().describe('FAL Seed-Audio: a reference image URL to condition the sound.'),
|
|
1256
|
+
// ── Output format (models whose list_models entry has output_audio_formats) ──
|
|
1257
|
+
audio_format: z.enum(['wav', 'mp3', 'aac', 'flac']).optional().describe('Output audio container/codec, for models that advertise output_audio_formats in list_models (Sonilo, Mirelo SFX 2.0).'),
|
|
1258
|
+
// ── Mirelo SFX 2.0 (list_models: max_samples / supports_negative_prompt / supports_seed / supports_audio_bitrate) ──
|
|
1259
|
+
negative_prompt: z.string().max(1000).optional().describe('Mirelo SFX 2.0: sounds to keep OUT of the result, e.g. "music, speech".'),
|
|
1260
|
+
num_samples: z.number().int().min(1).max(4).optional().describe('Mirelo SFX 2.0: number of variations (1-4, default 1). Each variation is billed; all URLs are returned.'),
|
|
1261
|
+
seed: z.number().int().min(-1).optional().describe('Mirelo SFX 2.0: seed for repeatable results (-1 or omit = random).'),
|
|
1262
|
+
audio_bitrate_kbps: z.number().int().optional().describe('Mirelo SFX 2.0: bitrate for mp3 (32,40,48,56,64,80,96,112,128,160,192,224,256,320) or aac (32-256). Not allowed with wav/flac.'),
|
|
1256
1263
|
project_id: projectIdField,
|
|
1257
1264
|
session_id: sessionIdField
|
|
1258
1265
|
},
|
|
1259
|
-
async ({ prompt, model, duration, prompt_influence, cfg_strength, sound_loop, sound_tempo, sound_key, seed_voice, seed_speed, seed_volume, seed_pitch, seed_reference_audio_urls, seed_reference_image_url, project_id, session_id }) => {
|
|
1266
|
+
async ({ prompt, model, duration, prompt_influence, cfg_strength, sound_loop, sound_tempo, sound_key, seed_voice, seed_speed, seed_volume, seed_pitch, seed_reference_audio_urls, seed_reference_image_url, audio_format, negative_prompt, num_samples, seed, audio_bitrate_kbps, project_id, session_id }) => {
|
|
1260
1267
|
model = await canonicalModelId(client, model, 'text_to_sound'); // lenient id resolution ("z-image" → "z-image/turbo")
|
|
1261
1268
|
const gen = await client.post('/v1/generate/sound', {
|
|
1262
1269
|
prompt, model, duration, prompt_influence,
|
|
1263
1270
|
cfg_strength, sound_loop, sound_tempo, sound_key,
|
|
1264
1271
|
seed_voice, seed_speed, seed_volume, seed_pitch,
|
|
1265
|
-
seed_reference_audio_urls, seed_reference_image_url,
|
|
1272
|
+
seed_reference_audio_urls, seed_reference_image_url,
|
|
1273
|
+
audio_format, negative_prompt, num_samples, seed, audio_bitrate_kbps,
|
|
1274
|
+
project_id, session_id
|
|
1266
1275
|
});
|
|
1267
1276
|
|
|
1268
1277
|
if (returnsImmediately()) return submittedResult({
|
|
1269
1278
|
tool: 'generate_sound', kind: 'audio', gen, client, model, prompt,
|
|
1270
|
-
settings: { duration },
|
|
1279
|
+
settings: { duration, ...(num_samples > 1 && { variations: num_samples }) },
|
|
1271
1280
|
reference_images: seed_reference_image_url ? [seed_reference_image_url] : []
|
|
1272
1281
|
});
|
|
1273
1282
|
|
|
@@ -1280,7 +1289,7 @@ function registerGenerateTools(server, client, options = {}) {
|
|
|
1280
1289
|
|
|
1281
1290
|
return uiCompleted({
|
|
1282
1291
|
tool: 'generate_sound', kind: 'audio', gen, client, model, prompt,
|
|
1283
|
-
settings: { duration },
|
|
1292
|
+
settings: { duration, ...(num_samples > 1 && { variations: num_samples }) },
|
|
1284
1293
|
reference_images: seed_reference_image_url ? [seed_reference_image_url] : [],
|
|
1285
1294
|
urls: result.result.urls,
|
|
1286
1295
|
playback_urls: result.result.playback_urls,
|
|
@@ -2391,6 +2400,10 @@ function registerGenerateTools(server, client, options = {}) {
|
|
|
2391
2400
|
const editDetails = (op, a) => {
|
|
2392
2401
|
const d = [];
|
|
2393
2402
|
const has = (v) => v !== undefined && v !== null && v !== '';
|
|
2403
|
+
if (op === 'generate_audio') {
|
|
2404
|
+
if (a.num_samples > 1) d.push(`${a.num_samples} variations`);
|
|
2405
|
+
if (a.preserve_speech === false) d.push('no dialogue');
|
|
2406
|
+
}
|
|
2394
2407
|
if (op === 'upscale' || op === 'split_upscale') {
|
|
2395
2408
|
if (has(a.scale)) d.push(`${a.scale}×`);
|
|
2396
2409
|
if (a.face_enhancement === false) d.push('no face enhance');
|
|
@@ -2678,7 +2691,7 @@ function registerGenerateTools(server, client, options = {}) {
|
|
|
2678
2691
|
'"draft_quote" — check a saved draft’s supported final resolutions, expiry and exact credit cost without starting a render. Use this before draft_enhance.',
|
|
2679
2692
|
'"upscale" — boost to 4K/2K resolution (use `scale` for factor, `resolution` for target, `target_fps` for frame rate). On model "blackforestlabs/flux-video-upscale" (Flux Video Upscale): `scale` is 1.5-3x (no named `resolution` target — billed on the OUTPUT tier it lands in), `mode` is "precise" (source-faithful, default) or "creative" (reimagines detail — a pricier tier), and `prompt` optionally guides the creative-mode enhancement. On model "bytedance-upscaler/upscale/video" (Bytedance Upscaler): `resolution` is "1080p" | "2k" | "4k" | "6k" | "8k" (OR `scale_ratio` 1.1-10, output ≤4K), plus `target_fps` (24-120), `enhancement_tier`, `enhancement_preset`, `fidelity`, `bit_depth` — see each field. Price = resolution tier (1080p 1 · 2k 2 · 4k 4 · 6k 8 · 8k 16 credits/s) × every started 30 fps (60 = 2×, 120 = 4×) × tier (fast 0.5×, pro 10×). Source-length caps: 6K 120s, 8K 60s, Pro 30s, otherwise 300s.',
|
|
2680
2693
|
'"reframe" — change aspect ratio (requires `aspect_ratio`; use `grid_position_x`/`grid_position_y` to control where the original sits).',
|
|
2681
|
-
'"generate_audio" — add AI-generated audio from `prompt`. Optionally split into `sound_effect_prompt` and `background_music_prompt`. Set `original_sound=true` to keep original audio alongside.',
|
|
2694
|
+
'"generate_audio" — add AI-generated audio from `prompt`. Optionally split into `sound_effect_prompt` and `background_music_prompt`. Set `original_sound=true` to keep original audio alongside. On model "mirelo-ai/sfx2.0/video-to-video" (Mirelo SFX 2.0) the prompt is optional (it watches the clip and builds a full synced sound design, up to 10 minutes): `preserve_speech` keeps the dialogue (default true), `negative_prompt` keeps sounds out, `num_samples` returns 1-4 variations (each billed), `seed` repeats a result, and `duration` makes a shorter soundtrack by TRIMMING the video (omit for the whole clip).',
|
|
2682
2695
|
'"remove_watermark" — AI-powered watermark removal.',
|
|
2683
2696
|
'"face_swap" — replace the face in the video with the face from `image_url` (required).',
|
|
2684
2697
|
'"extend" — lengthen the video at `mode` ("start" or "end") by `duration` seconds. Optional `prompt` and `context` guide the generated content.',
|
|
@@ -2742,6 +2755,15 @@ function registerGenerateTools(server, client, options = {}) {
|
|
|
2742
2755
|
prompt: z.string()
|
|
2743
2756
|
})).optional()
|
|
2744
2757
|
.describe('Optional contiguous Sonilo sound-design ranges. The first start must be 0, each end must equal the next start, and the final end must not exceed the video duration. Omit to let Sonilo detect scenes automatically.'),
|
|
2758
|
+
// Mirelo SFX 2.0 (list_models: max_samples / supports_negative_prompt / supports_seed / supports_preserve_speech)
|
|
2759
|
+
negative_prompt: z.string().max(1000).optional()
|
|
2760
|
+
.describe('Mirelo SFX 2.0 (operation="generate_audio"): sounds to keep out, as a short comma-separated list, e.g. "music, crowd noise".'),
|
|
2761
|
+
preserve_speech: z.boolean().optional()
|
|
2762
|
+
.describe('Mirelo SFX 2.0 (operation="generate_audio"): true (default) keeps the dialogue and builds the soundtrack around it; false makes sound effects only and suppresses speech.'),
|
|
2763
|
+
num_samples: z.number().int().min(1).max(4).optional()
|
|
2764
|
+
.describe('Mirelo SFX 2.0 (operation="generate_audio"): number of variations, 1-4 (default 1). Each is billed; all result URLs are returned.'),
|
|
2765
|
+
seed: z.number().int().min(-1).optional()
|
|
2766
|
+
.describe('Mirelo SFX 2.0 (operation="generate_audio"): seed for repeatable results (-1 or omit = random).'),
|
|
2745
2767
|
|
|
2746
2768
|
// ── face_swap ──────────────────────────────────────────
|
|
2747
2769
|
image_url: z.string().optional()
|
|
@@ -2749,7 +2771,7 @@ function registerGenerateTools(server, client, options = {}) {
|
|
|
2749
2771
|
|
|
2750
2772
|
// ── extend ─────────────────────────────────────────────
|
|
2751
2773
|
duration: z.number().optional()
|
|
2752
|
-
.describe('Seconds of content to generate. Used with "extend" (required) and "retake" (optional). Typical range: 1–20.'),
|
|
2774
|
+
.describe('Seconds of content to generate. Used with "extend" (required) and "retake" (optional). Typical range: 1–20. With "generate_audio" on Mirelo SFX 2.0: seconds of sound (1-600) — the returned video is TRIMMED to this length; omit for the whole clip.'),
|
|
2753
2775
|
mode: z.string().optional()
|
|
2754
2776
|
.describe('Extension direction: "start" or "end". Used with "extend". For "retake": replacement mode (default: "replace_audio_and_video"). For "upscale" on model "blackforestlabs/flux-video-upscale": "precise" (source-faithful, default) or "creative" (reimagines detail — pricier). Default: "end".'),
|
|
2755
2777
|
context: z.string().optional()
|
|
@@ -2790,6 +2812,7 @@ function registerGenerateTools(server, client, options = {}) {
|
|
|
2790
2812
|
grid_position_x, grid_position_y,
|
|
2791
2813
|
sound_effect_prompt, background_music_prompt, original_sound, cfg_strength,
|
|
2792
2814
|
audio_format, segments,
|
|
2815
|
+
negative_prompt, preserve_speech, num_samples, seed,
|
|
2793
2816
|
refine_edges, subject_is_person,
|
|
2794
2817
|
text_prompt, context,
|
|
2795
2818
|
mask_video_url, object_prompt, video_strength,
|
|
@@ -2806,7 +2829,7 @@ function registerGenerateTools(server, client, options = {}) {
|
|
|
2806
2829
|
// Validation
|
|
2807
2830
|
if (operation === 'magic_edit' && !prompt) throw new Error('prompt is required for magic_edit');
|
|
2808
2831
|
if (operation === 'generate_audio' && !prompt && !sound_effect_prompt && !background_music_prompt
|
|
2809
|
-
&& !(typeof model === 'string' && model.includes('sonilo'))) {
|
|
2832
|
+
&& !(typeof model === 'string' && (model.includes('sonilo') || model.includes('mirelo')))) {
|
|
2810
2833
|
throw new Error('prompt is required for generate_audio unless dedicated sound/music prompts are provided or the selected model supports automatic captioning');
|
|
2811
2834
|
}
|
|
2812
2835
|
if (operation === 'reframe' && !aspect_ratio)throw new Error('aspect_ratio is required for reframe');
|
|
@@ -2824,6 +2847,7 @@ function registerGenerateTools(server, client, options = {}) {
|
|
|
2824
2847
|
grid_position_x, grid_position_y,
|
|
2825
2848
|
sound_effect_prompt, background_music_prompt, original_sound, cfg_strength,
|
|
2826
2849
|
audio_format, segments,
|
|
2850
|
+
negative_prompt, preserve_speech, num_samples, seed,
|
|
2827
2851
|
refine_edges, subject_is_person,
|
|
2828
2852
|
text_prompt, context,
|
|
2829
2853
|
mask_video_url, object_prompt, video_strength,
|
|
@@ -2840,7 +2864,7 @@ function registerGenerateTools(server, client, options = {}) {
|
|
|
2840
2864
|
if (operation === 'draft_quote') return { content: [{ type: 'text', text: JSON.stringify(gen, null, 2) }] };
|
|
2841
2865
|
const cardSettings = {
|
|
2842
2866
|
mode: operation, duration, aspect_ratio, resolution,
|
|
2843
|
-
details: editDetails(operation, { scale, enhancement_model, target_fps, mode, enhancement_tier, enhancement_preset, bit_depth, scale_ratio }),
|
|
2867
|
+
details: editDetails(operation, { scale, enhancement_model, target_fps, mode, enhancement_tier, enhancement_preset, bit_depth, scale_ratio, num_samples, preserve_speech }),
|
|
2844
2868
|
};
|
|
2845
2869
|
if (returnsImmediately()) return submittedResult({
|
|
2846
2870
|
tool: 'edit_video', kind: 'video', gen, client, model,
|