@acedatacloud/sdk 2026.1108.0 → 2026.1113.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/README.md +73 -0
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/resources/providers/suno.ts +7 -4
package/README.md
CHANGED
|
@@ -143,6 +143,31 @@ Streaming and `claude.chat.messages.countTokens(...)` also preserve thinking
|
|
|
143
143
|
configuration. Parameter pass-through does not guarantee model support; API errors
|
|
144
144
|
are returned through the SDK's normal error handling.
|
|
145
145
|
|
|
146
|
+
### Claude Fable 5.2
|
|
147
|
+
|
|
148
|
+
Use the exact model ID `claude-fable-5-2`. Native Messages preserves thinking and
|
|
149
|
+
tool content blocks. Omit `temperature`, `top_p` and `top_k`; adaptive thinking is
|
|
150
|
+
always enabled, and the output budget covers thinking plus the final answer.
|
|
151
|
+
For tools, use `tool_choice: { type: 'auto' }`, not `any` or a forced tool.
|
|
152
|
+
Fable 5.1 and Fable 5 remain separate model IDs; upgrade by changing `model` explicitly.
|
|
153
|
+
Count Tokens and Responses are not published for this model. Consult the
|
|
154
|
+
[current model page](https://platform.acedata.cloud/models/claude-fable-5-2?m=chat)
|
|
155
|
+
for account availability and package-dependent prices; model discovery alone does
|
|
156
|
+
not guarantee a successful generation.
|
|
157
|
+
|
|
158
|
+
```typescript
|
|
159
|
+
const fable = new AceDataCloud({
|
|
160
|
+
apiToken: 'your-token',
|
|
161
|
+
baseURL: 'https://api.acedata.cloud',
|
|
162
|
+
});
|
|
163
|
+
const response = await fable.chat.messages.create({
|
|
164
|
+
model: 'claude-fable-5-2',
|
|
165
|
+
messages: [{ role: 'user', content: 'Explain this code.' }],
|
|
166
|
+
maxTokens: 4096,
|
|
167
|
+
output_config: { effort: 'high' },
|
|
168
|
+
});
|
|
169
|
+
```
|
|
170
|
+
|
|
146
171
|
## OpenAI Embeddings
|
|
147
172
|
|
|
148
173
|
```typescript
|
|
@@ -304,6 +329,54 @@ not trigger reference-video billing. Do not combine `videoList` with
|
|
|
304
329
|
|
|
305
330
|
## Suno music processing
|
|
306
331
|
|
|
332
|
+
### Replace a section
|
|
333
|
+
|
|
334
|
+
Use the completed song's `data[].id`, not the task ID. Listen to the source and
|
|
335
|
+
use `await client.suno.timing({ audioId })` to choose a complete phrase; replace
|
|
336
|
+
the example ID and 30–50 second interval with your own. Supply only the local
|
|
337
|
+
new lyrics, preferably the same text in `lyric` and `prompt`, not the whole song.
|
|
338
|
+
|
|
339
|
+
```typescript
|
|
340
|
+
const localLyrics = 'Evening winds along the quiet lane\nCarry our story home again';
|
|
341
|
+
const task = await client.suno.generate({
|
|
342
|
+
action: 'replace_section',
|
|
343
|
+
audioId: 'YOUR_COMPLETED_AUDIO_ID',
|
|
344
|
+
model: 'chirp-v5-5',
|
|
345
|
+
lyric: localLyrics,
|
|
346
|
+
prompt: localLyrics,
|
|
347
|
+
replaceSectionStart: 30.0,
|
|
348
|
+
replaceSectionEnd: 50.0,
|
|
349
|
+
replaceSectionResultMode: 'full_song',
|
|
350
|
+
});
|
|
351
|
+
const result = await task.wait();
|
|
352
|
+
const songs = (result.response as Record<string, unknown>).data;
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
Omitting `replaceSectionResultMode` uses the server's `full_song` default:
|
|
356
|
+
two complete songs, with no further `concat`. Listen to both results and check
|
|
357
|
+
`audio_url`, `duration`, new words and transitions. Success does not guarantee
|
|
358
|
+
word-for-word lyrics or the original duration; the `duration` request field
|
|
359
|
+
cannot lock a replacement's length. Returned `lyric` is metadata, not a
|
|
360
|
+
transcription, and may be empty if source lyric timing is unavailable.
|
|
361
|
+
|
|
362
|
+
For another edit, use the selected complete song's `id` and recheck its timing;
|
|
363
|
+
do not reuse old coordinates or send its whole returned lyric as local input.
|
|
364
|
+
For manual selection, request `replaceSectionResultMode: 'candidates'`, then
|
|
365
|
+
call `await client.suno.generate({ action: 'concat', audioId: selectedCandidateId })`
|
|
366
|
+
and wait for the complete song. Candidates are unstitched clips, possibly with
|
|
367
|
+
context. If results still sing old words or grow too long, check the source,
|
|
368
|
+
interval and local lyrics, then the other result; more polling cannot change
|
|
369
|
+
completed audio. Keep the task ID, source ID, request and result audio for support.
|
|
370
|
+
|
|
371
|
+
### Processing charges
|
|
372
|
+
|
|
373
|
+
Standard successful-request charges are **0.56 Credits** for `action: 'stems'`
|
|
374
|
+
(vocals and accompaniment together count once), **0.08 Credits** for
|
|
375
|
+
`client.suno.lyrics(...)` (multiple candidates still count once), and **0.15 Credits**
|
|
376
|
+
for `client.suno.voices(...)`. Failed requests are not charged; applicable discounts
|
|
377
|
+
follow the actual bill. `all_stems`, `extract_stem` and other actions have their own
|
|
378
|
+
prices, not the `stems` rate.
|
|
379
|
+
|
|
307
380
|
`await client.suno.persona({ name, audioId })` creates a singer style with
|
|
308
381
|
`POST /suno/persona`; creation still follows the endpoint's pricing rules.
|
|
309
382
|
Listing with `GET /suno/persona` and deleting with `DELETE /suno/persona` are
|
package/dist/index.js
CHANGED
|
@@ -2266,8 +2266,9 @@ var Suno = class {
|
|
|
2266
2266
|
if (options.replaceSectionEnd !== void 0) body["replace_section_end"] = options.replaceSectionEnd;
|
|
2267
2267
|
if (options.underpaintingStart !== void 0) body["underpainting_start"] = options.underpaintingStart;
|
|
2268
2268
|
if (options.replaceSectionStart !== void 0) body["replace_section_start"] = options.replaceSectionStart;
|
|
2269
|
+
if (options.replaceSectionResultMode !== void 0) body["replace_section_result_mode"] = options.replaceSectionResultMode;
|
|
2269
2270
|
for (const [key, value] of Object.entries(options)) {
|
|
2270
|
-
if (!["action", "async", "audioId", "audioUrls", "audioWeight", "callbackUrl", "continueAt", "custom", "duration", "instrumental", "lyric", "lyricPrompt", "mashupAudioIds", "maxWait", "model", "negativeTags", "overpaintingEnd", "overpaintingStart", "personaId", "pollInterval", "prompt", "replaceSectionEnd", "replaceSectionStart", "samplesEnd", "samplesStart", "style", "styleInfluence", "title", "underpaintingEnd", "underpaintingStart", "variationCategory", "vocalGender", "wait", "weirdness"].includes(key) && value !== void 0) {
|
|
2271
|
+
if (!["action", "async", "audioId", "audioUrls", "audioWeight", "callbackUrl", "continueAt", "custom", "duration", "instrumental", "lyric", "lyricPrompt", "mashupAudioIds", "maxWait", "model", "negativeTags", "overpaintingEnd", "overpaintingStart", "personaId", "pollInterval", "prompt", "replaceSectionEnd", "replaceSectionResultMode", "replaceSectionStart", "samplesEnd", "samplesStart", "style", "styleInfluence", "title", "underpaintingEnd", "underpaintingStart", "variationCategory", "vocalGender", "wait", "weirdness"].includes(key) && value !== void 0) {
|
|
2271
2272
|
body[key] = value;
|
|
2272
2273
|
}
|
|
2273
2274
|
}
|