loopcut 0.1.0__py3-none-any.whl

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.
loopcut/catalog.json ADDED
@@ -0,0 +1,955 @@
1
+ {
2
+ "source": "https://loopcut-web.vercel.app/v1/manifest",
3
+ "taken_at": "2026-10-18T21:08:44+00:00",
4
+ "capabilities": {
5
+ "blob_multipart": {
6
+ "min_size": 16777216
7
+ }
8
+ },
9
+ "tools": [
10
+ {
11
+ "byok": null,
12
+ "cost": {
13
+ "quote_required": false,
14
+ "credits_estimate": 0
15
+ },
16
+ "kind": "assist",
17
+ "name": "asset_search",
18
+ "apply": "attach_report",
19
+ "title": "Search assets",
20
+ "output": {
21
+ "type": "report",
22
+ "formats": [
23
+ "json"
24
+ ]
25
+ },
26
+ "display": {
27
+ "title": "Loopcut cloud asset library",
28
+ "summary": "Search a hosted library of free models, materials and HDRIs.",
29
+ "category": "assets"
30
+ },
31
+ "latency": "seconds",
32
+ "version": 1,
33
+ "approval": {
34
+ "confirm_over_credits": 0
35
+ },
36
+ "backends": [
37
+ "managed"
38
+ ],
39
+ "namespace": "loopcut_cloud",
40
+ "description": "Finds existing models, materials, HDRIs or textures, including public Blender remote asset libraries, using query, source, license and size filters, with licence and credit attached. Use it to discover reusable assets. Searches are free, return at most 50 results and usually take 1–10 seconds; license any currently searches the same CC0 sources. The report attaches to the model; import selected results with existing asset tools or direct downloads.",
41
+ "file_inputs": [],
42
+ "bundle_input": null,
43
+ "input_schema": {
44
+ "type": "object",
45
+ "required": [
46
+ "query"
47
+ ],
48
+ "properties": {
49
+ "kind": {
50
+ "anyOf": [
51
+ {
52
+ "enum": [
53
+ "model",
54
+ "material",
55
+ "hdri",
56
+ "texture",
57
+ "any"
58
+ ],
59
+ "type": "string"
60
+ },
61
+ {
62
+ "type": "array",
63
+ "items": {
64
+ "enum": [
65
+ "model",
66
+ "material",
67
+ "hdri",
68
+ "texture"
69
+ ],
70
+ "type": "string"
71
+ },
72
+ "minItems": 1,
73
+ "uniqueItems": true
74
+ }
75
+ ],
76
+ "description": "Asset category to search: one kind, a list of kinds, or any for every kind. Defaults to model."
77
+ },
78
+ "limit": {
79
+ "type": "integer",
80
+ "maximum": 50,
81
+ "minimum": 1,
82
+ "description": "Maximum number of search results. Defaults to 10."
83
+ },
84
+ "query": {
85
+ "type": "string",
86
+ "maxLength": 1000,
87
+ "minLength": 1,
88
+ "description": "Search terms describing the desired asset; at most 1000 characters."
89
+ },
90
+ "license": {
91
+ "enum": [
92
+ "cc0",
93
+ "any"
94
+ ],
95
+ "type": "string",
96
+ "description": "License filter. Defaults to cc0; any currently returns the same CC0 sources."
97
+ },
98
+ "sources": {
99
+ "type": "array",
100
+ "items": {
101
+ "enum": [
102
+ "polyhaven",
103
+ "ambientcg",
104
+ "physicallybased"
105
+ ],
106
+ "type": "string"
107
+ },
108
+ "minItems": 1,
109
+ "description": "Libraries to search. Defaults to all.",
110
+ "uniqueItems": true
111
+ },
112
+ "max_polycount": {
113
+ "type": "integer",
114
+ "maximum": 10000000,
115
+ "minimum": 1,
116
+ "description": "Maximum source-stated polygon count, for models only; ignored for other kinds. Assets with no stated polycount are excluded when set. Defaults to no cap."
117
+ },
118
+ "min_resolution": {
119
+ "type": "integer",
120
+ "maximum": 32768,
121
+ "minimum": 256,
122
+ "description": "Minimum longest side in pixels of the largest texture, HDRI or model texture set offered by the source. Assets with no stated resolution are excluded when set. Defaults to no minimum."
123
+ }
124
+ },
125
+ "additionalProperties": false
126
+ },
127
+ "data_class": "B",
128
+ "status": "live"
129
+ },
130
+ {
131
+ "byok": {
132
+ "key_name": "FAL_KEY",
133
+ "provider": "fal",
134
+ "data_class": "C"
135
+ },
136
+ "cost": {
137
+ "quote_required": true,
138
+ "credits_estimate": 10
139
+ },
140
+ "kind": "assist",
141
+ "name": "auto_rig",
142
+ "apply": "import_model",
143
+ "title": "Rig humanoid",
144
+ "output": {
145
+ "type": "model_3d",
146
+ "formats": [
147
+ "glb"
148
+ ]
149
+ },
150
+ "display": {
151
+ "title": "Auto-rig",
152
+ "summary": "Add a skeleton and skin weights to a humanoid character.",
153
+ "category": "characters"
154
+ },
155
+ "latency": "minutes",
156
+ "version": 1,
157
+ "approval": {
158
+ "confirm_over_credits": 0
159
+ },
160
+ "backends": [
161
+ "managed",
162
+ "byok"
163
+ ],
164
+ "namespace": "loopcut_cloud",
165
+ "description": "Adds a humanoid skeleton and skin weights to an uploaded GLB character. Use it for an unrigged human-shaped mesh with clearly separated limbs, not creatures, props or retargeting an existing animation; creatures are planned later. GLBs are limited to 100 MB and rig_type is humanoid only in v0; processing usually takes 1–5 minutes. Applying the result imports the rigged model and armature into the scene.",
166
+ "file_inputs": [
167
+ {
168
+ "field": "model",
169
+ "accept": [
170
+ "model/gltf-binary"
171
+ ],
172
+ "max_mb": 100,
173
+ "required": true
174
+ }
175
+ ],
176
+ "bundle_input": null,
177
+ "input_schema": {
178
+ "type": "object",
179
+ "required": [],
180
+ "properties": {
181
+ "rig_type": {
182
+ "enum": [
183
+ "humanoid"
184
+ ],
185
+ "type": "string",
186
+ "description": "Skeleton type. Defaults to humanoid, the only supported type in v0; creatures are planned later."
187
+ }
188
+ },
189
+ "additionalProperties": false
190
+ },
191
+ "data_class": "C",
192
+ "status": "coming_soon"
193
+ },
194
+ {
195
+ "byok": {
196
+ "key_name": "ELEVENLABS_API_KEY",
197
+ "provider": "elevenlabs",
198
+ "data_class": "C"
199
+ },
200
+ "cost": {
201
+ "quote_required": true,
202
+ "credits_estimate": 18
203
+ },
204
+ "kind": "assist",
205
+ "name": "dialogue_from_recordings",
206
+ "apply": "add_audio_strip",
207
+ "title": "Dialogue from recordings",
208
+ "output": {
209
+ "type": "audio",
210
+ "formats": [
211
+ "wav"
212
+ ]
213
+ },
214
+ "display": {
215
+ "title": "Dialogue from your recordings",
216
+ "summary": "Match your recorded takes to script lines and place them on the timeline.",
217
+ "category": "audio"
218
+ },
219
+ "latency": "minutes",
220
+ "version": 1,
221
+ "approval": {
222
+ "confirm_over_credits": 0
223
+ },
224
+ "backends": [
225
+ "managed",
226
+ "byok"
227
+ ],
228
+ "namespace": "loopcut_cloud",
229
+ "description": "Matches recorded takes to speaker-labelled script lines and returns cleaned dialogue audio plus a matching report. Use it to assemble an existing performance, not to invent missing words or synthesize a voice; it remains available with generation off. A recording bundle and quote are required, and processing usually takes a few minutes per recorded minute, depending on cleanup and the number of takes. Applying the result adds one audio strip per matched line to the sequencer and attaches the report of matches and gaps.",
230
+ "file_inputs": [],
231
+ "bundle_input": {
232
+ "accept": [
233
+ "audio/wav",
234
+ "audio/mpeg"
235
+ ],
236
+ "required": true,
237
+ "description": "Bundle of raw recording takes in WAV or MP3 format, referenced by a bundle manifest; the script is supplied separately in input. Include the recording blobs as bundle members."
238
+ },
239
+ "input_schema": {
240
+ "type": "object",
241
+ "required": [
242
+ "script"
243
+ ],
244
+ "properties": {
245
+ "script": {
246
+ "type": "string",
247
+ "maxLength": 100000,
248
+ "minLength": 1,
249
+ "description": "Script lines with speaker names, for example Ada: Hello. The recordings must contain the requested lines; at most 100000 characters."
250
+ },
251
+ "language": {
252
+ "type": "string",
253
+ "pattern": "^(?:[A-Za-z]{2,8}(?:-[A-Za-z0-9]{1,8})*|[xX](?:-[A-Za-z0-9]{1,8})+|[iI]-[A-Za-z0-9]{1,8})$",
254
+ "maxLength": 63,
255
+ "minLength": 2,
256
+ "description": "BCP-47 language tag, for example en-US or fr-FR. Defaults to en-US; supported languages depend on the route."
257
+ }
258
+ },
259
+ "additionalProperties": false
260
+ },
261
+ "data_class": "C",
262
+ "status": "coming_soon"
263
+ },
264
+ {
265
+ "byok": {
266
+ "key_name": "OPENAI_API_KEY",
267
+ "provider": "openai",
268
+ "data_class": "A"
269
+ },
270
+ "cost": {
271
+ "quote_required": true,
272
+ "credits_estimate": 6
273
+ },
274
+ "kind": "gen",
275
+ "name": "image_edit",
276
+ "apply": "add_image_reference",
277
+ "title": "Edit image",
278
+ "output": {
279
+ "type": "image",
280
+ "formats": [
281
+ "png"
282
+ ]
283
+ },
284
+ "display": {
285
+ "title": "Image editing",
286
+ "summary": "Change an existing image or render with a text instruction.",
287
+ "category": "images"
288
+ },
289
+ "latency": "seconds",
290
+ "version": 1,
291
+ "approval": {
292
+ "confirm_over_credits": 0
293
+ },
294
+ "backends": [
295
+ "managed",
296
+ "byok"
297
+ ],
298
+ "namespace": "loopcut_cloud",
299
+ "description": "Changes an existing image from a text instruction, including restyling a render or changing a selected area. Use a mask for a local change; use image generation for a new composition and scene tools for exact geometry changes. The source is required and source/mask uploads are limited to 50 MB each; an optional PNG alpha mask must match its dimensions, with transparent pixels marking the area to edit, and edits usually take 15–90 seconds. Applying the result adds an image reference to the scene.",
300
+ "file_inputs": [
301
+ {
302
+ "field": "image",
303
+ "accept": [
304
+ "image/png",
305
+ "image/jpeg",
306
+ "image/webp"
307
+ ],
308
+ "max_mb": 50,
309
+ "required": true
310
+ },
311
+ {
312
+ "field": "mask",
313
+ "accept": [
314
+ "image/png"
315
+ ],
316
+ "max_mb": 50,
317
+ "required": false
318
+ }
319
+ ],
320
+ "bundle_input": null,
321
+ "input_schema": {
322
+ "type": "object",
323
+ "required": [
324
+ "prompt"
325
+ ],
326
+ "properties": {
327
+ "size": {
328
+ "enum": [
329
+ "1024x1024",
330
+ "1536x1024",
331
+ "1024x1536"
332
+ ],
333
+ "type": "string",
334
+ "description": "Output width and height in pixels. Defaults to 1024x1024."
335
+ },
336
+ "prompt": {
337
+ "type": "string",
338
+ "maxLength": 4000,
339
+ "minLength": 1,
340
+ "description": "Describe the changes to make and the features to preserve; at most 4000 characters."
341
+ },
342
+ "quality": {
343
+ "enum": [
344
+ "low",
345
+ "medium",
346
+ "high"
347
+ ],
348
+ "type": "string",
349
+ "description": "Image detail and compute budget. Defaults to medium; high (HD) costs 20 credits versus 6 for low or medium, at any size."
350
+ }
351
+ },
352
+ "additionalProperties": false
353
+ },
354
+ "data_class": "A",
355
+ "status": "coming_soon"
356
+ },
357
+ {
358
+ "byok": {
359
+ "key_name": "OPENAI_API_KEY",
360
+ "provider": "openai",
361
+ "data_class": "A"
362
+ },
363
+ "cost": {
364
+ "quote_required": true,
365
+ "credits_estimate": 6
366
+ },
367
+ "kind": "gen",
368
+ "name": "image_generate",
369
+ "apply": "add_image_reference",
370
+ "title": "Generate image",
371
+ "output": {
372
+ "type": "image",
373
+ "formats": [
374
+ "png"
375
+ ]
376
+ },
377
+ "display": {
378
+ "title": "Image generation",
379
+ "summary": "Create a reference image or backplate from a text prompt.",
380
+ "category": "images"
381
+ },
382
+ "latency": "seconds",
383
+ "version": 1,
384
+ "approval": {
385
+ "confirm_over_credits": 0
386
+ },
387
+ "backends": [
388
+ "managed",
389
+ "byok"
390
+ ],
391
+ "namespace": "loopcut_cloud",
392
+ "description": "Creates a still image from a prompt, optionally guided by a reference image. Use it for concept art, backplates or visual references; use image editing to change an existing image and a 3D tool for geometry. Prompts are limited to 4000 characters and reference images to 20 MB; results usually take 15–90 seconds. Applying the result adds an image reference to the scene.",
393
+ "file_inputs": [
394
+ {
395
+ "field": "reference",
396
+ "accept": [
397
+ "image/png",
398
+ "image/jpeg",
399
+ "image/webp"
400
+ ],
401
+ "max_mb": 20,
402
+ "required": false
403
+ }
404
+ ],
405
+ "bundle_input": null,
406
+ "input_schema": {
407
+ "type": "object",
408
+ "required": [
409
+ "prompt"
410
+ ],
411
+ "properties": {
412
+ "size": {
413
+ "enum": [
414
+ "1024x1024",
415
+ "1536x1024",
416
+ "1024x1536"
417
+ ],
418
+ "type": "string",
419
+ "description": "Output width and height in pixels. Defaults to 1024x1024."
420
+ },
421
+ "prompt": {
422
+ "type": "string",
423
+ "maxLength": 4000,
424
+ "minLength": 1,
425
+ "description": "Describe the subject, composition, lighting and visual style; at most 4000 characters."
426
+ },
427
+ "quality": {
428
+ "enum": [
429
+ "low",
430
+ "medium",
431
+ "high"
432
+ ],
433
+ "type": "string",
434
+ "description": "Image detail and compute budget. Defaults to medium; high (HD) costs 20 credits versus 6 for low or medium, at any size."
435
+ },
436
+ "background": {
437
+ "enum": [
438
+ "opaque",
439
+ "transparent"
440
+ ],
441
+ "type": "string",
442
+ "description": "Output background treatment. Defaults to opaque; transparent produces a PNG with alpha."
443
+ }
444
+ },
445
+ "additionalProperties": false
446
+ },
447
+ "data_class": "A",
448
+ "status": "coming_soon"
449
+ },
450
+ {
451
+ "byok": {
452
+ "key_name": "FAL_KEY",
453
+ "provider": "fal",
454
+ "data_class": "A"
455
+ },
456
+ "cost": {
457
+ "quote_required": true,
458
+ "credits_estimate": 80
459
+ },
460
+ "kind": "gen",
461
+ "name": "image_to_3d",
462
+ "apply": "import_model",
463
+ "title": "Image to 3D model",
464
+ "output": {
465
+ "type": "model_3d",
466
+ "formats": [
467
+ "glb"
468
+ ]
469
+ },
470
+ "display": {
471
+ "title": "Image to 3D",
472
+ "summary": "Turn an image or a description into a textured 3D model.",
473
+ "category": "3d_models"
474
+ },
475
+ "latency": "minutes",
476
+ "version": 1,
477
+ "approval": {
478
+ "confirm_over_credits": 0
479
+ },
480
+ "backends": [
481
+ "managed",
482
+ "byok"
483
+ ],
484
+ "namespace": "loopcut_cloud",
485
+ "description": "Creates a GLB mesh with PBR materials from an image, a prompt or both; at least one of image and prompt is required. Use it for a new prop or concept mesh, not dimensionally exact CAD or cleanup of an existing mesh. Drafts cost 25 credits and finals 80, usually taking 1–5 minutes; hidden surfaces are inferred and quads do not guarantee animation-ready edge flow. Applying the result imports the model and its materials into the scene.",
486
+ "file_inputs": [
487
+ {
488
+ "field": "image",
489
+ "accept": [
490
+ "image/png",
491
+ "image/jpeg",
492
+ "image/webp"
493
+ ],
494
+ "max_mb": 20,
495
+ "required": false
496
+ }
497
+ ],
498
+ "bundle_input": null,
499
+ "input_schema": {
500
+ "type": "object",
501
+ "required": [],
502
+ "properties": {
503
+ "prompt": {
504
+ "type": "string",
505
+ "maxLength": 4000,
506
+ "minLength": 1,
507
+ "description": "Describe the object to generate. Optional when an image file is supplied; otherwise required, at most 4000 characters."
508
+ },
509
+ "quality": {
510
+ "enum": [
511
+ "draft",
512
+ "final"
513
+ ],
514
+ "type": "string",
515
+ "description": "Generation detail. Defaults to final (80 credits); draft costs 25 credits."
516
+ },
517
+ "textured": {
518
+ "type": "boolean",
519
+ "description": "Include PBR materials and textures. Defaults to true; false returns geometry only."
520
+ },
521
+ "topology": {
522
+ "enum": [
523
+ "triangles",
524
+ "quads"
525
+ ],
526
+ "type": "string",
527
+ "description": "Preferred face topology. Defaults to triangles; quads are a target rather than a guarantee of clean edge flow."
528
+ }
529
+ },
530
+ "additionalProperties": false
531
+ },
532
+ "data_class": "A",
533
+ "status": "live"
534
+ },
535
+ {
536
+ "byok": null,
537
+ "cost": {
538
+ "quote_required": true,
539
+ "credits_estimate": 5
540
+ },
541
+ "kind": "assist",
542
+ "name": "lip_sync",
543
+ "apply": "apply_shape_keys",
544
+ "title": "Lip sync audio",
545
+ "output": {
546
+ "type": "report",
547
+ "formats": [
548
+ "json"
549
+ ]
550
+ },
551
+ "display": {
552
+ "title": "Lip sync",
553
+ "summary": "Animate a character's existing mouth shapes from a speech recording.",
554
+ "category": "characters"
555
+ },
556
+ "latency": "minutes",
557
+ "version": 1,
558
+ "approval": {
559
+ "confirm_over_credits": 0
560
+ },
561
+ "backends": [
562
+ "managed"
563
+ ],
564
+ "namespace": "loopcut_cloud",
565
+ "description": "Creates mouth animation curves from an existing speech recording for a mesh with viseme shape keys. Use it to synchronize a prepared face to recorded dialogue, not to generate speech, create missing shape keys or rig a face. Audio must be WAV or MP3 up to 100 MB; processing usually takes seconds to a few minutes per recorded minute and requires the target mesh’s existing viseme names. Applying the result animates those shape keys on the target mesh at the requested frame rate.",
566
+ "file_inputs": [
567
+ {
568
+ "field": "audio",
569
+ "accept": [
570
+ "audio/wav",
571
+ "audio/mpeg"
572
+ ],
573
+ "max_mb": 100,
574
+ "required": true
575
+ }
576
+ ],
577
+ "bundle_input": null,
578
+ "input_schema": {
579
+ "type": "object",
580
+ "required": [
581
+ "shape_keys"
582
+ ],
583
+ "properties": {
584
+ "fps": {
585
+ "type": "number",
586
+ "maximum": 120,
587
+ "minimum": 1,
588
+ "description": "Animation frames per second, including fractional rates such as 29.97. Defaults to 24."
589
+ },
590
+ "shape_keys": {
591
+ "type": "array",
592
+ "items": {
593
+ "type": "string",
594
+ "maxLength": 256,
595
+ "minLength": 1,
596
+ "description": "An existing viseme shape-key name on the target mesh."
597
+ },
598
+ "maxItems": 64,
599
+ "minItems": 1,
600
+ "description": "Names of the target mesh’s existing viseme shape keys. Required; 1–64 unique names.",
601
+ "uniqueItems": true
602
+ }
603
+ },
604
+ "additionalProperties": false
605
+ },
606
+ "data_class": "A",
607
+ "status": "coming_soon"
608
+ },
609
+ {
610
+ "byok": null,
611
+ "cost": {
612
+ "quote_required": true,
613
+ "credits_estimate": 5
614
+ },
615
+ "kind": "assist",
616
+ "name": "render",
617
+ "apply": "load_frames",
618
+ "title": "Render scene",
619
+ "output": {
620
+ "type": "render_frames",
621
+ "formats": [
622
+ "png",
623
+ "json"
624
+ ]
625
+ },
626
+ "display": {
627
+ "title": "Cloud rendering",
628
+ "summary": "Render your scene on cloud GPUs and get the frames back.",
629
+ "category": "render"
630
+ },
631
+ "latency": "long",
632
+ "version": 1,
633
+ "approval": {
634
+ "confirm_over_credits": 0
635
+ },
636
+ "backends": [
637
+ "managed"
638
+ ],
639
+ "namespace": "loopcut_cloud",
640
+ "description": "Renders the bundled Blender scene with Cycles or EEVEE on cloud GPUs and returns frames plus a QA report. Use it for final stills, frame ranges or a 360° turntable of an existing scene, not image generation or an interactive viewport preview. Render with the scene's own engine: pass engine \"eevee\" for a scene set to EEVEE. A self-contained scene bundle and a quote are required, and it costs 5 credits per GPU-minute with a one-minute minimum; render time ranges from minutes to hours depending on scene complexity, frame count and samples. Applying the result loads the frames and attaches the QA report.",
641
+ "file_inputs": [],
642
+ "bundle_input": {
643
+ "required": true,
644
+ "description": "Self-contained Blender scene bundle: entry is a .blend file, with all textures, linked libraries, caches and other external dependencies collected at relative paths. Member MIME types are unrestricted to support scene dependencies."
645
+ },
646
+ "input_schema": {
647
+ "type": "object",
648
+ "required": [],
649
+ "properties": {
650
+ "camera": {
651
+ "type": "string",
652
+ "maxLength": 256,
653
+ "minLength": 1,
654
+ "description": "Name of the scene camera object. If omitted, use the active camera in the bundle."
655
+ },
656
+ "engine": {
657
+ "enum": [
658
+ "cycles",
659
+ "eevee"
660
+ ],
661
+ "type": "string",
662
+ "description": "Render engine. Use the scene's own: \"eevee\" when scene.render.engine is BLENDER_EEVEE. Defaults to \"cycles\"."
663
+ },
664
+ "denoise": {
665
+ "type": "boolean",
666
+ "description": "Denoise rendered frames (Cycles; EEVEE ignores it). Defaults to true."
667
+ },
668
+ "samples": {
669
+ "type": "integer",
670
+ "maximum": 4096,
671
+ "minimum": 1,
672
+ "description": "Samples per pixel: Cycles samples, or EEVEE render samples. Defaults to 128 for Cycles and 64 for EEVEE."
673
+ },
674
+ "frame_end": {
675
+ "type": "integer",
676
+ "maximum": 1048574,
677
+ "minimum": -1048574,
678
+ "description": "Last frame to render, inclusive; must be at least frame_start. Defaults to frame_start for a single frame, or 120 frames for a turntable."
679
+ },
680
+ "turntable": {
681
+ "type": "object",
682
+ "properties": {
683
+ "margin": {
684
+ "type": "number",
685
+ "maximum": 3,
686
+ "minimum": 1,
687
+ "description": "Framing padding; 1 fits the targets' bounding sphere exactly. Defaults to 1.15."
688
+ },
689
+ "targets": {
690
+ "type": "array",
691
+ "items": {
692
+ "type": "string",
693
+ "maxLength": 256,
694
+ "minLength": 1
695
+ },
696
+ "maxItems": 64,
697
+ "description": "Objects to frame and orbit, usually the selection; their children are included. Empty or omitted frames the whole scene.",
698
+ "uniqueItems": true
699
+ },
700
+ "elevation_deg": {
701
+ "type": "number",
702
+ "maximum": 80,
703
+ "minimum": -80,
704
+ "description": "Camera height as an angle above the targets' centre. Defaults to 20."
705
+ }
706
+ },
707
+ "description": "Render a 360° turntable instead of the scene camera: a generated camera orbits the target objects (or the whole scene) once across frame_start..frame_end, so the frames loop seamlessly. If frame_end is omitted, renders 120 frames. A named camera only lends its lens.",
708
+ "additionalProperties": false
709
+ },
710
+ "frame_step": {
711
+ "type": "integer",
712
+ "maximum": 1048574,
713
+ "minimum": 1,
714
+ "description": "Spacing between rendered frames. Defaults to 1."
715
+ },
716
+ "frame_start": {
717
+ "type": "integer",
718
+ "maximum": 1048574,
719
+ "minimum": -1048574,
720
+ "description": "First frame to render, inclusive. Defaults to 1."
721
+ },
722
+ "resolution_pct": {
723
+ "type": "integer",
724
+ "maximum": 100,
725
+ "minimum": 10,
726
+ "description": "Percentage of the scene output resolution. Defaults to 100."
727
+ }
728
+ },
729
+ "additionalProperties": false
730
+ },
731
+ "data_class": "A",
732
+ "status": "live"
733
+ },
734
+ {
735
+ "byok": {
736
+ "key_name": "FAL_KEY",
737
+ "provider": "fal",
738
+ "data_class": "B"
739
+ },
740
+ "cost": {
741
+ "quote_required": true,
742
+ "credits_estimate": 5
743
+ },
744
+ "kind": "assist",
745
+ "name": "retopology",
746
+ "apply": "import_model",
747
+ "title": "Retopologize model",
748
+ "output": {
749
+ "type": "model_3d",
750
+ "formats": [
751
+ "glb"
752
+ ]
753
+ },
754
+ "display": {
755
+ "title": "Retopology",
756
+ "summary": "Rebuild a dense mesh with cleaner, lighter topology.",
757
+ "category": "3d_models"
758
+ },
759
+ "latency": "minutes",
760
+ "version": 1,
761
+ "approval": {
762
+ "confirm_over_credits": 0
763
+ },
764
+ "backends": [
765
+ "managed",
766
+ "byok"
767
+ ],
768
+ "namespace": "loopcut_cloud",
769
+ "description": "Rebuilds an existing GLB mesh with clean quad or triangle topology, unwraps it and bakes the original's textures (base colour, normal, roughness and metallic) onto the new mesh. Typical target_faces by purpose: about 2000–5000 for a game prop or background asset, 5000–10000 for an editing or sculpting base, 10000–20000 for a hero asset or character. Without target_faces the service chooses from the source, about half its triangle count within 4000–16000 quads. It does not generate new objects or guarantee deformation-ready edge loops. Input GLBs are limited to 150 MB; the current route supports up to 20000 quads or 40000 triangles, and processing usually takes under two minutes. It usually costs 5 credits (up to 60 on the backup route), never more than the quote. Applying the result imports a new mesh into the scene.",
770
+ "file_inputs": [
771
+ {
772
+ "field": "model",
773
+ "accept": [
774
+ "model/gltf-binary"
775
+ ],
776
+ "max_mb": 150,
777
+ "required": true
778
+ }
779
+ ],
780
+ "bundle_input": null,
781
+ "input_schema": {
782
+ "type": "object",
783
+ "required": [],
784
+ "properties": {
785
+ "topology": {
786
+ "enum": [
787
+ "quads",
788
+ "triangles"
789
+ ],
790
+ "type": "string",
791
+ "description": "Preferred output face topology. Defaults to quads."
792
+ },
793
+ "target_faces": {
794
+ "type": "integer",
795
+ "maximum": 200000,
796
+ "minimum": 500,
797
+ "description": "Output face count, 500–200000; the current route supports up to 20000 quads or 40000 triangles. Omit it to let the service choose from the source. By purpose: game prop or background asset 2000–5000, editing or sculpting base 5000–10000, hero asset or character 10000–20000."
798
+ }
799
+ },
800
+ "additionalProperties": false
801
+ },
802
+ "data_class": "A",
803
+ "status": "live"
804
+ },
805
+ {
806
+ "byok": {
807
+ "key_name": "ELEVENLABS_API_KEY",
808
+ "provider": "elevenlabs",
809
+ "data_class": "C"
810
+ },
811
+ "cost": {
812
+ "quote_required": true,
813
+ "credits_estimate": 4
814
+ },
815
+ "kind": "gen",
816
+ "name": "sfx",
817
+ "apply": "add_audio_strip",
818
+ "title": "Generate sound effect",
819
+ "output": {
820
+ "type": "audio",
821
+ "formats": [
822
+ "wav"
823
+ ]
824
+ },
825
+ "display": {
826
+ "title": "Sound effects",
827
+ "summary": "Create a sound effect from a short description.",
828
+ "category": "audio"
829
+ },
830
+ "latency": "seconds",
831
+ "version": 1,
832
+ "approval": {
833
+ "confirm_over_credits": 0
834
+ },
835
+ "backends": [
836
+ "managed",
837
+ "byok"
838
+ ],
839
+ "namespace": "loopcut_cloud",
840
+ "description": "Creates a sound effect from a description, with optional seamless looping. Use it for impacts, ambience or foley, not spoken dialogue, music or editing a recorded sound. Duration is limited to 0.5–30 seconds; most effects take 5–30 seconds; a take up to 6 seconds costs 4 credits, plus 1 credit per extra 2 seconds. Applying the result adds an audio strip to the sequencer.",
841
+ "file_inputs": [],
842
+ "bundle_input": null,
843
+ "input_schema": {
844
+ "type": "object",
845
+ "required": [
846
+ "prompt"
847
+ ],
848
+ "properties": {
849
+ "loop": {
850
+ "type": "boolean",
851
+ "description": "Make the start and end join for repeated playback. Defaults to false."
852
+ },
853
+ "prompt": {
854
+ "type": "string",
855
+ "maxLength": 4000,
856
+ "minLength": 1,
857
+ "description": "Describe the sound source, action, environment and acoustic character; at most 4000 characters."
858
+ },
859
+ "duration_seconds": {
860
+ "type": "number",
861
+ "maximum": 30,
862
+ "minimum": 0.5,
863
+ "description": "Length of the effect in seconds. Defaults to 2; accepted range is 0.5–30."
864
+ }
865
+ },
866
+ "additionalProperties": false
867
+ },
868
+ "data_class": "C",
869
+ "status": "live"
870
+ },
871
+ {
872
+ "byok": {
873
+ "key_name": "GEMINI_API_KEY",
874
+ "provider": "gemini",
875
+ "data_class": "B"
876
+ },
877
+ "cost": {
878
+ "quote_required": true,
879
+ "credits_estimate": 2
880
+ },
881
+ "kind": "gen",
882
+ "name": "voice_line",
883
+ "apply": "add_audio_strip",
884
+ "title": "Generate voice line",
885
+ "output": {
886
+ "type": "audio",
887
+ "formats": [
888
+ "wav"
889
+ ]
890
+ },
891
+ "display": {
892
+ "title": "Voice lines",
893
+ "summary": "Turn written lines into spoken audio for your scene.",
894
+ "category": "audio"
895
+ },
896
+ "latency": "seconds",
897
+ "version": 1,
898
+ "approval": {
899
+ "confirm_over_credits": 0
900
+ },
901
+ "backends": [
902
+ "managed",
903
+ "byok"
904
+ ],
905
+ "namespace": "loopcut_cloud",
906
+ "description": "Creates spoken audio from text with a selectable voice and performance direction. Use it for character lines or narration, not music, sound effects, voice cloning or cleaning a recorded performance. Text is limited to 2000 characters; a short line usually takes 5–30 seconds, at 10 credits per minute of speech, rounded up per line with a 1-credit minimum. Applying the result adds an audio strip to the sequencer.",
907
+ "file_inputs": [],
908
+ "bundle_input": null,
909
+ "input_schema": {
910
+ "type": "object",
911
+ "required": [
912
+ "text"
913
+ ],
914
+ "properties": {
915
+ "text": {
916
+ "type": "string",
917
+ "maxLength": 2000,
918
+ "minLength": 1,
919
+ "description": "Words to speak; at most 2000 characters."
920
+ },
921
+ "voice": {
922
+ "enum": [
923
+ "Zephyr",
924
+ "Puck",
925
+ "Charon",
926
+ "Kore",
927
+ "Fenrir",
928
+ "Leda",
929
+ "Aoede",
930
+ "Sulafat"
931
+ ],
932
+ "type": "string",
933
+ "description": "Voice character: Zephyr (bright), Puck (upbeat), Charon (informative), Kore (firm), Fenrir (excitable), Leda (youthful), Aoede (breezy), Sulafat (warm). Defaults to Kore."
934
+ },
935
+ "language": {
936
+ "type": "string",
937
+ "pattern": "^(?:[A-Za-z]{2,8}(?:-[A-Za-z0-9]{1,8})*|[xX](?:-[A-Za-z0-9]{1,8})+|[iI]-[A-Za-z0-9]{1,8})$",
938
+ "maxLength": 63,
939
+ "minLength": 2,
940
+ "description": "BCP-47 language tag, for example en-US or fr-FR. Defaults to en-US; supported languages depend on the route."
941
+ },
942
+ "direction": {
943
+ "type": "string",
944
+ "maxLength": 1000,
945
+ "minLength": 1,
946
+ "description": "Performance direction such as tone, pace and emotion; at most 1000 characters. If omitted, use a neutral delivery."
947
+ }
948
+ },
949
+ "additionalProperties": false
950
+ },
951
+ "data_class": "A",
952
+ "status": "live"
953
+ }
954
+ ]
955
+ }