@renoise/video-maker 0.1.0

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