@neta-art/generation 0.1.4 → 0.1.6

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.
Files changed (37) hide show
  1. package/README.md +97 -14
  2. package/dist/{builtins-BJ2_TVlr.d.ts → builtins-C-_aGhT8.d.ts} +2 -2
  3. package/dist/builtins-C-_aGhT8.d.ts.map +1 -0
  4. package/dist/builtins-NAtI9FFU.js +1186 -0
  5. package/dist/builtins-NAtI9FFU.js.map +1 -0
  6. package/dist/builtins.d.ts +1 -1
  7. package/dist/builtins.js +1 -1
  8. package/dist/cli/index.js +2 -2
  9. package/dist/{export-config-D8By2_r7.js → export-config-DS2XD-tF.js} +443 -44
  10. package/dist/export-config-DS2XD-tF.js.map +1 -0
  11. package/dist/index.d.ts +8 -2
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +3 -3
  14. package/models/birefnet-general.yaml +25 -0
  15. package/models/kling-image-to-video.yaml +89 -0
  16. package/models/kling-multi-image-to-video.yaml +93 -0
  17. package/models/kling-omni-video.yaml +107 -0
  18. package/models/kling-text-to-video.yaml +79 -0
  19. package/models/noobxl-i2i-ipa-onediff.yaml +72 -0
  20. package/models/noobxl-t2i-onediff.yaml +44 -0
  21. package/models/qwen-image-edit.yaml +44 -0
  22. package/models/suno_cover_chirp_v5.yaml +159 -0
  23. package/models/suno_image_to_song_chirp_v5.yaml +152 -0
  24. package/models/suno_infill_chirp_v5.yaml +148 -0
  25. package/models/suno_music_chirp_fenix.yaml +77 -0
  26. package/models/suno_sound_chirp_v5.yaml +145 -0
  27. package/models/suno_style_tags.yaml +14 -0
  28. package/models/suno_upload_audio.yaml +44 -0
  29. package/models/suno_video_to_song_chirp_v5.yaml +152 -0
  30. package/models/suno_vox_chirp_v5.yaml +149 -0
  31. package/models/z-image-turbo.yaml +34 -0
  32. package/package.json +19 -15
  33. package/dist/builtins-BJ2_TVlr.d.ts.map +0 -1
  34. package/dist/builtins-FumzmWvj.js +0 -565
  35. package/dist/builtins-FumzmWvj.js.map +0 -1
  36. package/dist/export-config-D8By2_r7.js.map +0 -1
  37. package/models/suno_music.yaml +0 -265
@@ -1,565 +0,0 @@
1
- //#region src/types.ts
2
- const MODEL_SCHEMA = "neta.generation.model.v1";
3
-
4
- //#endregion
5
- //#region src/utils.ts
6
- function cloneJson(value) {
7
- return JSON.parse(JSON.stringify(value));
8
- }
9
- function slugifyFileName(value) {
10
- return value.trim().toLowerCase().replace(/[^a-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || "model";
11
- }
12
- function getBlockMeta(block) {
13
- return "meta" in block ? block.meta : void 0;
14
- }
15
- function compactArray(values) {
16
- return values.length > 0 ? values : void 0;
17
- }
18
- function compactObject(value) {
19
- for (const key of Object.keys(value)) if (value[key] === void 0) delete value[key];
20
- return value;
21
- }
22
-
23
- //#endregion
24
- //#region src/builtins.ts
25
- const imageSizeParameters = {
26
- size: {
27
- type: "string",
28
- optional: true,
29
- default: "1024x1024",
30
- description: "Output image size.",
31
- examples: [
32
- "auto",
33
- "1024x1024",
34
- "1536x1024",
35
- "1024x1536",
36
- "2048x2048",
37
- "2048x1152",
38
- "3840x2160",
39
- "2160x3840"
40
- ]
41
- },
42
- quality: {
43
- type: "string",
44
- optional: true,
45
- default: "auto",
46
- enum: [
47
- "auto",
48
- "low",
49
- "medium",
50
- "high"
51
- ],
52
- description: "Image quality."
53
- }
54
- };
55
- function videoParameters(defaults) {
56
- return {
57
- duration: {
58
- type: "integer",
59
- optional: true,
60
- default: 5,
61
- min: 4,
62
- max: 15,
63
- description: "Video duration in seconds."
64
- },
65
- resolution: {
66
- type: "string",
67
- optional: true,
68
- default: defaults.resolution,
69
- enum: [
70
- "480p",
71
- "720p",
72
- "1080p",
73
- "2K"
74
- ],
75
- description: "Output video resolution."
76
- },
77
- aspect_ratio: {
78
- type: "string",
79
- optional: true,
80
- default: "16:9",
81
- enum: [
82
- "16:9",
83
- "9:16",
84
- "1:1",
85
- "4:3",
86
- "3:2",
87
- "2:3",
88
- "3:4",
89
- "21:9",
90
- "adaptive"
91
- ],
92
- description: "Output aspect ratio. Use adaptive to let the model choose."
93
- },
94
- fps: {
95
- type: "integer",
96
- optional: true,
97
- default: 30,
98
- min: 1,
99
- max: 60,
100
- description: "Frames per second."
101
- },
102
- seed: {
103
- type: "integer",
104
- optional: true,
105
- description: "Random seed for reproducibility."
106
- },
107
- generate_audio: {
108
- type: "boolean",
109
- optional: true,
110
- default: true,
111
- description: "Generate synchronized audio."
112
- },
113
- return_last_frame: {
114
- type: "boolean",
115
- optional: true,
116
- default: true,
117
- description: "Return the last frame as an image for chaining video segments."
118
- },
119
- camera_fixed: {
120
- type: "boolean",
121
- optional: true,
122
- default: false,
123
- description: "Fix camera position when supported."
124
- },
125
- watermark: {
126
- type: "boolean",
127
- optional: true,
128
- default: false,
129
- description: "Add AI Generated watermark."
130
- },
131
- poll_interval: {
132
- type: "integer",
133
- optional: true,
134
- default: 2,
135
- min: 1,
136
- max: 30,
137
- description: "Seconds between task status checks."
138
- },
139
- max_wait: {
140
- type: "integer",
141
- optional: true,
142
- default: defaults.maxWait,
143
- min: 30,
144
- max: 1800,
145
- description: "Maximum seconds to wait for task completion."
146
- }
147
- };
148
- }
149
- const sunoContinuationTaskVariant = { required: [
150
- "task_id",
151
- "clip_id",
152
- "continue_clip_id"
153
- ] };
154
- const sunoMeta = {
155
- taskField: "task",
156
- fields: {
157
- task: {
158
- type: "string",
159
- optional: true,
160
- enum: [
161
- "extend",
162
- "upload_extend",
163
- "infill",
164
- "fixed_infill",
165
- "infill_intro",
166
- "infill_outro",
167
- "cover_infill",
168
- "cover_extend",
169
- "artist_infill",
170
- "artist_consistency",
171
- "cover",
172
- "image_to_song",
173
- "video_to_song",
174
- "concat",
175
- "sound",
176
- "underpainting",
177
- "remaster",
178
- "vox",
179
- "mashup_condition"
180
- ],
181
- description: "Integrated Suno music task for operation=music."
182
- },
183
- mv: {
184
- type: "string",
185
- optional: true,
186
- description: "Suno music model version."
187
- },
188
- task_id: {
189
- type: "string",
190
- optional: true,
191
- description: "Existing Suno task id used for continuation-style tasks."
192
- },
193
- clip_id: {
194
- type: "string",
195
- optional: true,
196
- description: "Existing Suno clip id used for continuation-style tasks."
197
- },
198
- continue_clip_id: {
199
- type: "string",
200
- optional: true,
201
- description: "Clip id to continue from."
202
- },
203
- continue_at: {
204
- type: "number",
205
- optional: true,
206
- description: "Continue position in seconds."
207
- },
208
- model_name: {
209
- type: "string",
210
- optional: true,
211
- description: "Suno model name used by remaster."
212
- },
213
- variation_category: {
214
- type: "string",
215
- optional: true,
216
- description: "Remaster variation category."
217
- },
218
- metadata_params: {
219
- type: "object",
220
- optional: true,
221
- description: "Yunwu/Suno task-specific metadata payload."
222
- }
223
- },
224
- taskVariants: {
225
- extend: sunoContinuationTaskVariant,
226
- upload_extend: sunoContinuationTaskVariant,
227
- infill: sunoContinuationTaskVariant,
228
- fixed_infill: sunoContinuationTaskVariant,
229
- infill_intro: sunoContinuationTaskVariant,
230
- infill_outro: sunoContinuationTaskVariant,
231
- cover_infill: sunoContinuationTaskVariant,
232
- cover_extend: sunoContinuationTaskVariant,
233
- artist_infill: sunoContinuationTaskVariant,
234
- artist_consistency: sunoContinuationTaskVariant,
235
- cover: sunoContinuationTaskVariant,
236
- image_to_song: {
237
- requiredContent: ["image"],
238
- required: ["metadata_params"]
239
- },
240
- video_to_song: {
241
- requiredContent: ["video"],
242
- required: ["metadata_params"]
243
- },
244
- concat: sunoContinuationTaskVariant,
245
- sound: { required: ["metadata_params"] },
246
- underpainting: { required: ["metadata_params"] },
247
- remaster: {
248
- sendTask: false,
249
- required: [
250
- "clip_id",
251
- "model_name",
252
- "variation_category"
253
- ]
254
- },
255
- vox: sunoContinuationTaskVariant,
256
- mashup_condition: sunoContinuationTaskVariant
257
- }
258
- };
259
- const builtinModels = [
260
- {
261
- schema: MODEL_SCHEMA,
262
- model: "gpt-image-2",
263
- title: "GPT Image 2",
264
- description: "Image generation model with optional reference images. Good for photorealistic scenes, detailed images, and image editing with references.",
265
- adapter: { type: "openai.images" },
266
- content: { input: [{
267
- type: "text",
268
- required: true,
269
- min: 1,
270
- max: 16,
271
- merge: "newline",
272
- description: "Prompt text."
273
- }, {
274
- type: "image",
275
- required: false,
276
- max: 16,
277
- sources: ["url", "base64"],
278
- description: "Optional reference images."
279
- }] },
280
- parameters: imageSizeParameters,
281
- examples: [{
282
- title: "Basic image",
283
- request: {
284
- model: "gpt-image-2",
285
- content: [{
286
- type: "text",
287
- text: "a cyberpunk cat in neon rain"
288
- }],
289
- parameters: {
290
- size: "1024x1024",
291
- quality: "auto"
292
- }
293
- }
294
- }]
295
- },
296
- {
297
- schema: MODEL_SCHEMA,
298
- model: "gemini-3.1-flash-image-preview",
299
- title: "Gemini 3.1 Flash Image Preview",
300
- description: "Gemini image generation and editing model. Good for text rendering, infographics, style transfer, and iterative image editing with references.",
301
- adapter: { type: "gemini.generateContent" },
302
- content: { input: [{
303
- type: "text",
304
- required: true,
305
- min: 1,
306
- max: 16,
307
- merge: "newline",
308
- description: "Prompt text."
309
- }, {
310
- type: "image",
311
- required: false,
312
- max: 14,
313
- sources: ["url", "base64"],
314
- description: "Optional reference images."
315
- }] },
316
- parameters: {
317
- aspect_ratio: {
318
- type: "string",
319
- optional: true,
320
- default: "1:1",
321
- enum: [
322
- "1:1",
323
- "16:9",
324
- "4:3",
325
- "3:2",
326
- "3:4",
327
- "2:3",
328
- "9:16",
329
- "5:4",
330
- "4:5",
331
- "21:9",
332
- "1:4",
333
- "4:1",
334
- "1:8",
335
- "8:1"
336
- ],
337
- description: "Output aspect ratio."
338
- },
339
- image_size: {
340
- type: "string",
341
- optional: true,
342
- default: "2K",
343
- enum: [
344
- "512",
345
- "1K",
346
- "2K",
347
- "4K"
348
- ],
349
- description: "Output image resolution."
350
- }
351
- },
352
- examples: [{
353
- title: "Basic image",
354
- request: {
355
- model: "gemini-3.1-flash-image-preview",
356
- content: [{
357
- type: "text",
358
- text: "a vibrant infographic explaining photosynthesis with clear readable labels"
359
- }],
360
- parameters: {
361
- aspect_ratio: "16:9",
362
- image_size: "1K"
363
- }
364
- }
365
- }]
366
- },
367
- {
368
- schema: MODEL_SCHEMA,
369
- model: "seedance-2-0",
370
- title: "Seedance 2.0",
371
- description: "Higher quality Ark video generation model for final production outputs.",
372
- adapter: { type: "ark.videoGenerations" },
373
- content: { input: [{
374
- type: "text",
375
- required: true,
376
- min: 1,
377
- max: 16,
378
- merge: "newline",
379
- description: "Video prompt."
380
- }, {
381
- type: "image",
382
- required: false,
383
- max: 9,
384
- sources: ["url", "base64"],
385
- description: "Optional image input. Use meta.role as first_frame, last_frame, or reference_image."
386
- }] },
387
- parameters: videoParameters({
388
- resolution: "1080p",
389
- maxWait: 900
390
- })
391
- },
392
- {
393
- schema: MODEL_SCHEMA,
394
- model: "seedance-2-0-fast",
395
- title: "Seedance 2.0 Fast",
396
- description: "Fast Ark video generation model for drafts, rapid iteration, text-to-video, image-to-video, and reference-guided video generation.",
397
- adapter: { type: "ark.videoGenerations" },
398
- content: { input: [{
399
- type: "text",
400
- required: true,
401
- min: 1,
402
- max: 16,
403
- merge: "newline",
404
- description: "Video prompt."
405
- }, {
406
- type: "image",
407
- required: false,
408
- max: 9,
409
- sources: ["url", "base64"],
410
- description: "Optional image input. Use meta.role as first_frame, last_frame, or reference_image."
411
- }] },
412
- parameters: videoParameters({
413
- resolution: "720p",
414
- maxWait: 600
415
- })
416
- },
417
- {
418
- schema: MODEL_SCHEMA,
419
- model: "suno_music",
420
- title: "Suno Music",
421
- description: "Suno music model for songs, lyrics, sound effects, and integrated music tasks.",
422
- adapter: { type: "suno.tasks" },
423
- content: { input: [
424
- {
425
- type: "text",
426
- required: false,
427
- max: 16,
428
- merge: "newline",
429
- description: "Optional prompt text. The adapter maps merged text to the operation's text field when that field is not provided."
430
- },
431
- {
432
- type: "audio",
433
- required: false,
434
- max: 1,
435
- sources: ["url", "base64"],
436
- description: "Optional reference audio. The adapter maps it to url when url is not provided."
437
- },
438
- {
439
- type: "image",
440
- required: false,
441
- max: 1,
442
- sources: ["url", "base64"],
443
- description: "Optional image source. The adapter maps it to image_url when image_url is not provided."
444
- },
445
- {
446
- type: "video",
447
- required: false,
448
- max: 1,
449
- sources: ["url", "base64"],
450
- description: "Optional video source. The adapter maps it to video_url when video_url is not provided."
451
- }
452
- ] },
453
- parameters: {
454
- operation: {
455
- type: "string",
456
- optional: true,
457
- default: "music",
458
- enum: ["music", "lyrics"],
459
- description: "Stable Suno endpoint operation. Provider-specific fields such as task, mv, title, tags, metadataParams, and clip_id belong in request meta."
460
- },
461
- poll_interval: {
462
- type: "integer",
463
- optional: true,
464
- default: 5,
465
- min: 1,
466
- max: 60,
467
- description: "Seconds between task status checks."
468
- },
469
- max_wait: {
470
- type: "integer",
471
- optional: true,
472
- default: 600,
473
- min: 30,
474
- max: 3600,
475
- description: "Maximum seconds to wait for task completion."
476
- }
477
- },
478
- meta: sunoMeta,
479
- examples: [
480
- {
481
- title: "Music generation",
482
- request: {
483
- model: "suno_music",
484
- content: [{
485
- type: "text",
486
- text: "uplifting cinematic pop with warm piano and clear chorus"
487
- }],
488
- parameters: { operation: "music" },
489
- meta: {
490
- mv: "chirp-v5-5",
491
- title: "Warm Horizon",
492
- tags: "cinematic pop, warm piano",
493
- make_instrumental: false
494
- }
495
- }
496
- },
497
- {
498
- title: "Lyrics",
499
- request: {
500
- model: "suno_music",
501
- content: [{
502
- type: "text",
503
- text: "write a hopeful chorus about sunrise after a storm"
504
- }],
505
- parameters: { operation: "lyrics" }
506
- }
507
- },
508
- {
509
- title: "Sound effect",
510
- request: {
511
- model: "suno_music",
512
- content: [{
513
- type: "text",
514
- text: "ambient music with gentle rain and distant thunder"
515
- }],
516
- parameters: { operation: "music" },
517
- meta: {
518
- task: "sound",
519
- mv: "chirp-v5-5",
520
- metadata_params: { sound: "gentle rain ambience with distant thunder" },
521
- title: "Gentle Rain",
522
- tags: "ambient, rain, cinematic",
523
- make_instrumental: true
524
- }
525
- }
526
- },
527
- {
528
- title: "Image to song",
529
- request: {
530
- model: "suno_music",
531
- content: [{
532
- type: "text",
533
- text: "turn this image into a short hopeful pop song"
534
- }, {
535
- type: "image",
536
- source: {
537
- type: "url",
538
- url: "https://picsum.photos/512/512"
539
- }
540
- }],
541
- parameters: { operation: "music" },
542
- meta: {
543
- task: "image_to_song",
544
- mv: "chirp-v5-5",
545
- metadata_params: {
546
- image_url: "https://picsum.photos/512/512",
547
- prompt: "turn this image into a short hopeful pop song"
548
- }
549
- }
550
- }
551
- }
552
- ]
553
- }
554
- ];
555
- const builtinGenerationModels = cloneJson(builtinModels);
556
- function getBuiltinGenerationModel(model) {
557
- return cloneJson(builtinModels.find((declaration) => declaration.model === model) ?? null);
558
- }
559
- function listBuiltinGenerationModels() {
560
- return cloneJson(builtinModels);
561
- }
562
-
563
- //#endregion
564
- export { compactArray as a, slugifyFileName as c, cloneJson as i, MODEL_SCHEMA as l, getBuiltinGenerationModel as n, compactObject as o, listBuiltinGenerationModels as r, getBlockMeta as s, builtinGenerationModels as t };
565
- //# sourceMappingURL=builtins-FumzmWvj.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"builtins-FumzmWvj.js","names":["builtinGenerationModels: GenerationModelDeclaration[]"],"sources":["../src/types.ts","../src/utils.ts","../src/builtins.ts"],"sourcesContent":["export const MODEL_SCHEMA = \"neta.generation.model.v1\" as const;\n\nexport type GenerationSource = { type: \"url\"; url: string } | { type: \"base64\"; mediaType: string; data: string };\n\nexport type GenerationContentBlockMeta = Record<string, unknown>;\n\nexport type GenerationContentBlock =\n | { type: \"text\"; text: string; meta?: GenerationContentBlockMeta }\n | { type: \"image\"; source: GenerationSource; meta?: GenerationContentBlockMeta }\n | { type: \"video\"; source: GenerationSource; meta?: GenerationContentBlockMeta }\n | { type: \"audio\"; source: GenerationSource; meta?: GenerationContentBlockMeta };\n\nexport type GenerationContentSpec = {\n type: \"text\" | \"image\" | \"video\" | \"audio\";\n required?: boolean;\n min?: number;\n max?: number;\n sources?: Array<GenerationSource[\"type\"]>;\n merge?: \"newline\" | \"space\" | \"concat\";\n meta?: Record<string, unknown>;\n description?: string;\n};\n\nexport type GenerationParameterSpec =\n | {\n type: \"string\";\n optional?: boolean;\n default?: string;\n enum?: string[];\n description?: string;\n examples?: string[];\n }\n | {\n type: \"number\";\n optional?: boolean;\n default?: number;\n min?: number;\n max?: number;\n description?: string;\n examples?: number[];\n }\n | {\n type: \"integer\";\n optional?: boolean;\n default?: number;\n min?: number;\n max?: number;\n description?: string;\n examples?: number[];\n }\n | {\n type: \"boolean\";\n optional?: boolean;\n default?: boolean;\n description?: string;\n examples?: boolean[];\n };\n\nexport type GenerationMetaFieldSpec =\n | GenerationParameterSpec\n | { type: \"object\"; optional?: boolean; description?: string };\n\nexport type GenerationMetaTaskVariantSpec = {\n description?: string;\n required?: string[];\n requiredContent?: Array<GenerationContentSpec[\"type\"]>;\n sendTask?: boolean;\n};\n\nexport type GenerationMetaSpec = {\n fields?: Record<string, GenerationMetaFieldSpec>;\n taskField?: string;\n taskVariants?: Record<string, GenerationMetaTaskVariantSpec>;\n};\n\nexport type GenerationModelDeclaration = {\n schema: typeof MODEL_SCHEMA;\n model: string;\n title?: string;\n description?: string;\n allowUnknownParameters?: boolean;\n adapter: {\n type: string;\n };\n content: {\n input: GenerationContentSpec[];\n };\n parameters?: Record<string, GenerationParameterSpec>;\n meta?: GenerationMetaSpec;\n examples?: Array<{\n title?: string;\n request: GenerateRequest;\n }>;\n};\n\nexport type GenerateRequest = {\n model: string;\n content: GenerationContentBlock[];\n parameters?: Record<string, unknown>;\n meta?: Record<string, unknown>;\n /** @deprecated Use meta. */\n metadata?: Record<string, unknown>;\n apiKey?: string;\n baseUrl?: string;\n};\n\nexport type ResolvedGenerationRequest = {\n declaration: GenerationModelDeclaration;\n request: GenerateRequest;\n parameters: Record<string, unknown>;\n meta: Record<string, unknown>;\n};\n\nexport type GenerationSourceResolver = (source: GenerationSource) => Promise<string> | string;\n\nexport type GenerationDebugEvent =\n | {\n type: \"request\";\n url: string;\n method: string;\n headers: Record<string, string>;\n body?: unknown;\n }\n | {\n type: \"response\";\n url: string;\n status: number;\n statusText: string;\n headers: Record<string, string>;\n trace: Record<string, string>;\n elapsedMs: number;\n body?: unknown;\n };\n\nexport type GenerationDebugLogger = (event: GenerationDebugEvent) => void;\n\nexport type GenerationDebugOptions = {\n enabled?: boolean;\n includeSensitive?: boolean;\n includeResponseBody?: boolean;\n logger?: GenerationDebugLogger;\n};\n\nexport type GenerationDebugConfig = GenerationDebugOptions & {\n enabled: boolean;\n includeSensitive: boolean;\n includeResponseBody: boolean;\n logger: GenerationDebugLogger;\n};\n\nexport type GenerationAdapterContext = {\n apiKey: string;\n baseUrl: string;\n fetch: typeof fetch;\n resolveSource: GenerationSourceResolver;\n};\n\nexport type GenerationAdapterInput = ResolvedGenerationRequest & {\n context: GenerationAdapterContext;\n};\n\nexport type GenerationAdapter = (input: GenerationAdapterInput) => Promise<GenerationContentBlock[]>;\n\nexport type CreateGenerationClientOptions = {\n apiKey?: string;\n baseUrl?: string;\n models?: GenerationModelDeclaration[];\n includeBuiltinModels?: boolean;\n fetch?: typeof fetch;\n sourceResolver?: GenerationSourceResolver;\n adapters?: Record<string, GenerationAdapter>;\n debug?: boolean | GenerationDebugOptions;\n};\n\nexport type GenerationClient = {\n generate(request: GenerateRequest): Promise<GenerationContentBlock[]>;\n validate(request: GenerateRequest): ResolvedGenerationRequest;\n listModels(): GenerationModelDeclaration[];\n getModel(model: string): GenerationModelDeclaration | null;\n stringifyModelConfig(model: string, options?: { format?: \"yaml\" | \"json\" }): string;\n exportModelConfig(model: string, filePath: string): Promise<void>;\n exportModelConfigs(directory: string): Promise<void>;\n};\n","import type { GenerationContentBlock } from \"./types.js\";\n\nexport function cloneJson<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nexport function slugifyFileName(value: string): string {\n return (\n value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"model\"\n );\n}\n\nexport function getBlockMeta(block: GenerationContentBlock): Record<string, unknown> | undefined {\n return \"meta\" in block ? block.meta : undefined;\n}\n\nexport function compactArray<T>(values: T[]): T[] | undefined {\n return values.length > 0 ? values : undefined;\n}\n\nexport function compactObject<T extends Record<string, unknown>>(value: T): T {\n for (const key of Object.keys(value)) if (value[key] === undefined) delete value[key];\n return value;\n}\n","import type { GenerationModelDeclaration } from \"./types.js\";\nimport { MODEL_SCHEMA } from \"./types.js\";\nimport { cloneJson } from \"./utils.js\";\n\nconst imageSizeParameters = {\n size: {\n type: \"string\",\n optional: true,\n default: \"1024x1024\",\n description: \"Output image size.\",\n examples: [\"auto\", \"1024x1024\", \"1536x1024\", \"1024x1536\", \"2048x2048\", \"2048x1152\", \"3840x2160\", \"2160x3840\"],\n },\n quality: {\n type: \"string\",\n optional: true,\n default: \"auto\",\n enum: [\"auto\", \"low\", \"medium\", \"high\"],\n description: \"Image quality.\",\n },\n} satisfies GenerationModelDeclaration[\"parameters\"];\n\nfunction videoParameters(defaults: { resolution: string; maxWait: number }) {\n return {\n duration: {\n type: \"integer\",\n optional: true,\n default: 5,\n min: 4,\n max: 15,\n description: \"Video duration in seconds.\",\n },\n resolution: {\n type: \"string\",\n optional: true,\n default: defaults.resolution,\n enum: [\"480p\", \"720p\", \"1080p\", \"2K\"],\n description: \"Output video resolution.\",\n },\n aspect_ratio: {\n type: \"string\",\n optional: true,\n default: \"16:9\",\n enum: [\"16:9\", \"9:16\", \"1:1\", \"4:3\", \"3:2\", \"2:3\", \"3:4\", \"21:9\", \"adaptive\"],\n description: \"Output aspect ratio. Use adaptive to let the model choose.\",\n },\n fps: { type: \"integer\", optional: true, default: 30, min: 1, max: 60, description: \"Frames per second.\" },\n seed: { type: \"integer\", optional: true, description: \"Random seed for reproducibility.\" },\n generate_audio: { type: \"boolean\", optional: true, default: true, description: \"Generate synchronized audio.\" },\n return_last_frame: {\n type: \"boolean\",\n optional: true,\n default: true,\n description: \"Return the last frame as an image for chaining video segments.\",\n },\n camera_fixed: {\n type: \"boolean\",\n optional: true,\n default: false,\n description: \"Fix camera position when supported.\",\n },\n watermark: { type: \"boolean\", optional: true, default: false, description: \"Add AI Generated watermark.\" },\n poll_interval: {\n type: \"integer\",\n optional: true,\n default: 2,\n min: 1,\n max: 30,\n description: \"Seconds between task status checks.\",\n },\n max_wait: {\n type: \"integer\",\n optional: true,\n default: defaults.maxWait,\n min: 30,\n max: 1800,\n description: \"Maximum seconds to wait for task completion.\",\n },\n } satisfies GenerationModelDeclaration[\"parameters\"];\n}\n\nconst sunoContinuationTaskVariant = {\n required: [\"task_id\", \"clip_id\", \"continue_clip_id\"],\n};\n\nconst sunoMeta = {\n taskField: \"task\",\n fields: {\n task: {\n type: \"string\",\n optional: true,\n enum: [\n \"extend\",\n \"upload_extend\",\n \"infill\",\n \"fixed_infill\",\n \"infill_intro\",\n \"infill_outro\",\n \"cover_infill\",\n \"cover_extend\",\n \"artist_infill\",\n \"artist_consistency\",\n \"cover\",\n \"image_to_song\",\n \"video_to_song\",\n \"concat\",\n \"sound\",\n \"underpainting\",\n \"remaster\",\n \"vox\",\n \"mashup_condition\",\n ],\n description: \"Integrated Suno music task for operation=music.\",\n },\n mv: { type: \"string\", optional: true, description: \"Suno music model version.\" },\n task_id: {\n type: \"string\",\n optional: true,\n description: \"Existing Suno task id used for continuation-style tasks.\",\n },\n clip_id: {\n type: \"string\",\n optional: true,\n description: \"Existing Suno clip id used for continuation-style tasks.\",\n },\n continue_clip_id: { type: \"string\", optional: true, description: \"Clip id to continue from.\" },\n continue_at: { type: \"number\", optional: true, description: \"Continue position in seconds.\" },\n model_name: { type: \"string\", optional: true, description: \"Suno model name used by remaster.\" },\n variation_category: { type: \"string\", optional: true, description: \"Remaster variation category.\" },\n metadata_params: {\n type: \"object\",\n optional: true,\n description: \"Yunwu/Suno task-specific metadata payload.\",\n },\n },\n taskVariants: {\n extend: sunoContinuationTaskVariant,\n upload_extend: sunoContinuationTaskVariant,\n infill: sunoContinuationTaskVariant,\n fixed_infill: sunoContinuationTaskVariant,\n infill_intro: sunoContinuationTaskVariant,\n infill_outro: sunoContinuationTaskVariant,\n cover_infill: sunoContinuationTaskVariant,\n cover_extend: sunoContinuationTaskVariant,\n artist_infill: sunoContinuationTaskVariant,\n artist_consistency: sunoContinuationTaskVariant,\n cover: sunoContinuationTaskVariant,\n image_to_song: { requiredContent: [\"image\"], required: [\"metadata_params\"] },\n video_to_song: { requiredContent: [\"video\"], required: [\"metadata_params\"] },\n concat: sunoContinuationTaskVariant,\n sound: { required: [\"metadata_params\"] },\n underpainting: { required: [\"metadata_params\"] },\n remaster: { sendTask: false, required: [\"clip_id\", \"model_name\", \"variation_category\"] },\n vox: sunoContinuationTaskVariant,\n mashup_condition: sunoContinuationTaskVariant,\n },\n} satisfies GenerationModelDeclaration[\"meta\"];\n\nconst builtinModels = [\n {\n schema: MODEL_SCHEMA,\n model: \"gpt-image-2\",\n title: \"GPT Image 2\",\n description:\n \"Image generation model with optional reference images. Good for photorealistic scenes, detailed images, and image editing with references.\",\n adapter: { type: \"openai.images\" },\n content: {\n input: [\n { type: \"text\", required: true, min: 1, max: 16, merge: \"newline\", description: \"Prompt text.\" },\n {\n type: \"image\",\n required: false,\n max: 16,\n sources: [\"url\", \"base64\"],\n description: \"Optional reference images.\",\n },\n ],\n },\n parameters: imageSizeParameters,\n examples: [\n {\n title: \"Basic image\",\n request: {\n model: \"gpt-image-2\",\n content: [{ type: \"text\", text: \"a cyberpunk cat in neon rain\" }],\n parameters: { size: \"1024x1024\", quality: \"auto\" },\n },\n },\n ],\n },\n {\n schema: MODEL_SCHEMA,\n model: \"gemini-3.1-flash-image-preview\",\n title: \"Gemini 3.1 Flash Image Preview\",\n description:\n \"Gemini image generation and editing model. Good for text rendering, infographics, style transfer, and iterative image editing with references.\",\n adapter: { type: \"gemini.generateContent\" },\n content: {\n input: [\n { type: \"text\", required: true, min: 1, max: 16, merge: \"newline\", description: \"Prompt text.\" },\n {\n type: \"image\",\n required: false,\n max: 14,\n sources: [\"url\", \"base64\"],\n description: \"Optional reference images.\",\n },\n ],\n },\n parameters: {\n aspect_ratio: {\n type: \"string\",\n optional: true,\n default: \"1:1\",\n enum: [\"1:1\", \"16:9\", \"4:3\", \"3:2\", \"3:4\", \"2:3\", \"9:16\", \"5:4\", \"4:5\", \"21:9\", \"1:4\", \"4:1\", \"1:8\", \"8:1\"],\n description: \"Output aspect ratio.\",\n },\n image_size: {\n type: \"string\",\n optional: true,\n default: \"2K\",\n enum: [\"512\", \"1K\", \"2K\", \"4K\"],\n description: \"Output image resolution.\",\n },\n },\n examples: [\n {\n title: \"Basic image\",\n request: {\n model: \"gemini-3.1-flash-image-preview\",\n content: [\n { type: \"text\", text: \"a vibrant infographic explaining photosynthesis with clear readable labels\" },\n ],\n parameters: { aspect_ratio: \"16:9\", image_size: \"1K\" },\n },\n },\n ],\n },\n {\n schema: MODEL_SCHEMA,\n model: \"seedance-2-0\",\n title: \"Seedance 2.0\",\n description: \"Higher quality Ark video generation model for final production outputs.\",\n adapter: { type: \"ark.videoGenerations\" },\n content: {\n input: [\n { type: \"text\", required: true, min: 1, max: 16, merge: \"newline\", description: \"Video prompt.\" },\n {\n type: \"image\",\n required: false,\n max: 9,\n sources: [\"url\", \"base64\"],\n description: \"Optional image input. Use meta.role as first_frame, last_frame, or reference_image.\",\n },\n ],\n },\n parameters: videoParameters({ resolution: \"1080p\", maxWait: 900 }),\n },\n {\n schema: MODEL_SCHEMA,\n model: \"seedance-2-0-fast\",\n title: \"Seedance 2.0 Fast\",\n description:\n \"Fast Ark video generation model for drafts, rapid iteration, text-to-video, image-to-video, and reference-guided video generation.\",\n adapter: { type: \"ark.videoGenerations\" },\n content: {\n input: [\n { type: \"text\", required: true, min: 1, max: 16, merge: \"newline\", description: \"Video prompt.\" },\n {\n type: \"image\",\n required: false,\n max: 9,\n sources: [\"url\", \"base64\"],\n description: \"Optional image input. Use meta.role as first_frame, last_frame, or reference_image.\",\n },\n ],\n },\n parameters: videoParameters({ resolution: \"720p\", maxWait: 600 }),\n },\n {\n schema: MODEL_SCHEMA,\n model: \"suno_music\",\n title: \"Suno Music\",\n description: \"Suno music model for songs, lyrics, sound effects, and integrated music tasks.\",\n adapter: { type: \"suno.tasks\" },\n content: {\n input: [\n {\n type: \"text\",\n required: false,\n max: 16,\n merge: \"newline\",\n description:\n \"Optional prompt text. The adapter maps merged text to the operation's text field when that field is not provided.\",\n },\n {\n type: \"audio\",\n required: false,\n max: 1,\n sources: [\"url\", \"base64\"],\n description: \"Optional reference audio. The adapter maps it to url when url is not provided.\",\n },\n {\n type: \"image\",\n required: false,\n max: 1,\n sources: [\"url\", \"base64\"],\n description: \"Optional image source. The adapter maps it to image_url when image_url is not provided.\",\n },\n {\n type: \"video\",\n required: false,\n max: 1,\n sources: [\"url\", \"base64\"],\n description: \"Optional video source. The adapter maps it to video_url when video_url is not provided.\",\n },\n ],\n },\n parameters: {\n operation: {\n type: \"string\",\n optional: true,\n default: \"music\",\n enum: [\"music\", \"lyrics\"],\n description:\n \"Stable Suno endpoint operation. Provider-specific fields such as task, mv, title, tags, metadataParams, and clip_id belong in request meta.\",\n },\n poll_interval: {\n type: \"integer\",\n optional: true,\n default: 5,\n min: 1,\n max: 60,\n description: \"Seconds between task status checks.\",\n },\n max_wait: {\n type: \"integer\",\n optional: true,\n default: 600,\n min: 30,\n max: 3600,\n description: \"Maximum seconds to wait for task completion.\",\n },\n },\n meta: sunoMeta,\n examples: [\n {\n title: \"Music generation\",\n request: {\n model: \"suno_music\",\n content: [{ type: \"text\", text: \"uplifting cinematic pop with warm piano and clear chorus\" }],\n parameters: { operation: \"music\" },\n meta: {\n mv: \"chirp-v5-5\",\n title: \"Warm Horizon\",\n tags: \"cinematic pop, warm piano\",\n make_instrumental: false,\n },\n },\n },\n {\n title: \"Lyrics\",\n request: {\n model: \"suno_music\",\n content: [{ type: \"text\", text: \"write a hopeful chorus about sunrise after a storm\" }],\n parameters: { operation: \"lyrics\" },\n },\n },\n {\n title: \"Sound effect\",\n request: {\n model: \"suno_music\",\n content: [{ type: \"text\", text: \"ambient music with gentle rain and distant thunder\" }],\n parameters: { operation: \"music\" },\n meta: {\n task: \"sound\",\n mv: \"chirp-v5-5\",\n metadata_params: { sound: \"gentle rain ambience with distant thunder\" },\n title: \"Gentle Rain\",\n tags: \"ambient, rain, cinematic\",\n make_instrumental: true,\n },\n },\n },\n {\n title: \"Image to song\",\n request: {\n model: \"suno_music\",\n content: [\n { type: \"text\", text: \"turn this image into a short hopeful pop song\" },\n { type: \"image\", source: { type: \"url\", url: \"https://picsum.photos/512/512\" } },\n ],\n parameters: { operation: \"music\" },\n meta: {\n task: \"image_to_song\",\n mv: \"chirp-v5-5\",\n metadata_params: {\n image_url: \"https://picsum.photos/512/512\",\n prompt: \"turn this image into a short hopeful pop song\",\n },\n },\n },\n },\n ],\n },\n] satisfies GenerationModelDeclaration[];\n\nexport const builtinGenerationModels: GenerationModelDeclaration[] = cloneJson(builtinModels);\n\nexport function getBuiltinGenerationModel(model: string): GenerationModelDeclaration | null {\n return cloneJson(builtinModels.find((declaration) => declaration.model === model) ?? null);\n}\n\nexport function listBuiltinGenerationModels(): GenerationModelDeclaration[] {\n return cloneJson(builtinModels);\n}\n"],"mappings":"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"}