instantclips-mcp 1.4.0 → 1.6.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.
@@ -7,10 +7,10 @@
7
7
  "serverInfo": {
8
8
  "name": "instantclips",
9
9
  "title": "InstantClips",
10
- "version": "0.5.0",
10
+ "version": "0.6.1",
11
11
  "websiteUrl": "https://instantclips.ai"
12
12
  },
13
- "instructions": "InstantClips turns a product into a short vertical marketing video.\n\nEvery video is drafted against a BRAND — a voice, a target market and a\nset of keywords. Getting the brand right matters more than anything else\nhere: a product drafted under the wrong company's voice renders perfectly\nand is still unusable. Never assume a product belongs to whatever brand\nthe account already has.\n\nStart by asking the user for their store's URL if you do not already know\nthe brand, and call `list_brands` to see what the account has. Unlike the\nwebsite, which takes a product link and gets out of the way, you can\nsimply ask — a short question here is cheaper than a wrongly branded\nvideo.\n\nThe workflow, in order:\n\n1. `import_product_from_url` with the product's page URL (or\n `create_product_from_images` with hosted image URLs). Both return\n immediately and import in the background. If the user already made\n the product on the website — dropped photos on the workbench, pasted\n a link there — find it with `list_products` (newest first) and\n continue from step 2.\n2. Poll `get_product` until `import_status` is \"imported\".\n - If it reports `brand_decision_required` with `drafting: false`, the\n brand could not be settled: the storefront does not match any brand\n on the account, or (photos) there was no page to detect one from.\n Stop and put the choice to the user: create a brand for it\n (`create_brand`) or attach it to one they already have\n (`set_product_brand`). Do not choose for them. For a photos product\n nothing was detected, so `create_brand` needs the name from the\n user, and the voice, target market and keywords they can give you.\n No direction is drafted until this is settled.\n - Otherwise the import also drafts a video direction — a six-section\n creative plan (Hook / Content Focus / Format / Suggesting Visual\n Aesthetic / Execution Guidelines /\n Strict Guidelines & Restrictions) — so keep polling until\n `video_direction.drafting` is false.\n3. Show the drafted direction to the user. Edit it with\n `update_video_direction`, or roll a completely different angle with\n `redraft_video_direction`. The direction is optional: an empty one is\n valid and generation still works. The render settings — ratio,\n resolution, duration_seconds, enable_audio — are parameters of\n `update_video_direction` too, and are never read from the direction\n text. So are the photos: `images` in `get_product` lists every one\n with `usable` and `selected`, and `selected_image_ids` chooses which\n the render uses. `format` and `format_options` name the angle a\n redraft can pin. `update_product` corrects the facts a draft is\n written from (name, description, price, the posted link, the photos)\n and `update_brand` the identity (voice, market, keywords); both feed\n the next draft, so redraft after.\n4. `generate_video`, passing `expected_credit_cost` — this SPENDS THE\n USER'S CREDITS. Get the user's explicit go-ahead first, and tell\n them the credit cost that `get_product` reports; the launch is\n refused, uncharged, if that number no longer matches.\n5. Poll `get_video` until status is \"done\", then give the user\n `output_url` (the finished MP4) and `share_url` (a public page).\n On a free account the MP4 carries the InstantClips watermark\n (`watermarked` is true); buying credits removes it from every video\n on the account.\n\nEvery get_product response carries `next_step`: what to do now and the\ntool to do it with. Read it before choosing a tool — it covers the\nstates this list does not: a failed import, a failed or stalled\ndirection draft, photos the video model will not take, a failed\nrender, a balance short of the cost.\n\nA product whose video has been generated is not finished with, but a\ngenerated video cannot be changed: its direction locks the moment\ngeneration starts, and re-importing the same URL returns the same\nproduct rather than a fresh one. Editing or redrafting such a product\nopens its next video's draft, seeded from the last one (the response\nsays `opened_new_video: true`), and `generate_video` with no draft\nrenders another take of the last plan as a new video. Continue from\nstep 3 either way.\n\nA render takes a few minutes. Poll every 20-30 seconds rather than in a\ntight loop, and tell the user what you are waiting on.\n",
13
+ "instructions": "InstantClips turns a product into a short vertical marketing video.\n\nEvery video is drafted against a BRAND — a voice, a target market and a\nset of keywords. Getting the brand right matters more than anything else\nhere: a product drafted under the wrong company's voice renders perfectly\nand is still unusable. Never assume a product belongs to whatever brand\nthe account already has.\n\nThat does not mean opening with a question. If the user has given you a\nproduct link, start with it: `import_product_from_url` reads the page,\ndetects the brand behind the storefront and matches it against the\nbrands already on the account, so the usual case needs no question at\nall — and asking for a store URL when they have just handed you a\nproduct URL reads as not having looked. Ask only when the import comes\nback with `brand_decision_required`, which is this server saying it\ncould not settle the brand itself; `list_brands` then gives you the\naccount's brands by name so you can offer the choice. With photos and no\nlink there is nothing to detect from, so expect to ask there.\n\nThe workflow, in order:\n\n1. `import_product_from_url` with the product's page URL, or\n `create_product_from_images` with the product's photos: hosted\n `image_urls`, or `image_files` when the client hands you the photos\n the user attached to the conversation (ChatGPT does). A URL import\n returns immediately and runs in the background; attached photos are\n imported before the call answers. If the user already made the\n product on the website — dropped photos on the workbench, pasted a\n link there — find it with `list_products` (newest first) and\n continue from step 2.\n2. Poll `get_product` until `import_status` is \"imported\".\n - If it reports `brand_decision_required` with `drafting: false`, the\n brand could not be settled: the storefront does not match any brand\n on the account, or (photos) there was no page to detect one from.\n Stop and put the choice to the user: create a brand for it\n (`create_brand`) or attach it to one they already have\n (`set_product_brand`). Do not choose for them. For a photos product\n nothing was detected, so `create_brand` needs the name from the\n user, and the voice, target market and keywords they can give you.\n No direction is drafted until this is settled.\n - Otherwise the import also drafts a video direction — a six-section\n creative plan (Hook / Content Focus / Format / Suggesting Visual\n Aesthetic / Execution Guidelines /\n Strict Guidelines & Restrictions) — so keep polling until\n `video_direction.drafting` is false.\n3. Show the drafted direction to the user. Edit it with\n `update_video_direction`, or roll a completely different angle with\n `redraft_video_direction`. The direction is optional: an empty one is\n valid and generation still works. The render settings — ratio,\n resolution, duration_seconds, enable_audio — are parameters of\n `update_video_direction` too, and are never read from the direction\n text. So are the photos: `images` in `get_product` lists every one\n with `usable` and `selected`, and `selected_image_ids` chooses which\n the render uses. `format` and `format_options` name the angle a\n redraft can pin. `update_product` corrects the facts a draft is\n written from (name, description, price, the posted link, the photos)\n and `update_brand` the identity (voice, market, keywords); both feed\n the next draft, so redraft after.\n4. `generate_video`, passing `expected_credit_cost` — this SPENDS THE\n USER'S CREDITS. Get the user's explicit go-ahead first, and ask for\n it in ONE message that carries everything they are agreeing to: what\n the video does, its settings (length, ratio, resolution, audio), the\n credit cost `get_product` reports, and — when\n `video_direction.watermark_expected` is there — that the file will\n carry the InstantClips watermark. A go-ahead is only informed if the\n price and the watermark were in front of them when they gave it. The\n launch is refused, uncharged, if the cost no longer matches.\n5. The render is queued, not finished. Answer with what the user needs:\n it takes 5 to 15 minutes depending on queue depth,\n length and resolution; `workbench_url` shows the video they just\n directed; and `email_on_completion` is mailed the moment it is done,\n so they can go and work on something else. Offer to keep checking\n only if this client can actually keep polling — nothing here will\n wake you up, and the email arrives whether or not your session\n lasts. Then poll `get_video` until status is \"done\" and give them\n `output_url` (the finished MP4) and `share_url` (a public page).\n Inside that window the wait is expected: describe it as normal\n rather than slow. Past it, it is not, and `next_step` switches to\n what is actually known — still marked rendering, no revised finish\n time — and then to support. It has the clock; follow it rather than\n any blanket rule about how to describe the wait.\n\n On a free account the MP4 carries the InstantClips watermark, which\n is why the draft says `watermark_expected` before the render and the\n finished video says `watermarked` after it. Both appear only when\n true; buying credits removes the watermark from every video on the\n account. When they are absent there is no watermark: say nothing\n about watermarks at all.\n\nEvery get_product response carries `next_step`: what to do now and the\ntool to do it with. Read it before choosing a tool — it covers the\nstates this list does not: a failed import, a failed or stalled\ndirection draft, photos the video model will not take, a failed\nrender, a balance short of the cost.\n\nA product whose video has been generated is not finished with, but a\ngenerated video cannot be changed: its direction locks the moment\ngeneration starts, and re-importing the same URL returns the same\nproduct rather than a fresh one. Editing or redrafting such a product\nopens its next video's draft, seeded from the last one (the response\nsays `opened_new_video: true`), and `generate_video` with no draft\nrenders another take of the last plan as a new video. Continue from\nstep 3 either way.\n\n",
14
14
  "tools": [
15
15
  {
16
16
  "name": "list_brands",
@@ -22,6 +22,76 @@
22
22
  "required": [],
23
23
  "$schema": "https://json-schema.org/draft/2020-12/schema"
24
24
  },
25
+ "outputSchema": {
26
+ "type": "object",
27
+ "properties": {
28
+ "brands": {
29
+ "type": "array",
30
+ "items": {
31
+ "type": "object",
32
+ "properties": {
33
+ "brand_id": {
34
+ "type": "string"
35
+ },
36
+ "name": {
37
+ "type": "string"
38
+ },
39
+ "target_market": {
40
+ "type": "string"
41
+ },
42
+ "voice": {
43
+ "type": "string"
44
+ },
45
+ "keywords": {
46
+ "type": "array",
47
+ "items": {
48
+ "type": "string"
49
+ }
50
+ },
51
+ "configured": {
52
+ "type": "boolean"
53
+ },
54
+ "is_default": {
55
+ "type": "boolean"
56
+ },
57
+ "product_count": {
58
+ "type": "integer"
59
+ }
60
+ },
61
+ "required": [
62
+ "brand_id",
63
+ "name",
64
+ "keywords",
65
+ "configured",
66
+ "is_default",
67
+ "product_count"
68
+ ]
69
+ }
70
+ },
71
+ "brands_used": {
72
+ "type": "integer"
73
+ },
74
+ "brand_limit": {
75
+ "type": [
76
+ "integer",
77
+ "null"
78
+ ]
79
+ },
80
+ "unlimited_brands": {
81
+ "type": "boolean"
82
+ },
83
+ "can_create_brand": {
84
+ "type": "boolean"
85
+ }
86
+ },
87
+ "required": [
88
+ "brands",
89
+ "brands_used",
90
+ "unlimited_brands",
91
+ "can_create_brand"
92
+ ],
93
+ "$schema": "https://json-schema.org/draft/2020-12/schema"
94
+ },
25
95
  "annotations": {
26
96
  "readOnlyHint": true,
27
97
  "destructiveHint": false,
@@ -54,6 +124,94 @@
54
124
  "required": [],
55
125
  "$schema": "https://json-schema.org/draft/2020-12/schema"
56
126
  },
127
+ "outputSchema": {
128
+ "type": "object",
129
+ "properties": {
130
+ "products": {
131
+ "type": "array",
132
+ "items": {
133
+ "type": "object",
134
+ "properties": {
135
+ "product_id": {
136
+ "type": "string"
137
+ },
138
+ "name": {
139
+ "type": "string"
140
+ },
141
+ "state": {
142
+ "type": "string"
143
+ },
144
+ "import_status": {
145
+ "type": "string"
146
+ },
147
+ "source_url": {
148
+ "type": "string"
149
+ },
150
+ "image_count": {
151
+ "type": "integer"
152
+ },
153
+ "brand": {
154
+ "type": "object",
155
+ "properties": {
156
+ "brand_id": {
157
+ "type": [
158
+ "string",
159
+ "null"
160
+ ]
161
+ },
162
+ "name": {
163
+ "type": [
164
+ "string",
165
+ "null"
166
+ ]
167
+ }
168
+ },
169
+ "required": []
170
+ },
171
+ "brand_decision_required": {
172
+ "type": "boolean"
173
+ },
174
+ "video_count": {
175
+ "type": "integer"
176
+ },
177
+ "latest_video_status": {
178
+ "type": "string"
179
+ },
180
+ "created_at": {
181
+ "type": "string"
182
+ },
183
+ "workbench_url": {
184
+ "type": "string"
185
+ }
186
+ },
187
+ "required": [
188
+ "product_id",
189
+ "state",
190
+ "image_count",
191
+ "video_count",
192
+ "created_at",
193
+ "workbench_url"
194
+ ]
195
+ }
196
+ },
197
+ "count": {
198
+ "type": "integer"
199
+ },
200
+ "total": {
201
+ "type": "integer"
202
+ },
203
+ "next_step": {
204
+ "type": "string"
205
+ }
206
+ },
207
+ "required": [
208
+ "products",
209
+ "count",
210
+ "total",
211
+ "next_step"
212
+ ],
213
+ "$schema": "https://json-schema.org/draft/2020-12/schema"
214
+ },
57
215
  "annotations": {
58
216
  "readOnlyHint": true,
59
217
  "destructiveHint": false,
@@ -82,6 +240,312 @@
82
240
  ],
83
241
  "$schema": "https://json-schema.org/draft/2020-12/schema"
84
242
  },
243
+ "outputSchema": {
244
+ "type": "object",
245
+ "properties": {
246
+ "product_id": {
247
+ "type": "string"
248
+ },
249
+ "name": {
250
+ "type": "string"
251
+ },
252
+ "description": {
253
+ "type": "string"
254
+ },
255
+ "price": {
256
+ "type": "string"
257
+ },
258
+ "link_url": {
259
+ "type": "string"
260
+ },
261
+ "source_url": {
262
+ "type": "string"
263
+ },
264
+ "import_status": {
265
+ "type": "string"
266
+ },
267
+ "import_failed_reason": {
268
+ "type": "string"
269
+ },
270
+ "image_count": {
271
+ "type": "integer"
272
+ },
273
+ "usable_image_count": {
274
+ "type": "integer"
275
+ },
276
+ "images": {
277
+ "type": "array",
278
+ "items": {
279
+ "type": "object",
280
+ "properties": {
281
+ "image_id": {
282
+ "type": "string"
283
+ },
284
+ "url": {
285
+ "type": "string"
286
+ },
287
+ "filename": {
288
+ "type": "string"
289
+ },
290
+ "usable": {
291
+ "type": "boolean"
292
+ },
293
+ "selected": {
294
+ "type": "boolean"
295
+ }
296
+ },
297
+ "required": [
298
+ "image_id",
299
+ "url",
300
+ "filename",
301
+ "usable",
302
+ "selected"
303
+ ]
304
+ }
305
+ },
306
+ "state": {
307
+ "type": "string"
308
+ },
309
+ "brand": {
310
+ "type": "object",
311
+ "properties": {
312
+ "brand_id": {
313
+ "type": "string"
314
+ },
315
+ "name": {
316
+ "type": "string"
317
+ },
318
+ "target_market": {
319
+ "type": [
320
+ "string",
321
+ "null"
322
+ ]
323
+ },
324
+ "keywords": {
325
+ "type": "array",
326
+ "items": {
327
+ "type": "string"
328
+ }
329
+ }
330
+ },
331
+ "required": [
332
+ "brand_id",
333
+ "name",
334
+ "keywords"
335
+ ]
336
+ },
337
+ "brand_decision_required": {
338
+ "type": "object",
339
+ "properties": {
340
+ "drafting": {
341
+ "type": "boolean"
342
+ },
343
+ "reason": {
344
+ "type": "string"
345
+ },
346
+ "detected_brand_name": {
347
+ "type": [
348
+ "string",
349
+ "null"
350
+ ]
351
+ },
352
+ "existing_brands": {
353
+ "type": "array",
354
+ "items": {
355
+ "type": "object",
356
+ "properties": {
357
+ "brand_id": {
358
+ "type": "string"
359
+ },
360
+ "name": {
361
+ "type": "string"
362
+ },
363
+ "target_market": {
364
+ "type": [
365
+ "string",
366
+ "null"
367
+ ]
368
+ },
369
+ "keywords": {
370
+ "type": "array",
371
+ "items": {
372
+ "type": "string"
373
+ }
374
+ }
375
+ },
376
+ "required": [
377
+ "brand_id",
378
+ "name",
379
+ "keywords"
380
+ ]
381
+ }
382
+ },
383
+ "can_create_brand": {
384
+ "type": "boolean"
385
+ },
386
+ "brand_limit": {
387
+ "type": [
388
+ "integer",
389
+ "null"
390
+ ]
391
+ },
392
+ "brands_used": {
393
+ "type": "integer"
394
+ },
395
+ "resolve_with": {
396
+ "type": "string"
397
+ }
398
+ },
399
+ "required": [
400
+ "drafting"
401
+ ]
402
+ },
403
+ "workbench_url": {
404
+ "type": "string"
405
+ },
406
+ "video_direction": {
407
+ "type": "object",
408
+ "properties": {
409
+ "video_request_id": {
410
+ "type": "string"
411
+ },
412
+ "drafting": {
413
+ "type": "boolean"
414
+ },
415
+ "creative_direction": {
416
+ "type": "string"
417
+ },
418
+ "draft_failed": {
419
+ "type": "boolean"
420
+ },
421
+ "draft_error": {
422
+ "type": "string"
423
+ },
424
+ "creator_note": {
425
+ "type": "string"
426
+ },
427
+ "format": {
428
+ "type": "string"
429
+ },
430
+ "format_options": {
431
+ "type": "array",
432
+ "items": {
433
+ "type": "object",
434
+ "properties": {
435
+ "key": {
436
+ "type": "string"
437
+ },
438
+ "summary": {
439
+ "type": "string"
440
+ }
441
+ },
442
+ "required": [
443
+ "key",
444
+ "summary"
445
+ ]
446
+ }
447
+ },
448
+ "selected_image_ids": {
449
+ "type": "array",
450
+ "items": {
451
+ "type": "string"
452
+ }
453
+ },
454
+ "ratio": {
455
+ "type": "string"
456
+ },
457
+ "resolution": {
458
+ "type": "string"
459
+ },
460
+ "duration_seconds": {
461
+ "type": "integer"
462
+ },
463
+ "enable_audio": {
464
+ "type": "boolean"
465
+ },
466
+ "target_market": {
467
+ "type": "string"
468
+ },
469
+ "credit_cost": {
470
+ "type": "number"
471
+ },
472
+ "affordable": {
473
+ "type": "boolean"
474
+ },
475
+ "watermark_expected": {
476
+ "type": "boolean"
477
+ },
478
+ "editable": {
479
+ "type": "boolean"
480
+ }
481
+ },
482
+ "required": [
483
+ "video_request_id",
484
+ "drafting",
485
+ "draft_failed",
486
+ "format_options",
487
+ "selected_image_ids",
488
+ "credit_cost",
489
+ "editable"
490
+ ]
491
+ },
492
+ "videos": {
493
+ "type": "array",
494
+ "items": {
495
+ "type": "object",
496
+ "properties": {
497
+ "video_request_id": {
498
+ "type": "string"
499
+ },
500
+ "status": {
501
+ "type": "string"
502
+ },
503
+ "failed_reason": {
504
+ "type": "string"
505
+ },
506
+ "output_url": {
507
+ "type": "string"
508
+ },
509
+ "watermarked": {
510
+ "type": "boolean"
511
+ },
512
+ "duration_seconds": {
513
+ "type": "integer"
514
+ },
515
+ "script": {
516
+ "type": "string"
517
+ },
518
+ "share_url": {
519
+ "type": "string"
520
+ }
521
+ },
522
+ "required": [
523
+ "video_request_id",
524
+ "status"
525
+ ]
526
+ }
527
+ },
528
+ "next_step": {
529
+ "type": "string"
530
+ },
531
+ "already_imported": {
532
+ "type": "boolean"
533
+ },
534
+ "retried": {
535
+ "type": "boolean"
536
+ }
537
+ },
538
+ "required": [
539
+ "product_id",
540
+ "image_count",
541
+ "usable_image_count",
542
+ "images",
543
+ "state",
544
+ "workbench_url",
545
+ "videos"
546
+ ],
547
+ "$schema": "https://json-schema.org/draft/2020-12/schema"
548
+ },
85
549
  "annotations": {
86
550
  "readOnlyHint": false,
87
551
  "destructiveHint": true,
@@ -91,8 +555,8 @@
91
555
  },
92
556
  {
93
557
  "name": "create_product_from_images",
94
- "title": "Create a product from image URLs",
95
- "description": "Start a new InstantClips product from hosted product photos, for a\nproduct that has no public page to scrape.\n\nImages must be publicly reachable URLs — this endpoint cannot read files\nfrom the caller's machine. Images larger than\n8MB are skipped; at most\n9 are used in a render.\n\nReturns immediately with a product_id; the downloads run in the\nbackground. Poll `get_product` until `import_status` is \"imported\".\n\nPhotos carry no brand identity, so nothing can detect the brand here.\nWithout `brand_id` the product waits on a brand decision\n(`brand_decision_required` on the response and on `get_product`) and\nno video direction is drafted until it is settled with\n`set_product_brand` or `create_brand`. Ask the user which brand this\nis; do not pick for them.\n\nPrefer `import_product_from_url` when a product page exists — the scrape\nalso collects the name, description, price and brand identity, which\nmake for a far better direction draft than images alone.\n\nDirection drafting sends product facts, photos and brand context to\nan external AI service when the product is ready and its brand is settled.\n\nThis does not spend credits. Only `generate_video` does.\n",
558
+ "title": "Create a product from photos",
559
+ "description": "Start a new InstantClips product from product photos, for a product\nthat has no public page to scrape.\n\nPhotos arrive one of two ways: `image_urls`, publicly reachable URLs,\nor `image_files`, the photos the user attached to the conversation,\nfor clients that pass attachments to tools (ChatGPT fills it in from\nthe attachments — do not build it by hand). Either or both, at least\none photo. This endpoint cannot read files from the caller's machine.\nImages larger than 8MB are skipped; at\nmost 9 are used in a render.\n\nWith `image_urls` alone the downloads run in the background: poll\n`get_product` until `import_status` is \"imported\". Attached photos are\ndownloaded before this call answers, so the product comes back\nimported — or failed, with the reason and the way on in `next_step`.\n\nPhotos carry no brand identity, so nothing can detect the brand here.\nWithout `brand_id` the product waits on a brand decision\n(`brand_decision_required` on the response and on `get_product`) and\nno video direction is drafted until it is settled with\n`set_product_brand` or `create_brand`. Ask the user which brand this\nis; do not pick for them.\n\nPrefer `import_product_from_url` when a product page exists — the scrape\nalso collects the name, description, price and brand identity, which\nmake for a far better direction draft than images alone.\n\nDirection drafting sends product facts, photos and brand context to\nan external AI service when the product is ready and its brand is settled.\n\nThis does not spend credits. Only `generate_video` does.\n",
96
560
  "inputSchema": {
97
561
  "type": "object",
98
562
  "properties": {
@@ -104,6 +568,32 @@
104
568
  "description": "Publicly reachable image URLs, most representative first.",
105
569
  "minItems": 1
106
570
  },
571
+ "image_files": {
572
+ "type": "array",
573
+ "items": {
574
+ "type": "object",
575
+ "properties": {
576
+ "download_url": {
577
+ "type": "string"
578
+ },
579
+ "file_id": {
580
+ "type": "string"
581
+ },
582
+ "mime_type": {
583
+ "type": "string"
584
+ },
585
+ "file_name": {
586
+ "type": "string"
587
+ }
588
+ },
589
+ "required": [
590
+ "download_url",
591
+ "file_id"
592
+ ],
593
+ "additionalProperties": false
594
+ },
595
+ "description": "Photos attached to the conversation, as the client supplies them (a download_url and file_id per file). Leave it out unless the client filled it in."
596
+ },
107
597
  "name": {
108
598
  "type": "string",
109
599
  "description": "Product name."
@@ -122,16 +612,320 @@
122
612
  }
123
613
  },
124
614
  "required": [
125
- "image_urls",
126
615
  "name"
127
616
  ],
128
617
  "$schema": "https://json-schema.org/draft/2020-12/schema"
129
618
  },
619
+ "outputSchema": {
620
+ "type": "object",
621
+ "properties": {
622
+ "product_id": {
623
+ "type": "string"
624
+ },
625
+ "name": {
626
+ "type": "string"
627
+ },
628
+ "description": {
629
+ "type": "string"
630
+ },
631
+ "price": {
632
+ "type": "string"
633
+ },
634
+ "link_url": {
635
+ "type": "string"
636
+ },
637
+ "source_url": {
638
+ "type": "string"
639
+ },
640
+ "import_status": {
641
+ "type": "string"
642
+ },
643
+ "import_failed_reason": {
644
+ "type": "string"
645
+ },
646
+ "image_count": {
647
+ "type": "integer"
648
+ },
649
+ "usable_image_count": {
650
+ "type": "integer"
651
+ },
652
+ "images": {
653
+ "type": "array",
654
+ "items": {
655
+ "type": "object",
656
+ "properties": {
657
+ "image_id": {
658
+ "type": "string"
659
+ },
660
+ "url": {
661
+ "type": "string"
662
+ },
663
+ "filename": {
664
+ "type": "string"
665
+ },
666
+ "usable": {
667
+ "type": "boolean"
668
+ },
669
+ "selected": {
670
+ "type": "boolean"
671
+ }
672
+ },
673
+ "required": [
674
+ "image_id",
675
+ "url",
676
+ "filename",
677
+ "usable",
678
+ "selected"
679
+ ]
680
+ }
681
+ },
682
+ "state": {
683
+ "type": "string"
684
+ },
685
+ "brand": {
686
+ "type": "object",
687
+ "properties": {
688
+ "brand_id": {
689
+ "type": "string"
690
+ },
691
+ "name": {
692
+ "type": "string"
693
+ },
694
+ "target_market": {
695
+ "type": [
696
+ "string",
697
+ "null"
698
+ ]
699
+ },
700
+ "keywords": {
701
+ "type": "array",
702
+ "items": {
703
+ "type": "string"
704
+ }
705
+ }
706
+ },
707
+ "required": [
708
+ "brand_id",
709
+ "name",
710
+ "keywords"
711
+ ]
712
+ },
713
+ "brand_decision_required": {
714
+ "type": "object",
715
+ "properties": {
716
+ "drafting": {
717
+ "type": "boolean"
718
+ },
719
+ "reason": {
720
+ "type": "string"
721
+ },
722
+ "detected_brand_name": {
723
+ "type": [
724
+ "string",
725
+ "null"
726
+ ]
727
+ },
728
+ "existing_brands": {
729
+ "type": "array",
730
+ "items": {
731
+ "type": "object",
732
+ "properties": {
733
+ "brand_id": {
734
+ "type": "string"
735
+ },
736
+ "name": {
737
+ "type": "string"
738
+ },
739
+ "target_market": {
740
+ "type": [
741
+ "string",
742
+ "null"
743
+ ]
744
+ },
745
+ "keywords": {
746
+ "type": "array",
747
+ "items": {
748
+ "type": "string"
749
+ }
750
+ }
751
+ },
752
+ "required": [
753
+ "brand_id",
754
+ "name",
755
+ "keywords"
756
+ ]
757
+ }
758
+ },
759
+ "can_create_brand": {
760
+ "type": "boolean"
761
+ },
762
+ "brand_limit": {
763
+ "type": [
764
+ "integer",
765
+ "null"
766
+ ]
767
+ },
768
+ "brands_used": {
769
+ "type": "integer"
770
+ },
771
+ "resolve_with": {
772
+ "type": "string"
773
+ }
774
+ },
775
+ "required": [
776
+ "drafting"
777
+ ]
778
+ },
779
+ "workbench_url": {
780
+ "type": "string"
781
+ },
782
+ "video_direction": {
783
+ "type": "object",
784
+ "properties": {
785
+ "video_request_id": {
786
+ "type": "string"
787
+ },
788
+ "drafting": {
789
+ "type": "boolean"
790
+ },
791
+ "creative_direction": {
792
+ "type": "string"
793
+ },
794
+ "draft_failed": {
795
+ "type": "boolean"
796
+ },
797
+ "draft_error": {
798
+ "type": "string"
799
+ },
800
+ "creator_note": {
801
+ "type": "string"
802
+ },
803
+ "format": {
804
+ "type": "string"
805
+ },
806
+ "format_options": {
807
+ "type": "array",
808
+ "items": {
809
+ "type": "object",
810
+ "properties": {
811
+ "key": {
812
+ "type": "string"
813
+ },
814
+ "summary": {
815
+ "type": "string"
816
+ }
817
+ },
818
+ "required": [
819
+ "key",
820
+ "summary"
821
+ ]
822
+ }
823
+ },
824
+ "selected_image_ids": {
825
+ "type": "array",
826
+ "items": {
827
+ "type": "string"
828
+ }
829
+ },
830
+ "ratio": {
831
+ "type": "string"
832
+ },
833
+ "resolution": {
834
+ "type": "string"
835
+ },
836
+ "duration_seconds": {
837
+ "type": "integer"
838
+ },
839
+ "enable_audio": {
840
+ "type": "boolean"
841
+ },
842
+ "target_market": {
843
+ "type": "string"
844
+ },
845
+ "credit_cost": {
846
+ "type": "number"
847
+ },
848
+ "affordable": {
849
+ "type": "boolean"
850
+ },
851
+ "watermark_expected": {
852
+ "type": "boolean"
853
+ },
854
+ "editable": {
855
+ "type": "boolean"
856
+ }
857
+ },
858
+ "required": [
859
+ "video_request_id",
860
+ "drafting",
861
+ "draft_failed",
862
+ "format_options",
863
+ "selected_image_ids",
864
+ "credit_cost",
865
+ "editable"
866
+ ]
867
+ },
868
+ "videos": {
869
+ "type": "array",
870
+ "items": {
871
+ "type": "object",
872
+ "properties": {
873
+ "video_request_id": {
874
+ "type": "string"
875
+ },
876
+ "status": {
877
+ "type": "string"
878
+ },
879
+ "failed_reason": {
880
+ "type": "string"
881
+ },
882
+ "output_url": {
883
+ "type": "string"
884
+ },
885
+ "watermarked": {
886
+ "type": "boolean"
887
+ },
888
+ "duration_seconds": {
889
+ "type": "integer"
890
+ },
891
+ "script": {
892
+ "type": "string"
893
+ },
894
+ "share_url": {
895
+ "type": "string"
896
+ }
897
+ },
898
+ "required": [
899
+ "video_request_id",
900
+ "status"
901
+ ]
902
+ }
903
+ },
904
+ "next_step": {
905
+ "type": "string"
906
+ }
907
+ },
908
+ "required": [
909
+ "product_id",
910
+ "image_count",
911
+ "usable_image_count",
912
+ "images",
913
+ "state",
914
+ "workbench_url",
915
+ "videos"
916
+ ],
917
+ "$schema": "https://json-schema.org/draft/2020-12/schema"
918
+ },
130
919
  "annotations": {
131
920
  "readOnlyHint": false,
132
921
  "destructiveHint": false,
133
922
  "idempotentHint": false,
134
923
  "openWorldHint": true
924
+ },
925
+ "_meta": {
926
+ "openai/fileParams": [
927
+ "image_files"
928
+ ]
135
929
  }
136
930
  },
137
931
  {
@@ -151,6 +945,310 @@
151
945
  ],
152
946
  "$schema": "https://json-schema.org/draft/2020-12/schema"
153
947
  },
948
+ "outputSchema": {
949
+ "type": "object",
950
+ "properties": {
951
+ "product_id": {
952
+ "type": "string"
953
+ },
954
+ "name": {
955
+ "type": "string"
956
+ },
957
+ "description": {
958
+ "type": "string"
959
+ },
960
+ "price": {
961
+ "type": "string"
962
+ },
963
+ "link_url": {
964
+ "type": "string"
965
+ },
966
+ "source_url": {
967
+ "type": "string"
968
+ },
969
+ "import_status": {
970
+ "type": "string"
971
+ },
972
+ "import_failed_reason": {
973
+ "type": "string"
974
+ },
975
+ "image_count": {
976
+ "type": "integer"
977
+ },
978
+ "usable_image_count": {
979
+ "type": "integer"
980
+ },
981
+ "images": {
982
+ "type": "array",
983
+ "items": {
984
+ "type": "object",
985
+ "properties": {
986
+ "image_id": {
987
+ "type": "string"
988
+ },
989
+ "url": {
990
+ "type": "string"
991
+ },
992
+ "filename": {
993
+ "type": "string"
994
+ },
995
+ "usable": {
996
+ "type": "boolean"
997
+ },
998
+ "selected": {
999
+ "type": "boolean"
1000
+ }
1001
+ },
1002
+ "required": [
1003
+ "image_id",
1004
+ "url",
1005
+ "filename",
1006
+ "usable",
1007
+ "selected"
1008
+ ]
1009
+ }
1010
+ },
1011
+ "state": {
1012
+ "type": "string"
1013
+ },
1014
+ "brand": {
1015
+ "type": "object",
1016
+ "properties": {
1017
+ "brand_id": {
1018
+ "type": "string"
1019
+ },
1020
+ "name": {
1021
+ "type": "string"
1022
+ },
1023
+ "target_market": {
1024
+ "type": [
1025
+ "string",
1026
+ "null"
1027
+ ]
1028
+ },
1029
+ "keywords": {
1030
+ "type": "array",
1031
+ "items": {
1032
+ "type": "string"
1033
+ }
1034
+ }
1035
+ },
1036
+ "required": [
1037
+ "brand_id",
1038
+ "name",
1039
+ "keywords"
1040
+ ]
1041
+ },
1042
+ "brand_decision_required": {
1043
+ "type": "object",
1044
+ "properties": {
1045
+ "drafting": {
1046
+ "type": "boolean"
1047
+ },
1048
+ "reason": {
1049
+ "type": "string"
1050
+ },
1051
+ "detected_brand_name": {
1052
+ "type": [
1053
+ "string",
1054
+ "null"
1055
+ ]
1056
+ },
1057
+ "existing_brands": {
1058
+ "type": "array",
1059
+ "items": {
1060
+ "type": "object",
1061
+ "properties": {
1062
+ "brand_id": {
1063
+ "type": "string"
1064
+ },
1065
+ "name": {
1066
+ "type": "string"
1067
+ },
1068
+ "target_market": {
1069
+ "type": [
1070
+ "string",
1071
+ "null"
1072
+ ]
1073
+ },
1074
+ "keywords": {
1075
+ "type": "array",
1076
+ "items": {
1077
+ "type": "string"
1078
+ }
1079
+ }
1080
+ },
1081
+ "required": [
1082
+ "brand_id",
1083
+ "name",
1084
+ "keywords"
1085
+ ]
1086
+ }
1087
+ },
1088
+ "can_create_brand": {
1089
+ "type": "boolean"
1090
+ },
1091
+ "brand_limit": {
1092
+ "type": [
1093
+ "integer",
1094
+ "null"
1095
+ ]
1096
+ },
1097
+ "brands_used": {
1098
+ "type": "integer"
1099
+ },
1100
+ "resolve_with": {
1101
+ "type": "string"
1102
+ }
1103
+ },
1104
+ "required": [
1105
+ "drafting"
1106
+ ]
1107
+ },
1108
+ "workbench_url": {
1109
+ "type": "string"
1110
+ },
1111
+ "video_direction": {
1112
+ "type": "object",
1113
+ "properties": {
1114
+ "video_request_id": {
1115
+ "type": "string"
1116
+ },
1117
+ "drafting": {
1118
+ "type": "boolean"
1119
+ },
1120
+ "creative_direction": {
1121
+ "type": "string"
1122
+ },
1123
+ "draft_failed": {
1124
+ "type": "boolean"
1125
+ },
1126
+ "draft_error": {
1127
+ "type": "string"
1128
+ },
1129
+ "creator_note": {
1130
+ "type": "string"
1131
+ },
1132
+ "format": {
1133
+ "type": "string"
1134
+ },
1135
+ "format_options": {
1136
+ "type": "array",
1137
+ "items": {
1138
+ "type": "object",
1139
+ "properties": {
1140
+ "key": {
1141
+ "type": "string"
1142
+ },
1143
+ "summary": {
1144
+ "type": "string"
1145
+ }
1146
+ },
1147
+ "required": [
1148
+ "key",
1149
+ "summary"
1150
+ ]
1151
+ }
1152
+ },
1153
+ "selected_image_ids": {
1154
+ "type": "array",
1155
+ "items": {
1156
+ "type": "string"
1157
+ }
1158
+ },
1159
+ "ratio": {
1160
+ "type": "string"
1161
+ },
1162
+ "resolution": {
1163
+ "type": "string"
1164
+ },
1165
+ "duration_seconds": {
1166
+ "type": "integer"
1167
+ },
1168
+ "enable_audio": {
1169
+ "type": "boolean"
1170
+ },
1171
+ "target_market": {
1172
+ "type": "string"
1173
+ },
1174
+ "credit_cost": {
1175
+ "type": "number"
1176
+ },
1177
+ "affordable": {
1178
+ "type": "boolean"
1179
+ },
1180
+ "watermark_expected": {
1181
+ "type": "boolean"
1182
+ },
1183
+ "editable": {
1184
+ "type": "boolean"
1185
+ }
1186
+ },
1187
+ "required": [
1188
+ "video_request_id",
1189
+ "drafting",
1190
+ "draft_failed",
1191
+ "format_options",
1192
+ "selected_image_ids",
1193
+ "credit_cost",
1194
+ "editable"
1195
+ ]
1196
+ },
1197
+ "videos": {
1198
+ "type": "array",
1199
+ "items": {
1200
+ "type": "object",
1201
+ "properties": {
1202
+ "video_request_id": {
1203
+ "type": "string"
1204
+ },
1205
+ "status": {
1206
+ "type": "string"
1207
+ },
1208
+ "failed_reason": {
1209
+ "type": "string"
1210
+ },
1211
+ "output_url": {
1212
+ "type": "string"
1213
+ },
1214
+ "watermarked": {
1215
+ "type": "boolean"
1216
+ },
1217
+ "duration_seconds": {
1218
+ "type": "integer"
1219
+ },
1220
+ "script": {
1221
+ "type": "string"
1222
+ },
1223
+ "share_url": {
1224
+ "type": "string"
1225
+ }
1226
+ },
1227
+ "required": [
1228
+ "video_request_id",
1229
+ "status"
1230
+ ]
1231
+ }
1232
+ },
1233
+ "next_step": {
1234
+ "type": "string"
1235
+ },
1236
+ "credits_remaining": {
1237
+ "type": "number"
1238
+ }
1239
+ },
1240
+ "required": [
1241
+ "product_id",
1242
+ "image_count",
1243
+ "usable_image_count",
1244
+ "images",
1245
+ "state",
1246
+ "workbench_url",
1247
+ "videos",
1248
+ "credits_remaining"
1249
+ ],
1250
+ "$schema": "https://json-schema.org/draft/2020-12/schema"
1251
+ },
154
1252
  "annotations": {
155
1253
  "readOnlyHint": true,
156
1254
  "destructiveHint": false,
@@ -194,6 +1292,335 @@
194
1292
  ],
195
1293
  "$schema": "https://json-schema.org/draft/2020-12/schema"
196
1294
  },
1295
+ "outputSchema": {
1296
+ "type": "object",
1297
+ "properties": {
1298
+ "product_id": {
1299
+ "type": "string"
1300
+ },
1301
+ "name": {
1302
+ "type": "string"
1303
+ },
1304
+ "description": {
1305
+ "type": "string"
1306
+ },
1307
+ "price": {
1308
+ "type": "string"
1309
+ },
1310
+ "link_url": {
1311
+ "type": "string"
1312
+ },
1313
+ "source_url": {
1314
+ "type": "string"
1315
+ },
1316
+ "import_status": {
1317
+ "type": "string"
1318
+ },
1319
+ "import_failed_reason": {
1320
+ "type": "string"
1321
+ },
1322
+ "image_count": {
1323
+ "type": "integer"
1324
+ },
1325
+ "usable_image_count": {
1326
+ "type": "integer"
1327
+ },
1328
+ "images": {
1329
+ "type": "array",
1330
+ "items": {
1331
+ "type": "object",
1332
+ "properties": {
1333
+ "image_id": {
1334
+ "type": "string"
1335
+ },
1336
+ "url": {
1337
+ "type": "string"
1338
+ },
1339
+ "filename": {
1340
+ "type": "string"
1341
+ },
1342
+ "usable": {
1343
+ "type": "boolean"
1344
+ },
1345
+ "selected": {
1346
+ "type": "boolean"
1347
+ }
1348
+ },
1349
+ "required": [
1350
+ "image_id",
1351
+ "url",
1352
+ "filename",
1353
+ "usable",
1354
+ "selected"
1355
+ ]
1356
+ }
1357
+ },
1358
+ "state": {
1359
+ "type": "string"
1360
+ },
1361
+ "brand": {
1362
+ "type": "object",
1363
+ "properties": {
1364
+ "brand_id": {
1365
+ "type": "string"
1366
+ },
1367
+ "name": {
1368
+ "type": "string"
1369
+ },
1370
+ "target_market": {
1371
+ "type": [
1372
+ "string",
1373
+ "null"
1374
+ ]
1375
+ },
1376
+ "keywords": {
1377
+ "type": "array",
1378
+ "items": {
1379
+ "type": "string"
1380
+ }
1381
+ }
1382
+ },
1383
+ "required": [
1384
+ "brand_id",
1385
+ "name",
1386
+ "keywords"
1387
+ ]
1388
+ },
1389
+ "brand_decision_required": {
1390
+ "type": "object",
1391
+ "properties": {
1392
+ "drafting": {
1393
+ "type": "boolean"
1394
+ },
1395
+ "reason": {
1396
+ "type": "string"
1397
+ },
1398
+ "detected_brand_name": {
1399
+ "type": [
1400
+ "string",
1401
+ "null"
1402
+ ]
1403
+ },
1404
+ "existing_brands": {
1405
+ "type": "array",
1406
+ "items": {
1407
+ "type": "object",
1408
+ "properties": {
1409
+ "brand_id": {
1410
+ "type": "string"
1411
+ },
1412
+ "name": {
1413
+ "type": "string"
1414
+ },
1415
+ "target_market": {
1416
+ "type": [
1417
+ "string",
1418
+ "null"
1419
+ ]
1420
+ },
1421
+ "keywords": {
1422
+ "type": "array",
1423
+ "items": {
1424
+ "type": "string"
1425
+ }
1426
+ }
1427
+ },
1428
+ "required": [
1429
+ "brand_id",
1430
+ "name",
1431
+ "keywords"
1432
+ ]
1433
+ }
1434
+ },
1435
+ "can_create_brand": {
1436
+ "type": "boolean"
1437
+ },
1438
+ "brand_limit": {
1439
+ "type": [
1440
+ "integer",
1441
+ "null"
1442
+ ]
1443
+ },
1444
+ "brands_used": {
1445
+ "type": "integer"
1446
+ },
1447
+ "resolve_with": {
1448
+ "type": "string"
1449
+ }
1450
+ },
1451
+ "required": [
1452
+ "drafting"
1453
+ ]
1454
+ },
1455
+ "workbench_url": {
1456
+ "type": "string"
1457
+ },
1458
+ "video_direction": {
1459
+ "type": "object",
1460
+ "properties": {
1461
+ "video_request_id": {
1462
+ "type": "string"
1463
+ },
1464
+ "drafting": {
1465
+ "type": "boolean"
1466
+ },
1467
+ "creative_direction": {
1468
+ "type": "string"
1469
+ },
1470
+ "draft_failed": {
1471
+ "type": "boolean"
1472
+ },
1473
+ "draft_error": {
1474
+ "type": "string"
1475
+ },
1476
+ "creator_note": {
1477
+ "type": "string"
1478
+ },
1479
+ "format": {
1480
+ "type": "string"
1481
+ },
1482
+ "format_options": {
1483
+ "type": "array",
1484
+ "items": {
1485
+ "type": "object",
1486
+ "properties": {
1487
+ "key": {
1488
+ "type": "string"
1489
+ },
1490
+ "summary": {
1491
+ "type": "string"
1492
+ }
1493
+ },
1494
+ "required": [
1495
+ "key",
1496
+ "summary"
1497
+ ]
1498
+ }
1499
+ },
1500
+ "selected_image_ids": {
1501
+ "type": "array",
1502
+ "items": {
1503
+ "type": "string"
1504
+ }
1505
+ },
1506
+ "ratio": {
1507
+ "type": "string"
1508
+ },
1509
+ "resolution": {
1510
+ "type": "string"
1511
+ },
1512
+ "duration_seconds": {
1513
+ "type": "integer"
1514
+ },
1515
+ "enable_audio": {
1516
+ "type": "boolean"
1517
+ },
1518
+ "target_market": {
1519
+ "type": "string"
1520
+ },
1521
+ "credit_cost": {
1522
+ "type": "number"
1523
+ },
1524
+ "affordable": {
1525
+ "type": "boolean"
1526
+ },
1527
+ "watermark_expected": {
1528
+ "type": "boolean"
1529
+ },
1530
+ "editable": {
1531
+ "type": "boolean"
1532
+ }
1533
+ },
1534
+ "required": [
1535
+ "video_request_id",
1536
+ "drafting",
1537
+ "draft_failed",
1538
+ "format_options",
1539
+ "selected_image_ids",
1540
+ "credit_cost",
1541
+ "editable"
1542
+ ]
1543
+ },
1544
+ "videos": {
1545
+ "type": "array",
1546
+ "items": {
1547
+ "type": "object",
1548
+ "properties": {
1549
+ "video_request_id": {
1550
+ "type": "string"
1551
+ },
1552
+ "status": {
1553
+ "type": "string"
1554
+ },
1555
+ "failed_reason": {
1556
+ "type": "string"
1557
+ },
1558
+ "output_url": {
1559
+ "type": "string"
1560
+ },
1561
+ "watermarked": {
1562
+ "type": "boolean"
1563
+ },
1564
+ "duration_seconds": {
1565
+ "type": "integer"
1566
+ },
1567
+ "script": {
1568
+ "type": "string"
1569
+ },
1570
+ "share_url": {
1571
+ "type": "string"
1572
+ }
1573
+ },
1574
+ "required": [
1575
+ "video_request_id",
1576
+ "status"
1577
+ ]
1578
+ }
1579
+ },
1580
+ "next_step": {
1581
+ "type": "string"
1582
+ },
1583
+ "created_brand": {
1584
+ "type": "object",
1585
+ "properties": {
1586
+ "brand_id": {
1587
+ "type": "string"
1588
+ },
1589
+ "name": {
1590
+ "type": "string"
1591
+ },
1592
+ "target_market": {
1593
+ "type": [
1594
+ "string",
1595
+ "null"
1596
+ ]
1597
+ },
1598
+ "keywords": {
1599
+ "type": "array",
1600
+ "items": {
1601
+ "type": "string"
1602
+ }
1603
+ }
1604
+ },
1605
+ "required": [
1606
+ "brand_id",
1607
+ "name",
1608
+ "keywords"
1609
+ ]
1610
+ }
1611
+ },
1612
+ "required": [
1613
+ "product_id",
1614
+ "image_count",
1615
+ "usable_image_count",
1616
+ "images",
1617
+ "state",
1618
+ "workbench_url",
1619
+ "videos",
1620
+ "created_brand"
1621
+ ],
1622
+ "$schema": "https://json-schema.org/draft/2020-12/schema"
1623
+ },
197
1624
  "annotations": {
198
1625
  "readOnlyHint": false,
199
1626
  "destructiveHint": false,
@@ -227,6 +1654,334 @@
227
1654
  ],
228
1655
  "$schema": "https://json-schema.org/draft/2020-12/schema"
229
1656
  },
1657
+ "outputSchema": {
1658
+ "type": "object",
1659
+ "properties": {
1660
+ "product_id": {
1661
+ "type": "string"
1662
+ },
1663
+ "name": {
1664
+ "type": "string"
1665
+ },
1666
+ "description": {
1667
+ "type": "string"
1668
+ },
1669
+ "price": {
1670
+ "type": "string"
1671
+ },
1672
+ "link_url": {
1673
+ "type": "string"
1674
+ },
1675
+ "source_url": {
1676
+ "type": "string"
1677
+ },
1678
+ "import_status": {
1679
+ "type": "string"
1680
+ },
1681
+ "import_failed_reason": {
1682
+ "type": "string"
1683
+ },
1684
+ "image_count": {
1685
+ "type": "integer"
1686
+ },
1687
+ "usable_image_count": {
1688
+ "type": "integer"
1689
+ },
1690
+ "images": {
1691
+ "type": "array",
1692
+ "items": {
1693
+ "type": "object",
1694
+ "properties": {
1695
+ "image_id": {
1696
+ "type": "string"
1697
+ },
1698
+ "url": {
1699
+ "type": "string"
1700
+ },
1701
+ "filename": {
1702
+ "type": "string"
1703
+ },
1704
+ "usable": {
1705
+ "type": "boolean"
1706
+ },
1707
+ "selected": {
1708
+ "type": "boolean"
1709
+ }
1710
+ },
1711
+ "required": [
1712
+ "image_id",
1713
+ "url",
1714
+ "filename",
1715
+ "usable",
1716
+ "selected"
1717
+ ]
1718
+ }
1719
+ },
1720
+ "state": {
1721
+ "type": "string"
1722
+ },
1723
+ "brand": {
1724
+ "type": "object",
1725
+ "properties": {
1726
+ "brand_id": {
1727
+ "type": "string"
1728
+ },
1729
+ "name": {
1730
+ "type": "string"
1731
+ },
1732
+ "target_market": {
1733
+ "type": [
1734
+ "string",
1735
+ "null"
1736
+ ]
1737
+ },
1738
+ "keywords": {
1739
+ "type": "array",
1740
+ "items": {
1741
+ "type": "string"
1742
+ }
1743
+ }
1744
+ },
1745
+ "required": [
1746
+ "brand_id",
1747
+ "name",
1748
+ "keywords"
1749
+ ]
1750
+ },
1751
+ "brand_decision_required": {
1752
+ "type": "object",
1753
+ "properties": {
1754
+ "drafting": {
1755
+ "type": "boolean"
1756
+ },
1757
+ "reason": {
1758
+ "type": "string"
1759
+ },
1760
+ "detected_brand_name": {
1761
+ "type": [
1762
+ "string",
1763
+ "null"
1764
+ ]
1765
+ },
1766
+ "existing_brands": {
1767
+ "type": "array",
1768
+ "items": {
1769
+ "type": "object",
1770
+ "properties": {
1771
+ "brand_id": {
1772
+ "type": "string"
1773
+ },
1774
+ "name": {
1775
+ "type": "string"
1776
+ },
1777
+ "target_market": {
1778
+ "type": [
1779
+ "string",
1780
+ "null"
1781
+ ]
1782
+ },
1783
+ "keywords": {
1784
+ "type": "array",
1785
+ "items": {
1786
+ "type": "string"
1787
+ }
1788
+ }
1789
+ },
1790
+ "required": [
1791
+ "brand_id",
1792
+ "name",
1793
+ "keywords"
1794
+ ]
1795
+ }
1796
+ },
1797
+ "can_create_brand": {
1798
+ "type": "boolean"
1799
+ },
1800
+ "brand_limit": {
1801
+ "type": [
1802
+ "integer",
1803
+ "null"
1804
+ ]
1805
+ },
1806
+ "brands_used": {
1807
+ "type": "integer"
1808
+ },
1809
+ "resolve_with": {
1810
+ "type": "string"
1811
+ }
1812
+ },
1813
+ "required": [
1814
+ "drafting"
1815
+ ]
1816
+ },
1817
+ "workbench_url": {
1818
+ "type": "string"
1819
+ },
1820
+ "video_direction": {
1821
+ "type": "object",
1822
+ "properties": {
1823
+ "video_request_id": {
1824
+ "type": "string"
1825
+ },
1826
+ "drafting": {
1827
+ "type": "boolean"
1828
+ },
1829
+ "creative_direction": {
1830
+ "type": "string"
1831
+ },
1832
+ "draft_failed": {
1833
+ "type": "boolean"
1834
+ },
1835
+ "draft_error": {
1836
+ "type": "string"
1837
+ },
1838
+ "creator_note": {
1839
+ "type": "string"
1840
+ },
1841
+ "format": {
1842
+ "type": "string"
1843
+ },
1844
+ "format_options": {
1845
+ "type": "array",
1846
+ "items": {
1847
+ "type": "object",
1848
+ "properties": {
1849
+ "key": {
1850
+ "type": "string"
1851
+ },
1852
+ "summary": {
1853
+ "type": "string"
1854
+ }
1855
+ },
1856
+ "required": [
1857
+ "key",
1858
+ "summary"
1859
+ ]
1860
+ }
1861
+ },
1862
+ "selected_image_ids": {
1863
+ "type": "array",
1864
+ "items": {
1865
+ "type": "string"
1866
+ }
1867
+ },
1868
+ "ratio": {
1869
+ "type": "string"
1870
+ },
1871
+ "resolution": {
1872
+ "type": "string"
1873
+ },
1874
+ "duration_seconds": {
1875
+ "type": "integer"
1876
+ },
1877
+ "enable_audio": {
1878
+ "type": "boolean"
1879
+ },
1880
+ "target_market": {
1881
+ "type": "string"
1882
+ },
1883
+ "credit_cost": {
1884
+ "type": "number"
1885
+ },
1886
+ "affordable": {
1887
+ "type": "boolean"
1888
+ },
1889
+ "watermark_expected": {
1890
+ "type": "boolean"
1891
+ },
1892
+ "editable": {
1893
+ "type": "boolean"
1894
+ }
1895
+ },
1896
+ "required": [
1897
+ "video_request_id",
1898
+ "drafting",
1899
+ "draft_failed",
1900
+ "format_options",
1901
+ "selected_image_ids",
1902
+ "credit_cost",
1903
+ "editable"
1904
+ ]
1905
+ },
1906
+ "videos": {
1907
+ "type": "array",
1908
+ "items": {
1909
+ "type": "object",
1910
+ "properties": {
1911
+ "video_request_id": {
1912
+ "type": "string"
1913
+ },
1914
+ "status": {
1915
+ "type": "string"
1916
+ },
1917
+ "failed_reason": {
1918
+ "type": "string"
1919
+ },
1920
+ "output_url": {
1921
+ "type": "string"
1922
+ },
1923
+ "watermarked": {
1924
+ "type": "boolean"
1925
+ },
1926
+ "duration_seconds": {
1927
+ "type": "integer"
1928
+ },
1929
+ "script": {
1930
+ "type": "string"
1931
+ },
1932
+ "share_url": {
1933
+ "type": "string"
1934
+ }
1935
+ },
1936
+ "required": [
1937
+ "video_request_id",
1938
+ "status"
1939
+ ]
1940
+ }
1941
+ },
1942
+ "next_step": {
1943
+ "type": "string"
1944
+ },
1945
+ "identity_replaced": {
1946
+ "type": "object",
1947
+ "properties": {
1948
+ "brand_id": {
1949
+ "type": "string"
1950
+ },
1951
+ "name": {
1952
+ "type": "string"
1953
+ },
1954
+ "target_market": {
1955
+ "type": [
1956
+ "string",
1957
+ "null"
1958
+ ]
1959
+ },
1960
+ "keywords": {
1961
+ "type": "array",
1962
+ "items": {
1963
+ "type": "string"
1964
+ }
1965
+ }
1966
+ },
1967
+ "required": [
1968
+ "brand_id",
1969
+ "name",
1970
+ "keywords"
1971
+ ]
1972
+ }
1973
+ },
1974
+ "required": [
1975
+ "product_id",
1976
+ "image_count",
1977
+ "usable_image_count",
1978
+ "images",
1979
+ "state",
1980
+ "workbench_url",
1981
+ "videos"
1982
+ ],
1983
+ "$schema": "https://json-schema.org/draft/2020-12/schema"
1984
+ },
230
1985
  "annotations": {
231
1986
  "readOnlyHint": false,
232
1987
  "destructiveHint": true,
@@ -270,6 +2025,57 @@
270
2025
  ],
271
2026
  "$schema": "https://json-schema.org/draft/2020-12/schema"
272
2027
  },
2028
+ "outputSchema": {
2029
+ "type": "object",
2030
+ "properties": {
2031
+ "brand_id": {
2032
+ "type": "string"
2033
+ },
2034
+ "name": {
2035
+ "type": "string"
2036
+ },
2037
+ "target_market": {
2038
+ "type": [
2039
+ "string",
2040
+ "null"
2041
+ ]
2042
+ },
2043
+ "keywords": {
2044
+ "type": "array",
2045
+ "items": {
2046
+ "type": "string"
2047
+ }
2048
+ },
2049
+ "voice": {
2050
+ "type": [
2051
+ "string",
2052
+ "null"
2053
+ ]
2054
+ },
2055
+ "configured": {
2056
+ "type": "boolean"
2057
+ },
2058
+ "is_default": {
2059
+ "type": "boolean"
2060
+ },
2061
+ "product_count": {
2062
+ "type": "integer"
2063
+ },
2064
+ "next_step": {
2065
+ "type": "string"
2066
+ }
2067
+ },
2068
+ "required": [
2069
+ "brand_id",
2070
+ "name",
2071
+ "keywords",
2072
+ "configured",
2073
+ "is_default",
2074
+ "product_count",
2075
+ "next_step"
2076
+ ],
2077
+ "$schema": "https://json-schema.org/draft/2020-12/schema"
2078
+ },
273
2079
  "annotations": {
274
2080
  "readOnlyHint": false,
275
2081
  "destructiveHint": true,
@@ -280,7 +2086,7 @@
280
2086
  {
281
2087
  "name": "update_product",
282
2088
  "title": "Edit a product's facts, link and photos",
283
- "description": "Edit what a product says about itself. `name`, `description` and\n`price` are the facts the direction draft is written from — fix a\nscrape that got them wrong, then `redraft_video_direction` so the next\ndraft uses them (the response's `next_step` says so when a direction\nalready exists). `link_url` is the product link posted with the video\nand shown on its share page: http(s) only, or empty to clear it.\n\n`add_image_urls` downloads hosted photos and adds them to the product,\nup to 9 per call and 8 MB each; the usable ones join the\nrender's selection while there is room, as the workbench's \"+\" tile\ndoes. `remove_image_ids` deletes photos by the image_id `get_product`\nlists; a removed photo leaves the selection by itself. Only the fields\nyou pass change.\n\nThis does not spend credits.\n",
2089
+ "description": "Edit what a product says about itself. `name`, `description` and\n`price` are the facts the direction draft is written from — fix a\nscrape that got them wrong, then `redraft_video_direction` so the next\ndraft uses them (the response's `next_step` says so when a direction\nalready exists). `link_url` is the product link posted with the video\nand shown on its share page: http(s) only, or empty to clear it.\n\n`add_image_urls` downloads hosted photos and adds them to the product;\n`add_image_files` does the same for photos the user attached to the\nconversation, for clients that pass attachments to tools (ChatGPT\nfills it in — do not build it by hand). Up to 9 per call\nand 8 MB each; the usable ones join the render's selection while\nthere is room, as the workbench's \"+\" tile does, and photos added to\na product whose import failed complete that import. `remove_image_ids`\ndeletes photos by the image_id `get_product` lists; a removed photo\nleaves the selection by itself. Only the fields you pass change;\n`get_product` shows `price` and `link_url` while they are set.\n\nThis does not spend credits.\n",
284
2090
  "inputSchema": {
285
2091
  "type": "object",
286
2092
  "properties": {
@@ -311,6 +2117,32 @@
311
2117
  },
312
2118
  "description": "Hosted image URLs to download and add, in the order they should appear."
313
2119
  },
2120
+ "add_image_files": {
2121
+ "type": "array",
2122
+ "items": {
2123
+ "type": "object",
2124
+ "properties": {
2125
+ "download_url": {
2126
+ "type": "string"
2127
+ },
2128
+ "file_id": {
2129
+ "type": "string"
2130
+ },
2131
+ "mime_type": {
2132
+ "type": "string"
2133
+ },
2134
+ "file_name": {
2135
+ "type": "string"
2136
+ }
2137
+ },
2138
+ "required": [
2139
+ "download_url",
2140
+ "file_id"
2141
+ ],
2142
+ "additionalProperties": false
2143
+ },
2144
+ "description": "Photos attached to the conversation, as the client supplies them (a download_url and file_id per file). Leave it out unless the client filled it in."
2145
+ },
314
2146
  "remove_image_ids": {
315
2147
  "type": "array",
316
2148
  "items": {
@@ -324,17 +2156,322 @@
324
2156
  ],
325
2157
  "$schema": "https://json-schema.org/draft/2020-12/schema"
326
2158
  },
2159
+ "outputSchema": {
2160
+ "type": "object",
2161
+ "properties": {
2162
+ "product_id": {
2163
+ "type": "string"
2164
+ },
2165
+ "name": {
2166
+ "type": "string"
2167
+ },
2168
+ "description": {
2169
+ "type": "string"
2170
+ },
2171
+ "price": {
2172
+ "type": "string"
2173
+ },
2174
+ "link_url": {
2175
+ "type": "string"
2176
+ },
2177
+ "source_url": {
2178
+ "type": "string"
2179
+ },
2180
+ "import_status": {
2181
+ "type": "string"
2182
+ },
2183
+ "import_failed_reason": {
2184
+ "type": "string"
2185
+ },
2186
+ "image_count": {
2187
+ "type": "integer"
2188
+ },
2189
+ "usable_image_count": {
2190
+ "type": "integer"
2191
+ },
2192
+ "images": {
2193
+ "type": "array",
2194
+ "items": {
2195
+ "type": "object",
2196
+ "properties": {
2197
+ "image_id": {
2198
+ "type": "string"
2199
+ },
2200
+ "url": {
2201
+ "type": "string"
2202
+ },
2203
+ "filename": {
2204
+ "type": "string"
2205
+ },
2206
+ "usable": {
2207
+ "type": "boolean"
2208
+ },
2209
+ "selected": {
2210
+ "type": "boolean"
2211
+ }
2212
+ },
2213
+ "required": [
2214
+ "image_id",
2215
+ "url",
2216
+ "filename",
2217
+ "usable",
2218
+ "selected"
2219
+ ]
2220
+ }
2221
+ },
2222
+ "state": {
2223
+ "type": "string"
2224
+ },
2225
+ "brand": {
2226
+ "type": "object",
2227
+ "properties": {
2228
+ "brand_id": {
2229
+ "type": "string"
2230
+ },
2231
+ "name": {
2232
+ "type": "string"
2233
+ },
2234
+ "target_market": {
2235
+ "type": [
2236
+ "string",
2237
+ "null"
2238
+ ]
2239
+ },
2240
+ "keywords": {
2241
+ "type": "array",
2242
+ "items": {
2243
+ "type": "string"
2244
+ }
2245
+ }
2246
+ },
2247
+ "required": [
2248
+ "brand_id",
2249
+ "name",
2250
+ "keywords"
2251
+ ]
2252
+ },
2253
+ "brand_decision_required": {
2254
+ "type": "object",
2255
+ "properties": {
2256
+ "drafting": {
2257
+ "type": "boolean"
2258
+ },
2259
+ "reason": {
2260
+ "type": "string"
2261
+ },
2262
+ "detected_brand_name": {
2263
+ "type": [
2264
+ "string",
2265
+ "null"
2266
+ ]
2267
+ },
2268
+ "existing_brands": {
2269
+ "type": "array",
2270
+ "items": {
2271
+ "type": "object",
2272
+ "properties": {
2273
+ "brand_id": {
2274
+ "type": "string"
2275
+ },
2276
+ "name": {
2277
+ "type": "string"
2278
+ },
2279
+ "target_market": {
2280
+ "type": [
2281
+ "string",
2282
+ "null"
2283
+ ]
2284
+ },
2285
+ "keywords": {
2286
+ "type": "array",
2287
+ "items": {
2288
+ "type": "string"
2289
+ }
2290
+ }
2291
+ },
2292
+ "required": [
2293
+ "brand_id",
2294
+ "name",
2295
+ "keywords"
2296
+ ]
2297
+ }
2298
+ },
2299
+ "can_create_brand": {
2300
+ "type": "boolean"
2301
+ },
2302
+ "brand_limit": {
2303
+ "type": [
2304
+ "integer",
2305
+ "null"
2306
+ ]
2307
+ },
2308
+ "brands_used": {
2309
+ "type": "integer"
2310
+ },
2311
+ "resolve_with": {
2312
+ "type": "string"
2313
+ }
2314
+ },
2315
+ "required": [
2316
+ "drafting"
2317
+ ]
2318
+ },
2319
+ "workbench_url": {
2320
+ "type": "string"
2321
+ },
2322
+ "video_direction": {
2323
+ "type": "object",
2324
+ "properties": {
2325
+ "video_request_id": {
2326
+ "type": "string"
2327
+ },
2328
+ "drafting": {
2329
+ "type": "boolean"
2330
+ },
2331
+ "creative_direction": {
2332
+ "type": "string"
2333
+ },
2334
+ "draft_failed": {
2335
+ "type": "boolean"
2336
+ },
2337
+ "draft_error": {
2338
+ "type": "string"
2339
+ },
2340
+ "creator_note": {
2341
+ "type": "string"
2342
+ },
2343
+ "format": {
2344
+ "type": "string"
2345
+ },
2346
+ "format_options": {
2347
+ "type": "array",
2348
+ "items": {
2349
+ "type": "object",
2350
+ "properties": {
2351
+ "key": {
2352
+ "type": "string"
2353
+ },
2354
+ "summary": {
2355
+ "type": "string"
2356
+ }
2357
+ },
2358
+ "required": [
2359
+ "key",
2360
+ "summary"
2361
+ ]
2362
+ }
2363
+ },
2364
+ "selected_image_ids": {
2365
+ "type": "array",
2366
+ "items": {
2367
+ "type": "string"
2368
+ }
2369
+ },
2370
+ "ratio": {
2371
+ "type": "string"
2372
+ },
2373
+ "resolution": {
2374
+ "type": "string"
2375
+ },
2376
+ "duration_seconds": {
2377
+ "type": "integer"
2378
+ },
2379
+ "enable_audio": {
2380
+ "type": "boolean"
2381
+ },
2382
+ "target_market": {
2383
+ "type": "string"
2384
+ },
2385
+ "credit_cost": {
2386
+ "type": "number"
2387
+ },
2388
+ "affordable": {
2389
+ "type": "boolean"
2390
+ },
2391
+ "watermark_expected": {
2392
+ "type": "boolean"
2393
+ },
2394
+ "editable": {
2395
+ "type": "boolean"
2396
+ }
2397
+ },
2398
+ "required": [
2399
+ "video_request_id",
2400
+ "drafting",
2401
+ "draft_failed",
2402
+ "format_options",
2403
+ "selected_image_ids",
2404
+ "credit_cost",
2405
+ "editable"
2406
+ ]
2407
+ },
2408
+ "videos": {
2409
+ "type": "array",
2410
+ "items": {
2411
+ "type": "object",
2412
+ "properties": {
2413
+ "video_request_id": {
2414
+ "type": "string"
2415
+ },
2416
+ "status": {
2417
+ "type": "string"
2418
+ },
2419
+ "failed_reason": {
2420
+ "type": "string"
2421
+ },
2422
+ "output_url": {
2423
+ "type": "string"
2424
+ },
2425
+ "watermarked": {
2426
+ "type": "boolean"
2427
+ },
2428
+ "duration_seconds": {
2429
+ "type": "integer"
2430
+ },
2431
+ "script": {
2432
+ "type": "string"
2433
+ },
2434
+ "share_url": {
2435
+ "type": "string"
2436
+ }
2437
+ },
2438
+ "required": [
2439
+ "video_request_id",
2440
+ "status"
2441
+ ]
2442
+ }
2443
+ },
2444
+ "next_step": {
2445
+ "type": "string"
2446
+ }
2447
+ },
2448
+ "required": [
2449
+ "product_id",
2450
+ "image_count",
2451
+ "usable_image_count",
2452
+ "images",
2453
+ "state",
2454
+ "workbench_url",
2455
+ "videos"
2456
+ ],
2457
+ "$schema": "https://json-schema.org/draft/2020-12/schema"
2458
+ },
327
2459
  "annotations": {
328
2460
  "readOnlyHint": false,
329
2461
  "destructiveHint": true,
330
2462
  "idempotentHint": false,
331
2463
  "openWorldHint": true
2464
+ },
2465
+ "_meta": {
2466
+ "openai/fileParams": [
2467
+ "add_image_files"
2468
+ ]
332
2469
  }
333
2470
  },
334
2471
  {
335
2472
  "name": "update_video_direction",
336
2473
  "title": "Edit the video direction and render settings",
337
- "description": "Edit the creative direction and render settings for a product's next\nvideo. Only the fields you pass are changed; everything else keeps its\ncurrent value. Supplied text replaces the saved text; an empty creative\ndirection clears it. A target_market change updates the shared brand\nand affects future videos for its other products.\n\n`creative_direction` is the plan the render is built from. It is free\ntext, but the drafts follow a six-section shape that works well and is\nworth preserving when editing:\n\n Hook: ...\n Content Focus: ...\n Format: ...\n Suggesting Visual Aesthetic: ...\n Execution Guidelines: ...\n Strict Guidelines & Restrictions: ...\n\nDo not invent a direction from nothing when one has not been drafted\nyet — call `redraft_video_direction` and edit what comes back. Leaving\nit empty is also valid: generation works without a direction.\n\n`creator_note` is different and smaller: the user's own short note to\nthe director (\"mention it is machine washable\", \"for Father's Day\"). It\nis carried through to the render verbatim, so put the user's words in\nit, not your paraphrase.\n\n`selected_image_ids` chooses which of the product's photos the render\nuses, in order, by the image_id `get_product` lists under `images`\n(usable ones only, at most 9); an empty list restores the\ndefault, the first usable ones. The poll's `selected_image_ids` shows\nwhat would go out now.\n\n`duration_seconds` is the render length — 15, 20, 25 or 30 — and a\nsetting, not part of the direction: writing \"20 seconds\" into the text\nchanges nothing. Longer costs more; the response's `credit_cost` is\nthe new price, and the user must hear it before `generate_video`.\nAbove the plan's ceiling it clamps like resolution (free: 20s).\n\nA target_market change after a direction exists gets a `next_step` in\nthe response: the direction's wording sets the spoken language, so it\nneeds a redraft (or an edit) to match the new market.\n\nA launched video cannot change: if the product's last video has\nalready launched, this opens the next video's draft (seeded from that\nvideo) and edits that; the response says `opened_new_video: true` and\ncarries the new video_request_id.\n\nThis does not spend credits.\n",
2474
+ "description": "Edit the creative direction and render settings for a product's next\nvideo. Only the fields you pass are changed; everything else keeps its\ncurrent value. Supplied text replaces the saved text; an empty creative\ndirection clears it. A target_market change updates the shared brand\nand affects future videos for its other products.\n\n`creative_direction` is the plan the render is built from. It is free\ntext, but the drafts follow a six-section shape that works well and is\nworth preserving when editing:\n\n Hook: ...\n Content Focus: ...\n Format: ...\n Suggesting Visual Aesthetic: ...\n Execution Guidelines: ...\n Strict Guidelines & Restrictions: ...\n\nDo not invent a direction from nothing when one has not been drafted\nyet — call `redraft_video_direction` and edit what comes back. Leaving\nit empty is also valid: generation works without a direction.\n\n`creator_note` is different and smaller: the user's own short note to\nthe director (\"mention it is machine washable\", \"for Father's Day\"). It\nis carried through to the render verbatim, so put the user's words in\nit, not your paraphrase.\n\n`selected_image_ids` chooses which of the product's photos the render\nuses, in order, by the image_id `get_product` lists under `images`\n(usable ones only, at most 9); an empty list restores the\ndefault, the first usable ones. The poll's `selected_image_ids` shows\nwhat would go out now.\n\n`duration_seconds` is the render length — 15, 20, 25 or 30 — and a\nsetting, not part of the direction: writing \"20 seconds\" into the text\nchanges nothing. Longer costs more; the response's `credit_cost` is\nthe new price, and the user must hear it before `generate_video` —\n`next_step` states it for you, read after this edit, so quote it in\nthe same message you ask for their go-ahead in.\nAbove the plan's ceiling it clamps like resolution (free: 20s).\n\nA target_market change after a direction exists gets a `next_step` in\nthe response: the direction's wording sets the spoken language, so it\nneeds a redraft (or an edit) to match the new market.\n\nA setting above the account's ceiling is saved as the ceiling rather\nthan refused, and the response says so in `adjustments` — each one\nnaming the field, what was asked for, what was saved and why. \"Make it\n30 seconds in 1080P\" on a free account saves as 20 seconds at 480P.\nWhen `adjustments` is there, tell the user what changed before you ask\nthem to approve the video: otherwise their \"yes\" covers settings they\nnever chose.\n\nA launched video cannot change: if the product's last video has\nalready launched, this opens the next video's draft (seeded from that\nvideo) and edits that; the response says `opened_new_video: true` and\ncarries the new video_request_id.\n\nThis does not spend credits.\n",
338
2475
  "inputSchema": {
339
2476
  "type": "object",
340
2477
  "properties": {
@@ -400,6 +2537,131 @@
400
2537
  ],
401
2538
  "$schema": "https://json-schema.org/draft/2020-12/schema"
402
2539
  },
2540
+ "outputSchema": {
2541
+ "type": "object",
2542
+ "properties": {
2543
+ "video_request_id": {
2544
+ "type": "string"
2545
+ },
2546
+ "drafting": {
2547
+ "type": "boolean"
2548
+ },
2549
+ "creative_direction": {
2550
+ "type": "string"
2551
+ },
2552
+ "draft_failed": {
2553
+ "type": "boolean"
2554
+ },
2555
+ "draft_error": {
2556
+ "type": "string"
2557
+ },
2558
+ "creator_note": {
2559
+ "type": "string"
2560
+ },
2561
+ "format": {
2562
+ "type": "string"
2563
+ },
2564
+ "format_options": {
2565
+ "type": "array",
2566
+ "items": {
2567
+ "type": "object",
2568
+ "properties": {
2569
+ "key": {
2570
+ "type": "string"
2571
+ },
2572
+ "summary": {
2573
+ "type": "string"
2574
+ }
2575
+ },
2576
+ "required": [
2577
+ "key",
2578
+ "summary"
2579
+ ]
2580
+ }
2581
+ },
2582
+ "selected_image_ids": {
2583
+ "type": "array",
2584
+ "items": {
2585
+ "type": "string"
2586
+ }
2587
+ },
2588
+ "ratio": {
2589
+ "type": "string"
2590
+ },
2591
+ "resolution": {
2592
+ "type": "string"
2593
+ },
2594
+ "duration_seconds": {
2595
+ "type": "integer"
2596
+ },
2597
+ "enable_audio": {
2598
+ "type": "boolean"
2599
+ },
2600
+ "target_market": {
2601
+ "type": "string"
2602
+ },
2603
+ "credit_cost": {
2604
+ "type": "number"
2605
+ },
2606
+ "affordable": {
2607
+ "type": "boolean"
2608
+ },
2609
+ "watermark_expected": {
2610
+ "type": "boolean"
2611
+ },
2612
+ "editable": {
2613
+ "type": "boolean"
2614
+ },
2615
+ "product_id": {
2616
+ "type": "string"
2617
+ },
2618
+ "opened_new_video": {
2619
+ "type": "boolean"
2620
+ },
2621
+ "adjustments": {
2622
+ "type": "array",
2623
+ "items": {
2624
+ "type": "object",
2625
+ "properties": {
2626
+ "field": {
2627
+ "type": "string"
2628
+ },
2629
+ "requested": {
2630
+ "type": "string"
2631
+ },
2632
+ "saved": {
2633
+ "type": "string"
2634
+ },
2635
+ "reason": {
2636
+ "type": "string"
2637
+ }
2638
+ },
2639
+ "required": [
2640
+ "field",
2641
+ "requested",
2642
+ "saved",
2643
+ "reason"
2644
+ ]
2645
+ }
2646
+ },
2647
+ "next_step": {
2648
+ "type": "string"
2649
+ }
2650
+ },
2651
+ "required": [
2652
+ "video_request_id",
2653
+ "drafting",
2654
+ "draft_failed",
2655
+ "format_options",
2656
+ "selected_image_ids",
2657
+ "credit_cost",
2658
+ "editable",
2659
+ "product_id",
2660
+ "opened_new_video",
2661
+ "next_step"
2662
+ ],
2663
+ "$schema": "https://json-schema.org/draft/2020-12/schema"
2664
+ },
403
2665
  "annotations": {
404
2666
  "readOnlyHint": false,
405
2667
  "destructiveHint": true,
@@ -410,7 +2672,7 @@
410
2672
  {
411
2673
  "name": "redraft_video_direction",
412
2674
  "title": "Draft a new creative direction",
413
- "description": "Ask InstantClips to draft a fresh creative direction for this product's\nnext video, using the product's facts, its images and the brand's\nidentity. Use it to get a first draft, or to try a different angle when\nthe user does not like the current one.\n\nThis OVERWRITES the current direction — including any edits. Confirm with\nthe user before re-rolling a direction they have already worked on.\n\nIf the product's last video has already launched, this opens the next\nvideo's draft (seeded from that video) and drafts into it; the response\nsays `opened_new_video: true` and carries the new video_request_id.\n\nThe draft runs in the background: this returns with `drafting` true, and\nyou poll `get_product` until `video_direction.drafting` is false (a few\nseconds). Rolling a fresh angle is the point, so calling it twice gives\ntwo different drafts, not the same one.\n\nDirection drafting sends product facts, photos and brand context to\nan external AI service when the product is ready and its brand is settled.\n\nThis does not spend credits.\n",
2675
+ "description": "Ask InstantClips to draft a fresh creative direction for this product's\nnext video, using the product's facts, its images and the brand's\nidentity. Use it to get a first draft, or to try a different angle when\nthe user does not like the current one.\n\nThis OVERWRITES the current direction — including any edits. Confirm with\nthe user before re-rolling a direction they have already worked on.\n\nIf the product's last video has already launched, this opens the next\nvideo's draft (seeded from that video) and drafts into it; the response\nsays `opened_new_video: true` and carries the new video_request_id.\n\nThe draft runs in the background: this returns with `drafting` true, and\nyou poll `get_product` until `video_direction.drafting` is false (a few\nseconds). Rolling a fresh angle is the point, so calling it twice gives\ntwo different drafts, not the same one.\n\n`next_step` also states what rendering this will cost. The user has to\nhear that number before `generate_video`, so say it in the same\nmessage you show them the direction in.\n\nDirection drafting sends product facts, photos and brand context to\nan external AI service when the product is ready and its brand is settled.\n\nThis does not spend credits.\n",
414
2676
  "inputSchema": {
415
2677
  "type": "object",
416
2678
  "properties": {
@@ -428,6 +2690,105 @@
428
2690
  ],
429
2691
  "$schema": "https://json-schema.org/draft/2020-12/schema"
430
2692
  },
2693
+ "outputSchema": {
2694
+ "type": "object",
2695
+ "properties": {
2696
+ "video_request_id": {
2697
+ "type": "string"
2698
+ },
2699
+ "drafting": {
2700
+ "type": "boolean"
2701
+ },
2702
+ "creative_direction": {
2703
+ "type": "string"
2704
+ },
2705
+ "draft_failed": {
2706
+ "type": "boolean"
2707
+ },
2708
+ "draft_error": {
2709
+ "type": "string"
2710
+ },
2711
+ "creator_note": {
2712
+ "type": "string"
2713
+ },
2714
+ "format": {
2715
+ "type": "string"
2716
+ },
2717
+ "format_options": {
2718
+ "type": "array",
2719
+ "items": {
2720
+ "type": "object",
2721
+ "properties": {
2722
+ "key": {
2723
+ "type": "string"
2724
+ },
2725
+ "summary": {
2726
+ "type": "string"
2727
+ }
2728
+ },
2729
+ "required": [
2730
+ "key",
2731
+ "summary"
2732
+ ]
2733
+ }
2734
+ },
2735
+ "selected_image_ids": {
2736
+ "type": "array",
2737
+ "items": {
2738
+ "type": "string"
2739
+ }
2740
+ },
2741
+ "ratio": {
2742
+ "type": "string"
2743
+ },
2744
+ "resolution": {
2745
+ "type": "string"
2746
+ },
2747
+ "duration_seconds": {
2748
+ "type": "integer"
2749
+ },
2750
+ "enable_audio": {
2751
+ "type": "boolean"
2752
+ },
2753
+ "target_market": {
2754
+ "type": "string"
2755
+ },
2756
+ "credit_cost": {
2757
+ "type": "number"
2758
+ },
2759
+ "affordable": {
2760
+ "type": "boolean"
2761
+ },
2762
+ "watermark_expected": {
2763
+ "type": "boolean"
2764
+ },
2765
+ "editable": {
2766
+ "type": "boolean"
2767
+ },
2768
+ "product_id": {
2769
+ "type": "string"
2770
+ },
2771
+ "opened_new_video": {
2772
+ "type": "boolean"
2773
+ },
2774
+ "next_step": {
2775
+ "type": "string"
2776
+ }
2777
+ },
2778
+ "required": [
2779
+ "video_request_id",
2780
+ "drafting",
2781
+ "draft_failed",
2782
+ "format_options",
2783
+ "selected_image_ids",
2784
+ "credit_cost",
2785
+ "editable",
2786
+ "product_id",
2787
+ "opened_new_video",
2788
+ "next_step"
2789
+ ],
2790
+ "$schema": "https://json-schema.org/draft/2020-12/schema"
2791
+ },
431
2792
  "annotations": {
432
2793
  "readOnlyHint": false,
433
2794
  "destructiveHint": true,
@@ -438,7 +2799,7 @@
438
2799
  {
439
2800
  "name": "generate_video",
440
2801
  "title": "Generate the video (spends credits)",
441
- "description": "Render the video. THIS SPENDS THE USER'S CREDITS.\nProduct photos, brand identity and direction are sent to external\ngeneration services. Results have public share pages; generation can\ntrigger account emails, including a first-generation welcome email.\n\nAsk the user before calling this, every time. Tell them the cost first —\n`get_product` reports it as `video_direction.credit_cost`, and the\nuser's balance as `credits_remaining` — and pass that cost as\n`expected_credit_cost`: if it no longer matches (settings changed, a\nresolution was clamped), nothing is charged and the response says the\ncurrent cost. Credits are charged at launch, not on completion; a\nfailed render is refunded automatically.\n\nShow the user the creative direction and let them approve or edit it\nbefore you call this. Do not call it to \"see what happens\", to retry a\nrender that is still in progress, or as part of a batch you decided on\nyour own.\n\nReturns as soon as the render is queued. Poll `get_video` with the\nreturned video_request_id every 20-30 seconds until its status is\n\"done\" (a few minutes), then give the user `output_url` and\n`share_url`.\n\nIf the account cannot afford it, nothing is charged and the response\nsays so — tell the user to top up at the credits page rather than\nretrying.\n\nIf the product's last video is finished (done or failed) and there is\nno draft, this renders another take of the same plan as a new video,\nat the same cost; the response says `opened_new_video: true`. While a\nrender is in flight it refuses.\n",
2802
+ "description": "Render the video. THIS SPENDS THE USER'S CREDITS.\nProduct photos, brand identity and direction are sent to external\ngeneration services. Results have public share pages; generation can\ntrigger account emails, including a first-generation welcome email.\n\nAsk the user before calling this, every time. Tell them the cost first —\n`get_product` reports it as `video_direction.credit_cost`, and the\nuser's balance as `credits_remaining` — and pass that cost as\n`expected_credit_cost`: if it no longer matches (settings changed, a\nresolution was clamped), nothing is charged and the response says the\ncurrent cost. Credits are charged at launch, not on completion; a\nfailed render is refunded automatically.\n\nShow the user the creative direction and let them approve or edit it\nbefore you call this. Do not call it to \"see what happens\", to retry a\nrender that is still in progress, or as part of a batch you decided on\nyour own.\n\nReturns as soon as the render is queued — the video is not ready yet.\nDo not answer with a bare \"generating\" and start polling silently.\nTell the user, in one reply: it is in the queue and takes\n5 to 15 minutes depending on queue depth, length and\nresolution; `workbench_url` is where they can see what they directed;\nand `email_on_completion` (present unless the account takes no mail)\ngets a message the moment it is done, so they can go and work on\nsomething else.\n\nSay you will keep checking only if you actually can — if this client\nkeeps you running long enough to poll, and your session survives the\nuser walking away. This server is request/response and holds no\nmonitoring of its own: nothing here will wake you up, and if your\nsession ends mid-render the video still finishes and the email still\ngoes. When you cannot promise it, say so, and leave them with the link\nand the email as the delivery. They are the reliable path; you are\nthe convenience.\n\nWhile you can, poll `get_video` with the returned video_request_id\nevery 30-60\nseconds until its status is \"done\", and give them `output_url` and\n`share_url`.\n\nA wait inside that window is the normal shape of this, not a fault:\ndescribe it as expected, and do not apologise for it. Beyond the\nwindow it is no longer expected, and `get_video`'s `next_step` says so\n— it tracks how long this render has actually been going, switching to\nwhat is known (still marked rendering, no revised finish time) and\nthen to support. Read it each poll rather than re-running this\nparagraph: it is the one with the clock.\n\nIf the account cannot afford it, nothing is charged and the response\nsays so — tell the user to top up at the credits page rather than\nretrying.\n\nIf the product's last video is finished (done or failed) and there is\nno draft, this renders another take of the same plan as a new video,\nat the same cost; the response says `opened_new_video: true`. While a\nrender is in flight it refuses.\n",
442
2803
  "inputSchema": {
443
2804
  "type": "object",
444
2805
  "properties": {
@@ -457,6 +2818,102 @@
457
2818
  ],
458
2819
  "$schema": "https://json-schema.org/draft/2020-12/schema"
459
2820
  },
2821
+ "outputSchema": {
2822
+ "type": "object",
2823
+ "properties": {
2824
+ "product_id": {
2825
+ "type": "string"
2826
+ },
2827
+ "opened_new_video": {
2828
+ "type": "boolean"
2829
+ },
2830
+ "queued": {
2831
+ "type": "integer"
2832
+ },
2833
+ "skipped_insufficient_credit": {
2834
+ "type": "integer"
2835
+ },
2836
+ "credits_charged": {
2837
+ "type": "number"
2838
+ },
2839
+ "videos": {
2840
+ "type": "array",
2841
+ "items": {
2842
+ "type": "object",
2843
+ "properties": {
2844
+ "video_request_id": {
2845
+ "type": "string"
2846
+ },
2847
+ "status": {
2848
+ "type": "string"
2849
+ },
2850
+ "failed_reason": {
2851
+ "type": "string"
2852
+ },
2853
+ "output_url": {
2854
+ "type": "string"
2855
+ },
2856
+ "watermarked": {
2857
+ "type": "boolean"
2858
+ },
2859
+ "duration_seconds": {
2860
+ "type": "integer"
2861
+ },
2862
+ "script": {
2863
+ "type": "string"
2864
+ },
2865
+ "share_url": {
2866
+ "type": "string"
2867
+ }
2868
+ },
2869
+ "required": [
2870
+ "video_request_id",
2871
+ "status"
2872
+ ]
2873
+ }
2874
+ },
2875
+ "workbench_url": {
2876
+ "type": "string"
2877
+ },
2878
+ "typical_wait_minutes": {
2879
+ "type": "object",
2880
+ "properties": {
2881
+ "min": {
2882
+ "type": "integer"
2883
+ },
2884
+ "max": {
2885
+ "type": "integer"
2886
+ }
2887
+ },
2888
+ "required": [
2889
+ "min",
2890
+ "max"
2891
+ ]
2892
+ },
2893
+ "email_on_completion": {
2894
+ "type": "string"
2895
+ },
2896
+ "next_step": {
2897
+ "type": "string"
2898
+ },
2899
+ "credits_remaining": {
2900
+ "type": "number"
2901
+ }
2902
+ },
2903
+ "required": [
2904
+ "product_id",
2905
+ "opened_new_video",
2906
+ "queued",
2907
+ "skipped_insufficient_credit",
2908
+ "credits_charged",
2909
+ "videos",
2910
+ "workbench_url",
2911
+ "typical_wait_minutes",
2912
+ "next_step",
2913
+ "credits_remaining"
2914
+ ],
2915
+ "$schema": "https://json-schema.org/draft/2020-12/schema"
2916
+ },
460
2917
  "annotations": {
461
2918
  "readOnlyHint": false,
462
2919
  "destructiveHint": true,
@@ -467,7 +2924,7 @@
467
2924
  {
468
2925
  "name": "get_video",
469
2926
  "title": "Check a video's render status",
470
- "description": "Check one video's render.\n\n`status` values:\n \"generating\" — still rendering, keep polling every 20-30 seconds.\n \"done\" — finished; `output_url` is the MP4 and `share_url` is a\n public page to send someone. `watermarked` is true when\n that MP4 carries the InstantClips watermark (free\n accounts); buying credits switches every video on the\n account to the clean file, nothing is re-rendered.\n \"failed\" — `failed_reason` says why and what to change. The credits\n were refunded automatically. To try again, make the change\n with `update_video_direction` or `redraft_video_direction`\n (either opens the next video's draft), then `generate_video`.\n \"insufficient_credit\" — never launched; nothing was charged.\n \"pending\" — not launched yet; call `generate_video`.\n\n`next_step` says which of those applies right now.\n\nA render normally takes a few minutes. Tell the user what you are\nwaiting on rather than polling silently in a tight loop.\n",
2927
+ "description": "Check one video's render.\n\n`status` values:\n \"generating\" — still rendering; poll every\n 30-60\n seconds.\n \"done\" — finished; `output_url` is the MP4 and `share_url` is a\n public page to send someone. `watermarked` appears, set to\n true, only when that MP4 carries the InstantClips\n watermark (free accounts) — buying credits switches every\n video on the account to the clean file, nothing is\n re-rendered. When the field is absent there is no\n watermark and nothing to say about one: do not raise the\n subject with a paying customer.\n \"failed\" — `failed_reason` says why and what to change. The credits\n were refunded automatically. To try again, make the change\n with `update_video_direction` or `redraft_video_direction`\n (either opens the next video's draft), then `generate_video`.\n \"insufficient_credit\" — never launched; nothing was charged.\n \"pending\" — not launched yet; call `generate_video`.\n\n`next_step` says which of those applies right now.\n\nA render takes 5 to 15 minutes, depending on queue depth,\nlength and resolution. Inside that window the wait is the normal shape\nof this and not a fault, so describe it as expected rather than slow.\nPast it, it is not: `next_step` switches to what is actually known —\nbeyond the usual window, still marked rendering, no revised finish\ntime — and at 45 minutes it says to\nstop polling and hand the user to support. Follow `next_step`; it is\nthe one that knows how long this render has been going.\n\nThey do not have to wait with you either — the workbench link shows\nthe same thing, and `generate_video`'s `email_on_completion` (when the\naccount takes mail) is written to the moment the video lands.\n",
471
2928
  "inputSchema": {
472
2929
  "type": "object",
473
2930
  "properties": {
@@ -481,6 +2938,54 @@
481
2938
  ],
482
2939
  "$schema": "https://json-schema.org/draft/2020-12/schema"
483
2940
  },
2941
+ "outputSchema": {
2942
+ "type": "object",
2943
+ "properties": {
2944
+ "video_request_id": {
2945
+ "type": "string"
2946
+ },
2947
+ "status": {
2948
+ "type": "string"
2949
+ },
2950
+ "failed_reason": {
2951
+ "type": "string"
2952
+ },
2953
+ "output_url": {
2954
+ "type": "string"
2955
+ },
2956
+ "watermarked": {
2957
+ "type": "boolean"
2958
+ },
2959
+ "duration_seconds": {
2960
+ "type": "integer"
2961
+ },
2962
+ "script": {
2963
+ "type": "string"
2964
+ },
2965
+ "share_url": {
2966
+ "type": "string"
2967
+ },
2968
+ "product_id": {
2969
+ "type": "string"
2970
+ },
2971
+ "product_name": {
2972
+ "type": "string"
2973
+ },
2974
+ "workbench_url": {
2975
+ "type": "string"
2976
+ },
2977
+ "next_step": {
2978
+ "type": "string"
2979
+ }
2980
+ },
2981
+ "required": [
2982
+ "video_request_id",
2983
+ "status",
2984
+ "product_id",
2985
+ "workbench_url"
2986
+ ],
2987
+ "$schema": "https://json-schema.org/draft/2020-12/schema"
2988
+ },
484
2989
  "annotations": {
485
2990
  "readOnlyHint": true,
486
2991
  "destructiveHint": false,