@nodaro/prompts 1.18.0 → 1.19.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.
@@ -401,7 +401,7 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
401
401
  description: "Mellow focus beat.",
402
402
  group: "By Use-Case",
403
403
  data: {
404
- model: "V5_5",
404
+ model: "V6",
405
405
  instrumental: true,
406
406
  style: "lo-fi hip-hop, chill and mellow, jazzy Rhodes chords, vinyl crackle, soft boom-bap drums, Andante 80 BPM, instrumental",
407
407
  },
@@ -412,7 +412,7 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
412
412
  description: "Short confident opener.",
413
413
  group: "By Use-Case",
414
414
  data: {
415
- model: "V5_5",
415
+ model: "V6",
416
416
  instrumental: true,
417
417
  style: "modern podcast intro, upbeat and confident, catchy synth hook, punchy beat, Allegro, instrumental",
418
418
  },
@@ -423,7 +423,7 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
423
423
  description: "Epic orchestral build.",
424
424
  group: "By Use-Case",
425
425
  data: {
426
- model: "V5_5",
426
+ model: "V6",
427
427
  instrumental: true,
428
428
  style: "epic cinematic trailer, dramatic and intense, full orchestra, taiko drums, brass swells, crescendo into a powerful hit, instrumental",
429
429
  },
@@ -434,7 +434,7 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
434
434
  description: "Bright, motivational.",
435
435
  group: "By Use-Case",
436
436
  data: {
437
- model: "V5_5",
437
+ model: "V6",
438
438
  instrumental: true,
439
439
  style: "upbeat corporate, optimistic and motivational, bright piano, claps, clean electronic beat, Allegro 120 BPM, instrumental",
440
440
  },
@@ -445,7 +445,7 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
445
445
  description: "Feel-good acoustic bed.",
446
446
  group: "By Use-Case",
447
447
  data: {
448
- model: "V5_5",
448
+ model: "V6",
449
449
  instrumental: true,
450
450
  style: "feel-good vlog background, light and breezy, acoustic guitar, claps, warm and unobtrusive, Andante, instrumental",
451
451
  },
@@ -456,7 +456,7 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
456
456
  description: "Calm meditative pads.",
457
457
  group: "By Use-Case",
458
458
  data: {
459
- model: "V5_5",
459
+ model: "V6",
460
460
  instrumental: true,
461
461
  style: "ambient soundscape, calm and meditative, soft evolving synth pads, gentle textures, reverb-heavy, Adagio, instrumental",
462
462
  },
@@ -467,7 +467,7 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
467
467
  description: "Festival build and drop.",
468
468
  group: "By Use-Case",
469
469
  data: {
470
- model: "V5_5",
470
+ model: "V6",
471
471
  instrumental: true,
472
472
  style: "festival EDM, euphoric and energetic, big supersaw leads, sidechain bass, build-up and powerful drop, Allegro 128 BPM, instrumental",
473
473
  },
@@ -478,7 +478,7 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
478
478
  description: "Playful 8-bit loop.",
479
479
  group: "By Use-Case",
480
480
  data: {
481
- model: "V5_5",
481
+ model: "V6",
482
482
  instrumental: true,
483
483
  style: "video game chiptune, playful and adventurous, 8-bit synths, catchy melody, energetic, instrumental",
484
484
  },
@@ -491,7 +491,7 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
491
491
  description: "Dusty laid-back groove.",
492
492
  group: "By Genre",
493
493
  data: {
494
- model: "V5_5",
494
+ model: "V6",
495
495
  instrumental: true,
496
496
  style: "lo-fi hip-hop, jazzy and mellow, dusty Rhodes chords, vinyl warmth, laid-back boom-bap groove, instrumental",
497
497
  },
@@ -502,7 +502,7 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
502
502
  description: "Club-energy four-on-the-floor.",
503
503
  group: "By Genre",
504
504
  data: {
505
- model: "V5_5",
505
+ model: "V6",
506
506
  instrumental: true,
507
507
  style: "house EDM, energetic and euphoric, four-on-the-floor beat, catchy plucky synths, club energy, Allegro 124 BPM, instrumental",
508
508
  },
@@ -513,7 +513,7 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
513
513
  description: "Driving anthemic guitars.",
514
514
  group: "By Genre",
515
515
  data: {
516
- model: "V5_5",
516
+ model: "V6",
517
517
  instrumental: true,
518
518
  style: "rock anthem, energetic and driving, distorted electric guitars, pounding drums, anthemic, instrumental",
519
519
  },
@@ -524,7 +524,7 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
524
524
  description: "Late-night sophistication.",
525
525
  group: "By Genre",
526
526
  data: {
527
- model: "V5_5",
527
+ model: "V6",
528
528
  instrumental: true,
529
529
  style: "smooth jazz, relaxed and sophisticated, warm saxophone, brushed drums, walking bass, late-night, instrumental",
530
530
  },
@@ -535,7 +535,7 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
535
535
  description: "Spacious and serene.",
536
536
  group: "By Genre",
537
537
  data: {
538
- model: "V5_5",
538
+ model: "V6",
539
539
  instrumental: true,
540
540
  style: "ambient, serene and spacious, lush synth pads, field-recording textures, slow and meditative, instrumental",
541
541
  },
@@ -546,7 +546,7 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
546
546
  description: "Grand cinematic ensemble.",
547
547
  group: "By Genre",
548
548
  data: {
549
- model: "V5_5",
549
+ model: "V6",
550
550
  instrumental: true,
551
551
  style: "epic orchestral, grand and cinematic, sweeping strings, brass, woodwinds, timpani, dramatic, instrumental",
552
552
  },
@@ -557,7 +557,7 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
557
557
  description: "80s neon nostalgia.",
558
558
  group: "By Genre",
559
559
  data: {
560
- model: "V5_5",
560
+ model: "V6",
561
561
  instrumental: true,
562
562
  style: "80s synthwave, nostalgic and cool, retro analog synths, pulsing bass, gated drums, neon, Andante 110 BPM, instrumental",
563
563
  },
@@ -568,7 +568,7 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
568
568
  description: "Groovy and danceable.",
569
569
  group: "By Genre",
570
570
  data: {
571
- model: "V5_5",
571
+ model: "V6",
572
572
  instrumental: true,
573
573
  style: "funk and soul, groovy and fun, slap bass, wah guitar, tight horn section, danceable, instrumental",
574
574
  },
@@ -581,7 +581,7 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
581
581
  description: "Catchy vocal pop — add lyrics.",
582
582
  group: "Vocals & Songs",
583
583
  data: {
584
- model: "V5_5",
584
+ model: "V6",
585
585
  instrumental: false,
586
586
  style: "upbeat pop, catchy and bright, shimmering synths, four-on-the-floor, female vocals, Allegro 120 BPM, verse-chorus-verse with bridge",
587
587
  },
@@ -592,7 +592,7 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
592
592
  description: "Hard-hitting verses — add bars.",
593
593
  group: "Vocals & Songs",
594
594
  data: {
595
- model: "V5_5",
595
+ model: "V6",
596
596
  instrumental: false,
597
597
  style: "modern hip-hop, confident, hard-hitting 808s, trap hi-hats, male rap vocals, verse-hook-verse",
598
598
  },
@@ -603,7 +603,7 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
603
603
  description: "Heartfelt vocals — add lyrics.",
604
604
  group: "Vocals & Songs",
605
605
  data: {
606
- model: "V5_5",
606
+ model: "V6",
607
607
  instrumental: false,
608
608
  style: "emotional ballad, tender and heartfelt, piano and strings, soulful vocals, Adagio, verse-chorus with a big bridge",
609
609
  },
@@ -614,7 +614,7 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
614
614
  description: "Soaring chorus — add lyrics.",
615
615
  group: "Vocals & Songs",
616
616
  data: {
617
- model: "V5_5",
617
+ model: "V6",
618
618
  instrumental: false,
619
619
  style: "anthemic rock, powerful, driving guitars, big drums, male vocals, soaring chorus, verse-pre-chorus-chorus",
620
620
  },
@@ -625,7 +625,7 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
625
625
  description: "Warm and intimate — add lyrics.",
626
626
  group: "Vocals & Songs",
627
627
  data: {
628
- model: "V5_5",
628
+ model: "V6",
629
629
  instrumental: false,
630
630
  style: "acoustic singer-songwriter, warm and intimate, fingerpicked guitar, soft vocals, Andante, verse-chorus",
631
631
  },
@@ -636,42 +636,42 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
636
636
  name: "Trailer Riser / Braam",
637
637
  description: "Pure rising tension hit.",
638
638
  group: "By Use-Case",
639
- data: { model: "V5_5", instrumental: true, style: "cinematic trailer riser and braam, tense and building, rising whoosh into a deep brass impact, no melody, instrumental" },
639
+ data: { model: "V6", instrumental: true, style: "cinematic trailer riser and braam, tense and building, rising whoosh into a deep brass impact, no melody, instrumental" },
640
640
  },
641
641
  {
642
642
  id: "suno-generate/calm-corporate",
643
643
  name: "Calm Corporate / Tech",
644
644
  description: "Soft, professional bed.",
645
645
  group: "By Use-Case",
646
- data: { model: "V5_5", instrumental: true, style: "calm corporate tech, professional and clean, soft synth pads, gentle pulse, Andante, instrumental" },
646
+ data: { model: "V6", instrumental: true, style: "calm corporate tech, professional and clean, soft synth pads, gentle pulse, Andante, instrumental" },
647
647
  },
648
648
  {
649
649
  id: "suno-generate/holiday",
650
650
  name: "Holiday / Festive",
651
651
  description: "Warm seasonal cheer.",
652
652
  group: "By Use-Case",
653
- data: { model: "V5_5", instrumental: true, style: "festive holiday music, warm and cheerful, sleigh bells, warm orchestration, cozy, instrumental" },
653
+ data: { model: "V6", instrumental: true, style: "festive holiday music, warm and cheerful, sleigh bells, warm orchestration, cozy, instrumental" },
654
654
  },
655
655
  {
656
656
  id: "suno-generate/kids",
657
657
  name: "Kids / Children's",
658
658
  description: "Playful and simple.",
659
659
  group: "By Use-Case",
660
- data: { model: "V5_5", instrumental: true, style: "children's music, playful and happy, simple cheerful melody, xylophone and ukulele, bouncy, instrumental" },
660
+ data: { model: "V6", instrumental: true, style: "children's music, playful and happy, simple cheerful melody, xylophone and ukulele, bouncy, instrumental" },
661
661
  },
662
662
  {
663
663
  id: "suno-generate/meditation-spa",
664
664
  name: "Meditation / Spa",
665
665
  description: "Healing singing bowls.",
666
666
  group: "By Use-Case",
667
- data: { model: "V5_5", instrumental: true, style: "meditation and spa, serene and healing, singing bowls, soft drones, Adagio, reverb-heavy, instrumental" },
667
+ data: { model: "V6", instrumental: true, style: "meditation and spa, serene and healing, singing bowls, soft drones, Adagio, reverb-heavy, instrumental" },
668
668
  },
669
669
  {
670
670
  id: "suno-generate/workout",
671
671
  name: "Workout / Gym",
672
672
  description: "High-energy motivation.",
673
673
  group: "By Use-Case",
674
- data: { model: "V5_5", instrumental: true, style: "high-energy workout, motivational and driving, pumping electronic beat, big synths, Allegro 140 BPM, instrumental" },
674
+ data: { model: "V6", instrumental: true, style: "high-energy workout, motivational and driving, pumping electronic beat, big synths, Allegro 140 BPM, instrumental" },
675
675
  },
676
676
  // ── More By Genre ────────────────────────────────────────────────────────
677
677
  {
@@ -679,42 +679,42 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
679
679
  name: "Trap Beat",
680
680
  description: "Booming 808s, dark.",
681
681
  group: "By Genre",
682
- data: { model: "V5_5", instrumental: true, style: "trap beat, dark and hard, booming 808s, crisp rapid hi-hats, moody, instrumental" },
682
+ data: { model: "V6", instrumental: true, style: "trap beat, dark and hard, booming 808s, crisp rapid hi-hats, moody, instrumental" },
683
683
  },
684
684
  {
685
685
  id: "suno-generate/dnb",
686
686
  name: "Drum & Bass",
687
687
  description: "Fast breakbeats, deep bass.",
688
688
  group: "By Genre",
689
- data: { model: "V5_5", instrumental: true, style: "drum and bass, fast and energetic, breakbeats, deep rolling bassline, Presto 174 BPM, instrumental" },
689
+ data: { model: "V6", instrumental: true, style: "drum and bass, fast and energetic, breakbeats, deep rolling bassline, Presto 174 BPM, instrumental" },
690
690
  },
691
691
  {
692
692
  id: "suno-generate/afrobeats",
693
693
  name: "Afrobeats",
694
694
  description: "Warm syncopated groove.",
695
695
  group: "By Genre",
696
- data: { model: "V5_5", instrumental: true, style: "afrobeats, groovy and warm, syncopated percussion, warm bass, bright melodies, danceable, instrumental" },
696
+ data: { model: "V6", instrumental: true, style: "afrobeats, groovy and warm, syncopated percussion, warm bass, bright melodies, danceable, instrumental" },
697
697
  },
698
698
  {
699
699
  id: "suno-generate/country",
700
700
  name: "Country / Americana",
701
701
  description: "Acoustic, heartfelt.",
702
702
  group: "By Genre",
703
- data: { model: "V5_5", instrumental: true, style: "country americana, warm and heartfelt, acoustic and slide guitar, storytelling feel, instrumental" },
703
+ data: { model: "V6", instrumental: true, style: "country americana, warm and heartfelt, acoustic and slide guitar, storytelling feel, instrumental" },
704
704
  },
705
705
  {
706
706
  id: "suno-generate/phonk",
707
707
  name: "Phonk",
708
708
  description: "Dark drift-phonk for reels.",
709
709
  group: "By Genre",
710
- data: { model: "V5_5", instrumental: true, style: "drift phonk, dark and aggressive, distorted 808 cowbell, menacing beat, lo-fi grit, instrumental" },
710
+ data: { model: "V6", instrumental: true, style: "drift phonk, dark and aggressive, distorted 808 cowbell, menacing beat, lo-fi grit, instrumental" },
711
711
  },
712
712
  {
713
713
  id: "suno-generate/reggae",
714
714
  name: "Reggae / Dub",
715
715
  description: "Laid-back island groove.",
716
716
  group: "By Genre",
717
- data: { model: "V5_5", instrumental: true, style: "reggae dub, laid-back and sunny, off-beat skank guitar, deep dub bassline, relaxed island groove, instrumental" },
717
+ data: { model: "V6", instrumental: true, style: "reggae dub, laid-back and sunny, off-beat skank guitar, deep dub bassline, relaxed island groove, instrumental" },
718
718
  },
719
719
  // ── More Vocals & Songs ──────────────────────────────────────────────────
720
720
  {
@@ -722,13 +722,13 @@ export const SUNO_GENERATE_PRESETS: readonly FactoryPreset[] = [
722
722
  name: "R&B / Soul (vocal)",
723
723
  description: "Smooth soulful vocals — add lyrics.",
724
724
  group: "Vocals & Songs",
725
- data: { model: "V5_5", instrumental: false, style: "smooth R&B soul, sensual and warm, lush chords, soft drums, soulful vocals, Andante, verse-chorus with ad-libs" },
725
+ data: { model: "V6", instrumental: false, style: "smooth R&B soul, sensual and warm, lush chords, soft drums, soulful vocals, Andante, verse-chorus with ad-libs" },
726
726
  },
727
727
  {
728
728
  id: "suno-generate/song-kpop",
729
729
  name: "K-Pop (vocal)",
730
730
  description: "Polished hook — add lyrics.",
731
731
  group: "Vocals & Songs",
732
- data: { model: "V5_5", instrumental: false, style: "K-pop, polished and energetic, bright synths, punchy drums, layered vocals, Allegro 120 BPM, verse-pre-chorus-chorus" },
732
+ data: { model: "V6", instrumental: false, style: "K-pop, polished and energetic, bright synths, punchy drums, layered vocals, Allegro 120 BPM, verse-pre-chorus-chorus" },
733
733
  },
734
734
  ]
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Join prompt-hint fragments into one injected string.
3
+ *
4
+ * Catalog hints were historically single clauses ("slow camera pan left,
5
+ * rotating horizontally") and every composer glued fragments with `", "`. The
6
+ * tested camera-motion injections are multi-sentence paragraphs that END IN A
7
+ * PERIOD, so the comma join produced `"...no pull-out., beginning with ..."`.
8
+ *
9
+ * This helper keeps the comma between clause-style fragments — every string
10
+ * the composers emitted before it existed is byte-identical — and switches to
11
+ * a single space after a fragment that already closes a sentence. It never
12
+ * strips or adds terminal punctuation: a tested injection ships exactly as
13
+ * approved, and a user's preText/postText is never rewritten.
14
+ */
15
+
16
+ const ENDS_SENTENCE = /[.!?]$/
17
+
18
+ export function joinHintFragments(fragments: ReadonlyArray<string>): string {
19
+ let out = ""
20
+ for (const fragment of fragments) {
21
+ if (!fragment) continue
22
+ if (!out) { out = fragment; continue }
23
+ out += ENDS_SENTENCE.test(out) ? ` ${fragment}` : `, ${fragment}`
24
+ }
25
+ return out
26
+ }
package/src/index.ts CHANGED
@@ -49,6 +49,7 @@ export * from "./atmosphere.js"
49
49
  export * from "./backdrop.js"
50
50
  export * from "./camera-format.js"
51
51
  export * from "./camera-motions.js"
52
+ export * from "./hint-join.js"
52
53
  export * from "./character-fx.js"
53
54
  export * from "./color-look.js"
54
55
  export * from "./composition-effects.js"
@@ -35,6 +35,7 @@ import { buildPoseHints } from "./pose.js"
35
35
  import { buildStylingHints } from "./styling.js"
36
36
  import { buildTemporalHints } from "./temporal.js"
37
37
  import { composeCameraMotionHintFromConnections } from "./camera-motions.js"
38
+ import { joinHintFragments } from "./hint-join.js"
38
39
  import { composeTransitionHintFromConnections, type TransitionDuration, type TransitionIntensity, type TransitionPosition, type TransitionTiming } from "./transitions.js"
39
40
  import { composeCharacterFxHintFromConnections, type CharacterFxDuration, type CharacterFxIntensity, type CharacterFxPosition, type CharacterFxTiming } from "./character-fx.js"
40
41
  import { buildMaterialHints } from "./materials.js"
@@ -84,7 +85,7 @@ function withCustomText(data: Record<string, unknown>, mainHint: string): string
84
85
  if (mainHint) fragments.push(mainHint)
85
86
  const post = typeof data.postText === "string" ? data.postText.trim() : ""
86
87
  if (post) fragments.push(post)
87
- return fragments.join(", ")
88
+ return joinHintFragments(fragments)
88
89
  }
89
90
 
90
91
  /**
@@ -333,11 +333,17 @@ export const PROVIDER_CAPABILITIES: Record<string, Record<string, string>> = {
333
333
  "minimax": "General music generation, multiple genres",
334
334
  },
335
335
  "suno-generate": {
336
- "V4": "Standard Suno generation",
337
- "V4_5": "Improved quality and coherence",
336
+ // Current generation first (V6 = default), then the earlier ones — all
337
+ // offered in the picker; mirrors SUNO_MODELS order in @nodaro/shared.
338
+ "V6": "Flagship — greater musical expression, more natural vocals, richer details",
339
+ "V6_WILD": "Bolder, more distinctive, less predictable results for exploration",
340
+ "V6_MINI": "Lightweight and fast — quality/speed balance",
341
+ "V5_5": "Custom-model tuning with strong vocal quality",
342
+ "V5": "Superior musical expression, faster generation",
338
343
  "V4_5PLUS": "Enhanced V4.5 with better production",
339
344
  "V4_5ALL": "Full-featured V4.5",
340
- "V5": "Latest Suno with highest quality",
345
+ "V4_5": "Improved quality and coherence",
346
+ "V4": "Standard Suno generation",
341
347
  },
342
348
  "text-to-audio": {
343
349
  "elevenlabs-sfx": "High quality sound effects and ambient audio",
@@ -96,7 +96,7 @@ export function composeSoundHintFromConnections(
96
96
  // Music consumers (suno-generate, generate-music) accept BOTH music nodes
97
97
  // AND voice nodes — voice description (gender, age, accent, language,
98
98
  // timbre, delivery archetype) is valid input for music with vocals. Suno
99
- // V5 in particular benefits from rich voice description; the typed
99
+ // V6 in particular benefits from rich voice description; the typed
100
100
  // `vocalGender` field on Suno is also extracted below from voice-character.
101
101
  //
102
102
  // Voice Design rejects music nodes (different domain). Text-to-Audio