1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
use clap::{Subcommand, ValueEnum};
#[derive(clap::Args)]
pub struct PersonaArgs {
#[command(subcommand)]
pub command: PersonaCommand,
}
#[derive(Subcommand)]
pub enum PersonaCommand {
/// List voice personas
List(PersonaListArgs),
/// Show voice persona details
Info(PersonaInfoArgs),
/// List songs attached to a voice persona
Clips(PersonaClipsArgs),
/// Create a voice persona from an existing clip
Create(Box<PersonaCreateArgs>),
/// Update voice persona metadata
Set(PersonaSetArgs),
/// Show processed vocal clip status
ProcessedClip(PersonaProcessedClipArgs),
/// Make a voice persona public
Publish(PersonaPublishArgs),
/// Make a voice persona private
Unpublish(PersonaPublishArgs),
/// Ensure a voice persona is loved/favorited
Love(PersonaLoveArgs),
/// Ensure a voice persona is not loved/favorited
Unlove(PersonaLoveArgs),
/// Toggle loved/favorite state for a voice persona
ToggleLove(PersonaToggleLoveArgs),
/// Move a voice persona to trash
Delete(PersonaDeleteArgs),
/// Restore a trashed voice persona
Restore(PersonaDeleteArgs),
/// Permanently delete a trashed voice persona
Purge(PersonaDeleteArgs),
}
#[derive(clap::Args)]
pub struct PersonaListArgs {
/// Persona collection to list
#[arg(long, value_enum, default_value_t = PersonaListKind::Mine)]
pub kind: PersonaListKind,
/// Page number
#[arg(long, default_value_t = 1)]
pub page: u32,
/// Continuation token from a previous response
#[arg(long)]
pub continuation_token: Option<String>,
}
#[derive(Clone, Debug, ValueEnum)]
pub enum PersonaListKind {
/// Personas created by the authenticated user
Mine,
/// Personas loved/favorited by the authenticated user
Loved,
/// Personas from followed creators
Followed,
}
#[derive(clap::Args)]
pub struct PersonaInfoArgs {
/// Persona ID to inspect
pub id: String,
}
#[derive(clap::Args)]
pub struct PersonaClipsArgs {
/// Persona ID to inspect
pub id: String,
/// Page number
#[arg(long, default_value_t = 1)]
pub page: u32,
}
#[derive(clap::Args)]
pub struct PersonaCreateArgs {
/// Root clip ID to create the persona from
pub root_clip_id: String,
/// Persona name
#[arg(long)]
pub name: Option<String>,
/// Persona description
#[arg(long)]
pub description: Option<String>,
/// Existing Suno image S3 ID for persona artwork
#[arg(long)]
pub image_s3_id: Option<String>,
/// Create as private instead of public
#[arg(long)]
pub private: bool,
/// Persona type to pass through to Suno Web
#[arg(long)]
pub persona_type: Option<String>,
/// Optional vox audio ID used by Suno Web persona creation
#[arg(long)]
pub vox_audio_id: Option<String>,
/// Vocal range start in seconds
#[arg(long)]
pub vocal_start: Option<f64>,
/// Vocal range end in seconds
#[arg(long)]
pub vocal_end: Option<f64>,
/// User-input style text
#[arg(long)]
pub user_input_styles: Option<String>,
/// Source marker to pass through to Suno Web
#[arg(long)]
pub source: Option<String>,
/// Singer skill level marker to pass through to Suno Web
#[arg(long)]
pub singer_skill_level: Option<String>,
}
#[derive(clap::Args)]
pub struct PersonaSetArgs {
/// Persona ID to update
pub id: String,
/// New persona name
#[arg(long)]
pub name: Option<String>,
/// New persona description
#[arg(long)]
pub description: Option<String>,
/// Set public/private visibility with the edit endpoint
#[arg(long)]
pub public: Option<bool>,
/// Persona type to pass through to Suno Web
#[arg(long)]
pub persona_type: Option<String>,
/// User-input style text
#[arg(long)]
pub user_input_styles: Option<String>,
/// Processed vocal audio ID
#[arg(long)]
pub vox_audio_id: Option<String>,
/// Vocal range start in seconds
#[arg(long)]
pub vocal_start: Option<f64>,
/// Vocal range end in seconds
#[arg(long)]
pub vocal_end: Option<f64>,
}
#[derive(clap::Args)]
pub struct PersonaProcessedClipArgs {
/// Processed clip ID to inspect
pub id: String,
}
#[derive(clap::Args)]
pub struct PersonaLoveArgs {
/// Persona ID to update
pub id: String,
}
#[derive(clap::Args)]
pub struct PersonaPublishArgs {
/// Persona ID to update
pub id: String,
}
#[derive(clap::Args)]
pub struct PersonaToggleLoveArgs {
/// Persona ID to toggle
pub id: String,
}
#[derive(clap::Args)]
pub struct PersonaDeleteArgs {
/// Persona ID to update
pub id: String,
/// Skip confirmation
#[arg(short = 'y', long)]
pub yes: bool,
}