@remixmate/cli 0.9.16 → 0.9.18

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.
@@ -6,28 +6,79 @@
6
6
  "title": "AI Image Generation",
7
7
  "description": "AI image generation: produce an image from a text prompt. Supports the Seedream family (including a high-fidelity 'pro' variant) and Gemini, plus image-to-image with reference images.",
8
8
  "auth": "required",
9
- "envVars": ["PRIV_TOKEN", "MM_API_BASE_URL", "AGENT_NAME", "MM_IMAGE_MODEL"],
10
- "entry": { "type": "http", "handler": "gen-image" },
9
+ "joinsTake": true,
10
+ "envVars": [
11
+ "PRIV_TOKEN",
12
+ "MM_API_BASE_URL",
13
+ "AGENT_NAME",
14
+ "MM_IMAGE_MODEL"
15
+ ],
16
+ "entry": {
17
+ "type": "http",
18
+ "handler": "gen-image"
19
+ },
11
20
  "parameters": {
12
21
  "type": "object",
13
22
  "properties": {
14
- "prompt": { "type": "string", "description": "Image description (required)" },
15
- "model": { "type": "string", "description": "Model: 'seedream' (default), 'seedream-pro' (high fidelity, precise placement and on-image text; costs more per image), or 'gemini'" },
16
- "size": { "type": "string", "description": "Aspect ratio or WxH, e.g. 1:1, 9:16" },
17
- "resolution": { "type": "string", "enum": ["1K", "2K", "4K"], "description": "Output resolution (Gemini only)" },
18
- "n": { "type": "number", "description": "Number of images, 1-4" },
23
+ "prompt": {
24
+ "type": "string",
25
+ "description": "Image description (required)"
26
+ },
27
+ "model": {
28
+ "type": "string",
29
+ "description": "Model: 'seedream' (default), 'seedream-pro' (high fidelity, precise placement and on-image text; costs more per image), or 'gemini'"
30
+ },
31
+ "size": {
32
+ "type": "string",
33
+ "description": "Aspect ratio or WxH, e.g. 1:1, 9:16"
34
+ },
35
+ "resolution": {
36
+ "type": "string",
37
+ "enum": [
38
+ "1K",
39
+ "2K",
40
+ "4K"
41
+ ],
42
+ "description": "Output resolution (Gemini only)"
43
+ },
44
+ "n": {
45
+ "type": "number",
46
+ "description": "Number of images, 1-4"
47
+ },
19
48
  "reference": {
20
49
  "type": "array",
21
- "items": { "type": "string" },
50
+ "items": {
51
+ "type": "string"
52
+ },
22
53
  "description": "Reference images for image-to-image: local file path, https URL, or data URI. Pass multiple to blend several references (seedream: max 14, seedream-pro: max 10, gemini: max 4 — over the limit fails before spending credits)."
23
54
  },
24
- "image_strength": { "type": "number", "description": "How strongly the reference images influence the result, 0-1 (Seedream family only). Omit to use the backend default." },
25
- "guidance_scale": { "type": "number", "description": "Prompt-adherence strength, where supported. Omit to use the backend default." },
26
- "negative_prompt": { "type": "string", "description": "Negative prompt content to avoid" },
27
- "seed": { "type": "number", "description": "Random seed. Pass the same seed with the same prompt and model to make a run reproducible." },
28
- "watermark": { "type": "boolean", "description": "Add a watermark to the output. Only true has an effect; there is no opt-out override of the backend default." },
29
- "json_output": { "type": "boolean", "description": "Emit a JSON result ({ urls: [...] }) instead of human-readable output" }
55
+ "image_strength": {
56
+ "type": "number",
57
+ "description": "How strongly the reference images influence the result, 0-1 (Seedream family only). Omit to use the backend default."
58
+ },
59
+ "guidance_scale": {
60
+ "type": "number",
61
+ "description": "Prompt-adherence strength, where supported. Omit to use the backend default."
62
+ },
63
+ "negative_prompt": {
64
+ "type": "string",
65
+ "description": "Negative prompt — content to avoid"
66
+ },
67
+ "seed": {
68
+ "type": "number",
69
+ "description": "Random seed. Pass the same seed with the same prompt and model to make a run reproducible."
70
+ },
71
+ "watermark": {
72
+ "type": "boolean",
73
+ "description": "Add a watermark to the output. Only true has an effect; there is no opt-out override of the backend default."
74
+ },
75
+ "json_output": {
76
+ "type": "boolean",
77
+ "description": "Emit a JSON result ({ urls: [...] }) instead of human-readable output"
78
+ }
30
79
  },
31
- "required": ["prompt"]
80
+ "required": [
81
+ "prompt"
82
+ ]
32
83
  }
33
84
  }
@@ -6,30 +6,86 @@
6
6
  "title": "AI Video Generation",
7
7
  "description": "AI video generation: produce a short video clip from a text prompt. Supports Seedance and Veo models, plus first/last frame and reference images.",
8
8
  "auth": "required",
9
- "envVars": ["PRIV_TOKEN", "MM_API_BASE_URL", "AGENT_NAME", "MM_VIDEO_MODEL"],
10
- "entry": { "type": "http", "handler": "gen-video" },
9
+ "joinsTake": true,
10
+ "envVars": [
11
+ "PRIV_TOKEN",
12
+ "MM_API_BASE_URL",
13
+ "AGENT_NAME",
14
+ "MM_VIDEO_MODEL"
15
+ ],
16
+ "entry": {
17
+ "type": "http",
18
+ "handler": "gen-video"
19
+ },
11
20
  "parameters": {
12
21
  "type": "object",
13
22
  "properties": {
14
- "prompt": { "type": "string", "description": "Video description" },
15
- "model": { "type": "string", "description": "Model: 'seedance' (default; 4-12s, adaptive/21:9 ratios, fixed camera), 'veo' (4/6/8s, native audio, up to 4k, reference images), or 'veo-fast' (faster Veo variant for iteration)" },
16
- "duration": { "type": "number", "description": "Duration in seconds" },
17
- "ratio": { "type": "string", "description": "Aspect ratio" },
18
- "resolution": { "type": "string", "description": "Resolution" },
19
- "first_frame": { "type": "string", "description": "First-frame image path or URL" },
20
- "last_frame": { "type": "string", "description": "Last-frame image path or URL" },
23
+ "prompt": {
24
+ "type": "string",
25
+ "description": "Video description"
26
+ },
27
+ "model": {
28
+ "type": "string",
29
+ "description": "Model: 'seedance' (default; 4-12s, adaptive/21:9 ratios, fixed camera), 'veo' (4/6/8s, native audio, up to 4k, reference images), or 'veo-fast' (faster Veo variant for iteration)"
30
+ },
31
+ "duration": {
32
+ "type": "number",
33
+ "description": "Duration in seconds"
34
+ },
35
+ "ratio": {
36
+ "type": "string",
37
+ "description": "Aspect ratio"
38
+ },
39
+ "resolution": {
40
+ "type": "string",
41
+ "description": "Resolution"
42
+ },
43
+ "first_frame": {
44
+ "type": "string",
45
+ "description": "First-frame image path or URL"
46
+ },
47
+ "last_frame": {
48
+ "type": "string",
49
+ "description": "Last-frame image path or URL"
50
+ },
21
51
  "reference": {
22
52
  "type": "array",
23
- "items": { "type": "string" },
53
+ "items": {
54
+ "type": "string"
55
+ },
24
56
  "description": "Reference images: local file path, https URL, or data URI. Veo only, max 3 — Seedance rejects them, use first_frame / last_frame instead."
25
57
  },
26
- "generate_audio": { "type": "boolean", "description": "Generate native audio" },
27
- "camera_fixed": { "type": "boolean", "description": "Lock the camera in place (Seedance)" },
28
- "negative_prompt": { "type": "string", "description": "Content to steer away from (Veo)" },
29
- "seed": { "type": "number", "description": "Random seed. Pass the same seed with the same prompt and model to make a run reproducible." },
30
- "person_generation": { "type": "string", "enum": ["allow_all", "dont_allow"], "description": "Whether the model may render people (Veo). Omit to use the backend default." },
31
- "json_output": { "type": "boolean", "description": "Emit a JSON result ({ url }) instead of human-readable output" }
58
+ "generate_audio": {
59
+ "type": "boolean",
60
+ "description": "Generate native audio"
61
+ },
62
+ "camera_fixed": {
63
+ "type": "boolean",
64
+ "description": "Lock the camera in place (Seedance)"
65
+ },
66
+ "negative_prompt": {
67
+ "type": "string",
68
+ "description": "Content to steer away from (Veo)"
69
+ },
70
+ "seed": {
71
+ "type": "number",
72
+ "description": "Random seed. Pass the same seed with the same prompt and model to make a run reproducible."
73
+ },
74
+ "person_generation": {
75
+ "type": "string",
76
+ "enum": [
77
+ "allow_all",
78
+ "dont_allow"
79
+ ],
80
+ "description": "Whether the model may render people (Veo). Omit to use the backend default."
81
+ },
82
+ "json_output": {
83
+ "type": "boolean",
84
+ "description": "Emit a JSON result ({ url }) instead of human-readable output"
85
+ }
32
86
  },
33
- "required": ["prompt"]
87
+ "required": [
88
+ "prompt"
89
+ ]
34
90
  }
35
91
  }
@@ -6,17 +6,43 @@
6
6
  "title": "Text-to-Speech (Minimax)",
7
7
  "description": "Text-to-speech (TTS): synthesize narration audio from text via the Minimax TTS model. Returns the persisted audio URL — no download needed.",
8
8
  "auth": "required",
9
- "envVars": ["PRIV_TOKEN", "MM_API_BASE_URL", "AGENT_NAME"],
10
- "entry": { "type": "http", "handler": "gen-voice" },
9
+ "joinsTake": true,
10
+ "envVars": [
11
+ "PRIV_TOKEN",
12
+ "MM_API_BASE_URL",
13
+ "AGENT_NAME"
14
+ ],
15
+ "entry": {
16
+ "type": "http",
17
+ "handler": "gen-voice"
18
+ },
11
19
  "parameters": {
12
20
  "type": "object",
13
21
  "properties": {
14
- "text": { "type": "string", "description": "Text to synthesize (required)" },
15
- "voice_id": { "type": "string", "description": "Voice id. Default 'Chinese (Mandarin)_Male_Announcer'. When unsure, call with list_voices=true first to see what's available — do not invent ids." },
16
- "speed": { "type": "number", "description": "Speech rate, 0.5-2.0" },
17
- "list_voices": { "type": "boolean", "description": "List available voices and exit" },
18
- "local": { "type": "boolean", "description": "Used together with list_voices=true: print the voice-resolver fallback catalog with language tags (no remote /voice/page call). Output is one '<id>\\t<lang>\\t<name>' line per voice." },
19
- "json_output": { "type": "boolean", "description": "Emit a JSON result (url, audio_length_ms, subtitles)" }
22
+ "text": {
23
+ "type": "string",
24
+ "description": "Text to synthesize (required)"
25
+ },
26
+ "voice_id": {
27
+ "type": "string",
28
+ "description": "Voice id. Default 'Chinese (Mandarin)_Male_Announcer'. When unsure, call with list_voices=true first to see what's available — do not invent ids."
29
+ },
30
+ "speed": {
31
+ "type": "number",
32
+ "description": "Speech rate, 0.5-2.0"
33
+ },
34
+ "list_voices": {
35
+ "type": "boolean",
36
+ "description": "List available voices and exit"
37
+ },
38
+ "local": {
39
+ "type": "boolean",
40
+ "description": "Used together with list_voices=true: print the voice-resolver fallback catalog with language tags (no remote /voice/page call). Output is one '<id>\\t<lang>\\t<name>' line per voice."
41
+ },
42
+ "json_output": {
43
+ "type": "boolean",
44
+ "description": "Emit a JSON result (url, audio_length_ms, subtitles)"
45
+ }
20
46
  },
21
47
  "required": []
22
48
  }
@@ -6,19 +6,53 @@
6
6
  "title": "Video Asset Preparation",
7
7
  "description": "Resolves and generates every asset (image / audio / video) referenced by a Video DSL, persists a RenderPlan to the database, and returns a job_id for the subsequent render_video call. This is Phase 1 of the two-phase video pipeline; Phase 3 (Remotion render) lives in render_video.",
8
8
  "auth": "required",
9
- "envVars": ["PRIV_TOKEN", "MM_API_BASE_URL", "MM_BACKEND_API_URL", "AGENT_NAME", "REMOTION_RENDER_API_URL", "REMOTION_RENDER_MODE", "REMOTION_OUTPUT_DIR", "ASSET_CACHE_DIR"],
9
+ "createsTake": true,
10
+ "envVars": [
11
+ "PRIV_TOKEN",
12
+ "MM_API_BASE_URL",
13
+ "MM_BACKEND_API_URL",
14
+ "AGENT_NAME",
15
+ "REMOTION_RENDER_API_URL",
16
+ "REMOTION_RENDER_MODE",
17
+ "REMOTION_OUTPUT_DIR",
18
+ "ASSET_CACHE_DIR"
19
+ ],
10
20
  "scriptPath": "scripts/prepare_video_assets.py",
11
21
  "parameters": {
12
22
  "type": "object",
13
23
  "properties": {
14
- "dsl_json": { "type": "string", "description": "DSL JSON as an inline string (preferred — no disk write needed; required for multi-user concurrent flows). Pass the full DSL JSON, or — when a gen_script skeleton is cached in the session — a minimal JSON with only scenes[].audio.narration.text overrides (the agent layer merges narration onto the cached skeleton)." },
15
- "dsl": { "type": "string", "description": "DSL file path (legacy fallback; prefer dsl_json inline)." },
16
- "template_id": { "type": "string", "description": "Template id. When provided, the script invokes template-registry internally; no separate binding step is needed." },
17
- "binding_json": { "type": "string", "description": "TemplateBinding JSON as an inline string (alternative to template_id; no file needed)." },
18
- "binding": { "type": "string", "description": "TemplateBinding file path (optional; auto-generated when template_id is provided)." },
19
- "save_job": { "type": "boolean", "description": "Persist the RenderPlan to the database (default true). On success the stdout contains '📦 render job jobId: N'. Auto-degrades to false when PRIV_TOKEN is missing, falling back to file mode. Pass false to opt out explicitly." },
20
- "stub_image_url": { "type": "string", "description": "Test-mode image stub URL (renderer-side short-circuit). Only pass when the user explicitly says things like 'just testing / don't actually generate / use a placeholder image / save credits' AND provides a concrete URL. With this set, every image+source=gen-image AssetRef is short-circuited to that URL with no gen-image call. Do not pass otherwise; if the user expressed the intent without a URL, ask for one — do not invent one." },
21
- "stub_video_url": { "type": "string", "description": "Test-mode video stub URL (renderer-side short-circuit). Only pass when the user explicitly says things like 'just testing / don't actually generate the video / use a placeholder clip / save credits' AND provides a concrete URL. With this set, every video+source=gen-video AssetRef is short-circuited to that URL with no gen-video call. Do not pass otherwise; if the user expressed the intent without a URL, ask for one — do not invent one." }
24
+ "dsl_json": {
25
+ "type": "string",
26
+ "description": "DSL JSON as an inline string (preferred no disk write needed; required for multi-user concurrent flows). Pass the full DSL JSON, or — when a gen_script skeleton is cached in the session a minimal JSON with only scenes[].audio.narration.text overrides (the agent layer merges narration onto the cached skeleton)."
27
+ },
28
+ "dsl": {
29
+ "type": "string",
30
+ "description": "DSL file path (legacy fallback; prefer dsl_json inline)."
31
+ },
32
+ "template_id": {
33
+ "type": "string",
34
+ "description": "Template id. When provided, the script invokes template-registry internally; no separate binding step is needed."
35
+ },
36
+ "binding_json": {
37
+ "type": "string",
38
+ "description": "TemplateBinding JSON as an inline string (alternative to template_id; no file needed)."
39
+ },
40
+ "binding": {
41
+ "type": "string",
42
+ "description": "TemplateBinding file path (optional; auto-generated when template_id is provided)."
43
+ },
44
+ "save_job": {
45
+ "type": "boolean",
46
+ "description": "Persist the RenderPlan to the database (default true). On success the stdout contains '📦 render job jobId: N'. Auto-degrades to false when PRIV_TOKEN is missing, falling back to file mode. Pass false to opt out explicitly."
47
+ },
48
+ "stub_image_url": {
49
+ "type": "string",
50
+ "description": "Test-mode image stub URL (renderer-side short-circuit). Only pass when the user explicitly says things like 'just testing / don't actually generate / use a placeholder image / save credits' AND provides a concrete URL. With this set, every image+source=gen-image AssetRef is short-circuited to that URL with no gen-image call. Do not pass otherwise; if the user expressed the intent without a URL, ask for one — do not invent one."
51
+ },
52
+ "stub_video_url": {
53
+ "type": "string",
54
+ "description": "Test-mode video stub URL (renderer-side short-circuit). Only pass when the user explicitly says things like 'just testing / don't actually generate the video / use a placeholder clip / save credits' AND provides a concrete URL. With this set, every video+source=gen-video AssetRef is short-circuited to that URL with no gen-video call. Do not pass otherwise; if the user expressed the intent without a URL, ask for one — do not invent one."
55
+ }
22
56
  },
23
57
  "required": []
24
58
  }
@@ -114,7 +114,17 @@ python3 <SkillDir>/scripts/render_video.py --render-plan <path>.render-plan.json
114
114
  python3 <SkillDir>/scripts/render_video.py --job-id 42 --upload-title "My video"
115
115
  ```
116
116
 
117
- After rendering, the script auto-uploads by default; `render-manifest.json` then contains an `upload.fileUrl` field. **Prefer `upload.playbackUrl`** (transcoded) over `upload.fileUrl` (raw VOD) when surfacing the URL to a user.
117
+ After rendering, the script auto-uploads by default; `render-manifest.json` then contains an
118
+ `upload.fileUrl` field, and `upload.playbackUrl` (transcoded) once VOD processing finishes.
119
+
120
+ **Do not retype the video URL into your reply.** On success the script prints a structured
121
+ `__render_video_asset__` line; the host reads the authoritative URL from there and renders a
122
+ player for the user. Tell the user the video is ready — the player appears on its own.
123
+
124
+ Reproducing a 32-char opaque URL from memory is unreliable: on 2026-08-30 a single character
125
+ was dropped (`…c1c20102` → `…c1c2012`), so the user got a 404 while the file sat fine on the
126
+ CDN. The URL in your prose is redundant with the structured asset and is the only copy that
127
+ can be wrong — the UI now renders it as plain, non-clickable text for exactly this reason.
118
128
 
119
129
  ### Render but skip the upload
120
130
 
@@ -2413,6 +2413,26 @@ Examples:
2413
2413
  effective_playback = playback_url or remote_url
2414
2414
  if effective_playback and not effective_playback.startswith("vod://"):
2415
2415
  print(f"\n🎬 Video playback URL: {effective_playback}")
2416
+
2417
+ # 结构化资产标记 —— 宿主(ab-agent)据此把权威 URL 作为 attachment
2418
+ # 下发前端渲染播放器,绕开模型正文。
2419
+ #
2420
+ # 为什么必须绕开:模型复述 32 位不透明 hex 会出错。2026-08-30 实测一次
2421
+ # 成片链接被吞掉一个字符(…c1c20102 → …c1c2012),用户拿到 404,
2422
+ # 而文件本身好好地在 CDN 上。约定与 web-screenshot/scripts/record.py
2423
+ # 的 __web_record_asset__ 一致。
2424
+ #
2425
+ # 只在拿到**非 vod:// 的真实播放地址**时才打标记(上面的 if 已保证):
2426
+ # playbackUrl 来自 VOD 轮询,可能超时未就绪。宁可前端没有内联播放器
2427
+ # (用户仍可从成片面板看),也不要再给出一条不可用的地址。
2428
+ asset = {"url": effective_playback}
2429
+ cover = upload_info.get("coverUrl")
2430
+ if cover:
2431
+ asset["coverUrl"] = cover
2432
+ total_duration = (render_plan.get("renderConfig") or {}).get("totalDuration")
2433
+ if isinstance(total_duration, (int, float)) and total_duration > 0:
2434
+ asset["durationSec"] = total_duration
2435
+ print("__render_video_asset__ " + json.dumps(asset, ensure_ascii=False))
2416
2436
  else:
2417
2437
  LogPrint(f" Video: {output_path}", file=sys.stderr)
2418
2438
  if args.save_job:
@@ -6,18 +6,54 @@
6
6
  "title": "Remotion Video Renderer",
7
7
  "description": "Loads a persisted RenderPlan by job_id and drives the Remotion engine to produce the final video. Assets must already be generated via prepare_video_assets — this skill never resolves or regenerates assets.",
8
8
  "auth": "required",
9
- "envVars": ["PRIV_TOKEN", "MM_API_BASE_URL", "MM_BACKEND_API_URL", "AGENT_NAME", "REMOTION_RENDER_API_URL", "REMOTION_RENDER_MODE", "REMOTION_OUTPUT_DIR", "ASSET_CACHE_DIR"],
9
+ "createsTake": true,
10
+ "createsTakeUnless": ["resolve_only"],
11
+ "envVars": [
12
+ "PRIV_TOKEN",
13
+ "MM_API_BASE_URL",
14
+ "MM_BACKEND_API_URL",
15
+ "AGENT_NAME",
16
+ "REMOTION_RENDER_API_URL",
17
+ "REMOTION_RENDER_MODE",
18
+ "REMOTION_OUTPUT_DIR",
19
+ "ASSET_CACHE_DIR"
20
+ ],
10
21
  "scriptPath": "scripts/render_video.py",
11
22
  "parameters": {
12
23
  "type": "object",
13
24
  "properties": {
14
- "job_id": { "type": "number", "minimum": 1, "description": "Render job id (positive integer, e.g. 8). This is the integer N parsed from prepare_video_assets's stdout line '📦 render job jobId: N' (also tolerated: legacy zh '📦 渲染任务 jobId: N'). Never pass 0, a placeholder string, or descriptive text." },
15
- "save_job": { "type": "boolean", "description": "Persist the render Manifest back to the database under the same jobId (default true). Auto-degrades to false when PRIV_TOKEN is missing. Pass false to opt out explicitly." },
16
- "upload_title": { "type": "string", "description": "Upload title for the resulting video file. Defaults to the local output filename." },
17
- "no_upload": { "type": "boolean", "description": "Skip the upload step. Only effective for local rendering; remote rendering uploads server-side." },
18
- "renderer": { "type": "string", "enum": ["local", "remote"], "description": "Render mode: local runs the Remotion CLI on this host; remote calls the standalone remotion-renderer service. Defaults to REMOTION_RENDER_MODE." },
19
- "render_plan": { "type": "string", "description": "Existing RenderPlan file path. Local / single-user fallback used only when job_id is unavailable; prefer job_id." }
25
+ "job_id": {
26
+ "type": "number",
27
+ "minimum": 1,
28
+ "description": "Render job id (positive integer, e.g. 8). This is the integer N parsed from prepare_video_assets's stdout line '📦 render job jobId: N' (also tolerated: legacy zh '📦 渲染任务 jobId: N'). Never pass 0, a placeholder string, or descriptive text."
29
+ },
30
+ "save_job": {
31
+ "type": "boolean",
32
+ "description": "Persist the render Manifest back to the database under the same jobId (default true). Auto-degrades to false when PRIV_TOKEN is missing. Pass false to opt out explicitly."
33
+ },
34
+ "upload_title": {
35
+ "type": "string",
36
+ "description": "Upload title for the resulting video file. Defaults to the local output filename."
37
+ },
38
+ "no_upload": {
39
+ "type": "boolean",
40
+ "description": "Skip the upload step. Only effective for local rendering; remote rendering uploads server-side."
41
+ },
42
+ "renderer": {
43
+ "type": "string",
44
+ "enum": [
45
+ "local",
46
+ "remote"
47
+ ],
48
+ "description": "Render mode: local runs the Remotion CLI on this host; remote calls the standalone remotion-renderer service. Defaults to REMOTION_RENDER_MODE."
49
+ },
50
+ "render_plan": {
51
+ "type": "string",
52
+ "description": "Existing RenderPlan file path. Local / single-user fallback used only when job_id is unavailable; prefer job_id."
53
+ }
20
54
  },
21
- "required": ["job_id"]
55
+ "required": [
56
+ "job_id"
57
+ ]
22
58
  }
23
59
  }
@@ -6,17 +6,39 @@
6
6
  "title": "Video Deconstruction",
7
7
  "description": "Video deconstruction: split a video into reusable assets (audio extraction, ASR transcript, keyframe extraction, scene segmentation).",
8
8
  "auth": "required",
9
- "envVars": ["RENDER_API_URL", "PRIV_TOKEN", "CONVERSATION_ID"],
9
+ "joinsTake": true,
10
+ "envVars": [
11
+ "RENDER_API_URL",
12
+ "PRIV_TOKEN",
13
+ "CONVERSATION_ID"
14
+ ],
10
15
  "scriptPath": "scripts/parse_via_render.py",
11
16
  "parameters": {
12
17
  "type": "object",
13
18
  "properties": {
14
- "url": { "type": "string", "description": "Direct remote video URL (required). Share/page links are not supported." },
15
- "scene_threshold": { "type": "number", "description": "Scene-cut detection threshold 0.0-1.0 (default 0.3)" },
16
- "skip_asr": { "type": "boolean", "description": "Skip the ASR step" },
17
- "skip_keyframes": { "type": "boolean", "description": "Skip the keyframe-extraction step" },
18
- "json_output": { "type": "boolean", "description": "Pipeline mode — emit JSON only on stdout" }
19
+ "url": {
20
+ "type": "string",
21
+ "description": "Direct remote video URL (required). Share/page links are not supported."
22
+ },
23
+ "scene_threshold": {
24
+ "type": "number",
25
+ "description": "Scene-cut detection threshold 0.0-1.0 (default 0.3)"
26
+ },
27
+ "skip_asr": {
28
+ "type": "boolean",
29
+ "description": "Skip the ASR step"
30
+ },
31
+ "skip_keyframes": {
32
+ "type": "boolean",
33
+ "description": "Skip the keyframe-extraction step"
34
+ },
35
+ "json_output": {
36
+ "type": "boolean",
37
+ "description": "Pipeline mode — emit JSON only on stdout"
38
+ }
19
39
  },
20
- "required": ["url"]
40
+ "required": [
41
+ "url"
42
+ ]
21
43
  }
22
44
  }