@agentproto/model-catalog 0.2.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.
Files changed (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +37 -0
  3. package/dist/access/index.d.ts +30 -0
  4. package/dist/access/index.mjs +4 -0
  5. package/dist/access/index.mjs.map +1 -0
  6. package/dist/audio/index.d.ts +84 -0
  7. package/dist/audio/index.mjs +3 -0
  8. package/dist/audio/index.mjs.map +1 -0
  9. package/dist/audio-BzVF_wke.d.ts +92 -0
  10. package/dist/base-BNHcMifc.d.ts +109 -0
  11. package/dist/byok/index.d.ts +33 -0
  12. package/dist/byok/index.mjs +3 -0
  13. package/dist/byok/index.mjs.map +1 -0
  14. package/dist/catalog-aQHd559b.d.ts +594 -0
  15. package/dist/chunk-2LWYZOWB.mjs +643 -0
  16. package/dist/chunk-2LWYZOWB.mjs.map +1 -0
  17. package/dist/chunk-CINXNTU3.mjs +134 -0
  18. package/dist/chunk-CINXNTU3.mjs.map +1 -0
  19. package/dist/chunk-F7OEHYUI.mjs +187 -0
  20. package/dist/chunk-F7OEHYUI.mjs.map +1 -0
  21. package/dist/chunk-GH7PB5FB.mjs +183 -0
  22. package/dist/chunk-GH7PB5FB.mjs.map +1 -0
  23. package/dist/chunk-H6JUTF3U.mjs +33 -0
  24. package/dist/chunk-H6JUTF3U.mjs.map +1 -0
  25. package/dist/chunk-HEDDSOZF.mjs +47 -0
  26. package/dist/chunk-HEDDSOZF.mjs.map +1 -0
  27. package/dist/chunk-HRRG2RZO.mjs +116 -0
  28. package/dist/chunk-HRRG2RZO.mjs.map +1 -0
  29. package/dist/chunk-IJZ4XPO2.mjs +606 -0
  30. package/dist/chunk-IJZ4XPO2.mjs.map +1 -0
  31. package/dist/chunk-IORIAFK2.mjs +227 -0
  32. package/dist/chunk-IORIAFK2.mjs.map +1 -0
  33. package/dist/chunk-OHAMH3ZE.mjs +2629 -0
  34. package/dist/chunk-OHAMH3ZE.mjs.map +1 -0
  35. package/dist/chunk-QHELXPSL.mjs +85 -0
  36. package/dist/chunk-QHELXPSL.mjs.map +1 -0
  37. package/dist/chunk-SGJR6ZQH.mjs +1230 -0
  38. package/dist/chunk-SGJR6ZQH.mjs.map +1 -0
  39. package/dist/chunk-WRUWNKDB.mjs +521 -0
  40. package/dist/chunk-WRUWNKDB.mjs.map +1 -0
  41. package/dist/chunk-WTHHXXIK.mjs +366 -0
  42. package/dist/chunk-WTHHXXIK.mjs.map +1 -0
  43. package/dist/chunk-XFDXTFV3.mjs +28 -0
  44. package/dist/chunk-XFDXTFV3.mjs.map +1 -0
  45. package/dist/cost/index.d.ts +114 -0
  46. package/dist/cost/index.mjs +13 -0
  47. package/dist/cost/index.mjs.map +1 -0
  48. package/dist/curation/index.d.ts +98 -0
  49. package/dist/curation/index.mjs +13 -0
  50. package/dist/curation/index.mjs.map +1 -0
  51. package/dist/evaluate-DisH3H7u.d.ts +84 -0
  52. package/dist/image/index.d.ts +79 -0
  53. package/dist/image/index.mjs +3 -0
  54. package/dist/image/index.mjs.map +1 -0
  55. package/dist/index-BICjPG8H.d.ts +132 -0
  56. package/dist/index-D8nL3fPZ.d.ts +171 -0
  57. package/dist/index.d.ts +94 -0
  58. package/dist/index.mjs +33 -0
  59. package/dist/index.mjs.map +1 -0
  60. package/dist/llm/index.d.ts +48 -0
  61. package/dist/llm/index.mjs +4 -0
  62. package/dist/llm/index.mjs.map +1 -0
  63. package/dist/overlay/index.d.ts +67 -0
  64. package/dist/overlay/index.mjs +3 -0
  65. package/dist/overlay/index.mjs.map +1 -0
  66. package/dist/picker/index.d.ts +11 -0
  67. package/dist/picker/index.mjs +26 -0
  68. package/dist/picker/index.mjs.map +1 -0
  69. package/dist/pricing/index.d.ts +106 -0
  70. package/dist/pricing/index.mjs +3 -0
  71. package/dist/pricing/index.mjs.map +1 -0
  72. package/dist/providers/index.d.ts +78 -0
  73. package/dist/providers/index.mjs +237 -0
  74. package/dist/providers/index.mjs.map +1 -0
  75. package/dist/schema/index.d.ts +627 -0
  76. package/dist/schema/index.mjs +4 -0
  77. package/dist/schema/index.mjs.map +1 -0
  78. package/dist/schema/voice.d.ts +66 -0
  79. package/dist/schema/voice.mjs +3 -0
  80. package/dist/schema/voice.mjs.map +1 -0
  81. package/dist/video/index.d.ts +78 -0
  82. package/dist/video/index.mjs +3 -0
  83. package/dist/video/index.mjs.map +1 -0
  84. package/dist/voice/index.d.ts +1300 -0
  85. package/dist/voice/index.mjs +4 -0
  86. package/dist/voice/index.mjs.map +1 -0
  87. package/package.json +137 -0
@@ -0,0 +1,237 @@
1
+ import { z } from 'zod';
2
+
3
+ /**
4
+ * @agentproto/model-catalog v0.1.0
5
+ * Unified model catalog: LLM, image, video, audio entries + cost dispatcher + picker.
6
+ * Zod-only OSS core; @agstudio/model-catalog layers billing/access/BYOK on top.
7
+ */
8
+
9
+ var ElevenLabsRawVoiceSchema = z.object({
10
+ voice_id: z.string(),
11
+ name: z.string(),
12
+ category: z.string().optional(),
13
+ description: z.string().nullable().optional(),
14
+ labels: z.record(z.string(), z.string()).default({}),
15
+ preview_url: z.string().nullable().optional()
16
+ }).passthrough();
17
+ var ElevenLabsVoicesSnapshotSchema = z.object({
18
+ voices: z.array(ElevenLabsRawVoiceSchema)
19
+ });
20
+ var SUPPORTED_LANGUAGES = [
21
+ "en",
22
+ "fr",
23
+ "es",
24
+ "de",
25
+ "it",
26
+ "pt",
27
+ "ja",
28
+ "ko",
29
+ "zh",
30
+ "ar",
31
+ "ru",
32
+ "tr",
33
+ "nl",
34
+ "pl",
35
+ "sv",
36
+ "hi"
37
+ ];
38
+ var ACCENT_TO_LANG = {
39
+ french: "fr",
40
+ british: "en",
41
+ american: "en",
42
+ australian: "en",
43
+ indian: "en",
44
+ spanish: "es",
45
+ german: "de",
46
+ italian: "it",
47
+ portuguese: "pt",
48
+ japanese: "ja",
49
+ korean: "ko",
50
+ chinese: "zh",
51
+ mandarin: "zh",
52
+ arabic: "ar",
53
+ russian: "ru",
54
+ turkish: "tr",
55
+ dutch: "nl",
56
+ polish: "pl",
57
+ swedish: "sv",
58
+ hindi: "hi"
59
+ };
60
+ var FEATURED_VOICE_IDS = /* @__PURE__ */ new Set([
61
+ "O31r762Gb3WFygrEOGh0",
62
+ // Victoire
63
+ "WeAAwKYcS06VmXw086yZ",
64
+ // Victoria
65
+ "aQROLel5sQbj1vuIVi6B",
66
+ // Nicolas
67
+ "JBFqnCBsd6RMkjVDRZzb",
68
+ // George
69
+ "EXAVITQu4vr4xnSDxMaL",
70
+ // Sarah
71
+ "onwK4e9ZLuTAKqWW03F9",
72
+ // Daniel
73
+ "Xb7hH8MSUJpSbSDYk0k2"
74
+ // Alice
75
+ ]);
76
+ function slugify(name) {
77
+ return name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
78
+ }
79
+ function inferGender(labels) {
80
+ const g = labels.gender?.toLowerCase();
81
+ if (g === "female") return "female";
82
+ if (g === "male") return "male";
83
+ return "neutral";
84
+ }
85
+ function inferAge(labels) {
86
+ const a = labels.age?.toLowerCase();
87
+ if (a === "child") return "child";
88
+ if (a === "young") return "young";
89
+ if (a === "middle_aged" || a === "adult") return "adult";
90
+ if (a === "senior") return "senior";
91
+ return void 0;
92
+ }
93
+ function inferPrimaryLanguage(labels) {
94
+ const accent = labels.accent?.toLowerCase();
95
+ if (accent && ACCENT_TO_LANG[accent]) return ACCENT_TO_LANG[accent];
96
+ return "en";
97
+ }
98
+ function mapElevenLabsVoice(raw) {
99
+ const labels = raw.labels ?? {};
100
+ const age = inferAge(labels);
101
+ const samplePath = raw.preview_url ?? void 0;
102
+ const voice = {
103
+ catalogId: `elevenlabs-${slugify(raw.name)}`,
104
+ providerVoiceId: raw.voice_id,
105
+ provider: "elevenlabs",
106
+ label: raw.name,
107
+ description: raw.description ?? raw.name,
108
+ gender: inferGender(labels),
109
+ primaryLanguage: inferPrimaryLanguage(labels),
110
+ supportedLanguages: SUPPORTED_LANGUAGES,
111
+ quality: "premium",
112
+ featured: FEATURED_VOICE_IDS.has(raw.voice_id)
113
+ };
114
+ if (samplePath !== void 0) voice.samplePath = samplePath;
115
+ if (age !== void 0) voice.age = age;
116
+ return voice;
117
+ }
118
+ function mapElevenLabsVoices(snapshot) {
119
+ return snapshot.voices.map(mapElevenLabsVoice);
120
+ }
121
+ var MinimaxSystemVoiceSchema = z.object({
122
+ voice_id: z.string(),
123
+ voice_name: z.string(),
124
+ description: z.array(z.string()).default([]),
125
+ created_time: z.string().optional()
126
+ }).passthrough();
127
+ var MinimaxVoicesSnapshotSchema = z.object({
128
+ system_voice: z.array(MinimaxSystemVoiceSchema),
129
+ base_resp: z.object({
130
+ status_code: z.number(),
131
+ status_msg: z.string()
132
+ }).passthrough().optional()
133
+ }).passthrough();
134
+ var SUPPORTED_LANGUAGES2 = [
135
+ "en",
136
+ "fr",
137
+ "es",
138
+ "de",
139
+ "it",
140
+ "pt",
141
+ "ja",
142
+ "ko",
143
+ "zh",
144
+ "ar",
145
+ "ru",
146
+ "tr",
147
+ "nl",
148
+ "pl",
149
+ "sv",
150
+ "da",
151
+ "no",
152
+ "fi",
153
+ "hi",
154
+ "th",
155
+ "vi",
156
+ "id",
157
+ "ms",
158
+ "tl",
159
+ "ro",
160
+ "hu"
161
+ ];
162
+ var LANGUAGE_PREFIX_MAP = {
163
+ French: "fr",
164
+ English: "en",
165
+ Spanish: "es",
166
+ German: "de",
167
+ Japanese: "ja",
168
+ Korean: "ko",
169
+ "Chinese (Mandarin)": "zh",
170
+ Portuguese: "pt",
171
+ Italian: "it",
172
+ Arabic: "ar",
173
+ Russian: "ru",
174
+ Turkish: "tr",
175
+ Dutch: "nl",
176
+ Polish: "pl",
177
+ Swedish: "sv",
178
+ Danish: "da",
179
+ Norwegian: "no",
180
+ Finnish: "fi",
181
+ Hindi: "hi",
182
+ Thai: "th",
183
+ Vietnamese: "vi",
184
+ Indonesian: "id",
185
+ Malay: "ms",
186
+ Tagalog: "tl",
187
+ Romanian: "ro",
188
+ Hungarian: "hu"
189
+ };
190
+ var FEMALE_KEYWORDS = ["female", "woman", "lady", "girl", "heroine", "sweet"];
191
+ var MALE_KEYWORDS = ["male", "man", "butler", "gentleman", "narrator", "executive"];
192
+ function extractLanguageFromVoiceId(voiceId) {
193
+ for (const [prefix, lang] of Object.entries(LANGUAGE_PREFIX_MAP)) {
194
+ if (voiceId.startsWith(prefix)) return lang;
195
+ }
196
+ return "en";
197
+ }
198
+ function inferGender2(voiceId) {
199
+ const lower = voiceId.toLowerCase();
200
+ if (FEMALE_KEYWORDS.some((k) => lower.includes(k))) return "female";
201
+ if (MALE_KEYWORDS.some((k) => lower.includes(k))) return "male";
202
+ return "neutral";
203
+ }
204
+ function inferAge2(voiceId) {
205
+ const lower = voiceId.toLowerCase();
206
+ if (lower.includes("child")) return "child";
207
+ if (lower.includes("girl") || lower.includes("young")) return "young";
208
+ if (lower.includes("senior")) return "senior";
209
+ return "adult";
210
+ }
211
+ function slugify2(voiceId) {
212
+ return voiceId.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
213
+ }
214
+ function mapMinimaxVoice(raw) {
215
+ const age = inferAge2(raw.voice_id);
216
+ const voice = {
217
+ catalogId: `minimax-${slugify2(raw.voice_id)}`,
218
+ providerVoiceId: raw.voice_id,
219
+ provider: "minimax",
220
+ label: raw.voice_name,
221
+ description: raw.description[0] ?? raw.voice_name,
222
+ gender: inferGender2(raw.voice_id),
223
+ primaryLanguage: extractLanguageFromVoiceId(raw.voice_id),
224
+ supportedLanguages: SUPPORTED_LANGUAGES2,
225
+ quality: "premium",
226
+ featured: true
227
+ };
228
+ if (age !== void 0) voice.age = age;
229
+ return voice;
230
+ }
231
+ function mapMinimaxVoices(snapshot) {
232
+ return snapshot.system_voice.map(mapMinimaxVoice);
233
+ }
234
+
235
+ export { ElevenLabsRawVoiceSchema, ElevenLabsVoicesSnapshotSchema, MinimaxSystemVoiceSchema, MinimaxVoicesSnapshotSchema, mapElevenLabsVoice, mapElevenLabsVoices, mapMinimaxVoice, mapMinimaxVoices };
236
+ //# sourceMappingURL=index.mjs.map
237
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/voice/providers/elevenlabs-map.ts","../../src/voice/providers/minimax-map.ts"],"names":["z","SUPPORTED_LANGUAGES","inferGender","inferAge","slugify"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * ElevenLabs raw → CatalogVoice mapper.\n *\n * The single source of \"how an ElevenLabs `/v1/voices` entry becomes a\n * `CatalogVoice`\". Used in two places:\n * - build time, by `@agentproto/catalog-sync` to emit the full baseline\n * voice list from a pinned snapshot;\n * - runtime, by the live-on-setup path (`agentproto auth provider set\n * elevenlabs`) to turn a freshly-fetched account voice library into the\n * local overlay cache.\n *\n * Pure + deterministic — no network, no fs. The raw schema validates both the\n * pinned snapshot and a live response so a provider shape-change surfaces as a\n * parse error, not silent data loss.\n */\n\nimport { z } from \"zod\"\n\nimport type { CatalogVoice } from \"../../schema/voice.js\"\n\n// ── Raw source shape (ElevenLabs GET /v1/voices) ─────────────────────────\n\nexport const ElevenLabsRawVoiceSchema = z\n .object({\n voice_id: z.string(),\n name: z.string(),\n category: z.string().optional(),\n description: z.string().nullable().optional(),\n labels: z.record(z.string(), z.string()).default({}),\n preview_url: z.string().nullable().optional(),\n })\n .passthrough()\nexport type ElevenLabsRawVoice = z.infer<typeof ElevenLabsRawVoiceSchema>\n\nexport const ElevenLabsVoicesSnapshotSchema = z.object({\n voices: z.array(ElevenLabsRawVoiceSchema),\n})\nexport type ElevenLabsVoicesSnapshot = z.infer<\n typeof ElevenLabsVoicesSnapshotSchema\n>\n\n// ── Mapping rules ─────────────────────────────────────────────────────────\n\nconst SUPPORTED_LANGUAGES = [\n \"en\", \"fr\", \"es\", \"de\", \"it\", \"pt\", \"ja\", \"ko\", \"zh\",\n \"ar\", \"ru\", \"tr\", \"nl\", \"pl\", \"sv\", \"hi\",\n] as const\n\nconst ACCENT_TO_LANG: Record<string, string> = {\n french: \"fr\",\n british: \"en\",\n american: \"en\",\n australian: \"en\",\n indian: \"en\",\n spanish: \"es\",\n german: \"de\",\n italian: \"it\",\n portuguese: \"pt\",\n japanese: \"ja\",\n korean: \"ko\",\n chinese: \"zh\",\n mandarin: \"zh\",\n arabic: \"ar\",\n russian: \"ru\",\n turkish: \"tr\",\n dutch: \"nl\",\n polish: \"pl\",\n swedish: \"sv\",\n hindi: \"hi\",\n}\n\n/** Featured showcase voice ids — surfaced in the picker by default. */\nconst FEATURED_VOICE_IDS = new Set([\n \"O31r762Gb3WFygrEOGh0\", // Victoire\n \"WeAAwKYcS06VmXw086yZ\", // Victoria\n \"aQROLel5sQbj1vuIVi6B\", // Nicolas\n \"JBFqnCBsd6RMkjVDRZzb\", // George\n \"EXAVITQu4vr4xnSDxMaL\", // Sarah\n \"onwK4e9ZLuTAKqWW03F9\", // Daniel\n \"Xb7hH8MSUJpSbSDYk0k2\", // Alice\n])\n\nfunction slugify(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n}\n\nfunction inferGender(labels: Record<string, string>): \"female\" | \"male\" | \"neutral\" {\n const g = labels.gender?.toLowerCase()\n if (g === \"female\") return \"female\"\n if (g === \"male\") return \"male\"\n return \"neutral\"\n}\n\nfunction inferAge(labels: Record<string, string>): \"child\" | \"young\" | \"adult\" | \"senior\" | undefined {\n const a = labels.age?.toLowerCase()\n if (a === \"child\") return \"child\"\n if (a === \"young\") return \"young\"\n if (a === \"middle_aged\" || a === \"adult\") return \"adult\"\n if (a === \"senior\") return \"senior\"\n return undefined\n}\n\nfunction inferPrimaryLanguage(labels: Record<string, string>): string {\n const accent = labels.accent?.toLowerCase()\n if (accent && ACCENT_TO_LANG[accent]) return ACCENT_TO_LANG[accent]\n return \"en\"\n}\n\n/** Map one raw ElevenLabs voice to a `CatalogVoice`. */\nexport function mapElevenLabsVoice(raw: ElevenLabsRawVoice): CatalogVoice {\n const labels = raw.labels ?? {}\n const age = inferAge(labels)\n const samplePath = raw.preview_url ?? undefined\n const voice: CatalogVoice = {\n catalogId: `elevenlabs-${slugify(raw.name)}`,\n providerVoiceId: raw.voice_id,\n provider: \"elevenlabs\",\n label: raw.name,\n description: raw.description ?? raw.name,\n gender: inferGender(labels),\n primaryLanguage: inferPrimaryLanguage(labels),\n supportedLanguages: SUPPORTED_LANGUAGES,\n quality: \"premium\",\n featured: FEATURED_VOICE_IDS.has(raw.voice_id),\n }\n if (samplePath !== undefined) voice.samplePath = samplePath\n if (age !== undefined) voice.age = age\n return voice\n}\n\n/** Map a full `/v1/voices` snapshot to the baseline voice list. */\nexport function mapElevenLabsVoices(\n snapshot: ElevenLabsVoicesSnapshot,\n): CatalogVoice[] {\n return snapshot.voices.map(mapElevenLabsVoice)\n}\n","/**\n * MiniMax raw → CatalogVoice mapper.\n *\n * Single source of \"how a MiniMax `/v1/get_voice` system voice becomes a\n * `CatalogVoice`\". Shared by `@agentproto/catalog-sync` (build-time baseline\n * emit) and the runtime live-on-setup path. Pure + deterministic.\n */\n\nimport { z } from \"zod\"\n\nimport type { CatalogVoice } from \"../../schema/voice.js\"\n\n// ── Raw source shape (MiniMax POST /v1/get_voice, voice_type:\"system\") ────\n\nexport const MinimaxSystemVoiceSchema = z\n .object({\n voice_id: z.string(),\n voice_name: z.string(),\n description: z.array(z.string()).default([]),\n created_time: z.string().optional(),\n })\n .passthrough()\nexport type MinimaxSystemVoice = z.infer<typeof MinimaxSystemVoiceSchema>\n\nexport const MinimaxVoicesSnapshotSchema = z\n .object({\n system_voice: z.array(MinimaxSystemVoiceSchema),\n base_resp: z\n .object({\n status_code: z.number(),\n status_msg: z.string(),\n })\n .passthrough()\n .optional(),\n })\n .passthrough()\nexport type MinimaxVoicesSnapshot = z.infer<typeof MinimaxVoicesSnapshotSchema>\n\n// ── Mapping rules ─────────────────────────────────────────────────────────\n\nconst SUPPORTED_LANGUAGES = [\n \"en\", \"fr\", \"es\", \"de\", \"it\", \"pt\", \"ja\", \"ko\", \"zh\",\n \"ar\", \"ru\", \"tr\", \"nl\", \"pl\", \"sv\", \"da\", \"no\", \"fi\",\n \"hi\", \"th\", \"vi\", \"id\", \"ms\", \"tl\", \"ro\", \"hu\",\n] as const\n\nconst LANGUAGE_PREFIX_MAP: Record<string, string> = {\n French: \"fr\",\n English: \"en\",\n Spanish: \"es\",\n German: \"de\",\n Japanese: \"ja\",\n Korean: \"ko\",\n \"Chinese (Mandarin)\": \"zh\",\n Portuguese: \"pt\",\n Italian: \"it\",\n Arabic: \"ar\",\n Russian: \"ru\",\n Turkish: \"tr\",\n Dutch: \"nl\",\n Polish: \"pl\",\n Swedish: \"sv\",\n Danish: \"da\",\n Norwegian: \"no\",\n Finnish: \"fi\",\n Hindi: \"hi\",\n Thai: \"th\",\n Vietnamese: \"vi\",\n Indonesian: \"id\",\n Malay: \"ms\",\n Tagalog: \"tl\",\n Romanian: \"ro\",\n Hungarian: \"hu\",\n}\n\nconst FEMALE_KEYWORDS = [\"female\", \"woman\", \"lady\", \"girl\", \"heroine\", \"sweet\"]\nconst MALE_KEYWORDS = [\"male\", \"man\", \"butler\", \"gentleman\", \"narrator\", \"executive\"]\n\nfunction extractLanguageFromVoiceId(voiceId: string): string {\n for (const [prefix, lang] of Object.entries(LANGUAGE_PREFIX_MAP)) {\n if (voiceId.startsWith(prefix)) return lang\n }\n return \"en\"\n}\n\nfunction inferGender(voiceId: string): \"female\" | \"male\" | \"neutral\" {\n const lower = voiceId.toLowerCase()\n if (FEMALE_KEYWORDS.some(k => lower.includes(k))) return \"female\"\n if (MALE_KEYWORDS.some(k => lower.includes(k))) return \"male\"\n return \"neutral\"\n}\n\nfunction inferAge(voiceId: string): \"child\" | \"young\" | \"adult\" | \"senior\" | undefined {\n const lower = voiceId.toLowerCase()\n if (lower.includes(\"child\")) return \"child\"\n if (lower.includes(\"girl\") || lower.includes(\"young\")) return \"young\"\n if (lower.includes(\"senior\")) return \"senior\"\n return \"adult\"\n}\n\nfunction slugify(voiceId: string): string {\n return voiceId\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n}\n\n/** Map one raw MiniMax system voice to a `CatalogVoice`. */\nexport function mapMinimaxVoice(raw: MinimaxSystemVoice): CatalogVoice {\n const age = inferAge(raw.voice_id)\n const voice: CatalogVoice = {\n catalogId: `minimax-${slugify(raw.voice_id)}`,\n providerVoiceId: raw.voice_id,\n provider: \"minimax\",\n label: raw.voice_name,\n description: raw.description[0] ?? raw.voice_name,\n gender: inferGender(raw.voice_id),\n primaryLanguage: extractLanguageFromVoiceId(raw.voice_id),\n supportedLanguages: SUPPORTED_LANGUAGES,\n quality: \"premium\",\n featured: true,\n }\n if (age !== undefined) voice.age = age\n return voice\n}\n\n/** Map a full `/v1/get_voice` snapshot to the baseline voice list. */\nexport function mapMinimaxVoices(\n snapshot: MinimaxVoicesSnapshot,\n): CatalogVoice[] {\n return snapshot.system_voice.map(mapMinimaxVoice)\n}\n"]}