@renoise/plugin 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/.claude-plugin/marketplace.json +15 -0
  2. package/.claude-plugin/plugin.json +23 -0
  3. package/README.md +53 -0
  4. package/hooks/check-api-key.sh +28 -0
  5. package/hooks/hooks.json +28 -0
  6. package/hooks/session-start.sh +40 -0
  7. package/index.mjs +1 -0
  8. package/openclaw.plugin.json +22 -0
  9. package/package.json +22 -0
  10. package/skills/director/SKILL.md +269 -0
  11. package/skills/director/references/narrative-pacing.md +257 -0
  12. package/skills/director/references/style-library.md +179 -0
  13. package/skills/file-upload/SKILL.md +79 -0
  14. package/skills/file-upload/scripts/upload.mjs +103 -0
  15. package/skills/gemini-gen/SKILL.md +236 -0
  16. package/skills/gemini-gen/scripts/gemini.mjs +220 -0
  17. package/skills/product-sheet-generate/SKILL.md +75 -0
  18. package/skills/renoise-gen/SKILL.md +364 -0
  19. package/skills/renoise-gen/references/api-endpoints.md +142 -0
  20. package/skills/renoise-gen/references/video-capabilities.md +524 -0
  21. package/skills/renoise-gen/renoise-cli.mjs +723 -0
  22. package/skills/scene-generate/SKILL.md +52 -0
  23. package/skills/short-film-editor/SKILL.md +478 -0
  24. package/skills/short-film-editor/examples/mystery-package-4shot.md +260 -0
  25. package/skills/short-film-editor/references/continuity-guide.md +170 -0
  26. package/skills/short-film-editor/scripts/analyze-beats.py +271 -0
  27. package/skills/short-film-editor/scripts/batch-generate.sh +150 -0
  28. package/skills/short-film-editor/scripts/split-grid.sh +70 -0
  29. package/skills/tiktok-content-maker/SKILL.md +140 -0
  30. package/skills/tiktok-content-maker/examples/dress-demo.md +86 -0
  31. package/skills/tiktok-content-maker/references/ecom-prompt-guide.md +266 -0
  32. package/skills/video-download/SKILL.md +161 -0
  33. package/skills/video-download/scripts/download-video.sh +91 -0
@@ -0,0 +1,364 @@
1
+ ---
2
+ name: renoise-gen
3
+ description: Generate AI videos and images via Renoise platform. Create tasks, upload materials, browse characters, poll results, download outputs. Supports text-to-video, image-to-video, video-to-video, and text-to-image. Use this skill whenever the user asks to "generate video", "create video", "text to video", "image to video", "generate image", "AI video", "AI image", or describes any video/image content they want generated with AI.
4
+ allowed-tools: Bash, Read, Write, Glob
5
+ metadata:
6
+ author: renoise
7
+ version: 0.1.0
8
+ category: video-production
9
+ tags: [general, video-generation]
10
+ ---
11
+
12
+ # AI Video & Image Generation (via Renoise)
13
+
14
+ Generate AI videos and images through the Renoise platform.
15
+
16
+ > **IMPORTANT**: The Renoise website is **https://www.renoise.ai** — NOT renoise.com. Always use `renoise.ai` when referencing the platform URL.
17
+
18
+ ## Supported Models
19
+
20
+ | Model | Type | Description |
21
+ |-------|------|-------------|
22
+ | `renoise-2.0` | Video | Default video model with storyboard control |
23
+ | `nano-banana-2` | Image | AI image generation model |
24
+
25
+ ## Core Concept: Two Video Modes — Finished Cut vs Clip Stock
26
+
27
+ Choose between two generation modes based on user needs:
28
+
29
+ ### Finished Cut Mode — Default
30
+
31
+ For producing a complete, ready-to-use video. Leverages powerful storyboard control to **direct content, camera movement, and pacing across different time segments within a single 15s clip**:
32
+
33
+ - Music/SFX flow naturally with coherent progression
34
+ - Character consistency maintained within the same segment
35
+ - Complex continuous camera movements (e.g., close-up → orbit → wide pull back)
36
+ - Only 1 API call needed
37
+
38
+ **Default 15s, use time-annotated prompt to control content.**
39
+
40
+ ```
41
+ [0-3s] Close-up of hands unboxing a sleek black device on a white desk. Camera snaps dolly in to reveal the logo.
42
+
43
+ [3-10s] The woman picks it up, examines it from different angles. Medium shot, smooth orbit around the product. Spoken dialogue: "I've been waiting for this." Mouth clearly visible, lip-sync aligned.
44
+
45
+ [10-15s] She places it on a wireless charger, LED glows blue. Pull back to wide shot of the full workspace. The frame holds steady.
46
+ ```
47
+
48
+ ### Clip Stock Mode
49
+
50
+ For producing atomic clips for post-production editing. Each clip focuses on **a single action + single camera move** for maximum flexibility:
51
+
52
+ - Each clip **3-5s**, one clip does one thing
53
+ - No time annotations needed, just describe a single scene
54
+ - Batch generate multiple clips, organize with tags
55
+ - Combine freely in post-production
56
+
57
+ ```bash
58
+ # Clip stock example: prepare clips for a product video
59
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task create --prompt "Extreme close-up of a matte black smartwatch on white marble, slow dolly in, studio lighting." --duration 5 --tags product-x,detail
60
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task create --prompt "A hand picks up the smartwatch from the table, medium shot, tracking follows the hand upward." --duration 5 --tags product-x,pickup
61
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task create --prompt "Wrist-level shot of the watch on a person's arm, smooth orbit, outdoor golden hour." --duration 5 --tags product-x,lifestyle
62
+ ```
63
+
64
+ ### How to Decide?
65
+
66
+ | Signal | Mode |
67
+ |--------|------|
68
+ | "generate a video", "make a short film" | Finished Cut — 15s storyboard |
69
+ | "prepare clips", "clip", "for editing", "B-roll" | Clip Stock — 3-5s atomic clips |
70
+ | "shot list", "storyboard" | Clip Stock — generate per shot |
71
+ | Unclear | **Default to Finished Cut**, confirm with user |
72
+
73
+ ## Model Specs
74
+
75
+ ### renoise-2.0 (Video)
76
+
77
+ | Parameter | Value |
78
+ |-----------|-------|
79
+ | Duration range | 5-15s, any integer |
80
+ | **Default duration** | **15s** (maximize storyboard capability) |
81
+ | Aspect ratio | `1:1`, `16:9`, `9:16` |
82
+ | Recommended mode | **Image-to-Video with storyboard grid** (best visual consistency) |
83
+ | Prompt language | **English**, natural narrative paragraphs |
84
+
85
+ > **Default to Image-to-Video with storyboard grid**: Generate reference images as a 9-grid or 16-grid composite, upload as `ref_image`. Grid images bypass privacy detection more reliably than individual face photos because faces are small within the grid cells. **Fallback to Text-to-Video** only when the grid is still blocked by privacy detection (`PrivacyInformation` error) — text-only prompts are never subject to this limitation.
86
+
87
+ ### nano-banana-2 (Image)
88
+
89
+ | Parameter | Value |
90
+ |-----------|-------|
91
+ | Resolution | `1k`, `2k` |
92
+ | Aspect ratio | `1:1`, `16:9`, `9:16` |
93
+ | Prompt language | **English** |
94
+
95
+ See `${CLAUDE_SKILL_DIR}/references/video-capabilities.md` for details.
96
+
97
+ ## Configuration
98
+
99
+ CLI path: `${CLAUDE_SKILL_DIR}/renoise-cli.mjs` (Node.js 18+)
100
+
101
+ API Key and base URL are configured via environment variables (`RENOISE_API_KEY`, `RENOISE_BASE_URL`). Get your API key at https://www.renoise.ai (NOT renoise.com).
102
+
103
+ ## CLI Commands
104
+
105
+ All commands: `node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs <domain> <action> [options]`
106
+
107
+ Four domains: `task`, `material`, `character`, `credit`
108
+
109
+ ### Check Balance (always check before creating tasks)
110
+ ```bash
111
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs credit me # User info + balance
112
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs credit estimate --duration 10 # Estimate cost
113
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs credit history # Transaction history
114
+ ```
115
+
116
+ ### Video Input Modes (Mutually Exclusive)
117
+
118
+ Three ways to provide visual input. **These are mutually exclusive — do NOT mix them in the same task.**
119
+
120
+ | Mode | `--materials` | Description |
121
+ |------|---------------|-------------|
122
+ | **First frame only** | `ID:first_frame` (1 image) | Pin the first frame; prompt is optional |
123
+ | **First + last frame** | `ID1:first_frame,ID2:last_frame` (2 images, both roles required) | Pin start and end frames; model generates the transition |
124
+ | **Multimodal reference** | `ID:ref_image`, `ID:ref_video`, etc. | Reference images (1-9), videos (0-3), audio (0-3) for style/content guidance |
125
+
126
+ > **Cannot combine**: e.g. you cannot use `first_frame` together with `ref_image` in the same task. If you need "first/last frame + reference style", use multimodal reference mode and describe in the prompt which image should be the first/last frame — but for strict frame accuracy, prefer the dedicated first+last frame mode.
127
+
128
+ **Image requirements** (for first/last frame and ref_image):
129
+ - Format: jpeg, png, webp, bmp, tiff, gif
130
+ - Aspect ratio (W/H): 0.4 ~ 2.5
131
+ - Dimensions: 300 ~ 6000 px per side
132
+ - Size: < 30 MB per image
133
+
134
+ ### Generate Video (one step: create + wait for completion)
135
+ ```bash
136
+ # Text-to-video finished cut (default renoise-2.0, 15s storyboard)
137
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task generate \
138
+ --prompt "[0-5s] Close-up of a cat on the moon, slow push in. [5-12s] The cat starts dancing, smooth orbit camera, stars twinkling. [12-15s] Wide pull back revealing the full lunar landscape, frame holds steady. Cinematic lighting, shallow depth of field." \
139
+ --duration 15 --ratio 1:1
140
+
141
+ # First frame only — pin the opening shot
142
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs material upload /path/to/start.jpg
143
+ # (note the material ID from output, e.g. #42)
144
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task generate \
145
+ --prompt "The woman walks toward the camera, gentle breeze, cinematic lighting." \
146
+ --materials "42:first_frame" --duration 10 --ratio 16:9
147
+
148
+ # First + last frame — pin both start and end
149
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs material upload /path/to/start.jpg # e.g. #42
150
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs material upload /path/to/end.jpg # e.g. #43
151
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task generate \
152
+ --prompt "Smooth transition from dawn to sunset over the city skyline." \
153
+ --materials "42:first_frame,43:last_frame" --duration 10 --ratio 16:9
154
+
155
+ # Multimodal reference — image-to-video
156
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs material upload /path/to/photo.jpg
157
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task generate \
158
+ --prompt "[0-5s] Close-up of the product on a white surface, gentle dolly in. [5-12s] Camera orbits around the product revealing all angles, soft studio lighting. [12-15s] Pull back to wide shot, product centered, frame holds steady." \
159
+ --materials "ID:ref_image" --duration 15 --ratio 16:9
160
+
161
+ # Multimodal reference — video-to-video
162
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task generate \
163
+ --prompt "recreate this motion with a robot character" \
164
+ --materials "ID:ref_video" --duration 5
165
+ ```
166
+
167
+ ### Generate Image
168
+ ```bash
169
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task generate \
170
+ --prompt "A cute cat sitting on a crescent moon, watercolor style, dreamy atmosphere" \
171
+ --model nano-banana-2 --resolution 2k --ratio 1:1
172
+ ```
173
+
174
+ ### Create Task Only (no waiting)
175
+ ```bash
176
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task create \
177
+ --prompt "[0-5s] ... [5-12s] ... [12-15s] ..." \
178
+ --duration 15 --ratio 16:9 --tags cinematic
179
+ ```
180
+
181
+ **generate/create parameters**:
182
+ - `--prompt` (required) — English natural narrative prompt; use `[time segment]` annotations for video storyboards
183
+ - `--model` — Model name (default: renoise-2.0; use nano-banana-2 for images)
184
+ - `--duration` — Video duration 5-15s (CLI default: 5). **Always set `--duration 15` for Finished Cut mode**
185
+ - `--ratio` — `1:1` / `16:9` / `9:16` (default: 1:1)
186
+ - `--resolution` — Image resolution `1k` / `2k` (image models only)
187
+ - `--tags` — Comma-separated tags for organization
188
+ - `--materials` — Material references `id:role`, comma-separated for multiple
189
+ - `--characters` — Character references `id1,id2` or `id1:role,id2:role`
190
+
191
+ ### Task Management
192
+ ```bash
193
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task list # List tasks
194
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task list --status completed # Filter by status
195
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task list --tag project-x # Filter by tag
196
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task get <id> # Task detail
197
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task result <id> # Get result URL
198
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task wait <id> # Poll until complete
199
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task wait <id> --interval 15 --timeout 300
200
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task cancel <id> # Cancel (pending only)
201
+ ```
202
+
203
+ ### Material Upload & Management
204
+ ```bash
205
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs material upload /path/to/file.jpg # Upload (auto-detect type)
206
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs material upload /path/to/clip.mp4 --type video
207
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs material list # List materials
208
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs material list --type image --search cat
209
+ ```
210
+
211
+ ### Character Browsing
212
+ ```bash
213
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs character list # List available characters
214
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs character list --category female --search Jasmine
215
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs character get <id> # Character detail
216
+ ```
217
+
218
+ ### Tag Management
219
+ ```bash
220
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task tags # List all tags
221
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task tag <id> --tags a,b,c # Update task tags
222
+ ```
223
+
224
+ ## Task Statuses
225
+
226
+ `pending` → `assigning` → `assigned` → `queued` → `running` → `completed` / `failed`
227
+
228
+ Only `pending` tasks can be cancelled (auto-refund).
229
+
230
+ ## Workflows
231
+
232
+ ### Finished Cut Mode (Default)
233
+ ```
234
+ credit me → credit estimate → task generate (15s + storyboard prompt)
235
+ ```
236
+
237
+ `task generate` = create + wait + output result, all in one step.
238
+
239
+ ### Clip Stock Mode
240
+ ```
241
+ credit me → credit estimate → task create (3-5s × N, grouped by tag) → task wait each → collect task result
242
+ ```
243
+
244
+ Batch generate atomic clips, combine in post-production.
245
+
246
+ ### Image Generation
247
+ ```
248
+ credit me → task generate --model nano-banana-2 --prompt "..." --resolution 2k
249
+ ```
250
+
251
+ ### With First/Last Frame
252
+ ```
253
+ material upload (start.jpg) → material upload (end.jpg) → task generate (--materials "ID1:first_frame,ID2:last_frame")
254
+ ```
255
+
256
+ First frame only: omit the second upload, use `--materials "ID:first_frame"`.
257
+
258
+ ### With Multimodal Reference
259
+ ```
260
+ material upload → task generate (--materials "ID:ref_image" or "ID:ref_video")
261
+ ```
262
+ **Preferred**: Use storyboard grid images as ref_image — see "Storyboard Grid Workflow" section below.
263
+
264
+ ### With Character Reference
265
+ ```
266
+ character list → task generate (--characters "ID")
267
+ ```
268
+
269
+ ### Finished Cut > 15s
270
+
271
+ When target duration exceeds 15s, split into 15s segments, each with its own storyboard prompt:
272
+
273
+ ```bash
274
+ # 30s = 2 × 15s
275
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task create --prompt "[0-5s] ... [5-12s] ... [12-15s] ..." --duration 15 --tags vid-001,s1
276
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task create --prompt "[0-5s] ... [5-12s] ... [12-15s] ..." --duration 15 --tags vid-001,s2
277
+ ```
278
+
279
+ **Maintain consistency**: Repeat full character appearance description at the start of each segment's prompt, use consistent lighting/style keywords, bridge with `Continuing from the previous shot:`.
280
+
281
+ ## Storyboard Grid Workflow (Preferred Approach)
282
+
283
+ The storyboard grid method produces the best visual consistency across clips by anchoring each generation to a reference image from a unified grid.
284
+
285
+ ### Why Storyboard Grid?
286
+
287
+ | Approach | Visual Consistency | Privacy Detection Risk | Setup Effort |
288
+ |----------|-------------------|----------------------|--------------|
289
+ | **Storyboard Grid (preferred)** | Highest — all panels share style context | Low — faces are small in grid cells | Medium |
290
+ | Text-to-Video (fallback) | Lower — model interprets style differently each call | None | Low |
291
+ | Individual ref_image | Medium | High — close-up faces trigger blocking | Medium |
292
+
293
+ ### Step-by-Step
294
+
295
+ 1. **Generate reference images as a grid**: Use Midjourney (v7) or Gemini to create a single composite image containing all shots as panels in a 3x3 (9-grid) or 4x4 (16-grid) layout. Each panel shows one key moment from a shot with consistent character appearance and style.
296
+
297
+ 2. **Upload the grid as material**:
298
+ ```bash
299
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs material upload storyboard_grid.png
300
+ # Returns material ID
301
+ ```
302
+
303
+ 3. **Generate video with ref_image + time-annotated prompt**:
304
+ ```bash
305
+ node ${CLAUDE_SKILL_DIR}/renoise-cli.mjs task generate \
306
+ --prompt "Follow the attached storyboard panels. [0-5s] ... [5-10s] ... [10-15s] ..." \
307
+ --materials "MATERIAL_ID:ref_image" \
308
+ --duration 15 --ratio 16:9
309
+ ```
310
+
311
+ 4. **For videos > 15s**: Split into multiple grids (e.g., 3x3 for shots 1-9, another for shots 10-18), generate each 15s segment with its corresponding grid.
312
+
313
+ 5. **Fallback**: If a grid triggers `PrivacyInformation`, retry without `--materials` (pure text-to-video), copying full character descriptions into the prompt.
314
+
315
+ ### When to Use Each Approach
316
+
317
+ | Signal | Approach |
318
+ |--------|----------|
319
+ | Any project with recurring characters | **Storyboard grid** (preferred) |
320
+ | Product shots, landscapes, no people | Image-to-Video with individual ref_image |
321
+ | Grid ref_image blocked by privacy detection | **Text-to-Video** (fallback) |
322
+ | Quick one-off generation, no consistency needs | Text-to-Video |
323
+
324
+ ---
325
+
326
+ ## Prompt Writing
327
+
328
+ **General rules**:
329
+ - **Must be English** — The model understands English narrative paragraphs best. Chinese or tag lists degrade quality and coherence.
330
+ - **Natural narrative paragraphs** — Use complete descriptive sentences, not comma-separated keyword lists (e.g., `woman, café, coffee, 4k`). The model needs to understand causal and temporal relationships.
331
+ - **Specific > Abstract** — `a golden retriever running through shallow ocean waves at sunset` is far better than `a dog on a beach`. More detail = more accurate output.
332
+ - **Structure**: Subject (detailed appearance) + Action (action sequence) + Camera (camera movement) + Scene (environment/lighting) + Style (visual style)
333
+
334
+ **Finished cut prompt**:
335
+ - Use `[time segment]` annotations for storyboard beats — core advantage, the model switches content and camera per segment
336
+ - Each segment = Subject + Action + Camera
337
+ - At least 2-3 camera changes (e.g., close-up → orbit → wide pull back) for editing rhythm
338
+ - End last segment with `frame holds steady` for easy continuation or natural ending
339
+
340
+ **Clip stock prompt**:
341
+ - No time annotations needed, describe a single scene directly
342
+ - One clip does one thing: one action + one camera move, for flexible post-editing
343
+ - Keep concise, 3-5 sentences
344
+
345
+ **Image prompt**:
346
+ - Describe content, style, and atmosphere
347
+ - No time annotations or camera movements needed
348
+
349
+ See `${CLAUDE_SKILL_DIR}/references/video-capabilities.md` for detailed prompt writing guide and camera movement cheat sheet.
350
+
351
+ ## Error Handling
352
+
353
+ | Error | Cause | Solution |
354
+ |-------|-------|----------|
355
+ | `PrivacyInformation` | Reference image/video with human faces blocked by privacy detection | Switch to Text-to-Video, describe person's appearance in text |
356
+ | `Insufficient credits` (402) | Balance too low | Inform user of current balance and required cost, suggest top-up |
357
+ | Task `failed` | Generation failed | Use `task get <id>` to check error field. Common causes: prompt violation, server timeout. Adjust prompt and retry |
358
+ | `Auth Error` (401) | Invalid API Key | Check that the `RENOISE_API_KEY` environment variable is set correctly |
359
+ | `wait` timeout | Generation time exceeds timeout | 15s videos typically need 5-10 minutes, increase `--timeout` (e.g., 900) |
360
+
361
+ ## References
362
+
363
+ - [Video Model Capabilities](references/video-capabilities.md) — Model specs, detailed prompt writing guide, camera movement cheat sheet. Consult when writing prompts.
364
+ - [API Endpoint Reference](reference.md) — Renoise API endpoints and request/response formats. Consult when calling API directly or debugging HTTP errors.
@@ -0,0 +1,142 @@
1
+ # Renoise API Reference
2
+
3
+ ## API Endpoints
4
+
5
+ Base URL: `https://renoise.ai`
6
+ API Prefix: `/api/public/v1`
7
+
8
+ All endpoints require `X-API-Key: <api_key>` header.
9
+
10
+ ### Credits
11
+
12
+ | Method | Path | Description |
13
+ | ------ | ----------------------------------------------------------------- | -------------------------- |
14
+ | GET | `/api/public/v1/me` | User info + credit balance |
15
+ | GET | `/api/public/v1/credit/estimate?model=X&duration=Y&hasVideoRef=0` | Cost estimate |
16
+ | GET | `/api/public/v1/credit/history?limit=50&offset=0` | Credit transactions |
17
+
18
+ ### Tasks
19
+
20
+ | Method | Path | Description |
21
+ | ------ | ------------------------------------------------------- | ------------------------------------ |
22
+ | POST | `/api/public/v1/tasks` | Create task |
23
+ | GET | `/api/public/v1/tasks?status=X&tag=Y&limit=50&offset=0` | List tasks |
24
+ | GET | `/api/public/v1/tasks/:id` | Task detail |
25
+ | GET | `/api/public/v1/tasks/:id/result` | Task result (video/image/cover URLs) |
26
+ | POST | `/api/public/v1/tasks/:id/cancel` | Cancel pending task |
27
+ | PATCH | `/api/public/v1/tasks/:id/tags` | Update tags |
28
+ | GET | `/api/public/v1/tags` | List all tags |
29
+
30
+ ### Materials
31
+
32
+ | Method | Path | Description |
33
+ | ------ | ------------------------------------------ | --------------------------------- |
34
+ | POST | `/api/public/v1/materials/upload` | Upload material (multipart) |
35
+ | GET | `/api/public/v1/materials?type=X&search=Y` | List materials with download URLs |
36
+
37
+ ### Characters
38
+
39
+ | Method | Path | Description |
40
+ | ------ | --------------------------------------------------------------------------------- | ---------------- |
41
+ | GET | `/api/public/v1/characters?category=X&usage_group=Y&search=Z&page=1&page_size=20` | List characters |
42
+ | GET | `/api/public/v1/characters/:id` | Character detail |
43
+
44
+ ## Request/Response Formats
45
+
46
+ ### POST /api/public/v1/tasks
47
+
48
+ Request:
49
+
50
+ ```json
51
+ {
52
+ "prompt": "string (required)",
53
+ "model": "renoise-2.0",
54
+ "duration": 5,
55
+ "ratio": "1:1",
56
+ "resolution": "2k",
57
+ "materials": [
58
+ { "id": 42, "role": "ref_video" },
59
+ { "character_id": 3, "role": "reference_image" }
60
+ ],
61
+ "tags": ["demo"]
62
+ }
63
+ ```
64
+
65
+ Response (201):
66
+
67
+ ```json
68
+ {
69
+ "task": {
70
+ "id": 1,
71
+ "prompt": "...",
72
+ "model": "renoise-2.0",
73
+ "status": "pending",
74
+ "estimatedCredit": 5.0,
75
+ "createdAt": "2026-03-10T..."
76
+ }
77
+ }
78
+ ```
79
+
80
+ Error (402 — insufficient credits):
81
+
82
+ ```json
83
+ {
84
+ "error": "Insufficient credits",
85
+ "available": 2.5,
86
+ "required": 5.0
87
+ }
88
+ ```
89
+
90
+ ### GET /api/public/v1/tasks/:id/result
91
+
92
+ Response:
93
+
94
+ ```json
95
+ {
96
+ "taskId": 1,
97
+ "status": "completed",
98
+ "videoUrl": "https://...",
99
+ "imageUrl": "https://...",
100
+ "coverUrl": "https://...",
101
+ "resolutions": { "720p": "https://..." },
102
+ "itemCount": 1,
103
+ "fetchedAt": "2026-03-10T...",
104
+ "cached": true
105
+ }
106
+ ```
107
+
108
+ ## Task Statuses
109
+
110
+ | Status | Description |
111
+ | ----------- | -------------------------- |
112
+ | `pending` | Waiting for assignment |
113
+ | `assigning` | Being assigned to account |
114
+ | `assigned` | Assigned, waiting to start |
115
+ | `queued` | Queued on provider |
116
+ | `running` | Generating |
117
+ | `completed` | Done — result available |
118
+ | `failed` | Failed — check error field |
119
+ | `cancelled` | User cancelled |
120
+
121
+ ## Models
122
+
123
+ - `renoise-2.0` — Default video model (Renoise 2.0)
124
+ - `nano-banana-2` — Image generation model
125
+
126
+ ## Material Roles
127
+
128
+ - `ref_video` — Reference video (affects pricing)
129
+ - `ref_image` — Reference image
130
+ - `image1`, `image2` — Additional reference images
131
+ - `reference_image` — Character reference image
132
+
133
+ ## Aspect Ratios
134
+
135
+ - `1:1` (default)
136
+ - `16:9`
137
+ - `9:16`
138
+
139
+ ## Image Resolutions
140
+
141
+ - `1k`
142
+ - `2k`