@kolbo/mcp 1.81.2 → 1.81.4
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 +5 -2
- package/package.json +1 -1
- package/skill/GENERATED.md +1 -1
- package/skill/SKILL.md +68 -89
- package/skill/VERSION +1 -1
- package/skill/references/models/creative-director.md +2 -8
- package/skill/references/models/music.md +1 -1
- package/skill/references/models/prompt-copilot.md +1 -1
- package/skill/references/models/seedance.md +5 -21
- package/skill/references/models/seedance25.md +1 -1
- package/skill/references/models/veo.md +1 -1
- package/skill/references/workflows/color-dna.md +12 -0
- package/skill/references/workflows/cost-and-validation.md +6 -26
- package/skill/references/workflows/dtc-ads.md +1 -1
- package/skill/references/workflows/filmmaking.md +1 -25
- package/skill/references/workflows/marketing-studio.md +14 -14
- package/skill/references/workflows/media-library.md +11 -1
- package/skill/references/workflows/product-photoshoot.md +1 -1
- package/skill/references/workflows/production-log.md +2 -14
- package/skill/references/workflows/production-planning.md +6 -5
- package/skill/references/workflows/review-collections.md +98 -0
- package/skill/references/workflows/troubleshooting.md +2 -8
- package/skill/references/workflows/visual-dna.md +5 -34
package/README.md
CHANGED
|
@@ -58,9 +58,12 @@ Or add the config by hand — this block is identical for every MCP client and c
|
|
|
58
58
|
|
|
59
59
|
Restart your app, then ask it to generate something. The first time, a Kolbo login opens in your browser — click **Allow** (no API key to create). _Prefer an API key? Create one at [app.kolbo.ai/developer](https://app.kolbo.ai/developer) and add `"env": { "KOLBO_API_KEY": "kolbo_live_..." }` to the block above._
|
|
60
60
|
|
|
61
|
-
### Browser-only (claude.ai / ChatGPT):
|
|
61
|
+
### Browser-only (claude.ai / ChatGPT / Codex): connector + zip
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
1. Add the custom connector **`https://api.kolbo.ai/mcp`** under Settings → Connectors, then Connect → log in → Allow.
|
|
64
|
+
2. Download **[`kolbo.zip`](https://github.com/Zoharvan12/kolbo-skills/raw/main/kolbo.zip)** and upload it as a skill (Claude.ai: Settings → Features → Skills; ChatGPT/Codex: Settings → Skills). Codex CLI: unzip into `~/.codex/skills/`.
|
|
65
|
+
|
|
66
|
+
The zip is the canonical routing skill. Without it the tools still work, but the model will not load Seedance / Visual DNA / filmmaking rules.
|
|
64
67
|
|
|
65
68
|
### Optional upgrade: add the Kolbo skill for slash-commands + smart routing
|
|
66
69
|
|
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@a463d99, 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,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
version: 0.9.
|
|
2
|
+
version: 0.9.7
|
|
3
3
|
name: kolbo
|
|
4
4
|
description: |
|
|
5
5
|
Generate, edit, analyze, and direct creative media through Kolbo AI: images,
|
|
@@ -22,31 +22,7 @@ You have direct access to the Kolbo AI creative platform via MCP tools (auto-con
|
|
|
22
22
|
|
|
23
23
|
> 🚫 **Don't dump generated URLs as bare text or markdown links in chat** — the UI already shows results in **Library** (right panel) and on the generation card. Refer by description ("the rainy scene"), store URLs in `.kolbo/production.md`. INLINE `` images ARE allowed for catalog-style replies (per-item thumbs in numbered lists).
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
Agents keep getting confused because three UIs show the same job. Use this map — never invent a fourth:
|
|
28
|
-
|
|
29
|
-
| Surface | What it is | Trust it for |
|
|
30
|
-
|---|---|---|
|
|
31
|
-
| **Library** (right panel — "This session" / "All media") | User-facing gallery of **completed** media | "Is the user's output there?" Point humans here. Finished clips/images land automatically — do **not** `list_media` / `get_media` just to verify a `generate_*` you just ran. |
|
|
32
|
-
| **Chat generation card** | Progress chrome while a job is in flight | Status badge only (`Generating` / done). A **black / empty preview while Generating is NORMAL** — the iframe has nothing to paint yet. It is **not** failure, not "lost", not a reason to re-fire. |
|
|
33
|
-
| **`get_generation_status`** (MCP) | Agent API for job state | Whether the server job is `completed` / `failed` / still running, and the final `urls`. This is your SoT for in-flight work — **not** the card pixels. |
|
|
34
|
-
| **`.kolbo/production.md`** | Your private log across turns | Ids + URLs after success. Compaction-safe memory — not the user gallery. |
|
|
35
|
-
|
|
36
|
-
**Do NOT:**
|
|
37
|
-
- Treat an empty/black chat card as "generation failed" or "nothing produced".
|
|
38
|
-
- Re-call `generate_*` because Library still shows a K/logo spinner tile while the job is running — that tile **is** the in-progress placeholder for the same job.
|
|
39
|
-
- Call `list_media` / `get_media` / `list_session_generations` to "check if it worked" after a generate you already submitted — that burns credits/context and can pollute the session.
|
|
40
|
-
- Tell the user to look at chat history for finals — tell them **Library → This session**.
|
|
41
|
-
|
|
42
|
-
**Do:**
|
|
43
|
-
- After `submitted` / `_timed_out`: end the turn, or one `get_generation_status(..., wait=true)`.
|
|
44
|
-
- When done: say the result is in Library; log URLs to `.kolbo/production.md`.
|
|
45
|
-
- If the user asks "where is it?" → Library (This session). If they ask "is it done?" and you don't have urls yet → `get_generation_status` once.
|
|
46
|
-
|
|
47
|
-
This file is the **always-loaded core**: tool inventory + universal hard rules + routing index. For any model-specific prompt rules, Visual DNA workflow, production log format, marketing workflow, cost validation, etc., **Read the matching `references/` file from the index below**. Don't try to remember the rules — load the file when you need them.
|
|
48
|
-
|
|
49
|
-
Users never see the bundled prompting skills. If you skip them, they get a lazy one-line prompt. **Loading is mandatory, not optional flavor.**
|
|
25
|
+
This file is the **always-loaded core**: tool inventory + universal hard rules + routing index — for model-specific prompt rules, workflows, cost validation, etc., Read the matching `references/` file from the index below; loading is mandatory, not optional flavor (users never invoke the bundled skills themselves — skipping them yields a lazy one-line prompt).
|
|
50
26
|
|
|
51
27
|
## Step 0 — Bootstrap
|
|
52
28
|
|
|
@@ -54,26 +30,33 @@ Once per conversation, before any other Kolbo tool call:
|
|
|
54
30
|
|
|
55
31
|
1. **Run `check_credits`.** If it fails with "Session expired" / "Not authenticated", ask the user to run `kolbo auth login` (or their branded CLI command like `sapir auth login`) and reload the editor.
|
|
56
32
|
2. **If `list_models` returns empty**, MCP isn't wired — same fix.
|
|
57
|
-
3. Use the balance ONLY for the low-balance check at this moment
|
|
33
|
+
3. Use the balance ONLY for the low-balance check at this moment (see the "credits remaining" rule in the brief section below).
|
|
58
34
|
|
|
59
35
|
If the user is on a whitelabel build (`sapir`, etc.), they must use their branded command — not `kolbo`. See `references/workflows/troubleshooting.md`.
|
|
60
36
|
|
|
61
|
-
## 🎬 Confirm the Creative Brief BEFORE Generating (CRITICAL — read first)
|
|
37
|
+
## 🎬 Confirm the Creative Brief & Cost BEFORE Generating (CRITICAL — read first)
|
|
62
38
|
|
|
63
39
|
Never fire a paid generation the moment the user says "make X". First **present the brief back as a confirmation the user can change** — this is the single most important interaction. It gives the user control over what gets created and what it costs, instead of silently spending credits on defaults.
|
|
64
40
|
|
|
65
41
|
**Before ANY paid image / video / music / speech / 3D generation**, unless the user has *explicitly* dictated every key parameter in this message, ask ONE labeled question (the UI renders it as an options card) confirming:
|
|
66
42
|
|
|
67
|
-
- **Model** — your recommended pick as the default option, plus 1–2 alternatives (with their credit cost).
|
|
43
|
+
- **Model** — your recommended pick as the default option, plus 1–2 alternatives (with their credit cost). Suggest a cheaper alternative if one fits.
|
|
68
44
|
- **Aspect ratio** — e.g. `1:1 / 9:16 / 16:9` (offer the sensible default first).
|
|
69
45
|
- **Count** — how many (1 / 4 / …).
|
|
70
46
|
- **Resolution / quality / duration** — where the model supports it.
|
|
71
47
|
- **Creative direction** — style / mood / scene, when the user was vague ("4 cats" → offer style options: photoreal / illustrated / cinematic / surprise-me).
|
|
72
48
|
- **Credit cost** — state the total (`✦ N credits`) right in the question so cost is never a surprise.
|
|
73
49
|
|
|
74
|
-
Then generate **only** with the confirmed parameters. If the user changes an option, use the change. This mirrors the approval-card flow: propose → let them adjust → confirm → generate.
|
|
50
|
+
Then generate **only** with the confirmed parameters. If the user changes an option, use the change. This mirrors the approval-card flow: propose → let them adjust → confirm → generate. Never fire on defaults the user didn't choose.
|
|
51
|
+
|
|
52
|
+
**Only skip the brief/cost confirmation when** the user's message already pins model + aspect + count + creative direction (e.g. "generate 4 photoreal tabby cats, 1:1, z-image/turbo") — then just state the cost one-liner and fire. A low credit cost is **not** a reason to skip: cheap ≠ no-confirmation. What matters is whether the user actually chose the parameters.
|
|
75
53
|
|
|
76
|
-
**
|
|
54
|
+
**Cost rules** (full tables + formulas in `references/workflows/cost-and-validation.md`):
|
|
55
|
+
|
|
56
|
+
- **Video/lipsync `credit` is per-SECOND, not per-clip**: `total = credit × duration`. This is the universal rule for video/firstlast/elements/motion_graphic/cast types, not a per-model exception — `list_models` states it inline now. The one carve-out is a model with `flat_credit_by_resolution` set.
|
|
57
|
+
- **Batch totalling 100+ credits**: run `check_credits` first.
|
|
58
|
+
- **Quote real cost**: after firing, log `credits_used` (from the tool result) to `.kolbo/production.md` — never `base × count`.
|
|
59
|
+
- **Never state "credits remaining" from arithmetic** (opening balance − generation costs). Coding/chat usage deducts credits too, so the math is always wrong. Report cost only; if the user asks for their balance, call `check_credits` fresh at that moment.
|
|
77
60
|
|
|
78
61
|
For multi-scene / batch work this pairs with `generate_creative_director` (see below) — still confirm the brief first.
|
|
79
62
|
|
|
@@ -102,11 +85,13 @@ For multi-scene / batch work this pairs with `generate_creative_director` (see b
|
|
|
102
85
|
| Generate **brand product imagery** (studio shot, lifestyle, Pinterest pin, hero banner, carousel, ad pack, virtual try-on, conceptual, restyle) | `references/workflows/product-photoshoot.md` |
|
|
103
86
|
| Generate **marketplace listing cards** (Amazon main + secondary + A+ content) | `references/workflows/marketplace-cards.md` |
|
|
104
87
|
| Use **Visual DNA** / character consistency / `@name` syntax | `references/workflows/visual-dna.md` |
|
|
88
|
+
| Use **Color DNA** / brand palette grading | `references/workflows/color-dna.md` |
|
|
105
89
|
| Start or continue a **multi-step production** (storyboard → scenes → final cut) | `references/workflows/production-log.md` |
|
|
106
90
|
| **Transcribe** or **analyze** audio/video | `references/workflows/transcription.md` |
|
|
107
91
|
| **Split a soundtrack into layers** — remove/isolate speech, strip narration, instrumental bed, stems for dubbing | `references/workflows/audio-stems.md` |
|
|
108
92
|
| **Scrape brand/product info** before generating + persist as `.kolbo/brand-kits/<slug>.md` | `references/workflows/research-first.md` |
|
|
109
93
|
| Browse, manage, or present existing **media library** items | `references/workflows/media-library.md` |
|
|
94
|
+
| Run a **client review / approval loop** — share a cut for feedback, timestamped comments, versions (v1→v2), approve / request-changes, guest links | `references/workflows/review-collections.md` |
|
|
110
95
|
| Confirm **cost** or validate **resolution / aspect / duration** against model caps | `references/workflows/cost-and-validation.md` |
|
|
111
96
|
| Hit an **auth / MCP / 429** issue | `references/workflows/troubleshooting.md` |
|
|
112
97
|
|
|
@@ -140,13 +125,13 @@ Each `references/models/*.md` mirrors the matching skill prompt in `kolbo-api/sr
|
|
|
140
125
|
| `list_models` / `list_voices` / `check_credits` / `get_generation_status` / `cancel_generation` / `get_session_usage` | Discovery + status. `list_models` with no args returns the recommended shortlist out of ~428 — pass `type` for a full category with per-model caps. `cancel_generation` stops an in-flight job and refunds what it can: use it when the user changes their mind mid-generation instead of letting it run. |
|
|
141
126
|
| `upload_media` / `create_upload_ticket` / `list_media` / `get_media` / `get_media_stats` / `favorite_media` / `unfavorite_media` / `delete_media` / `restore_media` / `permanently_delete_media` / `move_media` / `bulk_*_media` / `*_media_folder` | Media library — see `workflows/media-library.md`. Getting a LOCAL file in depends on where the server runs: `upload_media` with a path only works on a local (stdio) install; over a remote connector use `create_upload_ticket` and POST the file yourself. |
|
|
142
127
|
| `create_visual_dna` / `update_visual_dna` / `generate_character_sheet` / `list_visual_dnas` / `get_visual_dna` / `delete_visual_dna` / `*_visual_dna_folder` (5 folder tools) | Visual DNA (+ character sheet, character folders) — see `workflows/visual-dna.md`. Edit with `update_visual_dna`; never delete+recreate. |
|
|
143
|
-
| `list_moodboards` / `get_moodboard` / `list_presets` | Style overlays + sheet presets
|
|
144
|
-
| `list_color_palettes` / `analyze_color_palette` / `create_color_palette` / `update_color_palette` / `delete_color_palette` / `activate_color_palette` / `deactivate_color_palette` | **Color DNA — sticky
|
|
128
|
+
| `list_moodboards` / `get_moodboard` / `list_presets` | Style overlays + sheet presets — see **Preset contract** in Core Workflow. Never omit `preset_id` after claiming a preset was used. |
|
|
129
|
+
| `list_color_palettes` / `analyze_color_palette` / `create_color_palette` / `update_color_palette` / `delete_color_palette` / `activate_color_palette` / `deactivate_color_palette` | **Color DNA — sticky + account-wide; at most one palette active at a time**, and while active it strict-grades **every** image and video generation automatically. Per-generation opt-out: `skip_color_palette: true`. Details: `workflows/color-dna.md`. |
|
|
145
130
|
| `list_agents` / `create_agent` / `update_agent` / `delete_agent` | Custom chat agents — reusable named personas for `chat_send_message`. The agent's `description` IS the system instruction. Resolve a name the user mentions ("use my SEO agent") to an id with `list_agents`, then pass `agent_id`. Global/preset agents are read-only; only the user's own can be updated or deleted. |
|
|
146
131
|
| `search_stock_media` / `get_stock_sources` / `get_stock_categories` / `get_stock_collections` / `get_stock_asset` / `analyze_script_for_stock` / `import_stock_asset` | Stock library (free, no credits) — EXISTING photos / videos / 3D / SFX / music. For stock **music** use `search_stock_media` with `mediaType: "music"` (semantic vibe query, e.g. "uplifting corporate background") → `get_stock_asset` for downloads. The older `*_music_library` tools are deprecated adapters over this — prefer the stock tools, except for the licensed-catalog tools in the next row. |
|
|
147
|
-
| `search_music_library` / `browse_music_library` / `get_music_library_facets` / `get_music_track_audio` / `get_music_track_lyrics` / `get_music_track_related` / `analyze_script_for_music` / `acquire_clean_music_track` / `import_music_track_to_library` | **SYNCI licensed music** —
|
|
148
|
-
| `list_projects` / `get_project` / `move_session` | Projects: resolve a project NAME → the `project_id` you pass on generation/upload/doc calls
|
|
149
|
-
| `create_project` / `update_project` / `archive_project` / `unarchive_project` / `list_sessions` / `rename_session` / `delete_session` / `restore_session` | Project lifecycle + session inventory. Edit name/description with `update_project` (read via `get_project` first)
|
|
132
|
+
| `search_music_library` / `browse_music_library` / `get_music_library_facets` / `get_music_track_audio` / `get_music_track_lyrics` / `get_music_track_related` / `analyze_script_for_music` / `acquire_clean_music_track` / `import_music_track_to_library` | **SYNCI licensed music** — commercially licensed catalog, not free stock; previews are **watermarked**. `acquire_clean_music_track` / `import_music_track_to_library` **CHARGES CREDITS** for the clean master — confirm with the user first + pass a stable `requestId`. Details: `workflows/media-library.md` "SYNCI licensed music". |
|
|
133
|
+
| `list_projects` / `get_project` / `move_session` | Projects: resolve a project NAME → the `project_id` you pass on generation/upload/doc calls (`get_project` returns the full description — list clips it); `move_session` relocates a whole session + its media. See "Projects — Where Work Lands" below. |
|
|
134
|
+
| `create_project` / `update_project` / `archive_project` / `unarchive_project` / `list_sessions` / `rename_session` / `delete_session` / `restore_session` | Project lifecycle + session inventory. Edit name/description with `update_project` (read via `get_project` first); rename sessions with `rename_session` — never delete+recreate. `list_sessions` returns `project_id` + `types[]` on every row. |
|
|
150
135
|
| `bulk_move_sessions` / `list_session_generations` / `move_generations_to_session` / `split_session` / `undo_session_organization` | Reorganize many sessions or generations. `list_session_generations` is an inventory (not a live generation card). |
|
|
151
136
|
| `add_project_context` / `list_project_context` / `delete_project_context` / `get_project_profile` / `regenerate_project_profile` | Project knowledge base (RAG): feed scripts/URLs/notes; `get_project_profile` = the living brief — read it to ground work in the project |
|
|
152
137
|
| `list_project_assets` / `link_project_asset` / `unlink_project_asset` / `update_project_asset` | Project CAST roster: the Visual DNAs and moodboards tagged onto a project (`@Name` / `#Name`). `update_project_asset` writes each tagged DNA's identity description and/or its project-scoped purpose note. Never unlink+relink to edit. |
|
|
@@ -155,6 +140,7 @@ Each `references/models/*.md` mirrors the matching skill prompt in `kolbo-api/sr
|
|
|
155
140
|
| `trim_video` | Frame-accurate trim of a Kolbo-hosted video (tool waits and returns the URL). `edit_video` also gained `remove_background`. |
|
|
156
141
|
| `create_doc` / `list_docs` / `get_doc` / `update_doc` / `share_doc` / `delete_doc` | AI Docs (Magic Pad): YOU author full HTML documents (plans, briefs, scripts, research) saved into the user's project, editable in the Kolbo app. `share_doc` returns a public link. `update_doc` content replaces the WHOLE doc — `get_doc` first. |
|
|
157
142
|
| `chat_send_message` / `chat_list_conversations` / `chat_get_messages` | Kolbo chat with optional `media_urls` (up to 10 per call) |
|
|
143
|
+
| `create_review_asset` / `add_review_version` / `set_review_status` / `create_review_comment` / `reply_review_comment` / `resolve_review_comment` / `unresolve_review_comment` / `create_review_collection` / `create_review_share_link` / `revoke_review_share_link` / `get_review_storage_usage` (+ list/get/update/delete siblings) | **Kolbo Review** — Frame.io-style client review: asset = media + appended versions (new cut = `add_review_version`, never delete+recreate), timecoded comments per version, approve/request-changes status, guest share links (no Kolbo account; comment-only unless `canSetStatus`). 5GB review storage cap. See `workflows/review-collections.md`. |
|
|
158
144
|
| `publish_html_artifact` | Publish HTML / SVG / Mermaid to `sites.kolbo.ai`. Server dedupes by content hash. Strict CSP. |
|
|
159
145
|
|
|
160
146
|
## ⚠️ Edit in place — never delete+recreate (HARD RULE — always on)
|
|
@@ -209,7 +195,7 @@ first, so the model renders *different words than the ones the user wrote*.
|
|
|
209
195
|
A URL from `generate_*`, `list_media`, `get_media`, or a prior `upload_media` is **already on Kolbo CDN**. Pass that exact URL to the next tool (`reference_images` / `source_images` / `image_url` / `files`). Do **not** call `upload_media`, `create_upload_ticket`, or `media_upload_widget` on it — that copies the file a second time and wastes storage.
|
|
210
196
|
|
|
211
197
|
- Hosts that are already hosted: `media.kolbo.ai`, any `*.kolbo.ai`, Kolbo DigitalOcean Spaces.
|
|
212
|
-
- `upload_media` is only for a **local disk path** or an **external** (non-Kolbo) URL
|
|
198
|
+
- `upload_media` is only for a **local disk path** or an **external** (non-Kolbo) URL — `files`/`source_images`/`image_url` reject unknown hosts with `400`; a Kolbo URL passes through as-is.
|
|
213
199
|
- Same rule after compaction: pull the URL from `.kolbo/production.md` and reuse it. Never download-then-reupload.
|
|
214
200
|
|
|
215
201
|
## ⚠️ Assets Before Shots (HARD RULE)
|
|
@@ -282,7 +268,7 @@ A user-named tool — in any language — overrides every other rule. Recognized
|
|
|
282
268
|
- Pass the exact returned `id` as `preset_id`. Never invent an id.
|
|
283
269
|
|
|
284
270
|
1. **Check credits** ONCE per conversation (Step 0). Skip if already checked.
|
|
285
|
-
2. **Load the matching skill** (HARD RULE above)
|
|
271
|
+
2. **Load the matching skill** (HARD RULE above) before the first paid call in the turn.
|
|
286
272
|
3. **Discover models** with `list_models` using a `type` filter — but **skip when the user names a specific model** (this turn **or** earlier in the conversation / compaction `## Locked choices`).
|
|
287
273
|
4. **Pick the model**:
|
|
288
274
|
- User named one → that name is a **family lock**, not a single catalog row. Use it. Identifiers resolve leniently — `"z-image"` / `"nano banana 2"` / `"grok imagine"` auto-resolve, including to the sibling for the tool you are calling (`grok-imagine-text-to-video` on `generate_video_from_image` becomes `grok-imagine-image-to-video`). `list_models` is still authoritative for constraints, caps, and pricing — not for swapping brands.
|
|
@@ -290,21 +276,57 @@ A user-named tool — in any language — overrides every other rule. Recognized
|
|
|
290
276
|
- Auto-select → **only when no model was named on this task**. Then pick from "Auto-selectable" (models with a `summary`). Cheapest fit. Prefer `[RECOMMENDED]` when cost is similar.
|
|
291
277
|
- Never auto-select from "Named-only" section.
|
|
292
278
|
5. **Validate inputs** against model caps — see `references/workflows/cost-and-validation.md`.
|
|
293
|
-
6. **
|
|
294
|
-
7.
|
|
295
|
-
- **Stop immediately** after telling the user it's generating in Library / the card above (preferred when you do not need the output URLs yet), OR
|
|
296
|
-
- If the **next** required step needs those URLs, call `get_generation_status` **once** with `wait=true` (and `generation_ids` for a batch) as the **only** follow-up — no parallel Write/Edit/Think while it waits.
|
|
297
|
-
- A black preview on the chat card is expected until URLs exist — not a signal to retry.
|
|
298
|
-
8. **Checking status — NEVER poll in a loop**: `get_generation_status` takes `wait=true` (blocks server-side until done, ~3 min) and `generation_ids` (check MANY generations in ONE call — returns `all_done` + which are still running). One `wait=true` call replaces any polling loop. If it comes back with some still processing, call it ONCE more with `wait=true` and the remaining ids.
|
|
299
|
-
9. **Share the URL** after success. Never fabricate URLs.
|
|
279
|
+
6. **Fire the call(s)** — then follow "⚠️ Generation lifecycle" below for waiting, status, and failure handling.
|
|
280
|
+
7. **Share the result** after success — per "⚠️ Generated URLs in Chat" and the no-fabricated-URLs rule in Limitations & Safety.
|
|
300
281
|
|
|
301
282
|
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`.
|
|
302
283
|
|
|
284
|
+
## ⚠️ Generation lifecycle — source of truth, waiting, failures (HARD RULE — read this)
|
|
285
|
+
|
|
286
|
+
**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.
|
|
287
|
+
|
|
288
|
+
Four surfaces show the same job. Use this map — never invent a fifth:
|
|
289
|
+
|
|
290
|
+
| Surface | What it is | Trust it for |
|
|
291
|
+
|---|---|---|
|
|
292
|
+
| **Library** (right panel — "This session" / "All media") | User-facing gallery of **completed** media | "Is the user's output there?" Point humans here — never to chat history. Finished clips/images land automatically — do **not** call `list_media` / `get_media` / `list_session_generations` to "check if it worked" after a generate you already submitted (burns credits/context, can pollute the session). A K/logo spinner tile **is** the in-progress placeholder for the same job, not a missing one. |
|
|
293
|
+
| **Chat generation card** | Progress chrome while a job is in flight | Status badge only (`Generating` / done). A **black / empty preview while Generating is NORMAL** — the iframe has nothing to paint yet. It is **not** failure, not "lost", not a reason to re-fire. |
|
|
294
|
+
| **`get_generation_status`** (MCP) | Agent API for job state | Whether the server job is `completed` / `failed` / still running, and the final `urls`. This is your SoT for in-flight work — **not** the card pixels. |
|
|
295
|
+
| **`.kolbo/production.md`** | Your private log across turns | Ids + URLs after success. Compaction-safe memory — not the user gallery. |
|
|
296
|
+
|
|
297
|
+
**🛑 NEVER re-fire a generation you already called.** Aborted / timed-out / `submitted` calls still process server-side. Finish with `get_generation_status` (`wait=true`) — never a second `generate_*`.
|
|
298
|
+
|
|
299
|
+
**🛑 After `submitted` / `_timed_out` — END THE TURN (credit guard).** Do **not** keep thinking, writing skills, editing files, or planning "next steps" while a generation is still running — that burns the user's coding/chat credits for nothing. Either **stop immediately** after telling the user it's generating in Library / the card above (preferred when you do not need the output URLs yet), OR — if the **next** required step needs those URLs — call `get_generation_status` **once** with `wait=true` as the **only** follow-up, no parallel Write/Edit/Think while it waits.
|
|
300
|
+
|
|
301
|
+
**Checking status — NEVER poll in a loop.** `get_generation_status` takes `wait=true` (blocks server-side until done, ~3 min) and `generation_ids` (check MANY generations in ONE call — returns `all_done` + which are still running). One `wait=true` call replaces any polling loop: check ALL in-flight ids in ONE call, never one by one, never without `wait`. If it comes back with some still processing, call it ONCE more with `wait=true` and the remaining ids.
|
|
302
|
+
|
|
303
|
+
**🛑 Runaway-loop guard — ONE generation per requested item.** When the user asks for **one specific change**, the answer is **a single tool call**. After URLs return, **stop**. Surface and wait. You are NOT allowed to:
|
|
304
|
+
- Fire the same tool 3+ times in a single turn unless the user explicitly asked for "N variations".
|
|
305
|
+
- Re-fire because you think the result might not be exactly what the user wanted.
|
|
306
|
+
- Auto-retry on success.
|
|
307
|
+
- Fire 5+ parallel `generate_video*` calls speculatively.
|
|
308
|
+
|
|
309
|
+
**Only re-fire when:** user explicitly asked for variations with a count, OR previous call returned `failure.retryable === true` (ONE retry), OR previous call returned `completed` but `urls.length === 0` (ONE retry).
|
|
310
|
+
|
|
311
|
+
**Detecting failure — a generation can fail three ways. Treat ALL as failure:**
|
|
312
|
+
|
|
313
|
+
1. **Tool returns `error`** — explicit. Surface, suggest retry, log `generation_id`.
|
|
314
|
+
2. **Tool returns `completed` but `urls` is empty** — silent failure (NSFW filter, model OOM, upstream 5xx). Tell user "completed without an output — retrying" and re-fire ONCE. Do NOT claim it worked.
|
|
315
|
+
3. **Tool hangs / never returns** — MCP poll timed out. Call `get_generation_status(generation_id, wait=true)` IMMEDIATELY. The server might be done.
|
|
316
|
+
|
|
317
|
+
**Reporting:**
|
|
318
|
+
- Don't celebrate before reading the result. Verify `urls` is non-empty.
|
|
319
|
+
- Don't auto-retry without surfacing the failure. Partial batches: list failed items + reasons + successful count, and surface the user's count — "6 of 8 ready", not "videos ready". Never "✅ all done!" on partials.
|
|
320
|
+
- Log only successes to `.kolbo/production.md` — never failed items.
|
|
321
|
+
- When done: say the result is in **Library → This session**. "Where is it?" → Library (This session). "Is it done?" with no urls yet → `get_generation_status` once.
|
|
322
|
+
|
|
323
|
+
`failure` envelope structure + retry rules: `references/workflows/troubleshooting.md`.
|
|
324
|
+
|
|
303
325
|
## 📁 Projects — Where Work Lands (CRITICAL)
|
|
304
326
|
|
|
305
327
|
Everything in Kolbo — sessions, generations, media, docs — lives inside a PROJECT. Getting this wrong is the #1 user complaint ("my work went to the wrong project").
|
|
306
328
|
|
|
307
|
-
1. **User names a project** ("in my Acme project", "for the film") → call `list_projects` ONCE to resolve the name to an ObjectId, then pass that **same** id as `project_id` on **EVERY** subsequent `generate_*` / `upload_media` / `create_doc` / `chat_send_message` call in **this conversation**. There is no server-side sticky store — omitting it on any later call silently lands in the default "API Generations" bucket (`is_default: true`). Once resolved, treat that id as required for the rest of the conversation. Accounts often hold hundreds of projects, so pass `list_projects({ search: "acme" })` rather than listing everything; the list is paginated (50/page) and hides archived projects unless you pass `include_archived: true`.
|
|
329
|
+
1. **User names a project** ("in my Acme project", "for the film") → call `list_projects` ONCE to resolve the name to an ObjectId, then pass that **same** id as `project_id` on **EVERY** subsequent `generate_*` / `upload_media` / `create_doc` / `chat_send_message` call in **this conversation**. There is no server-side sticky store — omitting it on any later call silently lands in the default "API Generations" bucket (`is_default: true`). Once resolved, treat that id as required for the rest of the conversation. Accounts often hold hundreds of projects, so pass `list_projects({ search: "acme" })` rather than listing everything; the list is paginated (50/page) and hides archived projects unless you pass `include_archived: true`. When the user starts new work, `create_project` first, then pass its id the same way.
|
|
308
330
|
2. **No project mentioned** → omit `project_id`; the default bucket is correct. Don't ask unless intent is ambiguous. If `list_sessions` already returned a `project_id` for the work you are continuing, keep passing that id.
|
|
309
331
|
3. **Work landed in the wrong project? MOVE it, never regenerate**: `move_session` relocates a whole session + all its media (works for any session type — the `session_id` from generation responses, chats, transcriptions); `move_media` / `bulk_move_media` / `move_folder_contents` relocate individual media items. Empty leftover sessions after a move: `delete_session` (soft-delete; `restore_session` undoes it). `rename_session` only changes the sidebar title.
|
|
310
332
|
|
|
@@ -330,26 +352,11 @@ How to thread:
|
|
|
330
352
|
|
|
331
353
|
Write each session's `session_id` + plan name into `.kolbo/production.md` `### Sessions`. Do **not** mark the phase Approved or jump to the next bucket until the user confirms (or you asked a labeled GATE and they answered). Full rules: `references/workflows/production-planning.md` + `production-log.md`.
|
|
332
354
|
|
|
333
|
-
## Cost Awareness — Quick Rules
|
|
334
|
-
|
|
335
|
-
Full tables + formulas in `references/workflows/cost-and-validation.md`. Quick rules:
|
|
336
|
-
|
|
337
|
-
- **Skip the brief/cost confirmation ONLY** when the user's message already pins model + count + aspect + creative direction (see "Confirm the Creative Brief" above). Low cost alone is **not** a reason to skip — cheap generations still get the one labeled confirmation unless the user chose the parameters.
|
|
338
|
-
- **Otherwise confirm** via the labeled-question card: the parameters + the credit cost, suggest a cheaper alternative if one fits, wait for the user's pick. Never fire on defaults the user didn't choose.
|
|
339
|
-
- **Batch totalling 100+ credits**: run `check_credits` first.
|
|
340
|
-
- **Quote real cost**: after firing, log `credits_used` (from the tool result) to `.kolbo/production.md` — never `base × count`.
|
|
341
|
-
- **Video/lipsync `credit` is per-SECOND, not per-clip**: `total = credit × duration`. This is the universal rule for video/firstlast/elements/motion_graphic/cast types, not a per-model exception — `list_models` states it inline now. The one carve-out is a model with `flat_credit_by_resolution` set.
|
|
342
|
-
- **Never state "credits remaining" from arithmetic** (opening balance − generation costs). Coding/chat usage deducts credits too, so the math is always wrong. Report cost only; if the user asks for their balance, call `check_credits` fresh at that moment.
|
|
343
|
-
|
|
344
355
|
## Rate Limiting & Batch Generation
|
|
345
356
|
|
|
346
357
|
- `generate_image`: 30/min. All other generation tools: 10/min per type. 300/min global. `upload_media`: 300/min, no credit cost.
|
|
347
|
-
- **⚠️ NEVER re-fire a generation you already called.** Aborted / timed-out / `submitted` calls still process server-side. Finish with `get_generation_status` (`wait=true`) — never a second `generate_*`. A black chat card or Library K-tile is not a missing job.
|
|
348
|
-
- **⚠️ NEVER keep working while a generation is in flight.** After `submitted` / `_timed_out`, end the turn or block on one `wait=true` status call. Writing production.md / skills / "merge decisions" while the card spins wastes coding credits.
|
|
349
|
-
- **Tracking a batch**: check ALL in-flight ids in ONE `get_generation_status` call with `generation_ids` + `wait=true`. Read `all_done` / `still_processing` from the response — do not check ids one by one, and never re-call without `wait`.
|
|
350
358
|
- **Batch ≤10 items**: output ALL tool calls in one response — they run concurrently.
|
|
351
359
|
- **Bulk >10 items**: real-world ceilings — `generate_image` 8–10 in-flight, image-edit 5–8, video tools 3–5, `generate_video_from_video` 3, music/speech/sound 5–8. Fire one batch → wait → fire next. Persist every `generation_id` in `.kolbo/production.md`.
|
|
352
|
-
- **`upload_media` external (non-Kolbo) URLs only.** `files`/`source_images`/`image_url` reject unknown hosts with `400`. A `media.kolbo.ai` / generate_* URL is already hosted — pass it through. Never `upload_media` a Kolbo URL.
|
|
353
360
|
|
|
354
361
|
## ⚠️ Multi-output? Default to `generate_creative_director` (CRITICAL)
|
|
355
362
|
|
|
@@ -361,18 +368,6 @@ Full tables + formulas in `references/workflows/cost-and-validation.md`. Quick r
|
|
|
361
368
|
|
|
362
369
|
**Parameter gotcha:** `num_images` (1–4, same prompt different seeds) on `generate_image` vs `scene_count` (1–8, distinct prompt per scene) on `generate_creative_director`. **Never pass `num_images` to Creative Director.**
|
|
363
370
|
|
|
364
|
-
## 🛑 Runaway-Loop Guard — ONE Generation per Requested Item (CRITICAL)
|
|
365
|
-
|
|
366
|
-
When the user asks for **one specific change**, the answer is **a single tool call**. After URLs return, **stop**. Surface and wait.
|
|
367
|
-
|
|
368
|
-
You are NOT allowed to:
|
|
369
|
-
- Fire the same tool 3+ times in a single turn unless the user explicitly asked for "N variations".
|
|
370
|
-
- Re-fire because you think the result might not be exactly what the user wanted.
|
|
371
|
-
- Auto-retry on success.
|
|
372
|
-
- Fire 5+ parallel `generate_video*` calls speculatively.
|
|
373
|
-
|
|
374
|
-
**Only re-fire when:** user explicitly asked for variations with a count, OR previous call returned `failure.retryable === true` (ONE retry), OR previous call returned `completed` but `urls.length === 0` (ONE retry).
|
|
375
|
-
|
|
376
371
|
## ⚠️ Editing an Existing Video → ONE Call, Not Frames-First (CRITICAL)
|
|
377
372
|
|
|
378
373
|
Existing video → modify → **single `generate_video_from_video` call** with source video URL + edit prompt.
|
|
@@ -393,22 +388,6 @@ For any ad / story / scene-based video **created from scratch** featuring a Visu
|
|
|
393
388
|
|
|
394
389
|
Skip frames-first only when the user says "go straight to video", single-shot quick experiments, or the user supplies approved frames. Full rules: `references/models/creative-director.md`.
|
|
395
390
|
|
|
396
|
-
## ⚠️ Detecting Failed Generations (CRITICAL)
|
|
397
|
-
|
|
398
|
-
A generation can fail three ways. Treat ALL as failure:
|
|
399
|
-
|
|
400
|
-
1. **Tool returns `error`** — explicit. Surface, suggest retry, log `generation_id`.
|
|
401
|
-
2. **Tool returns `completed` but `urls` is empty** — silent failure (NSFW filter, model OOM, upstream 5xx). Tell user "completed without an output — retrying" and re-fire ONCE. Do NOT log to `.kolbo/production.md`. Do NOT claim it worked.
|
|
402
|
-
3. **Tool hangs / never returns** — MCP poll timed out. Call `get_generation_status(generation_id, wait=true)` IMMEDIATELY. The server might be done.
|
|
403
|
-
|
|
404
|
-
**Always:**
|
|
405
|
-
- Don't celebrate before reading the result. Verify `urls` is non-empty.
|
|
406
|
-
- Don't auto-retry without surfacing the failure. Partial batches: list failed items + reasons + successful count. Never "✅ all done!" on partials.
|
|
407
|
-
- Don't log failed items to `.kolbo/production.md`. Only successes.
|
|
408
|
-
- Surface the user's count. "6 of 8 ready", not "videos ready".
|
|
409
|
-
|
|
410
|
-
`failure` envelope structure + retry rules: `references/workflows/troubleshooting.md`.
|
|
411
|
-
|
|
412
391
|
## ⚠️ Generated URLs in Chat (CRITICAL)
|
|
413
392
|
|
|
414
393
|
Chat renders markdown natively. `` = inline image. `[label](url)` = labeled link with preview.
|
package/skill/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.9.
|
|
1
|
+
0.9.7
|
|
@@ -18,7 +18,7 @@ A multi-scene batch generator. Submit 1–8 scenes in one go and the tool fans t
|
|
|
18
18
|
- **Cinema Manual** — per-scene **first frame + last frame** + per-scene prompt. Full cinematic control over composition transitions. Best for: hero shots, controlled camera moves, deliberate edits.
|
|
19
19
|
|
|
20
20
|
### Identity & Style Locks
|
|
21
|
-
- **Visual DNA** — attach a character/product preset via `visual_dna_ids` to lock identity across all scenes
|
|
21
|
+
- **Visual DNA** — attach a character/product preset via `visual_dna_ids` to lock identity across all scenes (e.g. main character + product + side character). The cap is per model — read `max_visual_dna` from `list_models`. See `workflows/visual-dna.md` for the `@name` syntax — every DNA must be tagged inside the prompt.
|
|
22
22
|
- **Moodboard** — attach `moodboard_id` (or `moodboard_ids`) for a curated mood/style reference that anchors the aesthetic of the whole batch.
|
|
23
23
|
- When the user mentions a recurring character/product, **ask** if they want to use a Visual DNA and recommend it. Same for a consistent aesthetic → recommend a Moodboard.
|
|
24
24
|
|
|
@@ -97,13 +97,7 @@ A great batch isn't 8 random shots — it's a sequence with intent. Pick one str
|
|
|
97
97
|
|
|
98
98
|
## Character-Driven Video — Frames First
|
|
99
99
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
1. **Generate the shot frames first** as still images via `generate_creative_director` with `scene_count` + `visual_dna_ids` + `workflow_type: "image"`. DNA is strongest in image generation; the user can approve cheaply before any expensive video runs.
|
|
103
|
-
2. **Confirm the frames with the user** if there are more than ~3 shots, or if the user hasn't said "go straight to video."
|
|
104
|
-
3. **Animate each frame** with `generate_video_from_image`, passing each approved frame as `image_url`.
|
|
105
|
-
|
|
106
|
-
Skip frames-first only when the user says "go straight to video / skip the storyboard", on single-shot quick experiments, or when the user supplies their own approved frames.
|
|
100
|
+
SKILL.md's frames-first rule applies. The Creative Director deltas: generate the frames via `generate_creative_director` with `workflow_type: "image"` (+ `scene_count`, `visual_dna_ids`), then animate each approved frame with `generate_video_from_image`, passing it as `image_url`.
|
|
107
101
|
|
|
108
102
|
## UGC sets and thumbnail sets
|
|
109
103
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
# Music — Prompt Rules (Suno-led)
|
|
6
6
|
|
|
7
|
-
Load this file when the user wants AI-generated **music** — full songs, lyrics, instrumentals, jingles, scores, soundtracks, lo-fi beats, trailers, ad music. Primarily Suno; the same craft applies to other music models. For TTS / voice cloning see `models/prompt-copilot.md`. For sound effects see SKILL.md
|
|
7
|
+
Load this file when the user wants AI-generated **music** — full songs, lyrics, instrumentals, jingles, scores, soundtracks, lo-fi beats, trailers, ad music. Primarily Suno; the same craft applies to other music models. For TTS / voice cloning see `models/prompt-copilot.md`. For sound effects see `generate_sound` (SKILL.md tool table).
|
|
8
8
|
|
|
9
9
|
**Kolbo MCP routing:** call `generate_music`. Suno is a model option — use `list_models({ type: "music_gen" })` to see versions. Pass `instrumental` and `duration` as separate params; pass the Style/Description text as `style` and the Lyrics as `lyrics`.
|
|
10
10
|
|
|
@@ -101,7 +101,7 @@ For models that DO expose `negative_prompt` (some text-to-image variants), keep
|
|
|
101
101
|
| `21:9` | Ultrawide cinematic, banner |
|
|
102
102
|
| `3:1` / `1:3` | Hero banner, narrow strip |
|
|
103
103
|
|
|
104
|
-
Model-dependent — always check `supported_aspect_ratios` on the model via `list_models` before passing a value. See
|
|
104
|
+
Model-dependent — always check `supported_aspect_ratios` on the model via `list_models` before passing a value. See `references/workflows/cost-and-validation.md`.
|
|
105
105
|
|
|
106
106
|
### Safety / content policy
|
|
107
107
|
|
|
@@ -25,17 +25,12 @@ Load this file when the user wants a **Seedance 2 / Seedance 2.0** (ByteDance) v
|
|
|
25
25
|
- **MCP `duration` must match the Total line.** Pass `duration: X` (whole seconds) on `generate_video` / `generate_elements` / `generate_video_from_image` equal to the `Xs` in `Total: Xs / …`. Mismatch = wrong-length clip.
|
|
26
26
|
- **Then the Locked Intro** — `[GLOBAL LOOK]` / `[CAST]` / `[LOCATION]` (+ LOCATION MAP / CONTINUITY / PHYSICS for multi-shot) — before any shot. A one-liner `same character throughout` is not a character lock.
|
|
27
27
|
- **Order inside each shot**: Subject → Action → Camera → Constraints → (Audio/SFX if relevant). Do NOT restack GLOBAL LOOK style inside the shot.
|
|
28
|
-
- **Prompt length**: simple single-idea pieces ~120–280 words. Locked-intro cinematic typically 400–900 words. Shorter than ~120 words = random output. The
|
|
28
|
+
- **Prompt length**: simple single-idea pieces ~120–280 words. Locked-intro cinematic typically 400–900 words. Shorter than ~120 words = random output. The 10,000-char cap below always wins.
|
|
29
29
|
- **Shot count is user-directed.** If the user asks for N shots, deliver exactly N in one prompt unless they ask to split.
|
|
30
30
|
- **Always describe at least one camera movement per shot.**
|
|
31
31
|
- **Tell Seedance what the camera is NOT doing** (e.g. `no cuts, no zoom, natural head movement`) — this is what locks POV.
|
|
32
32
|
- **Final prompt is always English**, wrapped in a copy-ready code block. Detect intent in any language and reply in the user's language, but the prompt itself is English.
|
|
33
|
-
- **HARD CAP:
|
|
34
|
-
- Applies to ANY prompt: 1 shot or 6 shots, single POV or full montage — the WHOLE thing must fit under 8000 chars combined.
|
|
35
|
-
- It is NOT 8000 chars per shot. It is 8000 chars per prompt.
|
|
36
|
-
- If your draft exceeds 8000 chars, trim aggressively in this order: (1) cut redundant adjectives, (2) collapse the opening cinematic boilerplate, (3) shorten SFX lists, (4) merge or drop shots — keep escalation beats and cut filler beats, (5) tighten action descriptions to verb-led essentials.
|
|
37
|
-
- **Never** split into multiple prompts, multiple code blocks, or "part 1 / part 2" to evade the cap.
|
|
38
|
-
- Before outputting, internally count the characters of the final prompt as a single string. If > 8000, rewrite tighter and re-count. Repeat until ≤ 8000. Only then show the user.
|
|
33
|
+
- **HARD CAP: 10,000 characters TOTAL for the ENTIRE prompt** — measured as one single string including all shots, boilerplate, SFX lines, and the Total lines. It is per PROMPT, not per shot. **Never** split into multiple prompts, code blocks, or "part 1 / part 2" to evade the cap. Count the final prompt before output; if over, trim (cut adjectives, collapse boilerplate, shorten SFX lists, merge or drop shots) and re-count until it fits.
|
|
39
34
|
|
|
40
35
|
## Locked Intro (DEFAULT for any multi-shot cinematic — including Elements)
|
|
41
36
|
|
|
@@ -72,21 +67,11 @@ Total: Xs / N shots / AR
|
|
|
72
67
|
POSITIVE LOCKS: <2–4 sentences restating positions / mouth / optical signature>
|
|
73
68
|
```
|
|
74
69
|
|
|
75
|
-
When a Visual DNA exists, its exact `@DNA_name` IS the cast name — never place a nickname before it or substitute one later. For plain image refs use `@ImageN`.
|
|
76
|
-
|
|
77
70
|
## OUTPUT CONTRACT (WINS — same as help widget)
|
|
78
71
|
|
|
79
|
-
ONE fenced prompt. Required shape or the turn failed:
|
|
80
|
-
1. `N connected cinematic shots, Xs total, AR, Multishot ON`
|
|
81
|
-
2. `Total: Xs / N shots / AR`
|
|
82
|
-
3. GLOBAL LOOK → CAST → LOCATION → LOCATION MAP → CONTINUITY → PHYSICS (dense, before any shot)
|
|
83
|
-
4. `SHOT 1 — 0:00–0:02 — …` through SHOT N; timecodes sum to Xs; continuity bridge after SHOT 1
|
|
84
|
-
5. Closing `Total: Xs / N shots / AR` + short POSITIVE LOCKS
|
|
85
|
-
6. Tool call `duration` = Xs
|
|
86
|
-
|
|
87
72
|
FORBIDDEN: omitting Total / Multishot; "same character throughout" as the only lock; one fence per shot; `[0s]`/`[3s]` stubs; splitting a ≤15s story into multiple generations unless the user asks.
|
|
88
73
|
|
|
89
|
-
## The
|
|
74
|
+
## The 6 Formats
|
|
90
75
|
|
|
91
76
|
### 1. Transformations (highest-performing format)
|
|
92
77
|
- Numbered shots, beat by beat.
|
|
@@ -248,7 +233,7 @@ Place CAMERA in the **3rd position** of each shot's core layers (Subject → Act
|
|
|
248
233
|
- No equipment / director names?
|
|
249
234
|
- Emotion through muscle, not labels?
|
|
250
235
|
- Multishot: FOV per segment + "no drift mid-segment"?
|
|
251
|
-
-
|
|
236
|
+
- prompt-cap honored?
|
|
252
237
|
|
|
253
238
|
## Grid Storyboard Mode (3×3 grid input)
|
|
254
239
|
|
|
@@ -273,7 +258,6 @@ When the user uploads a 3×3 grid image and asks for Seedance prompts, switch to
|
|
|
273
258
|
- Final prompt(s) ALWAYS in a fenced code block ready to paste into Seedance.
|
|
274
259
|
- After the code block, give a 1-line "why this works" note (camera/escalation/physics choice).
|
|
275
260
|
- If user asked in any language other than English, write your explanation in their language but keep the prompt itself English.
|
|
276
|
-
- **Never exceed 8000 characters TOTAL for the entire prompt as one string** — that is the WHOLE prompt including every shot, every line of boilerplate, every SFX list, every newline. NOT 8000 per shot — 8000 for the prompt as one combined unit. Count before output. If over, rewrite tighter (cut adjectives, collapse boilerplate, merge or drop shots). NEVER split into multiple prompts / multiple code blocks / "part 1 / part 2" to work around the limit.
|
|
277
261
|
|
|
278
262
|
## Where to run in Kolbo
|
|
279
263
|
|
|
@@ -286,4 +270,4 @@ Seedance 2 lives in the **Video** category. Route the prompt card by the INPUTS:
|
|
|
286
270
|
|
|
287
271
|
## Seedance + Visual DNA / References
|
|
288
272
|
|
|
289
|
-
When a character must stay consistent, pair Seedance with Visual DNA via `generate_elements` (NOT `generate_video` — text-to-video silently drops `visual_dna_ids`).
|
|
273
|
+
When a character must stay consistent, pair Seedance with Visual DNA via `generate_elements` (NOT `generate_video` — text-to-video silently drops `visual_dna_ids`). `@DNA_name` tagging rules: see `workflows/visual-dna.md`. For grid/storyboard inputs, the source frame is `@image1`.
|
|
@@ -20,7 +20,7 @@ Load this file when the user wants a **Seedance 2.5** video (they said "2.5" / "
|
|
|
20
20
|
- **Duration 4–30 seconds**, whole seconds. 30s IS supported.
|
|
21
21
|
- **Up to 30 shots/cuts in ONE generation.** Deliver exactly N if N ≤ 30.
|
|
22
22
|
- **Prompt cap 15,000 characters** for the entire prompt as one string (`max_prompt_length` in the catalog; Seedance 2.0 is 10,000). Verify with `list_models` rather than trusting this number — it was documented as 30,000 for months, which is double the real limit.
|
|
23
|
-
- **
|
|
23
|
+
- **Large reference / Visual DNA capacity** (`@Name`, `@ImageN`, `#Moodboard`) — read the exact caps from `max_visual_dna` / `elements_max_images` in `list_models`. Every referenced asset must be tagged in the prompt text. A rewrite that drops or renames a tag ( `@doron_fauda_1` → `DORON` / `the hero` ) is a failed turn — put the exact tag back.
|
|
24
24
|
- **Multimodal refs:** images + video clips + audio can all anchor one generation.
|
|
25
25
|
|
|
26
26
|
## Universal Rules (HARD — same as help widget OUTPUT CONTRACT)
|
|
@@ -15,7 +15,7 @@ Load this file when the user wants a **Veo 3 / Veo 3.1** (Google) video. For oth
|
|
|
15
15
|
## CRITICAL Kolbo Platform Rules
|
|
16
16
|
|
|
17
17
|
- **Aspect ratio, resolution, and clip length are MCP-tool params** (`aspect_ratio`, `resolution`, `duration`). **NEVER include "16:9", "9:16", "720p", "1080p", "4 seconds", "8s", or any duration / aspect / resolution string inside the prompt body.**
|
|
18
|
-
- Pass `sound_enabled: true/false` as a separate param when the user mentions audio — see
|
|
18
|
+
- Pass `sound_enabled: true/false` as a separate param when the user mentions audio — see `workflows/cost-and-validation.md`.
|
|
19
19
|
- Don't write Python / Vertex AI / API call syntax. The user is generating through Kolbo's MCP tools.
|
|
20
20
|
|
|
21
21
|
## Model Capabilities (informs recommendations, never in the prompt body)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Color DNA — Brand Palette Grading
|
|
2
|
+
|
|
3
|
+
Load this file when the user works with Color DNA / color palettes: creating, activating, analyzing, or opting a generation out of palette grading.
|
|
4
|
+
|
|
5
|
+
Core contract (also in SKILL.md): **Color DNA is sticky and account-wide — at most one palette is active at a time**, and while one is active it strict-grades **every** image and video generation automatically, with no per-call argument.
|
|
6
|
+
|
|
7
|
+
Operational detail:
|
|
8
|
+
|
|
9
|
+
- `analyze_color_palette` pulls colors out of 1–5 image URLs **for free** and does **NOT** save anything — use it to draft a palette before creating one.
|
|
10
|
+
- `create_color_palette` defaults `is_active: true`, which activates the new palette and deactivates any other active one.
|
|
11
|
+
- Per-generation opt-out: `skip_color_palette: true` on `generate_image` / `generate_image_edit` / `generate_video` / `generate_video_from_image`.
|
|
12
|
+
- Manage with `list_color_palettes` / `update_color_palette` / `activate_color_palette` / `deactivate_color_palette` / `delete_color_palette` (edit in place — never delete+recreate).
|
|
@@ -8,9 +8,9 @@ Creative generations bill against the user's Kolbo credit balance. **Billing uni
|
|
|
8
8
|
|
|
9
9
|
| Type | Billing unit | Credit range | Example |
|
|
10
10
|
|------|-------------|-------------|---------|
|
|
11
|
-
| **Image** | per image (flat) | 1–30 cr | Flux.1 Fast = 1 cr, Midjourney = 4 cr. If `resolution` is set, check `
|
|
11
|
+
| **Image** | per image (flat) | 1–30 cr | Flux.1 Fast = 1 cr, Midjourney = 4 cr. If `resolution` is set, check `resolution_multipliers` — some families multiply cost significantly at higher tiers. |
|
|
12
12
|
| **Image edit** | per image (flat) | 2–20 cr | |
|
|
13
|
-
| **Video** | **cr/s × duration** | 2–30 cr/s | Kandinsky 5 Fast × 5s = 10 cr; Seedance 2.0 × 10s = 300 cr. Check `
|
|
13
|
+
| **Video** | **cr/s × duration** | 2–30 cr/s | Kandinsky 5 Fast × 5s = 10 cr; Seedance 2.0 × 10s = 300 cr. Check `resolution_multipliers` + `sound_credit_multiplier`. |
|
|
14
14
|
| **Video from image** | **cr/s × duration** | 4–30 cr/s | Same per-second rule. |
|
|
15
15
|
| **Elements (ref-to-video)** | **cr/s × duration** | 4–30 cr/s | Check `credit` and multipliers in `list_models type="elements"`. |
|
|
16
16
|
| **Lipsync** | **cr/s × duration** | 5–20 cr/s | |
|
|
@@ -28,7 +28,7 @@ Apply when confirming cost before firing:
|
|
|
28
28
|
- **Music**: flat per generation — `total = model_credit` (duration does not change cost).
|
|
29
29
|
- **TTS**: `total = model_credit × ceil(character_count / 100)`. Count actual characters first. 1000 chars with ElevenLabs = 50 credits.
|
|
30
30
|
- **Images / 3D / Sound effects**: `total = model_credit × quantity`.
|
|
31
|
-
- **Resolution / audio multipliers**: if `resolution` is set or model has native audio, read `
|
|
31
|
+
- **Resolution / audio multipliers**: if `resolution` is set or model has native audio, read `resolution_multipliers[tier]` and `sound_credit_multiplier`. Formula: `final = base × resolutionMult × (sound ? soundMult : 1) × durationSeconds`.
|
|
32
32
|
|
|
33
33
|
### Tier label → pixel mapping (rough)
|
|
34
34
|
|
|
@@ -38,8 +38,7 @@ Apply when confirming cost before firing:
|
|
|
38
38
|
## When to Confirm Cost
|
|
39
39
|
|
|
40
40
|
**Skip cost confirmation when:**
|
|
41
|
-
-
|
|
42
|
-
- A single generation costs under 5 credits.
|
|
41
|
+
- Model + count + aspect + creative direction are already pinned by the user ("make 5 videos, seedance 2 fast, 15s" IS the confirmation).
|
|
43
42
|
|
|
44
43
|
**Required cost confirmation when:**
|
|
45
44
|
- Anything else — present a one-line summary: "8 videos × 5s × [model] @ X cr/s = **Y credits**. Proceed?"
|
|
@@ -52,21 +51,7 @@ Apply when confirming cost before firing:
|
|
|
52
51
|
|
|
53
52
|
## ⚠️ Quote Real Cost, Never Estimates (CRITICAL)
|
|
54
53
|
|
|
55
|
-
Pre-flight formulas above are for **preview only
|
|
56
|
-
|
|
57
|
-
```json
|
|
58
|
-
{
|
|
59
|
-
"credits_used": 12,
|
|
60
|
-
"credits_breakdown": [
|
|
61
|
-
{ "model": "nano-banana-2", "base": 8, "final": 12, ... }
|
|
62
|
-
],
|
|
63
|
-
"urls": [...]
|
|
64
|
-
}
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
**Log `credits_used` to `.kolbo/production.md`**, not `base × count`. The multiplier-adjusted number is the only truth.
|
|
68
|
-
|
|
69
|
-
When the user asks "how much did I spend?" → call `get_session_usage` for the real, multiplier-adjusted session total + per-tool + per-model breakdowns (same numbers as the desktop bottom-bar counter).
|
|
54
|
+
Pre-flight formulas above are for **preview only** — after firing, quote the returned `credits_used`, never `base × count`. Log `credits_used`, resolution, duration and sound state per entry — format in `production-log.md`.
|
|
70
55
|
|
|
71
56
|
## Validation Pattern — Every Generation
|
|
72
57
|
|
|
@@ -132,9 +117,4 @@ Cost formula: `final_cost = credit × resolution_multipliers[resolution] × (sou
|
|
|
132
117
|
|
|
133
118
|
## Always Log the Resolution / Duration / Sound Choices
|
|
134
119
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
```md
|
|
138
|
-
- still: https://...01-coffee.png (flux-2-pro · 1K, 2026-05-14)
|
|
139
|
-
- video: https://...02-rain.mp4 (kling-2 · 1080p · 5s · sound-off, 2026-05-14)
|
|
140
|
-
```
|
|
120
|
+
Log `credits_used`, resolution, duration and sound state per entry — format in `production-log.md`.
|
|
@@ -122,5 +122,5 @@ Default-to-cheapest when the user hasn't expressed a quality intent and the diff
|
|
|
122
122
|
2. **Always confirm aspect ratio + resolution + quantity** before firing.
|
|
123
123
|
3. **Always check for a brand kit** before scraping fresh — `Read .kolbo/brand-kits/<slug>.md` first.
|
|
124
124
|
4. **Always log products + brand kits in `.kolbo/production.md`** so future ads reuse instead of re-uploading / re-scraping.
|
|
125
|
-
5. **
|
|
125
|
+
5. **Retries:** one retry only when `failure.retryable === true` or the generation completed with empty URLs (SKILL.md "⚠️ Generation lifecycle"); otherwise surface the reason and let the user adjust.
|
|
126
126
|
6. **Strict NO uninvited additions** in every ad prompt: "NO captions, NO subtitles, NO watermarks, NO extra text beyond what's specified."
|
|
@@ -52,30 +52,6 @@ Compile only what the current generation needs. A video model cannot resolve “
|
|
|
52
52
|
|
|
53
53
|
Kolbo Visual DNA is semantic project truth, not merely reference imagery. Read and preserve the saved DNA type and analyzed context: character DNAs own identity/state/performance/voice; environment and scene DNAs own location/geography/light; product DNAs own prop/product identity, scale, material, and state; style DNAs own the visual register. Keep exact tags and never reinterpret one DNA type as another.
|
|
54
54
|
|
|
55
|
-
## Choose control density
|
|
56
|
-
|
|
57
|
-
Never equate sophistication with maximum length.
|
|
58
|
-
|
|
59
|
-
- **Strict** — lock exact blocking, count, timing, dialogue, hand/prop state, axis, scale, or failure-prone physics. Use for continuity-heavy dialogue, expensive hero shots, repeated failures, and exact music synchronization.
|
|
60
|
-
- **Anchored** — dictate non-negotiable story/continuity/physics anchors and allow camera or performance variation inside them. Use for complex spectacle where controlled discovery is valuable.
|
|
61
|
-
- **Exploratory** — protect identity, world, safety, and essential beats while inviting coverage variations. Use for montage, inserts, music-video coverage, and ideation.
|
|
62
|
-
|
|
63
|
-
If the user supplied an exact prompt, preserve its chosen density unless the failure diagnosis proves density itself is the problem.
|
|
64
|
-
|
|
65
|
-
## Select craft packs
|
|
66
|
-
|
|
67
|
-
Load only what the shot needs:
|
|
68
|
-
|
|
69
|
-
- Story causality and scene reversals: [scene-engine.md](references/filmmaking/scene-engine.md)
|
|
70
|
-
- Asset building, versions, and stress tests: [asset-preproduction.md](references/filmmaking/asset-preproduction.md)
|
|
71
|
-
- Character performance, listening, and voice identity: [acting-direction.md](references/filmmaking/acting-direction.md)
|
|
72
|
-
- Geography, axes, eyelines, diagrams, and state continuity: [blocking-continuity.md](references/filmmaking/blocking-continuity.md)
|
|
73
|
-
- Shot size, optics, operator behavior, and visual grammar: [cinematography.md](references/filmmaking/cinematography.md)
|
|
74
|
-
- Action feasibility, mass, materials, transformations, and impossible shots: [physics-action.md](references/filmmaking/physics-action.md)
|
|
75
|
-
- Dialogue, ambience, native audio, source-song performance, and post music: [audio-dialogue-music.md](references/filmmaking/audio-dialogue-music.md)
|
|
76
|
-
|
|
77
|
-
Do not paste every craft pack into every prompt. Translate the selected pack into the shortest observable instructions that preserve the intended result.
|
|
78
|
-
|
|
79
55
|
## Compile a shot
|
|
80
56
|
|
|
81
57
|
Read [prompt-contracts.md](references/filmmaking/prompt-contracts.md) for exact structures.
|
|
@@ -92,7 +68,7 @@ Before writing, establish:
|
|
|
92
68
|
8. Audio ownership, exact words/lyrics, and whether music is native, source-driven, or reserved for post.
|
|
93
69
|
9. Model capability limits and target generation mode.
|
|
94
70
|
|
|
95
|
-
Prompt-length limits apply to the entire compiled generation prompt as one string, including whitespace, headers, timecodes, dialogue, audio, and locks. Count after compilation
|
|
71
|
+
Prompt-length limits apply to the entire compiled generation prompt as one string, including whitespace, headers, timecodes, dialogue, audio, and locks. Count after compilation; read the cap from `max_prompt_length` via `list_models` (see `models/seedance25.md`).
|
|
96
72
|
|
|
97
73
|
**Seedance 2 / Seedance 2.5 / `generate_elements` — Locked Intro is the only compile shape.** Read `references/models/seedance.md` (and `seedance25.md` for 2.5 caps). Do not emit the SCENE CONTEXT / OPTICS / ACTION department pack below as the generation prompt. Every Visual DNA in play must be `@ExactName` in CAST and in each shot — never "the left man" or a possessive.
|
|
98
74
|
|
|
@@ -44,15 +44,17 @@ If the user mentions a product / brand but no mode word, default to `ugc`. If th
|
|
|
44
44
|
|
|
45
45
|
The mode determines which Kolbo MCP tool to call, what defaults to set, and what's forbidden.
|
|
46
46
|
|
|
47
|
-
| Mode | Primary tool |
|
|
48
|
-
|
|
49
|
-
| `ugc`, `ugc_how_to`, `ugc_unboxing`, `ugc_virtual_try_on`, `product_review` | `generate_video_from_image` (frame-first) OR `generate_elements` (Visual DNA → video) |
|
|
50
|
-
| `product_showcase` | `generate_creative_director` with `workflow_type: "video"` (for multi-shot) OR `generate_video` (single) |
|
|
51
|
-
| `tv_spot` | `generate_creative_director` with `workflow_type: "video"` (3–6 shots for a beat structure) |
|
|
52
|
-
| `virtual_try_on` | `generate_elements` with character Visual DNA + product as `reference_images` |
|
|
53
|
-
| `wild_card` | User's chosen model with broader prompt latitude (no mode-specific defaults) |
|
|
47
|
+
| Mode | Primary tool |
|
|
48
|
+
|---|---|
|
|
49
|
+
| `ugc`, `ugc_how_to`, `ugc_unboxing`, `ugc_virtual_try_on`, `product_review` | `generate_video_from_image` (frame-first) OR `generate_elements` (Visual DNA → video) |
|
|
50
|
+
| `product_showcase` | `generate_creative_director` with `workflow_type: "video"` (for multi-shot) OR `generate_video` (single) |
|
|
51
|
+
| `tv_spot` | `generate_creative_director` with `workflow_type: "video"` (3–6 shots for a beat structure) |
|
|
52
|
+
| `virtual_try_on` | `generate_elements` with character Visual DNA + product as `reference_images` |
|
|
53
|
+
| `wild_card` | User's chosen model with broader prompt latitude (no mode-specific defaults) |
|
|
54
|
+
|
|
55
|
+
Aspect / duration / sound / captions defaults for the `ugc*` family live in "UGC Family Defaults" below.
|
|
54
56
|
|
|
55
|
-
**Pick the actual model** with `list_models({ type: "..." })` and validate caps before firing — see
|
|
57
|
+
**Pick the actual model** with `list_models({ type: "..." })` and validate caps before firing — see `references/workflows/cost-and-validation.md`.
|
|
56
58
|
|
|
57
59
|
## The Look Itself — read `workflows/ugc-smartphone.md`
|
|
58
60
|
|
|
@@ -149,8 +151,7 @@ Scale to 2–6 slots. Keep `hook → demo → payoff` as the minimum arc; add `t
|
|
|
149
151
|
### 2. Rendering rules (hard invariants — apply to EVERY slot)
|
|
150
152
|
|
|
151
153
|
- One aspect ratio across all slots (UGC = `9:16`). Never mix.
|
|
152
|
-
- **
|
|
153
|
-
- **Identity lock**: same presenter, same wardrobe, same lighting environment across all slots — open the prompt with `same character throughout all shots`.
|
|
154
|
+
- **Identity lock**: same presenter, same wardrobe, same lighting environment across all slots — bind identity by tagging `@<dna-name>` in every slot description (identity binds via the DNA; the phrase "same character throughout all shots" is FORBIDDEN — see `models/seedance.md`).
|
|
154
155
|
- Hands and product must read cleanly — no deformed hands, no floating / clipping product, product logo legible when held.
|
|
155
156
|
- Phone-shot aesthetic (handheld sway, window/screen key) unless the mode is polished (`tv_spot`, `product_showcase`).
|
|
156
157
|
|
|
@@ -183,7 +184,7 @@ Track these so each slot's call is reproducible and the arc stays coherent:
|
|
|
183
184
|
Brief: *"15s UGC review of a skincare serum, tech-savvy woman creator."*
|
|
184
185
|
|
|
185
186
|
1. Ensure/create presenter Visual DNA (tech-savvy woman) → `visual_dna_id`.
|
|
186
|
-
2. Board: `generate_image` a 3-panel `16:9` sheet — (a) chest-up hook holding the serum, (b) hands applying it, (c) thumbs-up reaction —
|
|
187
|
+
2. Board: `generate_image` a 3-panel `16:9` sheet — (a) chest-up hook holding the serum, (b) hands applying it, (c) thumbs-up reaction — `@<dna-name>` tagged in every panel description, locked to the DNA. → `board_media_id`.
|
|
187
188
|
3. Slots (each `9:16`, ~5s, sound OFF, animate from the matching board panel + product `@image2`):
|
|
188
189
|
- Slot 1 (hook): "Before this serum my routine was five products…" holding it to camera.
|
|
189
190
|
- Slot 2 (demo): hands applying, product in active use.
|
|
@@ -194,9 +195,8 @@ Brief: *"15s UGC review of a skincare serum, tech-savvy woman creator."*
|
|
|
194
195
|
|
|
195
196
|
1. **Always pick a mode explicitly.** Don't auto-pick from one ambiguous word. If the user said "make me an ad" with no other signal, offer labeled options: `[UGC / TV Spot / Product Showcase / Surprise me]`.
|
|
196
197
|
2. **Always confirm aspect ratio + duration + sound** before firing — these materially change output and cost. One question, labeled options.
|
|
197
|
-
3. **
|
|
198
|
-
4. **
|
|
199
|
-
5. **Show results without dumping URLs** — see SKILL.md "Generated URLs in chat".
|
|
198
|
+
3. **Retries:** one retry only when `failure.retryable === true` or the generation completed with empty URLs (SKILL.md "⚠️ Generation lifecycle"); otherwise surface the reason and let the user adjust prompt or product.
|
|
199
|
+
4. **Show results without dumping URLs** — see SKILL.md "Generated URLs in chat".
|
|
200
200
|
|
|
201
201
|
## Prompt Template Seed for UGC
|
|
202
202
|
|
|
@@ -70,7 +70,7 @@ fails to open (exit 26).
|
|
|
70
70
|
|
|
71
71
|
| User says | Call |
|
|
72
72
|
|---|---|
|
|
73
|
-
| "Upload this file" / "host this" / "give me a public URL for this" | `upload_media` — but see "Local files"
|
|
73
|
+
| "Upload this file" / "host this" / "give me a public URL for this" | `upload_media` — but see "Local files" above if it's a path on the user's disk |
|
|
74
74
|
| "Show my media" / "list my images/videos" / "what do I have?" | `list_media` (pass `type` / `category` / `project_id` / `folder_id` / `search`) |
|
|
75
75
|
| "Show my favorites" / "list starred items" | `list_media` with `category=favorites` |
|
|
76
76
|
| "List everything in project X" | `list_media` with `project_id=X` |
|
|
@@ -110,3 +110,13 @@ fails to open (exit 26).
|
|
|
110
110
|
8. **Bulk caps:** 1000 ids for `bulk_delete_media` / `bulk_restore_media` / `bulk_permanently_delete_media` / `bulk_move_media`; 500 ids for `add_media_to_folder` / `remove_media_from_folder`. Split larger jobs into successive calls.
|
|
111
111
|
9. **Folder share resolution:** `share_media_folder` takes emails; users not found come back in `not_found`. Report those to the user — don't assume the share succeeded silently. Members can list/add/remove items but cannot delete the folder or reshare it.
|
|
112
112
|
10. **`get_media` accepts a generation_id as a fallback** for the `media_id` arg, so you can chase down items the user references by their original generation rather than by library id.
|
|
113
|
+
|
|
114
|
+
## SYNCI licensed music — operational detail
|
|
115
|
+
|
|
116
|
+
The `*_music_library` tools (`search_music_library` / `browse_music_library` / `get_music_library_facets` / `get_music_track_audio` / `get_music_track_lyrics` / `get_music_track_related` / `analyze_script_for_music` / `acquire_clean_music_track` / `import_music_track_to_library`) front **SYNCI**, a commercially licensed catalog — not free stock.
|
|
117
|
+
|
|
118
|
+
- Discovery and previews are free but **watermarked** — there is no unwatermarked URL until you pay.
|
|
119
|
+
- `acquire_clean_music_track` **CHARGES CREDITS** for the clean master. Confirm with the user first, and pass a stable `requestId` so a retry doesn't buy the track twice.
|
|
120
|
+
- `import_music_track_to_library` charges the same way AND also copies the clean track into the media library.
|
|
121
|
+
- `analyze_script_for_music` turns a script into search terms for `search_music_library`.
|
|
122
|
+
- Use this family when the user needs music cleared for commercial use. When free stock will do, use `search_stock_media` with `mediaType: "music"` instead.
|
|
@@ -61,7 +61,7 @@ The mode determines which Kolbo MCP tool to call and what defaults to use.
|
|
|
61
61
|
|
|
62
62
|
**For multi-output modes** (`social_carousel`, `ad_creative_pack`), always use `generate_creative_director` — never fire ≥2 `generate_image` calls in a loop. See `models/creative-director.md`.
|
|
63
63
|
|
|
64
|
-
**Always validate** `aspect_ratio` and `resolution` against the chosen model's `supported_aspect_ratios` / `supported_resolutions` via `list_models` — see
|
|
64
|
+
**Always validate** `aspect_ratio` and `resolution` against the chosen model's `supported_aspect_ratios` / `supported_resolutions` via `list_models` — see `references/workflows/cost-and-validation.md`.
|
|
65
65
|
|
|
66
66
|
## Pre-Generation Interview (CRITICAL)
|
|
67
67
|
|
|
@@ -38,20 +38,8 @@ The log records **what the user approved** — not everything you produced. Gett
|
|
|
38
38
|
|
|
39
39
|
**Never write an artifact into the log as approved without the user's approval.**
|
|
40
40
|
|
|
41
|
-
If they
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
```
|
|
45
|
-
GATE — <bucket name>
|
|
46
|
-
Presented: <what is in play>
|
|
47
|
-
Lock + next: "lock <bucket>" / "yes" / "next" / "now <next bucket>"
|
|
48
|
-
Stay: "redo @name" / "another take of …"
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
Confirmation the agent may treat as a lock: `yes`, `ok`, `lock`, `approved`,
|
|
52
|
-
`that's the one`, `use take 2`, `next`, `go`, `continue`, or they name the next
|
|
53
|
-
planned bucket while treating this set as done. Silence / "maybe" / a new
|
|
54
|
-
question is **not** a lock — repeat the GATE once, do not invent a yes.
|
|
41
|
+
If they didn't volunteer a yes, end the turn with the GATE block from
|
|
42
|
+
`production-planning.md` §3.
|
|
55
43
|
|
|
56
44
|
**If the user genuinely doesn't care** — "whatever you think", "you pick", "don't care", or they hand you the whole job — then **you decide**. Choose, say in one line which you picked and why, and log it as usual with `(agent-selected)`. Do not stall a production waiting for an approval the user has already delegated to you.
|
|
57
45
|
|
|
@@ -143,11 +143,12 @@ the next planned bucket in **its** session.
|
|
|
143
143
|
Only now compile shots. Defaults:
|
|
144
144
|
|
|
145
145
|
- **`generate_elements` with Seedance 2.5** (`seedance-2-5`) for the film itself —
|
|
146
|
-
up to 30s and 30 shots in ONE generation,
|
|
147
|
-
|
|
148
|
-
the primary reference-driven route.
|
|
149
|
-
- **Seedance 2.0** (`seedance-2`, cheaper, 4–15s,
|
|
150
|
-
|
|
146
|
+
up to 30s and 30 shots in ONE generation, dialogue and SFX baked in. DNA cap:
|
|
147
|
+
read `max_visual_dna` from `list_models`. `generate_video` also accepts
|
|
148
|
+
`visual_dna_ids` now; Elements remains the primary reference-driven route.
|
|
149
|
+
- **Seedance 2.0** (`seedance-2`, cheaper, 4–15s, smaller DNA cap per
|
|
150
|
+
`list_models`) when the piece is short and the cast is small.
|
|
151
|
+
`seedance-2-fast` / `seedance-2-mini` for cheap blocking.
|
|
151
152
|
- Every DNA in `visual_dna_ids` must also appear as `@ExactName` in the prompt.
|
|
152
153
|
- Dialogue in quotes inside its shot beat — English only, never TTS or lipsync.
|
|
153
154
|
See `models/seedance25.md`.
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Kolbo Review — client review & approval collections
|
|
2
|
+
|
|
3
|
+
Load this file when the user wants **feedback on finished media**: send a cut to a client,
|
|
4
|
+
collect timestamped comments, run an approve / request-changes loop, ship a v2 against the
|
|
5
|
+
same feedback thread, or share work with someone who has no Kolbo account. This is a
|
|
6
|
+
Frame.io-style layer over the media library — assets, versions, comments, statuses, and
|
|
7
|
+
guest share links — all project-scoped like everything else in Kolbo.
|
|
8
|
+
|
|
9
|
+
Not for: publishing a page (`publish_html_artifact`), sharing a whole media folder
|
|
10
|
+
(`share_media_folder`), or internal doc collaboration (`share_doc`).
|
|
11
|
+
|
|
12
|
+
## Tool inventory
|
|
13
|
+
|
|
14
|
+
| Tool | What it does |
|
|
15
|
+
|---|---|
|
|
16
|
+
| `create_review_asset` | New review asset with v1 media attached (`name`, `media_id`, optional `collection_id`, `version_note`). |
|
|
17
|
+
| `list_review_assets` / `get_review_asset` | Browse a project's review assets (filter by `collection_id` / `status`); fetch one with all versions + URLs. |
|
|
18
|
+
| `update_review_asset` | Rename, move to a collection (`collection_id: null` = uncollected), or switch `current_version_index`. |
|
|
19
|
+
| `add_review_version` | Append a new version to an existing asset from a `media_id`. |
|
|
20
|
+
| `set_review_status` | Workflow status: `in_progress` / `needs_review` / `approved` / `changes_requested`. |
|
|
21
|
+
| `delete_review_asset` | Soft-delete an asset AND its underlying review media. |
|
|
22
|
+
| `create_review_collection` / `list_review_collections` / `update_review_collection` / `delete_review_collection` | Folder layer. Deleting a collection is soft — its assets become uncollected, not deleted. |
|
|
23
|
+
| `create_review_comment` / `list_review_comments` / `reply_review_comment` / `edit_review_comment` / `delete_review_comment` | Text comments, optional video timecodes (`time_start` / `time_end`, seconds). One level of reply threading. |
|
|
24
|
+
| `resolve_review_comment` / `unresolve_review_comment` | Close / reopen a comment thread. |
|
|
25
|
+
| `create_review_share_link` / `list_review_share_links` / `revoke_review_share_link` | Guest links (no Kolbo account) for one asset or a whole collection. |
|
|
26
|
+
| `get_review_storage_usage` | `usedBytes` vs the 5GB review cap for the API-key owner. |
|
|
27
|
+
|
|
28
|
+
## The core flow
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
upload_media (or reuse a generation's media_id from list_media)
|
|
32
|
+
→ create_review_collection (only if grouping multiple assets)
|
|
33
|
+
→ create_review_asset ← media becomes v1
|
|
34
|
+
→ set_review_status "needs_review"
|
|
35
|
+
→ create_review_share_link ← hand the client the share_url
|
|
36
|
+
→ list_review_comments ← read what came back
|
|
37
|
+
→ fix → add_review_version ← v2 on the SAME asset
|
|
38
|
+
→ resolve_review_comment on each addressed note
|
|
39
|
+
→ set_review_status "approved" (usually the client does this via the link)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Media must already exist in the library — every attach point takes a `media_id` from
|
|
43
|
+
`upload_media` / `create_upload_ticket` / `media_upload_widget` / `list_media`, never a raw
|
|
44
|
+
URL or local path.
|
|
45
|
+
|
|
46
|
+
## Version semantics
|
|
47
|
+
|
|
48
|
+
- Versions **append**; labels are auto-set `v1`, `v2`, … — you can't choose or reorder them.
|
|
49
|
+
- `add_review_version` automatically makes the new version current. Use
|
|
50
|
+
`update_review_asset({ current_version_index })` only to point BACK at an older cut.
|
|
51
|
+
- **Comments attach to a version's media**, not the asset. `list_review_comments` defaults
|
|
52
|
+
to the current version — after adding v2, pass `version_media_id` to re-read v1 feedback.
|
|
53
|
+
Comments do not carry forward; the v2 thread starts clean.
|
|
54
|
+
- Never delete+recreate an asset to "update" it — that orphans the comment history and
|
|
55
|
+
every share link already sent to the client. New cut = `add_review_version`. Rename /
|
|
56
|
+
re-file = `update_review_asset`. Delete is for abandoning the review entirely.
|
|
57
|
+
|
|
58
|
+
## Share links — permissions and defaults
|
|
59
|
+
|
|
60
|
+
`create_review_share_link` targets an `asset` or a `collection` (collection links cover
|
|
61
|
+
every asset inside, including ones added later). Guest defaults if you pass nothing:
|
|
62
|
+
|
|
63
|
+
| Permission | Default |
|
|
64
|
+
|---|---|
|
|
65
|
+
| `canComment`, `canViewOtherComments`, `canSwitchVersions` | **true** |
|
|
66
|
+
| `canDownload`, `canResolveOwn`, `canSetStatus` | **false** |
|
|
67
|
+
| `require_email` | **true** — guests identify by email before viewing |
|
|
68
|
+
| `role_label` | `"Client"` (max 40 chars) |
|
|
69
|
+
|
|
70
|
+
- Want the client to approve directly? Pass `permissions: { canSetStatus: true }` —
|
|
71
|
+
otherwise they can only comment and you relay the verdict via `set_review_status`.
|
|
72
|
+
- Lockdown options: `password` (a NEW guest password — never an account credential),
|
|
73
|
+
`allowed_emails`, `expires_at` (ISO8601).
|
|
74
|
+
- Links are revoked by id (`revoke_review_share_link`), not edited — to change permissions,
|
|
75
|
+
create a new link and revoke the old one. This is the one place recreate IS the mechanism.
|
|
76
|
+
- When someone other than the owner sets a status, the owner gets a notification — don't
|
|
77
|
+
also announce it manually.
|
|
78
|
+
|
|
79
|
+
## Storage — the 5GB cap
|
|
80
|
+
|
|
81
|
+
Review media is **copied into dedicated review storage** and counts against a flat 5GB cap
|
|
82
|
+
per account — separate from library storage. The cap is enforced on `create_review_asset`
|
|
83
|
+
AND `add_review_version`; hitting it returns `REVIEW_STORAGE_LIMIT` (413). That error is a
|
|
84
|
+
real limit, not a transient failure — don't retry. Check `get_review_storage_usage`
|
|
85
|
+
(`usedBytes` / `capBytes`) before bulk-adding large videos, and free space by deleting
|
|
86
|
+
finished review assets (the library originals are untouched).
|
|
87
|
+
|
|
88
|
+
## Practical notes
|
|
89
|
+
|
|
90
|
+
- All of this is instant CRUD — no credits, no polling, no `get_generation_status`.
|
|
91
|
+
- Project contract applies: pass the same `project_id` you resolved via `list_projects` on
|
|
92
|
+
`create_review_asset` / `create_review_collection` / the list calls.
|
|
93
|
+
- `status` filter on `list_review_assets` takes exactly the four enum values — "pending" /
|
|
94
|
+
"done" are not statuses.
|
|
95
|
+
- Comment ids are `note_id` in the reply/edit/delete/resolve tools; version notes cap at
|
|
96
|
+
1000 chars.
|
|
97
|
+
- Guests can only resolve their own comments, and only if you granted `canResolveOwn` — the
|
|
98
|
+
resolve loop on client feedback is normally yours to run after fixing.
|
|
@@ -26,9 +26,9 @@ If Kolbo tools timeout or aren't listed, the MCP server may not be wired. Tell t
|
|
|
26
26
|
```
|
|
27
27
|
This re-wires the MCP configuration automatically. Then restart the session.
|
|
28
28
|
|
|
29
|
-
##
|
|
29
|
+
## Generation status, waiting, black cards
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
Status semantics, `wait=true` batching, black-card-is-normal and the credit guard live in SKILL.md "⚠️ Generation lifecycle — source of truth, waiting, failures".
|
|
32
32
|
|
|
33
33
|
## "Rate limited" (429 errors)
|
|
34
34
|
|
|
@@ -47,12 +47,6 @@ Call `list_color_palettes` and look for `is_active: true`. Then either
|
|
|
47
47
|
grade by writing colours into the prompt — the palette is applied after, and the
|
|
48
48
|
prompt loses.
|
|
49
49
|
|
|
50
|
-
## Checking generation status without spinning
|
|
51
|
-
|
|
52
|
-
`get_generation_status` supports `wait=true` (blocks server-side until the generation reaches a final state, up to ~3 min) and `generation_ids` (many ids in one call → returns `all_done`, `still_processing`, and per-generation results). **Never call it repeatedly in a loop** — one `wait=true` call replaces the loop. If some generations are still running after the wait window, call it ONCE more with `wait=true` and only the `still_processing` ids.
|
|
53
|
-
|
|
54
|
-
**Credit guard:** after a generate tool returns `submitted` / `_timed_out`, do not keep thinking or editing files while the card spins — that burns coding credits. End the turn, or make **one** `wait=true` status call if you need the URLs next.
|
|
55
|
-
|
|
56
50
|
## Failure envelope from `get_generation_status`
|
|
57
51
|
|
|
58
52
|
When a generation fails, `get_generation_status` returns a structured `failure` field alongside `error`:
|
|
@@ -8,7 +8,7 @@ Visual DNA profiles capture the visual "identity" of a character, style, product
|
|
|
8
8
|
|
|
9
9
|
## Workflow
|
|
10
10
|
|
|
11
|
-
1. **Sheet first, then DNA.** For any production asset (character / location / prop), resolve the sheet **preset** (`list_presets` with `search`) and `generate_image` with that `preset_id` — custom instructions live on the preset. Then `create_visual_dna` with the sheet as `character_sheet_url` (max 4 extra images — if the user gives more, pick the 4 most representative **that share the same identity and vibe**; never pass 5+). Optionally video and audio. See **Purity**
|
|
11
|
+
1. **Sheet first, then DNA.** For any production asset (character / location / prop), resolve the sheet **preset** (`list_presets` with `search`) and `generate_image` with that `preset_id` — custom instructions live on the preset. Then `create_visual_dna` with the sheet as `character_sheet_url` (max 4 extra images — if the user gives more, pick the 4 most representative **that share the same identity and vibe**; never pass 5+). Optionally video and audio. See **Purity** below before you generate those stills.
|
|
12
12
|
2. **Types**: `character` (default), `style`, `product`, `scene`, `environment`.
|
|
13
13
|
3. **Use** the profile by passing its `id` in `visual_dna_ids` in: `generate_image`, `generate_creative_director`, `generate_elements`, `generate_video_from_image`, `generate_video_from_video`, `generate_first_last_frame`.
|
|
14
14
|
4. **List/inspect** profiles with `list_visual_dnas` / `get_visual_dna`.
|
|
@@ -22,7 +22,7 @@ Visual DNA profiles capture the visual "identity" of a character, style, product
|
|
|
22
22
|
Kolbo no longer sends only the first still or the character sheet. For every attached DNA:
|
|
23
23
|
|
|
24
24
|
1. **User-uploaded refs take image slots first.**
|
|
25
|
-
2. **Remaining slots:** one main still per DNA, then leftover stills from each DNA **round-robin** until the model's image-slot cap (`
|
|
25
|
+
2. **Remaining slots:** one main still per DNA, then leftover stills from each DNA **round-robin** until the model's image-slot cap (`elements_max_images` / equivalent) is full.
|
|
26
26
|
3. **If every still fits the cap, every still is sent** as its own reference. A 4-image character DNA on a 9-slot model is four slots, not one.
|
|
27
27
|
4. **If a DNA only gets one leftover slot**, has **no distinct character sheet**, and still has unused stills, those leftovers are composited into a **white grid / collage** (up to 9 cells) so the model still sees them. A real character sheet is never overwritten by a collage.
|
|
28
28
|
5. **Native Kling Elements** stays one element per DNA (sheet / frontal). Other providers use the slot pack above.
|
|
@@ -104,16 +104,7 @@ Fields to read for the image source (use the first one present on the item): `th
|
|
|
104
104
|
|
|
105
105
|
## ⚠️ @name Syntax — ALWAYS use it when passing visual_dna_ids (MANDATORY)
|
|
106
106
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
**Use the actual stored name, programmatically.** When you call `list_visual_dnas` (or `create_visual_dna`), read the `name` field off the response and use that exact string after the `@`. Do NOT:
|
|
110
|
-
|
|
111
|
-
- Translate the name into another language ("אסתר" / "esther" / "אסתי" — pick whichever string is in `name` and use ONLY that one).
|
|
112
|
-
- Invent a friendlier alias ("the model", "המודל", "her", "Zohar's", "the left man", "the man on the LEFT").
|
|
113
|
-
- Write a "Visual DNA anchors:" prose block that describes position/wardrobe but never writes `@ExactName`.
|
|
114
|
-
- Write the character's name in plain text without the `@` prefix.
|
|
115
|
-
- Drop the `@name` when only one DNA is passed — the engine still needs the binding so it knows the DNA is the *subject* and not a passive style.
|
|
116
|
-
- **Drop or "clean" tags while rewriting a prompt** (help-widget parity). Compiling SCENE CONTEXT / Locked Intro / a "better" English prompt is not permission to delete `@gal_suit` or rewrite `@yonatan` as `Yonatan`. Copy every existing `@` / `#` token into the new prompt, then add craft around them.
|
|
107
|
+
SKILL.md's `@Name` hard rule applies; here is why it binds that way:
|
|
117
108
|
|
|
118
109
|
**Wrong** (DNA `name` is `esther_model`, user wrote prompt in Hebrew):
|
|
119
110
|
```
|
|
@@ -228,31 +219,11 @@ You can combine all three reference types in a single call — they're additive,
|
|
|
228
219
|
|
|
229
220
|
## Visual DNA Limits
|
|
230
221
|
|
|
231
|
-
Read `max_visual_dna` from `list_models` for the
|
|
222
|
+
Read `max_visual_dna` (and `elements_max_images` for image-slot packing) from `list_models` for the chosen model, AND `supports_visual_dna` for the on/off boolean. A model can support DNA without an explicit cap, or have a non-null cap but silently ignore DNA on certain paths (e.g. `generate_video`). Typical ranges: image models (non-Kling) up to **8**, Kling image models **3**, Elements video models **3–5**, everything else up to **3**.
|
|
232
223
|
|
|
233
224
|
## ⚠️ Visual DNA Creation — Always Generate Reference Images First (MANDATORY)
|
|
234
225
|
|
|
235
|
-
**Before calling `create_visual_dna` for a character**,
|
|
236
|
-
|
|
237
|
-
**Step 1 — Generate both images in parallel (one `generate_image` call each, fire simultaneously):**
|
|
238
|
-
|
|
239
|
-
1. **4-angle character sheet** — prompt: `"[character description], character reference sheet showing front view, back view, left side view, right side view, four panels arranged in a 2x2 grid, neutral solid background, full body, photorealistic"`, aspect ratio `16:9` (or `3:2` — always landscape, see the aspect-ratio rule below)
|
|
240
|
-
2. **Close-up portrait** — prompt: `"[character description], close-up portrait, face and shoulders, neutral solid background, soft studio lighting, photorealistic"`, aspect ratio `1:1`
|
|
241
|
-
|
|
242
|
-
**Step 2 — Call `create_visual_dna`** with:
|
|
243
|
-
- `images`: the 4-angle sheet URL first, then the close-up URL — **plus** the user's reference photo(s) only if they provided one (i.e. a real person or existing character they want to match). If they gave no reference image, the 2 generated images alone are sufficient.
|
|
244
|
-
- `type`: `"character"`
|
|
245
|
-
- `name`: single-token lowercase descriptive name (see naming rule above)
|
|
246
|
-
|
|
247
|
-
**Why:** A single reference photo only shows one angle. The close-up gives the engine facial detail; the 4-angle sheet gives it body geometry and pose range. Together they produce far more consistent generations. Both stills (and any user photos you add) must be the **same person, same vibe** — they will all be packed into the next generation.
|
|
248
|
-
|
|
249
|
-
**Skip this only if** the user explicitly says "just use my image as-is" or provides 3+ reference images already covering multiple angles.
|
|
250
|
-
|
|
251
|
-
### Environments, products, style — same precision
|
|
252
|
-
|
|
253
|
-
- **Environment / location:** generate empty (or crowd-only) plates. Prompt out heroes and readable faces. A location DNA that contains `@maya` in the frame will put Maya in every later shot of that place.
|
|
254
|
-
- **Product:** isolated angles, consistent lighting, readable label. No extra hero unless the product is worn and the body is generic.
|
|
255
|
-
- **Style:** one look, applied cleanly. Do not mix neon-cyber and dusty-western stills on the same style DNA.
|
|
226
|
+
**Before calling `create_visual_dna` for a character**, generate the reference stills first — a multi-angle sheet plus a close-up gives the engine far better coverage than a single photo. Route the stills through the **preset contract** (`list_presets` search → `preset_id` on `generate_image`), never a raw hand-written sheet prompt — see "Character sheet — default for production assets" below for the full flow, preset search terms, and aspect-ratio rules. Include the user's reference photo(s) alongside only if they provided one. **Skip this only if** the user explicitly says "just use my image as-is" or provides 3+ reference images already covering multiple angles.
|
|
256
227
|
|
|
257
228
|
## When to Use
|
|
258
229
|
|