@acedatacloud/sdk 2026.1101.0 → 2026.1101.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acedatacloud/sdk",
3
- "version": "2026.1101.0",
3
+ "version": "2026.1101.1",
4
4
  "description": "Ace Data Cloud SDK for Suno, Seedance, HappyHorse, GPT Image and Nano Banana",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -5,6 +5,7 @@ import { Transport } from '../runtime/transport';
5
5
  export type AiChatModel =
6
6
  | 'mimo-v2.6-pro'
7
7
  | 'mimo-v2.6-flash'
8
+ | 'gpt-6.1-terra'
8
9
  | 'gpt-5.6-sol-fast'
9
10
  | 'gpt-5.5'
10
11
  | 'gpt-5.5-pro'
@@ -34,9 +34,9 @@ export interface MaestroGenerateOptions {
34
34
  /** Production route: auto, narrated, captions, avatar, or drama. captions requires source video in file_urls; avatar requires a portrait. All routes use the same per-second rate. */
35
35
  scenario?: "auto" | "narrated" | "captions" | "avatar" | "drama";
36
36
  /** Optional visual-style preset — expressed through typography, palette, motion, image treatment and pacing. Orthogonal to `scenario` (it does NOT change routing). `auto` (default) lets the director pick; every other value adopts a real named look: `cinematic` = dark film-noir (black + blood-red, Oswald); `glass` = Apple / iOS-26 frosted liquid glass; `luxury` = timeless near-black + indigo, huge whitespace; `swiss` = precise grid + electric blue + oversized numerals; `modern` = clean light SaaS; `editorial` = cream magazine + serif; `warm` = intimate cream + amber; `vibrant` = festive folk colour; `neon` = electric neon glow; `mono` = grayscale, type-led; `pastel` = soft candy pastels; `bold` = huge poster type; `industrial` = raw glitch + rust; `futuristic` = particle glow. A freeform string is also accepted as a soft hint. */
37
- style?: "auto" | "cinematic" | "glass" | "luxury" | "swiss" | "modern" | "editorial" | "warm" | "vibrant" | "neon" | "mono" | "pastel" | "bold" | "industrial" | "futuristic" | "retro";
38
- /** Optional narration voice — the **timbre** of the voiceover, independent of language. `auto` (default) lets the director pick a fitting voice. Every preset can speak the language selected in `langs`, so choose purely by character — `warm-female`, `bright-female`, `anchor-female`, `clean-female`, `calm-male`, `deep-male`, `documentary-male`, `energetic-male`, `storyteller-male`. For `drama` / `avatar` this sets the primary / narrator timbre; distinct characters may still get their own. */
39
- voice?: "auto" | "warm-female" | "bright-female" | "anchor-female" | "clean-female" | "calm-male" | "deep-male" | "documentary-male" | "energetic-male" | "storyteller-male";
37
+ style?: string;
38
+ /** Optional narration voice — the **timbre** of the voiceover, independent of language. `auto` (default) lets the director pick a fitting voice. Every preset can speak the language selected in `langs`, so choose purely by character — `warm-female`, `bright-female`, `anchor-female`, `clean-female`, `calm-male`, `deep-male`, `documentary-male`, `energetic-male`, `storyteller-male`. For `drama` / `avatar` this sets the primary / narrator timbre; distinct characters may still get their own. A 32-character hexadecimal voice reference_id is also accepted. */
39
+ voice?: "auto" | "warm-female" | "bright-female" | "anchor-female" | "clean-female" | "calm-male" | "deep-male" | "documentary-male" | "energetic-male" | "storyteller-male" | string;
40
40
  /** Submit asynchronously and poll. Defaults to true. */
41
41
  async?: boolean;
42
42
  /** Wait for completion before returning the handle. */
@@ -41,20 +41,20 @@ export interface ProducerWavOptions {
41
41
  }
42
42
 
43
43
  export interface ProducerGenerateOptions {
44
- /** Lyrics content for generating audio. */
45
- lyric: string;
46
44
  /** Types of audio generation operations. Supported values include `generate` (generate based on prompts), `cover` (cover song), `extend` (continue writing), `variation` (variant), `swap_vocals` (replace vocals), `swap_instrumentals` (replace instrumentals), `replace_section` (replace section), `stems` (separate tracks). */
47
45
  action: "generate" | "cover" | "extend" | "variation" | "swap_vocals" | "swap_instrumentals" | "replace_section" | "stems";
48
- /** Prompts for generating audio should not exceed 200 characters in length. */
49
- prompt: string;
50
46
  /** Random seed used for audio generation. */
51
47
  seed?: string;
48
+ /** Lyrics content for generating audio. */
49
+ lyric?: string;
52
50
  /** The model used for generating music is `FUZZ-2.0` by default. */
53
51
  model?: "FUZZ-2.0 Pro" | "FUZZ-2.0" | "FUZZ-2.0 Raw" | "FUZZ-1.1 Pro" | "FUZZ-1.0 Pro" | "FUZZ-1.0" | "FUZZ-1.1" | "FUZZ-0.8";
54
52
  /** Title used for generating songs. */
55
53
  title?: string;
56
54
  /** Is it a custom mode? If `true`, the audio will be generated based on the `lyric`; otherwise, it will be generated based on the `prompt`. */
57
55
  custom?: boolean;
56
+ /** Prompts for generating audio should not exceed 200 characters in length. */
57
+ prompt?: string;
58
58
  /** The unique ID of the reference song. */
59
59
  audioId?: string;
60
60
  /** The degree of uniqueness of style can be selected between 0 and 1, with a default value of 0.5. */
@@ -136,13 +136,13 @@ export class Producer {
136
136
  /** Producer AI music generation API, generates 1 song per request. */
137
137
  async generate(options: ProducerGenerateOptions): Promise<TaskHandle> {
138
138
  const body: Record<string, unknown> = {};
139
- body["lyric"] = options.lyric;
140
139
  body["action"] = options.action;
141
- body["prompt"] = options.prompt;
142
140
  if (options.seed !== undefined) body["seed"] = options.seed;
141
+ if (options.lyric !== undefined) body["lyric"] = options.lyric;
143
142
  if (options.model !== undefined) body["model"] = options.model;
144
143
  if (options.title !== undefined) body["title"] = options.title;
145
- if (options.custom !== undefined) body["custom"] = options.custom;
144
+ body["custom"] = options.custom ?? false;
145
+ if (options.prompt !== undefined) body["prompt"] = options.prompt;
146
146
  if (options.audioId !== undefined) body["audio_id"] = options.audioId;
147
147
  body["weirdness"] = options.weirdness ?? false;
148
148
  body["continue_at"] = options.continueAt ?? false;
@@ -39,7 +39,7 @@ export interface SunoGenerateOptions {
39
39
  weirdness?: number;
40
40
  /** A list of reference audio URLs for inspiration, requiring 1 to 4 publicly accessible audio addresses. This field is mandatory when `action` is `inspo`. */
41
41
  audioUrls?: string[];
42
- /** Generate the singer Persona ID used when creating songs based on the unique style characteristics of the specified singer. */
42
+ /** Singer style or cloned voice Persona ID for generation and cover / upload_cover. For a private voice, first upload the source to /suno/upload with the same persona_id, then use the returned audio_id on the same channel. No vocal_gender is required. */
43
43
  personaId?: string;
44
44
  /** Continue generating from the specified time point (seconds) of the existing audio. For example, 213.5 means to continue from 3 minutes and 33.5 seconds. */
45
45
  continueAt?: number;
@@ -209,6 +209,8 @@ export interface SunoMashupLyricsOptions {
209
209
  export interface SunoUploadOptions {
210
210
  /** The CDN address (URL) for the custom audio file to be uploaded. */
211
211
  audioUrl: string;
212
+ /** Optional voice Persona ID for standard uploads only. Associate the source audio with this voice before upload_cover; use the returned audio_id and the same persona_id on the same channel. */
213
+ personaId?: string;
212
214
  callbackUrl?: string;
213
215
  /** Any parameter added upstream before the SDK is regenerated. */
214
216
  [key: string]: unknown;
@@ -228,6 +230,14 @@ export interface SunoMp3Options {
228
230
  [key: string]: unknown;
229
231
  }
230
232
 
233
+ export interface SunoAvailabilityOptions {
234
+ /** Suno audio ID from a completed task, not the task ID. */
235
+ audioId: string;
236
+ callbackUrl?: string;
237
+ /** Any parameter added upstream before the SDK is regenerated. */
238
+ [key: string]: unknown;
239
+ }
240
+
231
241
  /** suno client. */
232
242
  export class Suno {
233
243
  constructor(private transport: Transport) {}
@@ -442,8 +452,9 @@ export class Suno {
442
452
  async upload(options: SunoUploadOptions): Promise<Record<string, unknown>> {
443
453
  const body: Record<string, unknown> = {};
444
454
  body["audio_url"] = options.audioUrl;
455
+ if (options.personaId !== undefined) body["persona_id"] = options.personaId;
445
456
  for (const [key, value] of Object.entries(options)) {
446
- if (!["async", "audioUrl", "callbackUrl", "maxWait", "pollInterval", "wait"].includes(key) && value !== undefined) {
457
+ if (!["async", "audioUrl", "callbackUrl", "maxWait", "personaId", "pollInterval", "wait"].includes(key) && value !== undefined) {
447
458
  body[key] = value;
448
459
  }
449
460
  }
@@ -470,4 +481,17 @@ export class Suno {
470
481
  return handle;
471
482
  }
472
483
 
484
+ /** Check Suno audio availability. */
485
+ async availability(options: SunoAvailabilityOptions): Promise<Record<string, unknown>> {
486
+ const body: Record<string, unknown> = {};
487
+ body["audio_id"] = options.audioId;
488
+ for (const [key, value] of Object.entries(options)) {
489
+ if (!["async", "audioId", "callbackUrl", "maxWait", "pollInterval", "wait"].includes(key) && value !== undefined) {
490
+ body[key] = value;
491
+ }
492
+ }
493
+ if (options.callbackUrl !== undefined) body.callback_url = options.callbackUrl;
494
+ return (await this.transport.request('POST', "/suno/availability", { json: body })) as Record<string, unknown>;
495
+ }
496
+
473
497
  }
@@ -2,6 +2,17 @@
2
2
 
3
3
  import { Transport } from '../runtime/transport';
4
4
 
5
+ export interface WebExtratorCookie {
6
+ name: string;
7
+ value: string;
8
+ domain: string;
9
+ path?: string;
10
+ expires?: number;
11
+ httpOnly?: boolean;
12
+ secure?: boolean;
13
+ sameSite?: 'Strict' | 'Lax' | 'None';
14
+ }
15
+
5
16
  export class WebExtrator {
6
17
  constructor(private transport: Transport) {}
7
18
 
@@ -18,9 +29,12 @@ export class WebExtrator {
18
29
  userAgent?: string;
19
30
  callbackUrl?: string;
20
31
  async?: boolean;
32
+ cookies?: WebExtratorCookie[];
33
+ bypassCache?: boolean;
34
+ cacheTtlSeconds?: number;
21
35
  [key: string]: unknown;
22
36
  }): Promise<Record<string, unknown>> {
23
- const { url, expectedType, enableLlm, waitUntil, timeout, delay, waitForSelector, blockResources, headers, userAgent, callbackUrl, ...rest } = opts;
37
+ const { url, expectedType, enableLlm, waitUntil, timeout, delay, waitForSelector, blockResources, headers, userAgent, callbackUrl, cookies, bypassCache, cacheTtlSeconds, ...rest } = opts;
24
38
  const body: Record<string, unknown> = { url, ...rest };
25
39
  if (expectedType !== undefined) body.expected_type = expectedType;
26
40
  if (enableLlm !== undefined) body.enable_llm = enableLlm;
@@ -32,6 +46,9 @@ export class WebExtrator {
32
46
  if (headers !== undefined) body.headers = headers;
33
47
  if (userAgent !== undefined) body.user_agent = userAgent;
34
48
  if (callbackUrl !== undefined) body.callback_url = callbackUrl;
49
+ if (cookies !== undefined) body.cookies = cookies;
50
+ if (bypassCache !== undefined) body.bypass_cache = bypassCache;
51
+ if (cacheTtlSeconds !== undefined) body.cache_ttl_seconds = cacheTtlSeconds;
35
52
  return this.transport.request('POST', '/webextrator/extract', { json: body });
36
53
  }
37
54
 
@@ -46,9 +63,12 @@ export class WebExtrator {
46
63
  userAgent?: string;
47
64
  callbackUrl?: string;
48
65
  async?: boolean;
66
+ cookies?: WebExtratorCookie[];
67
+ bypassCache?: boolean;
68
+ cacheTtlSeconds?: number;
49
69
  [key: string]: unknown;
50
70
  }): Promise<Record<string, unknown>> {
51
- const { url, waitUntil, timeout, delay, waitForSelector, blockResources, headers, userAgent, callbackUrl, ...rest } = opts;
71
+ const { url, waitUntil, timeout, delay, waitForSelector, blockResources, headers, userAgent, callbackUrl, cookies, bypassCache, cacheTtlSeconds, ...rest } = opts;
52
72
  const body: Record<string, unknown> = { url, ...rest };
53
73
  if (waitUntil !== undefined) body.wait_until = waitUntil;
54
74
  if (timeout !== undefined) body.timeout = timeout;
@@ -58,6 +78,9 @@ export class WebExtrator {
58
78
  if (headers !== undefined) body.headers = headers;
59
79
  if (userAgent !== undefined) body.user_agent = userAgent;
60
80
  if (callbackUrl !== undefined) body.callback_url = callbackUrl;
81
+ if (cookies !== undefined) body.cookies = cookies;
82
+ if (bypassCache !== undefined) body.bypass_cache = bypassCache;
83
+ if (cacheTtlSeconds !== undefined) body.cache_ttl_seconds = cacheTtlSeconds;
61
84
  return this.transport.request('POST', '/webextrator/render', { json: body });
62
85
  }
63
86
  }