@renoise/video-maker 0.2.0 → 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.
- package/.claude-plugin/plugin.json +4 -0
- package/README.md +8 -0
- package/hooks/hooks.json +12 -0
- package/hooks/session-start.sh +40 -0
- package/package.json +1 -1
- package/skills/file-upload/SKILL.md +1 -1
- package/skills/file-upload/scripts/upload.mjs +1 -1
- package/skills/gemini-gen/SKILL.md +33 -29
- package/skills/gemini-gen/scripts/gemini.mjs +1 -1
- package/skills/renoise-gen/references/api-endpoints.md +37 -33
package/README.md
CHANGED
|
@@ -38,6 +38,14 @@ claude plugin install video-maker@renoise-plugins-official
|
|
|
38
38
|
openclaw plugins install @renoise/video-maker
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
+
3. Launch Claude Code and run the setup command to connect your Renoise account:
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
/video-maker:setup
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
This will guide you through connecting your API key and enabling the real-time credit balance display in the status bar.
|
|
48
|
+
|
|
41
49
|
## Environment Variables
|
|
42
50
|
|
|
43
51
|
| Variable | Required By | Description |
|
package/hooks/hooks.json
CHANGED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# SessionStart hook: guide users based on their setup state.
|
|
4
|
+
# - No API key → prompt to login
|
|
5
|
+
# - Has API key but no statusLine → prompt to enable credits display
|
|
6
|
+
|
|
7
|
+
set -euo pipefail
|
|
8
|
+
|
|
9
|
+
# Consume stdin (SessionStart sends context JSON, we don't need it)
|
|
10
|
+
cat > /dev/null
|
|
11
|
+
|
|
12
|
+
HAS_KEY=false
|
|
13
|
+
HAS_STATUSLINE=false
|
|
14
|
+
|
|
15
|
+
# Check if API key is configured
|
|
16
|
+
if [ -n "${RENOISE_API_KEY:-}" ] || [ -n "${RENOISE_AUTH_TOKEN:-}" ]; then
|
|
17
|
+
HAS_KEY=true
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
# Check if statusLine is pointing to our script
|
|
21
|
+
SETTINGS_FILE="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/settings.json"
|
|
22
|
+
if [ -f "$SETTINGS_FILE" ] && grep -q "video-maker" "$SETTINGS_FILE" 2>/dev/null && grep -q "statusLine" "$SETTINGS_FILE" 2>/dev/null; then
|
|
23
|
+
HAS_STATUSLINE=true
|
|
24
|
+
fi
|
|
25
|
+
|
|
26
|
+
# Case 1: New user — no API key
|
|
27
|
+
if [ "$HAS_KEY" = false ]; then
|
|
28
|
+
# stdout goes to Claude as context — Claude will relay the message to the user
|
|
29
|
+
echo '[Renoise Video Maker] Plugin installed successfully, but Renoise account is not connected yet. Tell the user: type /video-maker:setup to connect your account. One sentence only.'
|
|
30
|
+
exit 0
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
# Case 2: Existing user updated plugin — has key but no statusLine
|
|
34
|
+
if [ "$HAS_STATUSLINE" = false ]; then
|
|
35
|
+
echo '[Renoise Video Maker] Plugin updated — new feature: real-time credit balance in status bar. Tell the user: type /video-maker:setup to activate. One sentence only.'
|
|
36
|
+
exit 0
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
# Case 3: Everything configured — silent
|
|
40
|
+
exit 0
|
package/package.json
CHANGED
|
@@ -28,7 +28,7 @@ Upload files via the Renoise gateway and get back a file URI for use with `gemin
|
|
|
28
28
|
## API
|
|
29
29
|
|
|
30
30
|
```
|
|
31
|
-
POST https://
|
|
31
|
+
POST https://renoise.ai/api/public/v1/llm/files/upload
|
|
32
32
|
Header: X-API-Key: <RENOISE_API_KEY>
|
|
33
33
|
Body: multipart/form-data with field "file"
|
|
34
34
|
```
|
|
@@ -21,16 +21,16 @@ Gemini 3.1 Pro via Renoise gateway. Zero npm dependencies, native `fetch` only.
|
|
|
21
21
|
|
|
22
22
|
## When to Use
|
|
23
23
|
|
|
24
|
-
| Scenario
|
|
25
|
-
|
|
26
|
-
| **Analyze product photos**
|
|
27
|
-
| **Understand video content**
|
|
28
|
-
| **Extract scripts from video**
|
|
29
|
-
| **Replicate a video style**
|
|
30
|
-
| **Compare visual assets**
|
|
31
|
-
| **OCR / text extraction**
|
|
32
|
-
| **Describe scenes for prompts** | Look at a reference image → write a detailed prompt for `renoise-gen` to recreate the style
|
|
33
|
-
| **Content review**
|
|
24
|
+
| Scenario | Example |
|
|
25
|
+
| ------------------------------- | -------------------------------------------------------------------------------------------------- |
|
|
26
|
+
| **Analyze product photos** | Extract type, color, material, selling points, brand tone from product images |
|
|
27
|
+
| **Understand video content** | "What happens in this video?", summarize scenes, identify actions and objects |
|
|
28
|
+
| **Extract scripts from video** | Watch a reference video → output timestamped dialogue, scene descriptions, camera movements |
|
|
29
|
+
| **Replicate a video style** | Analyze a reference clip → extract visual style, pacing, transitions, color grading for recreation |
|
|
30
|
+
| **Compare visual assets** | Side-by-side analysis of two product photos, before/after comparison |
|
|
31
|
+
| **OCR / text extraction** | Read text from screenshots, packaging, signage in images |
|
|
32
|
+
| **Describe scenes for prompts** | Look at a reference image → write a detailed prompt for `renoise-gen` to recreate the style |
|
|
33
|
+
| **Content review** | Check if generated output matches the creative brief |
|
|
34
34
|
|
|
35
35
|
## When NOT to Use
|
|
36
36
|
|
|
@@ -45,7 +45,7 @@ Use environment variable `RENOISE_API_KEY`. Get one at: https://www.renoise.ai
|
|
|
45
45
|
## API Endpoint
|
|
46
46
|
|
|
47
47
|
```
|
|
48
|
-
POST https://
|
|
48
|
+
POST https://renoise.ai/api/public/llm/proxy/v1beta/models/{model}:generateContent?key={RENOISE_API_KEY}
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
Default model: `gemini-3.1-pro`
|
|
@@ -94,12 +94,12 @@ Gemini supports images and videos as inline base64 parts alongside text. Multipl
|
|
|
94
94
|
|
|
95
95
|
`mediaResolution` controls token allocation per image/frame:
|
|
96
96
|
|
|
97
|
-
| Level
|
|
98
|
-
|
|
99
|
-
| `media_resolution_low`
|
|
100
|
-
| `media_resolution_medium`
|
|
101
|
-
| `media_resolution_high`
|
|
102
|
-
| `media_resolution_ultra_high` | 1120
|
|
97
|
+
| Level | Image Tokens | Video Frame Tokens |
|
|
98
|
+
| ----------------------------- | ------------ | ------------------ |
|
|
99
|
+
| `media_resolution_low` | 280 | 70 |
|
|
100
|
+
| `media_resolution_medium` | 560 | 140 |
|
|
101
|
+
| `media_resolution_high` | 840 | 210 |
|
|
102
|
+
| `media_resolution_ultra_high` | 1120 | 280 |
|
|
103
103
|
|
|
104
104
|
Default: `media_resolution_medium`. Use `high` or `ultra_high` for detail-critical analysis (product photos, fine text). Use `low` for bulk/batch processing.
|
|
105
105
|
|
|
@@ -137,8 +137,12 @@ Send multiple images/videos in one request by adding more `inlineData` parts:
|
|
|
137
137
|
"contents": [
|
|
138
138
|
{
|
|
139
139
|
"parts": [
|
|
140
|
-
{
|
|
141
|
-
|
|
140
|
+
{
|
|
141
|
+
"inlineData": { "mimeType": "image/jpeg", "data": "<base64-image-1>" }
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"inlineData": { "mimeType": "image/png", "data": "<base64-image-2>" }
|
|
145
|
+
},
|
|
142
146
|
{ "text": "Compare these two product photos" }
|
|
143
147
|
]
|
|
144
148
|
}
|
|
@@ -220,13 +224,13 @@ node ${CLAUDE_SKILL_DIR}/scripts/gemini.mjs --json "Return a JSON object with na
|
|
|
220
224
|
|
|
221
225
|
### Options
|
|
222
226
|
|
|
223
|
-
| Flag
|
|
224
|
-
|
|
225
|
-
| `--file <path>`
|
|
226
|
-
| `--file-uri <uri>`
|
|
227
|
-
| `--file-mime <mime>`
|
|
228
|
-
| `--resolution <level>` | `medium`
|
|
229
|
-
| `--model <name>`
|
|
230
|
-
| `--temperature <n>`
|
|
231
|
-
| `--max-tokens <n>`
|
|
232
|
-
| `--json`
|
|
227
|
+
| Flag | Default | Description |
|
|
228
|
+
| ---------------------- | ---------------- | ---------------------------------------------------- |
|
|
229
|
+
| `--file <path>` | — | Attach local file (repeatable) |
|
|
230
|
+
| `--file-uri <uri>` | — | Attach uploaded file by URI (requires `--file-mime`) |
|
|
231
|
+
| `--file-mime <mime>` | — | MIME type for `--file-uri` |
|
|
232
|
+
| `--resolution <level>` | `medium` | `low` / `medium` / `high` / `ultra_high` |
|
|
233
|
+
| `--model <name>` | `gemini-3.1-pro` | Model name |
|
|
234
|
+
| `--temperature <n>` | `1.0` | Temperature |
|
|
235
|
+
| `--max-tokens <n>` | `8192` | Max output tokens |
|
|
236
|
+
| `--json` | off | Request JSON response format |
|
|
@@ -175,7 +175,7 @@ async function main() {
|
|
|
175
175
|
process.exit(1);
|
|
176
176
|
}
|
|
177
177
|
|
|
178
|
-
const endpoint = `https://
|
|
178
|
+
const endpoint = `https://renoise.ai/api/public/llm/proxy/v1beta/models/${opts.model}:generateContent?key=${RENOISE_API_KEY}`;
|
|
179
179
|
|
|
180
180
|
const parts = await buildParts(opts);
|
|
181
181
|
|
|
@@ -2,50 +2,51 @@
|
|
|
2
2
|
|
|
3
3
|
## API Endpoints
|
|
4
4
|
|
|
5
|
-
Base URL: `https://
|
|
5
|
+
Base URL: `https://renoise.ai`
|
|
6
6
|
API Prefix: `/api/public/v1`
|
|
7
7
|
|
|
8
8
|
All endpoints require `X-API-Key: <api_key>` header.
|
|
9
9
|
|
|
10
10
|
### Credits
|
|
11
11
|
|
|
12
|
-
| Method | Path
|
|
13
|
-
|
|
14
|
-
| GET
|
|
15
|
-
| GET
|
|
16
|
-
| GET
|
|
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
17
|
|
|
18
18
|
### Tasks
|
|
19
19
|
|
|
20
|
-
| Method | Path
|
|
21
|
-
|
|
22
|
-
| POST
|
|
23
|
-
| GET
|
|
24
|
-
| GET
|
|
25
|
-
| GET
|
|
26
|
-
| POST
|
|
27
|
-
| PATCH
|
|
28
|
-
| GET
|
|
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
29
|
|
|
30
30
|
### Materials
|
|
31
31
|
|
|
32
|
-
| Method | Path
|
|
33
|
-
|
|
34
|
-
| POST
|
|
35
|
-
| GET
|
|
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
36
|
|
|
37
37
|
### Characters
|
|
38
38
|
|
|
39
|
-
| Method | Path
|
|
40
|
-
|
|
41
|
-
| GET
|
|
42
|
-
| GET
|
|
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
43
|
|
|
44
44
|
## Request/Response Formats
|
|
45
45
|
|
|
46
46
|
### POST /api/public/v1/tasks
|
|
47
47
|
|
|
48
48
|
Request:
|
|
49
|
+
|
|
49
50
|
```json
|
|
50
51
|
{
|
|
51
52
|
"prompt": "string (required)",
|
|
@@ -62,6 +63,7 @@ Request:
|
|
|
62
63
|
```
|
|
63
64
|
|
|
64
65
|
Response (201):
|
|
66
|
+
|
|
65
67
|
```json
|
|
66
68
|
{
|
|
67
69
|
"task": {
|
|
@@ -76,6 +78,7 @@ Response (201):
|
|
|
76
78
|
```
|
|
77
79
|
|
|
78
80
|
Error (402 — insufficient credits):
|
|
81
|
+
|
|
79
82
|
```json
|
|
80
83
|
{
|
|
81
84
|
"error": "Insufficient credits",
|
|
@@ -87,6 +90,7 @@ Error (402 — insufficient credits):
|
|
|
87
90
|
### GET /api/public/v1/tasks/:id/result
|
|
88
91
|
|
|
89
92
|
Response:
|
|
93
|
+
|
|
90
94
|
```json
|
|
91
95
|
{
|
|
92
96
|
"taskId": 1,
|
|
@@ -103,16 +107,16 @@ Response:
|
|
|
103
107
|
|
|
104
108
|
## Task Statuses
|
|
105
109
|
|
|
106
|
-
| Status
|
|
107
|
-
|
|
108
|
-
| `pending`
|
|
109
|
-
| `assigning` | Being assigned to account
|
|
110
|
-
| `assigned`
|
|
111
|
-
| `queued`
|
|
112
|
-
| `running`
|
|
113
|
-
| `completed` | Done — result available
|
|
114
|
-
| `failed`
|
|
115
|
-
| `cancelled` | User cancelled
|
|
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 |
|
|
116
120
|
|
|
117
121
|
## Models
|
|
118
122
|
|