@usemo.com/sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +233 -0
- package/package.json +44 -0
- package/src/catalog.json +1599 -0
- package/src/cli.js +165 -0
- package/src/client.js +153 -0
- package/src/config.js +58 -0
- package/src/mcp.js +55 -0
package/src/catalog.json
ADDED
|
@@ -0,0 +1,1599 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"annotations": {
|
|
4
|
+
"destructiveHint": false,
|
|
5
|
+
"idempotentHint": false,
|
|
6
|
+
"openWorldHint": true,
|
|
7
|
+
"readOnlyHint": false,
|
|
8
|
+
"title": "Generate an image (spends credits)"
|
|
9
|
+
},
|
|
10
|
+
"command": "images create",
|
|
11
|
+
"description": "Start a text-to-image generation job. SPENDS CREDITS. Returns a job handle; poll with\n usemo_wait_for_job for the resulting image URL(s). Pass a twin_id to render a person's\n enrolled likeness.\n\n Returns: {\"job_id\": str, \"status\": \"queued\", \"credits_charged\": float, \"job_path\": str}.\n ",
|
|
12
|
+
"inputSchema": {
|
|
13
|
+
"additionalProperties": false,
|
|
14
|
+
"properties": {
|
|
15
|
+
"aspect_ratio": {
|
|
16
|
+
"anyOf": [
|
|
17
|
+
{
|
|
18
|
+
"type": "string"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"type": "null"
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"default": null,
|
|
25
|
+
"description": "e.g. '1:1', '9:16', '16:9'. Omit for square.",
|
|
26
|
+
"title": "Aspect Ratio"
|
|
27
|
+
},
|
|
28
|
+
"idempotency_key": {
|
|
29
|
+
"anyOf": [
|
|
30
|
+
{
|
|
31
|
+
"maxLength": 200,
|
|
32
|
+
"minLength": 1,
|
|
33
|
+
"type": "string"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"type": "null"
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"default": null,
|
|
40
|
+
"description": "Reuse the same key and payload after an uncertain submission; never blindly resubmit.",
|
|
41
|
+
"title": "Idempotency Key"
|
|
42
|
+
},
|
|
43
|
+
"model": {
|
|
44
|
+
"default": "flux-dev",
|
|
45
|
+
"description": "A customer-routable image model.",
|
|
46
|
+
"enum": [
|
|
47
|
+
"flux-dev",
|
|
48
|
+
"sdxl",
|
|
49
|
+
"flux2_flex",
|
|
50
|
+
"flux2_pro"
|
|
51
|
+
],
|
|
52
|
+
"title": "Model",
|
|
53
|
+
"type": "string"
|
|
54
|
+
},
|
|
55
|
+
"negative_prompt": {
|
|
56
|
+
"anyOf": [
|
|
57
|
+
{
|
|
58
|
+
"maxLength": 1000,
|
|
59
|
+
"type": "string"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"type": "null"
|
|
63
|
+
}
|
|
64
|
+
],
|
|
65
|
+
"default": null,
|
|
66
|
+
"title": "Negative Prompt"
|
|
67
|
+
},
|
|
68
|
+
"num_images": {
|
|
69
|
+
"default": 1,
|
|
70
|
+
"description": "How many variations (1-4).",
|
|
71
|
+
"maximum": 4,
|
|
72
|
+
"minimum": 1,
|
|
73
|
+
"title": "Num Images",
|
|
74
|
+
"type": "integer"
|
|
75
|
+
},
|
|
76
|
+
"project_id": {
|
|
77
|
+
"anyOf": [
|
|
78
|
+
{
|
|
79
|
+
"type": "string"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"type": "null"
|
|
83
|
+
}
|
|
84
|
+
],
|
|
85
|
+
"default": null,
|
|
86
|
+
"title": "Project Id"
|
|
87
|
+
},
|
|
88
|
+
"prompt": {
|
|
89
|
+
"description": "What to draw.",
|
|
90
|
+
"maxLength": 2000,
|
|
91
|
+
"minLength": 1,
|
|
92
|
+
"title": "Prompt",
|
|
93
|
+
"type": "string"
|
|
94
|
+
},
|
|
95
|
+
"twin_id": {
|
|
96
|
+
"anyOf": [
|
|
97
|
+
{
|
|
98
|
+
"type": "string"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"type": "null"
|
|
102
|
+
}
|
|
103
|
+
],
|
|
104
|
+
"default": null,
|
|
105
|
+
"description": "Optional digital-twin id to render the person's likeness.",
|
|
106
|
+
"title": "Twin Id"
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
"required": [
|
|
110
|
+
"prompt"
|
|
111
|
+
],
|
|
112
|
+
"title": "GenerateImageInput",
|
|
113
|
+
"type": "object"
|
|
114
|
+
},
|
|
115
|
+
"method": "POST",
|
|
116
|
+
"name": "usemo_generate_image",
|
|
117
|
+
"path": "/generate",
|
|
118
|
+
"positional": "prompt"
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"annotations": {
|
|
122
|
+
"destructiveHint": false,
|
|
123
|
+
"idempotentHint": false,
|
|
124
|
+
"openWorldHint": true,
|
|
125
|
+
"readOnlyHint": false,
|
|
126
|
+
"title": "Create a video from a brief (spends credits)"
|
|
127
|
+
},
|
|
128
|
+
"command": "videos create",
|
|
129
|
+
"description": "One-shot \"brief → finished video\", end to end through UseMo's quality harness.\n\n Unlike usemo_generate_video (a single raw render), this plans a GROUNDED, fact-checked\n storyboard (the critic gate blocks ungrounded claims before any spend) and then renders it\n through the GATED pipeline (per-shot identity + realism gates with bounded aimed retry) — so\n you get the best video we can produce from one sentence. SPENDS CREDITS.\n\n If the plan can't be grounded it returns without spending, so you can refine the ask.\n\n Returns (rendering): {\"shippable\": true, \"job_id\": str, \"status\": str, \"job_path\": str,\n \"estimated_cost_usd\": float, \"storyboard\": {...}} — poll usemo_wait_for_job for the URL.\n Returns (blocked): {\"shippable\": false, \"verdict\": {...}, \"reason\": str}.\n ",
|
|
130
|
+
"inputSchema": {
|
|
131
|
+
"additionalProperties": false,
|
|
132
|
+
"properties": {
|
|
133
|
+
"ask": {
|
|
134
|
+
"description": "One line describing the video to make (e.g. 'a 30s founder talking-head announcing our Series A').",
|
|
135
|
+
"maxLength": 2000,
|
|
136
|
+
"minLength": 3,
|
|
137
|
+
"title": "Ask",
|
|
138
|
+
"type": "string"
|
|
139
|
+
},
|
|
140
|
+
"async_plan": {
|
|
141
|
+
"default": true,
|
|
142
|
+
"description": "Queue storyboard planning with rendering to avoid gateway timeouts. Recommended.",
|
|
143
|
+
"title": "Async Plan",
|
|
144
|
+
"type": "boolean"
|
|
145
|
+
},
|
|
146
|
+
"brand_voice": {
|
|
147
|
+
"anyOf": [
|
|
148
|
+
{
|
|
149
|
+
"maxLength": 1000,
|
|
150
|
+
"type": "string"
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"type": "null"
|
|
154
|
+
}
|
|
155
|
+
],
|
|
156
|
+
"default": null,
|
|
157
|
+
"description": "Optional tone/voice override.",
|
|
158
|
+
"title": "Brand Voice"
|
|
159
|
+
},
|
|
160
|
+
"idempotency_key": {
|
|
161
|
+
"anyOf": [
|
|
162
|
+
{
|
|
163
|
+
"maxLength": 200,
|
|
164
|
+
"minLength": 1,
|
|
165
|
+
"type": "string"
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"type": "null"
|
|
169
|
+
}
|
|
170
|
+
],
|
|
171
|
+
"default": null,
|
|
172
|
+
"description": "Reuse the same key and payload after an uncertain submission; never blindly resubmit.",
|
|
173
|
+
"title": "Idempotency Key"
|
|
174
|
+
},
|
|
175
|
+
"iterate": {
|
|
176
|
+
"default": false,
|
|
177
|
+
"description": "If true, iterate the storyboard toward its best version before rendering (slower, higher quality).",
|
|
178
|
+
"title": "Iterate",
|
|
179
|
+
"type": "boolean"
|
|
180
|
+
},
|
|
181
|
+
"persona_prompt": {
|
|
182
|
+
"anyOf": [
|
|
183
|
+
{
|
|
184
|
+
"type": "string"
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"type": "null"
|
|
188
|
+
}
|
|
189
|
+
],
|
|
190
|
+
"default": null,
|
|
191
|
+
"description": "Optional description of the on-screen presenter/persona.",
|
|
192
|
+
"title": "Persona Prompt"
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
"required": [
|
|
196
|
+
"ask"
|
|
197
|
+
],
|
|
198
|
+
"title": "CreateVideoInput",
|
|
199
|
+
"type": "object"
|
|
200
|
+
},
|
|
201
|
+
"method": "POST",
|
|
202
|
+
"name": "usemo_create_video",
|
|
203
|
+
"path": "/video/create",
|
|
204
|
+
"positional": "ask"
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"annotations": {
|
|
208
|
+
"destructiveHint": false,
|
|
209
|
+
"idempotentHint": false,
|
|
210
|
+
"openWorldHint": true,
|
|
211
|
+
"readOnlyHint": false,
|
|
212
|
+
"title": "Generate a video (spends credits)"
|
|
213
|
+
},
|
|
214
|
+
"command": "videos generate",
|
|
215
|
+
"description": "Start an image-to-video generation job. SPENDS CREDITS. Returns immediately with a\n job handle — the render runs asynchronously (seconds to minutes). Call usemo_wait_for_job\n with the returned job_id to get the finished video URL.\n\n Prefer quoting first (usemo_quote_cost) and confirming the spend with the user.\n\n Returns: {\"job_id\": str, \"status\": \"queued\", \"credits_charged\": float, \"job_path\": str}.\n ",
|
|
216
|
+
"inputSchema": {
|
|
217
|
+
"additionalProperties": false,
|
|
218
|
+
"anyOf": [
|
|
219
|
+
{
|
|
220
|
+
"required": [
|
|
221
|
+
"input_image_url"
|
|
222
|
+
]
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
"required": [
|
|
226
|
+
"input_image_asset_id"
|
|
227
|
+
]
|
|
228
|
+
}
|
|
229
|
+
],
|
|
230
|
+
"properties": {
|
|
231
|
+
"duration_sec": {
|
|
232
|
+
"default": 5,
|
|
233
|
+
"description": "Clip length in seconds: one of 5, 15, 30, 60.",
|
|
234
|
+
"enum": [
|
|
235
|
+
5,
|
|
236
|
+
15,
|
|
237
|
+
30,
|
|
238
|
+
60
|
|
239
|
+
],
|
|
240
|
+
"title": "Duration Sec",
|
|
241
|
+
"type": "integer"
|
|
242
|
+
},
|
|
243
|
+
"idempotency_key": {
|
|
244
|
+
"anyOf": [
|
|
245
|
+
{
|
|
246
|
+
"maxLength": 200,
|
|
247
|
+
"minLength": 1,
|
|
248
|
+
"type": "string"
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
"type": "null"
|
|
252
|
+
}
|
|
253
|
+
],
|
|
254
|
+
"default": null,
|
|
255
|
+
"description": "Reuse the same key and payload after an uncertain submission; never blindly resubmit.",
|
|
256
|
+
"title": "Idempotency Key"
|
|
257
|
+
},
|
|
258
|
+
"input_image_asset_id": {
|
|
259
|
+
"anyOf": [
|
|
260
|
+
{
|
|
261
|
+
"type": "string"
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
"type": "null"
|
|
265
|
+
}
|
|
266
|
+
],
|
|
267
|
+
"default": null,
|
|
268
|
+
"description": "Asset id of the starting frame (from usemo_list_assets or a generate call).",
|
|
269
|
+
"title": "Input Image Asset Id"
|
|
270
|
+
},
|
|
271
|
+
"input_image_url": {
|
|
272
|
+
"anyOf": [
|
|
273
|
+
{
|
|
274
|
+
"type": "string"
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
"type": "null"
|
|
278
|
+
}
|
|
279
|
+
],
|
|
280
|
+
"default": null,
|
|
281
|
+
"description": "Public URL of the starting frame. Provide this OR an asset id.",
|
|
282
|
+
"title": "Input Image Url"
|
|
283
|
+
},
|
|
284
|
+
"motion_prompt": {
|
|
285
|
+
"description": "What should happen / move in the shot (e.g. 'slow push-in, gentle smile').",
|
|
286
|
+
"maxLength": 2000,
|
|
287
|
+
"minLength": 1,
|
|
288
|
+
"title": "Motion Prompt",
|
|
289
|
+
"type": "string"
|
|
290
|
+
},
|
|
291
|
+
"negative_prompt": {
|
|
292
|
+
"anyOf": [
|
|
293
|
+
{
|
|
294
|
+
"maxLength": 2000,
|
|
295
|
+
"type": "string"
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
"type": "null"
|
|
299
|
+
}
|
|
300
|
+
],
|
|
301
|
+
"default": null,
|
|
302
|
+
"title": "Negative Prompt"
|
|
303
|
+
},
|
|
304
|
+
"project_id": {
|
|
305
|
+
"anyOf": [
|
|
306
|
+
{
|
|
307
|
+
"type": "string"
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
"type": "null"
|
|
311
|
+
}
|
|
312
|
+
],
|
|
313
|
+
"default": null,
|
|
314
|
+
"description": "Optional project to file the job under.",
|
|
315
|
+
"title": "Project Id"
|
|
316
|
+
},
|
|
317
|
+
"quality": {
|
|
318
|
+
"default": "quality",
|
|
319
|
+
"description": "'fast' or 'quality'.",
|
|
320
|
+
"enum": [
|
|
321
|
+
"fast",
|
|
322
|
+
"quality"
|
|
323
|
+
],
|
|
324
|
+
"title": "Quality",
|
|
325
|
+
"type": "string"
|
|
326
|
+
},
|
|
327
|
+
"resolution": {
|
|
328
|
+
"default": "720p",
|
|
329
|
+
"description": "'480p', '720p', or '1080p'.",
|
|
330
|
+
"enum": [
|
|
331
|
+
"480p",
|
|
332
|
+
"720p",
|
|
333
|
+
"1080p"
|
|
334
|
+
],
|
|
335
|
+
"title": "Resolution",
|
|
336
|
+
"type": "string"
|
|
337
|
+
}
|
|
338
|
+
},
|
|
339
|
+
"required": [
|
|
340
|
+
"motion_prompt"
|
|
341
|
+
],
|
|
342
|
+
"title": "GenerateVideoInput",
|
|
343
|
+
"type": "object"
|
|
344
|
+
},
|
|
345
|
+
"method": "POST",
|
|
346
|
+
"name": "usemo_generate_video",
|
|
347
|
+
"path": "/video/generate",
|
|
348
|
+
"positional": "motion_prompt"
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
"annotations": {
|
|
352
|
+
"destructiveHint": false,
|
|
353
|
+
"idempotentHint": false,
|
|
354
|
+
"openWorldHint": true,
|
|
355
|
+
"readOnlyHint": true,
|
|
356
|
+
"title": "Plan a video (grounded storyboard)"
|
|
357
|
+
},
|
|
358
|
+
"command": "videos plan",
|
|
359
|
+
"description": "Turn a plain-language ask into a grounded, fact-checked storyboard (shots, script,\n on-screen text) using the workspace's brand context. Read-only — nothing is rendered.\n\n Feed the returned `storyboard` into usemo_quote_cost to price it, then into the\n generation tools to actually make it.\n\n Returns: {\"storyboard\": {...}, \"shippable\": bool, \"verdict\": {...}}.\n ",
|
|
360
|
+
"inputSchema": {
|
|
361
|
+
"additionalProperties": false,
|
|
362
|
+
"properties": {
|
|
363
|
+
"ask": {
|
|
364
|
+
"description": "What the video should accomplish, in plain language (e.g. 'a 30s founder talking-head explaining our new pricing').",
|
|
365
|
+
"maxLength": 2000,
|
|
366
|
+
"minLength": 3,
|
|
367
|
+
"title": "Ask",
|
|
368
|
+
"type": "string"
|
|
369
|
+
},
|
|
370
|
+
"brand_voice": {
|
|
371
|
+
"anyOf": [
|
|
372
|
+
{
|
|
373
|
+
"maxLength": 1000,
|
|
374
|
+
"type": "string"
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
"type": "null"
|
|
378
|
+
}
|
|
379
|
+
],
|
|
380
|
+
"default": null,
|
|
381
|
+
"description": "Optional tone/voice override for the script.",
|
|
382
|
+
"title": "Brand Voice"
|
|
383
|
+
},
|
|
384
|
+
"iterate": {
|
|
385
|
+
"default": false,
|
|
386
|
+
"description": "If true, the director iterates the storyboard toward its best version (slower, higher quality) instead of returning a first draft.",
|
|
387
|
+
"title": "Iterate",
|
|
388
|
+
"type": "boolean"
|
|
389
|
+
}
|
|
390
|
+
},
|
|
391
|
+
"required": [
|
|
392
|
+
"ask"
|
|
393
|
+
],
|
|
394
|
+
"title": "PlanVideoInput",
|
|
395
|
+
"type": "object"
|
|
396
|
+
},
|
|
397
|
+
"method": "POST",
|
|
398
|
+
"name": "usemo_plan_video",
|
|
399
|
+
"path": "/video/storyboard",
|
|
400
|
+
"positional": "ask"
|
|
401
|
+
},
|
|
402
|
+
{
|
|
403
|
+
"annotations": {
|
|
404
|
+
"destructiveHint": false,
|
|
405
|
+
"idempotentHint": true,
|
|
406
|
+
"openWorldHint": true,
|
|
407
|
+
"readOnlyHint": true,
|
|
408
|
+
"title": "Quote video cost"
|
|
409
|
+
},
|
|
410
|
+
"command": "videos quote",
|
|
411
|
+
"description": "Estimate the cost (COGS) of producing a storyboard at draft / standard / premium\n tiers, BEFORE spending any credits. Always quote before generating so the user can\n approve the spend.\n\n Returns: {\"tiers\": {\"draft\": {...}, \"standard\": {...}, \"premium\": {...}}}.\n ",
|
|
412
|
+
"inputSchema": {
|
|
413
|
+
"$defs": {
|
|
414
|
+
"Tier": {
|
|
415
|
+
"enum": [
|
|
416
|
+
"draft",
|
|
417
|
+
"standard",
|
|
418
|
+
"premium"
|
|
419
|
+
],
|
|
420
|
+
"title": "Tier",
|
|
421
|
+
"type": "string"
|
|
422
|
+
}
|
|
423
|
+
},
|
|
424
|
+
"additionalProperties": false,
|
|
425
|
+
"anyOf": [
|
|
426
|
+
{
|
|
427
|
+
"required": [
|
|
428
|
+
"storyboard"
|
|
429
|
+
]
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
"required": [
|
|
433
|
+
"shots"
|
|
434
|
+
]
|
|
435
|
+
}
|
|
436
|
+
],
|
|
437
|
+
"properties": {
|
|
438
|
+
"shots": {
|
|
439
|
+
"anyOf": [
|
|
440
|
+
{
|
|
441
|
+
"items": {
|
|
442
|
+
"type": "object"
|
|
443
|
+
},
|
|
444
|
+
"type": "array"
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
"type": "null"
|
|
448
|
+
}
|
|
449
|
+
],
|
|
450
|
+
"default": null,
|
|
451
|
+
"description": "A list of shot objects. Provide this OR `storyboard`.",
|
|
452
|
+
"title": "Shots"
|
|
453
|
+
},
|
|
454
|
+
"storyboard": {
|
|
455
|
+
"anyOf": [
|
|
456
|
+
{
|
|
457
|
+
"type": "object"
|
|
458
|
+
},
|
|
459
|
+
{
|
|
460
|
+
"type": "null"
|
|
461
|
+
}
|
|
462
|
+
],
|
|
463
|
+
"default": null,
|
|
464
|
+
"description": "A storyboard object returned by usemo_plan_video. Provide this OR `shots`.",
|
|
465
|
+
"title": "Storyboard"
|
|
466
|
+
},
|
|
467
|
+
"tier": {
|
|
468
|
+
"$ref": "#/$defs/Tier",
|
|
469
|
+
"default": "standard",
|
|
470
|
+
"description": "Quality/cost tier: 'draft' (cheapest), 'standard', or 'premium'."
|
|
471
|
+
}
|
|
472
|
+
},
|
|
473
|
+
"title": "QuoteCostInput",
|
|
474
|
+
"type": "object"
|
|
475
|
+
},
|
|
476
|
+
"method": "POST",
|
|
477
|
+
"name": "usemo_quote_cost",
|
|
478
|
+
"path": "/video/scene-video/quote",
|
|
479
|
+
"positional": null
|
|
480
|
+
},
|
|
481
|
+
{
|
|
482
|
+
"annotations": {
|
|
483
|
+
"destructiveHint": false,
|
|
484
|
+
"idempotentHint": false,
|
|
485
|
+
"openWorldHint": true,
|
|
486
|
+
"readOnlyHint": false
|
|
487
|
+
},
|
|
488
|
+
"command": "videos script",
|
|
489
|
+
"description": "Turn a supplied script into a video. Spends credits; returns a job handle.",
|
|
490
|
+
"inputSchema": {
|
|
491
|
+
"additionalProperties": false,
|
|
492
|
+
"properties": {
|
|
493
|
+
"aspect_ratio": {
|
|
494
|
+
"default": "16:9",
|
|
495
|
+
"enum": [
|
|
496
|
+
"16:9",
|
|
497
|
+
"9:16",
|
|
498
|
+
"1:1"
|
|
499
|
+
],
|
|
500
|
+
"title": "Aspect Ratio",
|
|
501
|
+
"type": "string"
|
|
502
|
+
},
|
|
503
|
+
"brand_id": {
|
|
504
|
+
"anyOf": [
|
|
505
|
+
{
|
|
506
|
+
"type": "string"
|
|
507
|
+
},
|
|
508
|
+
{
|
|
509
|
+
"type": "null"
|
|
510
|
+
}
|
|
511
|
+
],
|
|
512
|
+
"default": null,
|
|
513
|
+
"title": "Brand Id"
|
|
514
|
+
},
|
|
515
|
+
"broll_prompts": {
|
|
516
|
+
"items": {
|
|
517
|
+
"type": "string"
|
|
518
|
+
},
|
|
519
|
+
"maxItems": 8,
|
|
520
|
+
"title": "Broll Prompts",
|
|
521
|
+
"type": "array"
|
|
522
|
+
},
|
|
523
|
+
"project_id": {
|
|
524
|
+
"anyOf": [
|
|
525
|
+
{
|
|
526
|
+
"type": "string"
|
|
527
|
+
},
|
|
528
|
+
{
|
|
529
|
+
"type": "null"
|
|
530
|
+
}
|
|
531
|
+
],
|
|
532
|
+
"default": null,
|
|
533
|
+
"title": "Project Id"
|
|
534
|
+
},
|
|
535
|
+
"script": {
|
|
536
|
+
"maxLength": 4000,
|
|
537
|
+
"minLength": 20,
|
|
538
|
+
"title": "Script",
|
|
539
|
+
"type": "string"
|
|
540
|
+
},
|
|
541
|
+
"twin_id": {
|
|
542
|
+
"anyOf": [
|
|
543
|
+
{
|
|
544
|
+
"type": "string"
|
|
545
|
+
},
|
|
546
|
+
{
|
|
547
|
+
"type": "null"
|
|
548
|
+
}
|
|
549
|
+
],
|
|
550
|
+
"default": null,
|
|
551
|
+
"title": "Twin Id"
|
|
552
|
+
},
|
|
553
|
+
"use_context": {
|
|
554
|
+
"default": true,
|
|
555
|
+
"title": "Use Context",
|
|
556
|
+
"type": "boolean"
|
|
557
|
+
}
|
|
558
|
+
},
|
|
559
|
+
"required": [
|
|
560
|
+
"script"
|
|
561
|
+
],
|
|
562
|
+
"title": "ScriptToVideoRequest",
|
|
563
|
+
"type": "object"
|
|
564
|
+
},
|
|
565
|
+
"method": "POST",
|
|
566
|
+
"name": "usemo_script_to_video",
|
|
567
|
+
"path": "/video/script-to-video",
|
|
568
|
+
"positional": "script"
|
|
569
|
+
},
|
|
570
|
+
{
|
|
571
|
+
"annotations": {
|
|
572
|
+
"destructiveHint": false,
|
|
573
|
+
"idempotentHint": false,
|
|
574
|
+
"openWorldHint": true,
|
|
575
|
+
"readOnlyHint": false,
|
|
576
|
+
"title": "Generate written content"
|
|
577
|
+
},
|
|
578
|
+
"command": "content create",
|
|
579
|
+
"description": "Generate on-brand written content — captions, posts, blog copy, email, or deck text.\n\n Returns a job handle immediately; poll usemo_wait_for_job for the result.\n The generated text is saved as an asset in the workspace.\n\n Returns: {\"status\": \"queued\", \"job_id\": str, \"job_path\": str, \"note\": \"...\"}.\n ",
|
|
580
|
+
"inputSchema": {
|
|
581
|
+
"$defs": {
|
|
582
|
+
"ContentFormat": {
|
|
583
|
+
"enum": [
|
|
584
|
+
"text",
|
|
585
|
+
"markdown",
|
|
586
|
+
"json"
|
|
587
|
+
],
|
|
588
|
+
"title": "ContentFormat",
|
|
589
|
+
"type": "string"
|
|
590
|
+
},
|
|
591
|
+
"ContentUseCase": {
|
|
592
|
+
"enum": [
|
|
593
|
+
"general",
|
|
594
|
+
"blog",
|
|
595
|
+
"email",
|
|
596
|
+
"deck"
|
|
597
|
+
],
|
|
598
|
+
"title": "ContentUseCase",
|
|
599
|
+
"type": "string"
|
|
600
|
+
}
|
|
601
|
+
},
|
|
602
|
+
"additionalProperties": false,
|
|
603
|
+
"properties": {
|
|
604
|
+
"idempotency_key": {
|
|
605
|
+
"anyOf": [
|
|
606
|
+
{
|
|
607
|
+
"maxLength": 200,
|
|
608
|
+
"minLength": 1,
|
|
609
|
+
"type": "string"
|
|
610
|
+
},
|
|
611
|
+
{
|
|
612
|
+
"type": "null"
|
|
613
|
+
}
|
|
614
|
+
],
|
|
615
|
+
"default": null,
|
|
616
|
+
"description": "Reuse the same key and payload after an uncertain submission; never blindly resubmit.",
|
|
617
|
+
"title": "Idempotency Key"
|
|
618
|
+
},
|
|
619
|
+
"max_tokens": {
|
|
620
|
+
"default": 800,
|
|
621
|
+
"description": "Max length of the output.",
|
|
622
|
+
"maximum": 4096,
|
|
623
|
+
"minimum": 64,
|
|
624
|
+
"title": "Max Tokens",
|
|
625
|
+
"type": "integer"
|
|
626
|
+
},
|
|
627
|
+
"prompt": {
|
|
628
|
+
"description": "What to write (e.g. 'a LinkedIn post announcing our Series A').",
|
|
629
|
+
"maxLength": 12000,
|
|
630
|
+
"minLength": 1,
|
|
631
|
+
"title": "Prompt",
|
|
632
|
+
"type": "string"
|
|
633
|
+
},
|
|
634
|
+
"response_format": {
|
|
635
|
+
"$ref": "#/$defs/ContentFormat",
|
|
636
|
+
"default": "markdown",
|
|
637
|
+
"description": "Output format: 'markdown', 'text', or 'json'."
|
|
638
|
+
},
|
|
639
|
+
"system_prompt": {
|
|
640
|
+
"anyOf": [
|
|
641
|
+
{
|
|
642
|
+
"maxLength": 4000,
|
|
643
|
+
"type": "string"
|
|
644
|
+
},
|
|
645
|
+
{
|
|
646
|
+
"type": "null"
|
|
647
|
+
}
|
|
648
|
+
],
|
|
649
|
+
"default": null,
|
|
650
|
+
"description": "Optional steering instructions (voice, rules).",
|
|
651
|
+
"title": "System Prompt"
|
|
652
|
+
},
|
|
653
|
+
"temperature": {
|
|
654
|
+
"default": 0.7,
|
|
655
|
+
"description": "Creativity (0=precise, 2=wild).",
|
|
656
|
+
"maximum": 2,
|
|
657
|
+
"minimum": 0,
|
|
658
|
+
"title": "Temperature",
|
|
659
|
+
"type": "number"
|
|
660
|
+
},
|
|
661
|
+
"use_case": {
|
|
662
|
+
"$ref": "#/$defs/ContentUseCase",
|
|
663
|
+
"default": "general",
|
|
664
|
+
"description": "Tunes tone/structure: 'general', 'blog', 'email', or 'deck'."
|
|
665
|
+
}
|
|
666
|
+
},
|
|
667
|
+
"required": [
|
|
668
|
+
"prompt"
|
|
669
|
+
],
|
|
670
|
+
"title": "GenerateContentInput",
|
|
671
|
+
"type": "object"
|
|
672
|
+
},
|
|
673
|
+
"method": "POST",
|
|
674
|
+
"name": "usemo_generate_content",
|
|
675
|
+
"path": "/generate/text",
|
|
676
|
+
"positional": "prompt"
|
|
677
|
+
},
|
|
678
|
+
{
|
|
679
|
+
"annotations": {
|
|
680
|
+
"destructiveHint": false,
|
|
681
|
+
"idempotentHint": false,
|
|
682
|
+
"openWorldHint": true,
|
|
683
|
+
"readOnlyHint": false
|
|
684
|
+
},
|
|
685
|
+
"command": "content social",
|
|
686
|
+
"description": "Compose a branded social image with a headline and optional CTA. Spends credits.\n\n Returns a job handle; use usemo_wait_for_job for the finished asset.\n ",
|
|
687
|
+
"inputSchema": {
|
|
688
|
+
"$defs": {
|
|
689
|
+
"AssetInput": {
|
|
690
|
+
"properties": {
|
|
691
|
+
"asset_id": {
|
|
692
|
+
"anyOf": [
|
|
693
|
+
{
|
|
694
|
+
"format": "uuid",
|
|
695
|
+
"type": "string"
|
|
696
|
+
},
|
|
697
|
+
{
|
|
698
|
+
"type": "null"
|
|
699
|
+
}
|
|
700
|
+
],
|
|
701
|
+
"default": null,
|
|
702
|
+
"title": "Asset Id"
|
|
703
|
+
},
|
|
704
|
+
"base64_data": {
|
|
705
|
+
"anyOf": [
|
|
706
|
+
{
|
|
707
|
+
"type": "string"
|
|
708
|
+
},
|
|
709
|
+
{
|
|
710
|
+
"type": "null"
|
|
711
|
+
}
|
|
712
|
+
],
|
|
713
|
+
"default": null,
|
|
714
|
+
"title": "Base64 Data"
|
|
715
|
+
},
|
|
716
|
+
"source_url": {
|
|
717
|
+
"anyOf": [
|
|
718
|
+
{
|
|
719
|
+
"type": "string"
|
|
720
|
+
},
|
|
721
|
+
{
|
|
722
|
+
"type": "null"
|
|
723
|
+
}
|
|
724
|
+
],
|
|
725
|
+
"default": null,
|
|
726
|
+
"title": "Source Url"
|
|
727
|
+
}
|
|
728
|
+
},
|
|
729
|
+
"title": "AssetInput",
|
|
730
|
+
"type": "object"
|
|
731
|
+
}
|
|
732
|
+
},
|
|
733
|
+
"additionalProperties": false,
|
|
734
|
+
"properties": {
|
|
735
|
+
"aspect_ratio": {
|
|
736
|
+
"default": "1:1",
|
|
737
|
+
"enum": [
|
|
738
|
+
"1:1",
|
|
739
|
+
"16:9",
|
|
740
|
+
"9:16",
|
|
741
|
+
"4:5"
|
|
742
|
+
],
|
|
743
|
+
"title": "Aspect Ratio",
|
|
744
|
+
"type": "string"
|
|
745
|
+
},
|
|
746
|
+
"brand_id": {
|
|
747
|
+
"anyOf": [
|
|
748
|
+
{
|
|
749
|
+
"type": "string"
|
|
750
|
+
},
|
|
751
|
+
{
|
|
752
|
+
"type": "null"
|
|
753
|
+
}
|
|
754
|
+
],
|
|
755
|
+
"default": null,
|
|
756
|
+
"title": "Brand Id"
|
|
757
|
+
},
|
|
758
|
+
"cta": {
|
|
759
|
+
"anyOf": [
|
|
760
|
+
{
|
|
761
|
+
"maxLength": 60,
|
|
762
|
+
"type": "string"
|
|
763
|
+
},
|
|
764
|
+
{
|
|
765
|
+
"type": "null"
|
|
766
|
+
}
|
|
767
|
+
],
|
|
768
|
+
"default": null,
|
|
769
|
+
"title": "Cta"
|
|
770
|
+
},
|
|
771
|
+
"headline": {
|
|
772
|
+
"maxLength": 200,
|
|
773
|
+
"minLength": 1,
|
|
774
|
+
"title": "Headline",
|
|
775
|
+
"type": "string"
|
|
776
|
+
},
|
|
777
|
+
"input_image": {
|
|
778
|
+
"anyOf": [
|
|
779
|
+
{
|
|
780
|
+
"$ref": "#/$defs/AssetInput"
|
|
781
|
+
},
|
|
782
|
+
{
|
|
783
|
+
"type": "null"
|
|
784
|
+
}
|
|
785
|
+
],
|
|
786
|
+
"default": null
|
|
787
|
+
},
|
|
788
|
+
"project_id": {
|
|
789
|
+
"anyOf": [
|
|
790
|
+
{
|
|
791
|
+
"type": "string"
|
|
792
|
+
},
|
|
793
|
+
{
|
|
794
|
+
"type": "null"
|
|
795
|
+
}
|
|
796
|
+
],
|
|
797
|
+
"default": null,
|
|
798
|
+
"title": "Project Id"
|
|
799
|
+
},
|
|
800
|
+
"subtext": {
|
|
801
|
+
"anyOf": [
|
|
802
|
+
{
|
|
803
|
+
"maxLength": 400,
|
|
804
|
+
"type": "string"
|
|
805
|
+
},
|
|
806
|
+
{
|
|
807
|
+
"type": "null"
|
|
808
|
+
}
|
|
809
|
+
],
|
|
810
|
+
"default": null,
|
|
811
|
+
"title": "Subtext"
|
|
812
|
+
}
|
|
813
|
+
},
|
|
814
|
+
"required": [
|
|
815
|
+
"headline"
|
|
816
|
+
],
|
|
817
|
+
"title": "SocialPostComposeRequest",
|
|
818
|
+
"type": "object"
|
|
819
|
+
},
|
|
820
|
+
"method": "POST",
|
|
821
|
+
"name": "usemo_create_social_post",
|
|
822
|
+
"path": "/collateral/social-post",
|
|
823
|
+
"positional": "headline"
|
|
824
|
+
},
|
|
825
|
+
{
|
|
826
|
+
"annotations": {
|
|
827
|
+
"destructiveHint": false,
|
|
828
|
+
"idempotentHint": false,
|
|
829
|
+
"openWorldHint": true,
|
|
830
|
+
"readOnlyHint": false
|
|
831
|
+
},
|
|
832
|
+
"command": "content deck",
|
|
833
|
+
"description": "Create a presentation from a title and brief. Spends credits; returns a job handle.",
|
|
834
|
+
"inputSchema": {
|
|
835
|
+
"$defs": {
|
|
836
|
+
"AssetInput": {
|
|
837
|
+
"properties": {
|
|
838
|
+
"asset_id": {
|
|
839
|
+
"anyOf": [
|
|
840
|
+
{
|
|
841
|
+
"format": "uuid",
|
|
842
|
+
"type": "string"
|
|
843
|
+
},
|
|
844
|
+
{
|
|
845
|
+
"type": "null"
|
|
846
|
+
}
|
|
847
|
+
],
|
|
848
|
+
"default": null,
|
|
849
|
+
"title": "Asset Id"
|
|
850
|
+
},
|
|
851
|
+
"base64_data": {
|
|
852
|
+
"anyOf": [
|
|
853
|
+
{
|
|
854
|
+
"type": "string"
|
|
855
|
+
},
|
|
856
|
+
{
|
|
857
|
+
"type": "null"
|
|
858
|
+
}
|
|
859
|
+
],
|
|
860
|
+
"default": null,
|
|
861
|
+
"title": "Base64 Data"
|
|
862
|
+
},
|
|
863
|
+
"source_url": {
|
|
864
|
+
"anyOf": [
|
|
865
|
+
{
|
|
866
|
+
"type": "string"
|
|
867
|
+
},
|
|
868
|
+
{
|
|
869
|
+
"type": "null"
|
|
870
|
+
}
|
|
871
|
+
],
|
|
872
|
+
"default": null,
|
|
873
|
+
"title": "Source Url"
|
|
874
|
+
}
|
|
875
|
+
},
|
|
876
|
+
"title": "AssetInput",
|
|
877
|
+
"type": "object"
|
|
878
|
+
}
|
|
879
|
+
},
|
|
880
|
+
"additionalProperties": false,
|
|
881
|
+
"properties": {
|
|
882
|
+
"brand_id": {
|
|
883
|
+
"anyOf": [
|
|
884
|
+
{
|
|
885
|
+
"type": "string"
|
|
886
|
+
},
|
|
887
|
+
{
|
|
888
|
+
"type": "null"
|
|
889
|
+
}
|
|
890
|
+
],
|
|
891
|
+
"default": null,
|
|
892
|
+
"title": "Brand Id"
|
|
893
|
+
},
|
|
894
|
+
"brief": {
|
|
895
|
+
"maxLength": 8000,
|
|
896
|
+
"minLength": 1,
|
|
897
|
+
"title": "Brief",
|
|
898
|
+
"type": "string"
|
|
899
|
+
},
|
|
900
|
+
"project_id": {
|
|
901
|
+
"anyOf": [
|
|
902
|
+
{
|
|
903
|
+
"type": "string"
|
|
904
|
+
},
|
|
905
|
+
{
|
|
906
|
+
"type": "null"
|
|
907
|
+
}
|
|
908
|
+
],
|
|
909
|
+
"default": null,
|
|
910
|
+
"title": "Project Id"
|
|
911
|
+
},
|
|
912
|
+
"slide_count": {
|
|
913
|
+
"default": 6,
|
|
914
|
+
"maximum": 12,
|
|
915
|
+
"minimum": 3,
|
|
916
|
+
"title": "Slide Count",
|
|
917
|
+
"type": "integer"
|
|
918
|
+
},
|
|
919
|
+
"slide_images": {
|
|
920
|
+
"items": {
|
|
921
|
+
"$ref": "#/$defs/AssetInput"
|
|
922
|
+
},
|
|
923
|
+
"maxItems": 8,
|
|
924
|
+
"title": "Slide Images",
|
|
925
|
+
"type": "array"
|
|
926
|
+
},
|
|
927
|
+
"subtitle": {
|
|
928
|
+
"anyOf": [
|
|
929
|
+
{
|
|
930
|
+
"maxLength": 200,
|
|
931
|
+
"type": "string"
|
|
932
|
+
},
|
|
933
|
+
{
|
|
934
|
+
"type": "null"
|
|
935
|
+
}
|
|
936
|
+
],
|
|
937
|
+
"default": null,
|
|
938
|
+
"title": "Subtitle"
|
|
939
|
+
},
|
|
940
|
+
"title": {
|
|
941
|
+
"maxLength": 200,
|
|
942
|
+
"minLength": 1,
|
|
943
|
+
"title": "Title",
|
|
944
|
+
"type": "string"
|
|
945
|
+
}
|
|
946
|
+
},
|
|
947
|
+
"required": [
|
|
948
|
+
"title",
|
|
949
|
+
"brief"
|
|
950
|
+
],
|
|
951
|
+
"title": "DeckComposeRequest",
|
|
952
|
+
"type": "object"
|
|
953
|
+
},
|
|
954
|
+
"method": "POST",
|
|
955
|
+
"name": "usemo_create_deck",
|
|
956
|
+
"path": "/collateral/deck",
|
|
957
|
+
"positional": "title"
|
|
958
|
+
},
|
|
959
|
+
{
|
|
960
|
+
"annotations": {
|
|
961
|
+
"destructiveHint": false,
|
|
962
|
+
"idempotentHint": false,
|
|
963
|
+
"openWorldHint": true,
|
|
964
|
+
"readOnlyHint": false
|
|
965
|
+
},
|
|
966
|
+
"command": "content article",
|
|
967
|
+
"description": "Write an SEO article grounded in brand context. Spends credits; returns a job handle.",
|
|
968
|
+
"inputSchema": {
|
|
969
|
+
"additionalProperties": false,
|
|
970
|
+
"properties": {
|
|
971
|
+
"audience": {
|
|
972
|
+
"anyOf": [
|
|
973
|
+
{
|
|
974
|
+
"maxLength": 300,
|
|
975
|
+
"type": "string"
|
|
976
|
+
},
|
|
977
|
+
{
|
|
978
|
+
"type": "null"
|
|
979
|
+
}
|
|
980
|
+
],
|
|
981
|
+
"default": null,
|
|
982
|
+
"title": "Audience"
|
|
983
|
+
},
|
|
984
|
+
"brand_id": {
|
|
985
|
+
"anyOf": [
|
|
986
|
+
{
|
|
987
|
+
"type": "string"
|
|
988
|
+
},
|
|
989
|
+
{
|
|
990
|
+
"type": "null"
|
|
991
|
+
}
|
|
992
|
+
],
|
|
993
|
+
"default": null,
|
|
994
|
+
"title": "Brand Id"
|
|
995
|
+
},
|
|
996
|
+
"project_id": {
|
|
997
|
+
"anyOf": [
|
|
998
|
+
{
|
|
999
|
+
"type": "string"
|
|
1000
|
+
},
|
|
1001
|
+
{
|
|
1002
|
+
"type": "null"
|
|
1003
|
+
}
|
|
1004
|
+
],
|
|
1005
|
+
"default": null,
|
|
1006
|
+
"title": "Project Id"
|
|
1007
|
+
},
|
|
1008
|
+
"target_keyword": {
|
|
1009
|
+
"anyOf": [
|
|
1010
|
+
{
|
|
1011
|
+
"maxLength": 200,
|
|
1012
|
+
"type": "string"
|
|
1013
|
+
},
|
|
1014
|
+
{
|
|
1015
|
+
"type": "null"
|
|
1016
|
+
}
|
|
1017
|
+
],
|
|
1018
|
+
"default": null,
|
|
1019
|
+
"title": "Target Keyword"
|
|
1020
|
+
},
|
|
1021
|
+
"topic": {
|
|
1022
|
+
"maxLength": 300,
|
|
1023
|
+
"minLength": 3,
|
|
1024
|
+
"title": "Topic",
|
|
1025
|
+
"type": "string"
|
|
1026
|
+
},
|
|
1027
|
+
"use_context": {
|
|
1028
|
+
"default": true,
|
|
1029
|
+
"title": "Use Context",
|
|
1030
|
+
"type": "boolean"
|
|
1031
|
+
},
|
|
1032
|
+
"word_count": {
|
|
1033
|
+
"default": 1200,
|
|
1034
|
+
"maximum": 3000,
|
|
1035
|
+
"minimum": 400,
|
|
1036
|
+
"title": "Word Count",
|
|
1037
|
+
"type": "integer"
|
|
1038
|
+
}
|
|
1039
|
+
},
|
|
1040
|
+
"required": [
|
|
1041
|
+
"topic"
|
|
1042
|
+
],
|
|
1043
|
+
"title": "SeoArticleRequest",
|
|
1044
|
+
"type": "object"
|
|
1045
|
+
},
|
|
1046
|
+
"method": "POST",
|
|
1047
|
+
"name": "usemo_create_article",
|
|
1048
|
+
"path": "/content/seo-article",
|
|
1049
|
+
"positional": "topic"
|
|
1050
|
+
},
|
|
1051
|
+
{
|
|
1052
|
+
"annotations": {
|
|
1053
|
+
"destructiveHint": false,
|
|
1054
|
+
"idempotentHint": true,
|
|
1055
|
+
"openWorldHint": true,
|
|
1056
|
+
"readOnlyHint": true,
|
|
1057
|
+
"title": "Get job status"
|
|
1058
|
+
},
|
|
1059
|
+
"command": "jobs get",
|
|
1060
|
+
"description": "Get the current status of one generation job, including progress and (when finished)\n the result URLs.\n\n Returns: {job_id, status, progress, progress_message, result_urls, credits_cost, error}.\n ",
|
|
1061
|
+
"inputSchema": {
|
|
1062
|
+
"additionalProperties": false,
|
|
1063
|
+
"properties": {
|
|
1064
|
+
"job_id": {
|
|
1065
|
+
"description": "The job id returned by a generate/render tool.",
|
|
1066
|
+
"title": "Job Id",
|
|
1067
|
+
"type": "string"
|
|
1068
|
+
}
|
|
1069
|
+
},
|
|
1070
|
+
"required": [
|
|
1071
|
+
"job_id"
|
|
1072
|
+
],
|
|
1073
|
+
"title": "JobIdInput",
|
|
1074
|
+
"type": "object"
|
|
1075
|
+
},
|
|
1076
|
+
"method": "GET",
|
|
1077
|
+
"name": "usemo_job_status",
|
|
1078
|
+
"path": "/jobs/{job_id}",
|
|
1079
|
+
"positional": "job_id"
|
|
1080
|
+
},
|
|
1081
|
+
{
|
|
1082
|
+
"annotations": {
|
|
1083
|
+
"destructiveHint": false,
|
|
1084
|
+
"idempotentHint": false,
|
|
1085
|
+
"openWorldHint": true,
|
|
1086
|
+
"readOnlyHint": true,
|
|
1087
|
+
"title": "Wait for a job to finish"
|
|
1088
|
+
},
|
|
1089
|
+
"command": "jobs wait",
|
|
1090
|
+
"description": "Poll a job until it reaches a terminal state (completed/failed/cancelled) OR the\n max_wait_sec cap is hit — whichever comes first. BOUNDED: it never blocks indefinitely.\n\n If the cap is reached while the job is still running, returns the latest in-progress\n status with timed_out=true so the caller can decide to wait again.\n\n Returns: {job_id, status, progress, result_urls, credits_cost, error, timed_out: bool}.\n ",
|
|
1091
|
+
"inputSchema": {
|
|
1092
|
+
"additionalProperties": false,
|
|
1093
|
+
"properties": {
|
|
1094
|
+
"job_id": {
|
|
1095
|
+
"description": "The job id to wait on.",
|
|
1096
|
+
"title": "Job Id",
|
|
1097
|
+
"type": "string"
|
|
1098
|
+
},
|
|
1099
|
+
"max_wait_sec": {
|
|
1100
|
+
"default": 180,
|
|
1101
|
+
"description": "Hard cap on how long to wait (5-600s). Returns the latest status even if the job is still running when the cap is hit — it never blocks indefinitely.",
|
|
1102
|
+
"maximum": 600,
|
|
1103
|
+
"minimum": 5,
|
|
1104
|
+
"title": "Max Wait Sec",
|
|
1105
|
+
"type": "integer"
|
|
1106
|
+
},
|
|
1107
|
+
"poll_interval_sec": {
|
|
1108
|
+
"default": 5,
|
|
1109
|
+
"maximum": 30,
|
|
1110
|
+
"minimum": 2,
|
|
1111
|
+
"title": "Poll Interval Sec",
|
|
1112
|
+
"type": "integer"
|
|
1113
|
+
}
|
|
1114
|
+
},
|
|
1115
|
+
"required": [
|
|
1116
|
+
"job_id"
|
|
1117
|
+
],
|
|
1118
|
+
"title": "WaitForJobInput",
|
|
1119
|
+
"type": "object"
|
|
1120
|
+
},
|
|
1121
|
+
"method": "GET",
|
|
1122
|
+
"name": "usemo_wait_for_job",
|
|
1123
|
+
"path": "/jobs/{job_id}",
|
|
1124
|
+
"positional": "job_id"
|
|
1125
|
+
},
|
|
1126
|
+
{
|
|
1127
|
+
"annotations": {
|
|
1128
|
+
"destructiveHint": false,
|
|
1129
|
+
"idempotentHint": true,
|
|
1130
|
+
"openWorldHint": true,
|
|
1131
|
+
"readOnlyHint": true,
|
|
1132
|
+
"title": "List recent jobs"
|
|
1133
|
+
},
|
|
1134
|
+
"command": "jobs list",
|
|
1135
|
+
"description": "List recent generation jobs in this workspace (most recent first), trimmed to the\n fields that matter. Use this to recover a job_id you lost or to check what's in flight.\n\n Returns: {\"jobs\": [{job_id, status, progress, type, result_urls}], \"count\": int}.\n ",
|
|
1136
|
+
"inputSchema": {
|
|
1137
|
+
"additionalProperties": false,
|
|
1138
|
+
"properties": {
|
|
1139
|
+
"limit": {
|
|
1140
|
+
"default": 20,
|
|
1141
|
+
"maximum": 100,
|
|
1142
|
+
"minimum": 1,
|
|
1143
|
+
"title": "Limit",
|
|
1144
|
+
"type": "integer"
|
|
1145
|
+
},
|
|
1146
|
+
"status": {
|
|
1147
|
+
"anyOf": [
|
|
1148
|
+
{
|
|
1149
|
+
"type": "string"
|
|
1150
|
+
},
|
|
1151
|
+
{
|
|
1152
|
+
"type": "null"
|
|
1153
|
+
}
|
|
1154
|
+
],
|
|
1155
|
+
"default": null,
|
|
1156
|
+
"description": "Filter by status (queued/processing/completed/failed).",
|
|
1157
|
+
"title": "Status"
|
|
1158
|
+
},
|
|
1159
|
+
"type": {
|
|
1160
|
+
"anyOf": [
|
|
1161
|
+
{
|
|
1162
|
+
"type": "string"
|
|
1163
|
+
},
|
|
1164
|
+
{
|
|
1165
|
+
"type": "null"
|
|
1166
|
+
}
|
|
1167
|
+
],
|
|
1168
|
+
"default": null,
|
|
1169
|
+
"description": "Filter by job type.",
|
|
1170
|
+
"title": "Type"
|
|
1171
|
+
}
|
|
1172
|
+
},
|
|
1173
|
+
"title": "ListJobsInput",
|
|
1174
|
+
"type": "object"
|
|
1175
|
+
},
|
|
1176
|
+
"method": "GET",
|
|
1177
|
+
"name": "usemo_list_jobs",
|
|
1178
|
+
"path": "/jobs",
|
|
1179
|
+
"positional": null
|
|
1180
|
+
},
|
|
1181
|
+
{
|
|
1182
|
+
"annotations": {
|
|
1183
|
+
"destructiveHint": false,
|
|
1184
|
+
"idempotentHint": true,
|
|
1185
|
+
"openWorldHint": true,
|
|
1186
|
+
"readOnlyHint": true,
|
|
1187
|
+
"title": "List assets"
|
|
1188
|
+
},
|
|
1189
|
+
"command": "assets list",
|
|
1190
|
+
"description": "List media assets in this workspace (generated outputs and uploads). Use asset ids as\n inputs to generation tools (e.g. an audio asset for usemo_render_twin).\n\n Returns: {\"assets\": [{id, type, name, url, ...}], \"count\": int}.\n ",
|
|
1191
|
+
"inputSchema": {
|
|
1192
|
+
"additionalProperties": false,
|
|
1193
|
+
"properties": {
|
|
1194
|
+
"limit": {
|
|
1195
|
+
"default": 50,
|
|
1196
|
+
"maximum": 100,
|
|
1197
|
+
"minimum": 1,
|
|
1198
|
+
"title": "Limit",
|
|
1199
|
+
"type": "integer"
|
|
1200
|
+
},
|
|
1201
|
+
"search": {
|
|
1202
|
+
"anyOf": [
|
|
1203
|
+
{
|
|
1204
|
+
"type": "string"
|
|
1205
|
+
},
|
|
1206
|
+
{
|
|
1207
|
+
"type": "null"
|
|
1208
|
+
}
|
|
1209
|
+
],
|
|
1210
|
+
"default": null,
|
|
1211
|
+
"description": "Free-text search over asset names/tags.",
|
|
1212
|
+
"title": "Search"
|
|
1213
|
+
},
|
|
1214
|
+
"type": {
|
|
1215
|
+
"anyOf": [
|
|
1216
|
+
{
|
|
1217
|
+
"type": "string"
|
|
1218
|
+
},
|
|
1219
|
+
{
|
|
1220
|
+
"type": "null"
|
|
1221
|
+
}
|
|
1222
|
+
],
|
|
1223
|
+
"default": null,
|
|
1224
|
+
"description": "Filter by asset type (e.g. 'video', 'image', 'audio').",
|
|
1225
|
+
"title": "Type"
|
|
1226
|
+
}
|
|
1227
|
+
},
|
|
1228
|
+
"title": "ListAssetsInput",
|
|
1229
|
+
"type": "object"
|
|
1230
|
+
},
|
|
1231
|
+
"method": "GET",
|
|
1232
|
+
"name": "usemo_list_assets",
|
|
1233
|
+
"path": "/assets",
|
|
1234
|
+
"positional": null
|
|
1235
|
+
},
|
|
1236
|
+
{
|
|
1237
|
+
"annotations": {
|
|
1238
|
+
"destructiveHint": false,
|
|
1239
|
+
"idempotentHint": true,
|
|
1240
|
+
"openWorldHint": true,
|
|
1241
|
+
"readOnlyHint": true,
|
|
1242
|
+
"title": "Get asset details"
|
|
1243
|
+
},
|
|
1244
|
+
"command": "assets get",
|
|
1245
|
+
"description": "Get full details for one asset, including its download/preview URL.\n\n Returns the asset object: {id, type, name, url, created_at, metadata, ...}.\n ",
|
|
1246
|
+
"inputSchema": {
|
|
1247
|
+
"additionalProperties": false,
|
|
1248
|
+
"properties": {
|
|
1249
|
+
"asset_id": {
|
|
1250
|
+
"description": "The asset id.",
|
|
1251
|
+
"title": "Asset Id",
|
|
1252
|
+
"type": "string"
|
|
1253
|
+
}
|
|
1254
|
+
},
|
|
1255
|
+
"required": [
|
|
1256
|
+
"asset_id"
|
|
1257
|
+
],
|
|
1258
|
+
"title": "AssetIdInput",
|
|
1259
|
+
"type": "object"
|
|
1260
|
+
},
|
|
1261
|
+
"method": "GET",
|
|
1262
|
+
"name": "usemo_get_asset",
|
|
1263
|
+
"path": "/assets/{asset_id}",
|
|
1264
|
+
"positional": "asset_id"
|
|
1265
|
+
},
|
|
1266
|
+
{
|
|
1267
|
+
"annotations": {
|
|
1268
|
+
"destructiveHint": false,
|
|
1269
|
+
"idempotentHint": true,
|
|
1270
|
+
"openWorldHint": true,
|
|
1271
|
+
"readOnlyHint": true,
|
|
1272
|
+
"title": "List digital twins"
|
|
1273
|
+
},
|
|
1274
|
+
"command": "twins list",
|
|
1275
|
+
"description": "List the workspace's digital twins (enrolled avatars/clones) with their ids and status.\n Use a twin's id with usemo_render_twin or usemo_generate_image.\n\n Returns: {\"twins\": [{id, name, status, default_language}], \"count\": int}.\n ",
|
|
1276
|
+
"inputSchema": {
|
|
1277
|
+
"additionalProperties": false,
|
|
1278
|
+
"properties": {
|
|
1279
|
+
"limit": {
|
|
1280
|
+
"default": 50,
|
|
1281
|
+
"maximum": 100,
|
|
1282
|
+
"minimum": 1,
|
|
1283
|
+
"title": "Limit",
|
|
1284
|
+
"type": "integer"
|
|
1285
|
+
},
|
|
1286
|
+
"status": {
|
|
1287
|
+
"anyOf": [
|
|
1288
|
+
{
|
|
1289
|
+
"type": "string"
|
|
1290
|
+
},
|
|
1291
|
+
{
|
|
1292
|
+
"type": "null"
|
|
1293
|
+
}
|
|
1294
|
+
],
|
|
1295
|
+
"default": null,
|
|
1296
|
+
"description": "Filter by status (e.g. 'ready').",
|
|
1297
|
+
"title": "Status"
|
|
1298
|
+
}
|
|
1299
|
+
},
|
|
1300
|
+
"title": "ListTwinsInput",
|
|
1301
|
+
"type": "object"
|
|
1302
|
+
},
|
|
1303
|
+
"method": "GET",
|
|
1304
|
+
"name": "usemo_list_twins",
|
|
1305
|
+
"path": "/twins",
|
|
1306
|
+
"positional": null
|
|
1307
|
+
},
|
|
1308
|
+
{
|
|
1309
|
+
"annotations": {
|
|
1310
|
+
"destructiveHint": false,
|
|
1311
|
+
"idempotentHint": false,
|
|
1312
|
+
"openWorldHint": true,
|
|
1313
|
+
"readOnlyHint": false,
|
|
1314
|
+
"title": "Render a digital twin (spends credits)"
|
|
1315
|
+
},
|
|
1316
|
+
"command": "twins render",
|
|
1317
|
+
"description": "Render a talking-head video of a digital twin lip-syncing to a voiceover audio asset.\n SPENDS CREDITS. Returns a job handle; poll with usemo_wait_for_job for the video URL.\n\n Returns: {\"job_id\": str, \"status\": \"queued\", \"credits_charged\": float, \"job_path\": str}.\n ",
|
|
1318
|
+
"inputSchema": {
|
|
1319
|
+
"$defs": {
|
|
1320
|
+
"AspectRatio": {
|
|
1321
|
+
"enum": [
|
|
1322
|
+
"9:16",
|
|
1323
|
+
"1:1",
|
|
1324
|
+
"16:9"
|
|
1325
|
+
],
|
|
1326
|
+
"title": "AspectRatio",
|
|
1327
|
+
"type": "string"
|
|
1328
|
+
}
|
|
1329
|
+
},
|
|
1330
|
+
"additionalProperties": false,
|
|
1331
|
+
"properties": {
|
|
1332
|
+
"aspect_ratio": {
|
|
1333
|
+
"$ref": "#/$defs/AspectRatio",
|
|
1334
|
+
"default": "9:16"
|
|
1335
|
+
},
|
|
1336
|
+
"audio_asset_id": {
|
|
1337
|
+
"description": "Asset id of the voiceover audio the avatar should lip-sync to.",
|
|
1338
|
+
"title": "Audio Asset Id",
|
|
1339
|
+
"type": "string"
|
|
1340
|
+
},
|
|
1341
|
+
"motion_asset_id": {
|
|
1342
|
+
"anyOf": [
|
|
1343
|
+
{
|
|
1344
|
+
"type": "string"
|
|
1345
|
+
},
|
|
1346
|
+
{
|
|
1347
|
+
"type": "null"
|
|
1348
|
+
}
|
|
1349
|
+
],
|
|
1350
|
+
"default": null,
|
|
1351
|
+
"description": "Optional driving video for head motion; defaults to the twin's best clip.",
|
|
1352
|
+
"title": "Motion Asset Id"
|
|
1353
|
+
},
|
|
1354
|
+
"project_id": {
|
|
1355
|
+
"anyOf": [
|
|
1356
|
+
{
|
|
1357
|
+
"type": "string"
|
|
1358
|
+
},
|
|
1359
|
+
{
|
|
1360
|
+
"type": "null"
|
|
1361
|
+
}
|
|
1362
|
+
],
|
|
1363
|
+
"default": null,
|
|
1364
|
+
"title": "Project Id"
|
|
1365
|
+
},
|
|
1366
|
+
"style_prompt": {
|
|
1367
|
+
"anyOf": [
|
|
1368
|
+
{
|
|
1369
|
+
"maxLength": 2000,
|
|
1370
|
+
"type": "string"
|
|
1371
|
+
},
|
|
1372
|
+
{
|
|
1373
|
+
"type": "null"
|
|
1374
|
+
}
|
|
1375
|
+
],
|
|
1376
|
+
"default": null,
|
|
1377
|
+
"title": "Style Prompt"
|
|
1378
|
+
},
|
|
1379
|
+
"twin_id": {
|
|
1380
|
+
"description": "The digital-twin id (from usemo_list_twins).",
|
|
1381
|
+
"title": "Twin Id",
|
|
1382
|
+
"type": "string"
|
|
1383
|
+
}
|
|
1384
|
+
},
|
|
1385
|
+
"required": [
|
|
1386
|
+
"twin_id",
|
|
1387
|
+
"audio_asset_id"
|
|
1388
|
+
],
|
|
1389
|
+
"title": "RenderTwinInput",
|
|
1390
|
+
"type": "object"
|
|
1391
|
+
},
|
|
1392
|
+
"method": "POST",
|
|
1393
|
+
"name": "usemo_render_twin",
|
|
1394
|
+
"path": "/twins/{twin_id}/avatar/render",
|
|
1395
|
+
"positional": "twin_id"
|
|
1396
|
+
},
|
|
1397
|
+
{
|
|
1398
|
+
"annotations": {
|
|
1399
|
+
"destructiveHint": false,
|
|
1400
|
+
"idempotentHint": false,
|
|
1401
|
+
"openWorldHint": true,
|
|
1402
|
+
"readOnlyHint": false,
|
|
1403
|
+
"title": "Synthesize a twin's voice (spends credits)"
|
|
1404
|
+
},
|
|
1405
|
+
"command": "twins speak",
|
|
1406
|
+
"description": "Generate spoken audio in a digital twin's voice from a script. SPENDS CREDITS. Returns a\n job handle; poll usemo_wait_for_job for the audio asset (then usable as the audio for\n usemo_render_twin).\n ",
|
|
1407
|
+
"inputSchema": {
|
|
1408
|
+
"additionalProperties": false,
|
|
1409
|
+
"properties": {
|
|
1410
|
+
"language": {
|
|
1411
|
+
"anyOf": [
|
|
1412
|
+
{
|
|
1413
|
+
"type": "string"
|
|
1414
|
+
},
|
|
1415
|
+
{
|
|
1416
|
+
"type": "null"
|
|
1417
|
+
}
|
|
1418
|
+
],
|
|
1419
|
+
"default": null,
|
|
1420
|
+
"description": "Optional language override.",
|
|
1421
|
+
"title": "Language"
|
|
1422
|
+
},
|
|
1423
|
+
"script_text": {
|
|
1424
|
+
"description": "The text to speak.",
|
|
1425
|
+
"maxLength": 20000,
|
|
1426
|
+
"minLength": 1,
|
|
1427
|
+
"title": "Script Text",
|
|
1428
|
+
"type": "string"
|
|
1429
|
+
},
|
|
1430
|
+
"style_prompt": {
|
|
1431
|
+
"anyOf": [
|
|
1432
|
+
{
|
|
1433
|
+
"type": "string"
|
|
1434
|
+
},
|
|
1435
|
+
{
|
|
1436
|
+
"type": "null"
|
|
1437
|
+
}
|
|
1438
|
+
],
|
|
1439
|
+
"default": null,
|
|
1440
|
+
"description": "Optional delivery/style direction.",
|
|
1441
|
+
"title": "Style Prompt"
|
|
1442
|
+
},
|
|
1443
|
+
"twin_id": {
|
|
1444
|
+
"description": "The digital-twin id whose voice to use (from usemo_list_twins).",
|
|
1445
|
+
"title": "Twin Id",
|
|
1446
|
+
"type": "string"
|
|
1447
|
+
}
|
|
1448
|
+
},
|
|
1449
|
+
"required": [
|
|
1450
|
+
"twin_id",
|
|
1451
|
+
"script_text"
|
|
1452
|
+
],
|
|
1453
|
+
"title": "SynthesizeVoiceInput",
|
|
1454
|
+
"type": "object"
|
|
1455
|
+
},
|
|
1456
|
+
"method": "POST",
|
|
1457
|
+
"name": "usemo_synthesize_voice",
|
|
1458
|
+
"path": "/twins/{twin_id}/voice/synthesize",
|
|
1459
|
+
"positional": "twin_id"
|
|
1460
|
+
},
|
|
1461
|
+
{
|
|
1462
|
+
"annotations": {
|
|
1463
|
+
"destructiveHint": false,
|
|
1464
|
+
"idempotentHint": true,
|
|
1465
|
+
"openWorldHint": true,
|
|
1466
|
+
"readOnlyHint": true,
|
|
1467
|
+
"title": "Get brand context"
|
|
1468
|
+
},
|
|
1469
|
+
"command": "brand get",
|
|
1470
|
+
"description": "Return the workspace's learned brand profile (what UseMo knows about this business:\n product, audience, voice) and how complete that knowledge is.\n\n Call this first to ground ideation and scripts. If coverage is low, suggest the user add\n their website in the UseMo app so generations are on-brand.\n\n Returns: {\"profile\": {...}, \"coverage\": {...}} or an error string.\n ",
|
|
1471
|
+
"inputSchema": {
|
|
1472
|
+
"additionalProperties": false,
|
|
1473
|
+
"properties": {},
|
|
1474
|
+
"type": "object"
|
|
1475
|
+
},
|
|
1476
|
+
"method": "GET",
|
|
1477
|
+
"name": "usemo_get_brand_context",
|
|
1478
|
+
"path": "/context/profile",
|
|
1479
|
+
"positional": null
|
|
1480
|
+
},
|
|
1481
|
+
{
|
|
1482
|
+
"annotations": {
|
|
1483
|
+
"destructiveHint": false,
|
|
1484
|
+
"idempotentHint": false,
|
|
1485
|
+
"openWorldHint": true,
|
|
1486
|
+
"readOnlyHint": false,
|
|
1487
|
+
"title": "Learn brand context from a website"
|
|
1488
|
+
},
|
|
1489
|
+
"command": "brand learn",
|
|
1490
|
+
"description": "Teach UseMo about a brand by reading its website — extracts product, audience, and voice\n into the workspace's context so later generations are on-brand. Great for onboarding.\n\n Returns a job handle; poll usemo_wait_for_job, then usemo_get_brand_context to see coverage.\n ",
|
|
1491
|
+
"inputSchema": {
|
|
1492
|
+
"additionalProperties": false,
|
|
1493
|
+
"properties": {
|
|
1494
|
+
"url": {
|
|
1495
|
+
"description": "A website URL UseMo should read to learn this brand (product, audience, voice).",
|
|
1496
|
+
"maxLength": 2048,
|
|
1497
|
+
"minLength": 8,
|
|
1498
|
+
"title": "Url",
|
|
1499
|
+
"type": "string"
|
|
1500
|
+
}
|
|
1501
|
+
},
|
|
1502
|
+
"required": [
|
|
1503
|
+
"url"
|
|
1504
|
+
],
|
|
1505
|
+
"title": "LearnContextInput",
|
|
1506
|
+
"type": "object"
|
|
1507
|
+
},
|
|
1508
|
+
"method": "POST",
|
|
1509
|
+
"name": "usemo_learn_context",
|
|
1510
|
+
"path": "/context/sources/website",
|
|
1511
|
+
"positional": "url"
|
|
1512
|
+
},
|
|
1513
|
+
{
|
|
1514
|
+
"annotations": {
|
|
1515
|
+
"destructiveHint": false,
|
|
1516
|
+
"idempotentHint": false,
|
|
1517
|
+
"openWorldHint": true,
|
|
1518
|
+
"readOnlyHint": true,
|
|
1519
|
+
"title": "Suggest video ideas"
|
|
1520
|
+
},
|
|
1521
|
+
"command": "ideas suggest",
|
|
1522
|
+
"description": "Propose fresh, on-brand short-video concepts for this workspace — one per content\n pillar — each with a scroll-stopping hook, an angle, a format, and an estimated cost.\n\n This is the \"what should I make today?\" tool. Read-only: it does not generate anything.\n\n Returns: {\"ideas\": [{title, hook, angle, pillar, format, duration_sec}], \"plan\": {...},\n \"grounded\": bool, \"context\": {...}}. Returns a setup hint if the workspace has no context.\n ",
|
|
1523
|
+
"inputSchema": {
|
|
1524
|
+
"additionalProperties": false,
|
|
1525
|
+
"properties": {
|
|
1526
|
+
"brief": {
|
|
1527
|
+
"anyOf": [
|
|
1528
|
+
{
|
|
1529
|
+
"maxLength": 2000,
|
|
1530
|
+
"type": "string"
|
|
1531
|
+
},
|
|
1532
|
+
{
|
|
1533
|
+
"type": "null"
|
|
1534
|
+
}
|
|
1535
|
+
],
|
|
1536
|
+
"default": null,
|
|
1537
|
+
"description": "Optional steer for the ideas (e.g. 'promote our summer sale to Gen-Z'). Omit to get the proactive default: fresh high-performing concepts for this brand.",
|
|
1538
|
+
"title": "Brief"
|
|
1539
|
+
}
|
|
1540
|
+
},
|
|
1541
|
+
"title": "SuggestIdeasInput",
|
|
1542
|
+
"type": "object"
|
|
1543
|
+
},
|
|
1544
|
+
"method": "POST",
|
|
1545
|
+
"name": "usemo_suggest_ideas",
|
|
1546
|
+
"path": "/companion/suggest",
|
|
1547
|
+
"positional": "brief"
|
|
1548
|
+
},
|
|
1549
|
+
{
|
|
1550
|
+
"annotations": {
|
|
1551
|
+
"destructiveHint": false,
|
|
1552
|
+
"idempotentHint": true,
|
|
1553
|
+
"openWorldHint": true,
|
|
1554
|
+
"readOnlyHint": true,
|
|
1555
|
+
"title": "Quote a multi-video campaign"
|
|
1556
|
+
},
|
|
1557
|
+
"command": "campaigns quote",
|
|
1558
|
+
"description": "Estimate the per-video and campaign-total cost (COGS) for a set of video concepts —\n e.g. the `ideas` from usemo_suggest_ideas. Read-only; nothing is rendered.\n\n Returns per-concept + total cost at the chosen tier.\n ",
|
|
1559
|
+
"inputSchema": {
|
|
1560
|
+
"$defs": {
|
|
1561
|
+
"Tier": {
|
|
1562
|
+
"enum": [
|
|
1563
|
+
"draft",
|
|
1564
|
+
"standard",
|
|
1565
|
+
"premium"
|
|
1566
|
+
],
|
|
1567
|
+
"title": "Tier",
|
|
1568
|
+
"type": "string"
|
|
1569
|
+
}
|
|
1570
|
+
},
|
|
1571
|
+
"additionalProperties": false,
|
|
1572
|
+
"properties": {
|
|
1573
|
+
"concepts": {
|
|
1574
|
+
"description": "Video concepts to price (e.g. the `ideas` from usemo_suggest_ideas), one per format/pillar.",
|
|
1575
|
+
"items": {
|
|
1576
|
+
"type": "object"
|
|
1577
|
+
},
|
|
1578
|
+
"minItems": 1,
|
|
1579
|
+
"title": "Concepts",
|
|
1580
|
+
"type": "array"
|
|
1581
|
+
},
|
|
1582
|
+
"tier": {
|
|
1583
|
+
"$ref": "#/$defs/Tier",
|
|
1584
|
+
"default": "standard",
|
|
1585
|
+
"description": "Quality/cost tier for the estimate."
|
|
1586
|
+
}
|
|
1587
|
+
},
|
|
1588
|
+
"required": [
|
|
1589
|
+
"concepts"
|
|
1590
|
+
],
|
|
1591
|
+
"title": "PlanCampaignInput",
|
|
1592
|
+
"type": "object"
|
|
1593
|
+
},
|
|
1594
|
+
"method": "POST",
|
|
1595
|
+
"name": "usemo_plan_campaign",
|
|
1596
|
+
"path": "/video/campaign/plan",
|
|
1597
|
+
"positional": null
|
|
1598
|
+
}
|
|
1599
|
+
]
|