beplus-mcp 0.33.0 → 0.34.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.
- package/README.md +3 -0
- package/dist/index.js +103 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -86,6 +86,9 @@ Reinicie o cliente. Rode a tool **`whoami`** para confirmar o vínculo.
|
|
|
86
86
|
| `upscale` | Melhora a resolução de uma imagem ou vídeo que já existe (Topaz). Detecta o tipo pelo arquivo. Imagem até 4x (~20s, a partir de 6💎); vídeo até 30s e saída até 1080p, custa por bloco de 10s e **descarta o áudio**. Mede o arquivo sozinho para o preço sair certo. ⚠️ Vídeo é restrito à equipe. |
|
|
87
87
|
| `generate_audio` | Sintetiza fala (Gemini TTS, multi-locutor). Padrão `gemini-3.8-flash-lite-tts`; os modelos 3.8 aceitam vozes da biblioteca, tags vocais (`<laugh>`, `<sigh>`...) e `style` por locutor; os legados só as 30 vozes clássicas. Síncrono. |
|
|
88
88
|
| `list_tts_voices` | Lista as vozes da biblioteca do TTS 3.8 (filtros: idioma, gênero, tom, contexto, busca) com o id para usar em `voice`. Somente leitura. |
|
|
89
|
+
| `list_custom_voices` | Lista suas vozes próprias do TTS 3.8 (máx. 3) com o `voice_xxx` para usar em `voice`. Clonar a própria voz só no app web. Somente leitura. |
|
|
90
|
+
| `design_voice` | Cria uma voz própria a partir de uma descrição. Gasta 💎 e leva ~30 s. |
|
|
91
|
+
| `delete_custom_voice` | Apaga uma voz própria (destrutivo, sem volta). |
|
|
89
92
|
| `generate_music` | Gera música completa (Suno v5.5 / v4.5) — modo descrição ou letra própria, tags, instrumental, vocal_gender, controles criativos. Async. |
|
|
90
93
|
| `check_generation` | Status de uma geração async por id. |
|
|
91
94
|
| `cancel_generation` | Cancela uma geração em fila/processamento (estorna diamantes). |
|
package/dist/index.js
CHANGED
|
@@ -21624,6 +21624,16 @@ var BeplusClient = class {
|
|
|
21624
21624
|
ttsVoices(query) {
|
|
21625
21625
|
return this.request("GET", "/tts/voices", { query, timeoutMs: 2e4 });
|
|
21626
21626
|
}
|
|
21627
|
+
customVoices() {
|
|
21628
|
+
return this.request("GET", "/tts/custom-voices", { timeoutMs: 2e4 });
|
|
21629
|
+
}
|
|
21630
|
+
// Leva ~30 s no Google; 90 s cobre a espera com folga.
|
|
21631
|
+
designVoice(body2) {
|
|
21632
|
+
return this.request("POST", "/tts/custom-voices/design", { body: body2, timeoutMs: 9e4 });
|
|
21633
|
+
}
|
|
21634
|
+
deleteCustomVoice(id) {
|
|
21635
|
+
return this.request("DELETE", `/tts/custom-voices/${encodeURIComponent(id)}`, { timeoutMs: 3e4 });
|
|
21636
|
+
}
|
|
21627
21637
|
models() {
|
|
21628
21638
|
return this.request("GET", "/models");
|
|
21629
21639
|
}
|
|
@@ -22188,6 +22198,7 @@ var TTS_MODELS = [
|
|
|
22188
22198
|
"gemini-2.5-pro-preview-tts"
|
|
22189
22199
|
];
|
|
22190
22200
|
var TTS_MODELS_38 = ["gemini-3.8-flash-lite-tts", "gemini-3.8-flash-tts"];
|
|
22201
|
+
var CUSTOM_VOICE_ID = /^voice_[a-z0-9]{6,64}$/;
|
|
22191
22202
|
var LIBRARY_VOICE_ID = /^[a-z]{2,3}-[a-z0-9]{2,4}-[a-z0-9-]{1,60}$/;
|
|
22192
22203
|
var VOICES = [
|
|
22193
22204
|
"Zephyr",
|
|
@@ -23471,9 +23482,16 @@ ${BUDGET_BLOCKED_GUIDANCE}`);
|
|
|
23471
23482
|
|
|
23472
23483
|
// src/tools/audio.ts
|
|
23473
23484
|
var VOICE_HELP = "Uma das 30 vozes cl\xE1ssicas (Kore, Puck, Charon...) OU o id de uma voz da biblioteca (ex.: pt-br-advisor-10, s\xF3 nos modelos 3.8; descubra ids com list_tts_voices).";
|
|
23485
|
+
var VOICE_HELP_TOP = `${VOICE_HELP} Ou o id de uma voz pr\xF3pria (voice_xxx, de list_custom_voices; s\xF3 3.8 e sem multi_speaker).`;
|
|
23474
23486
|
var voiceSchema = external_exports.string().refine((v) => VOICES.includes(v) || LIBRARY_VOICE_ID.test(v), {
|
|
23475
23487
|
message: "Voz inv\xE1lida: use uma das 30 vozes cl\xE1ssicas (ex.: Kore) ou um id da biblioteca (ex.: pt-br-advisor-10)."
|
|
23476
23488
|
});
|
|
23489
|
+
var topVoiceSchema = external_exports.string().refine((v) => VOICES.includes(v) || LIBRARY_VOICE_ID.test(v) || CUSTOM_VOICE_ID.test(v), {
|
|
23490
|
+
message: "Voz inv\xE1lida: use uma das 30 vozes cl\xE1ssicas (ex.: Kore), um id da biblioteca (ex.: pt-br-advisor-10) ou uma voz pr\xF3pria (voice_xxx)."
|
|
23491
|
+
});
|
|
23492
|
+
function isCustomVoice(v) {
|
|
23493
|
+
return CUSTOM_VOICE_ID.test(v);
|
|
23494
|
+
}
|
|
23477
23495
|
function isLibraryVoice(v) {
|
|
23478
23496
|
return !VOICES.includes(v) && LIBRARY_VOICE_ID.test(v);
|
|
23479
23497
|
}
|
|
@@ -23487,10 +23505,10 @@ function registerAudioTools(server, client, cfg) {
|
|
|
23487
23505
|
"generate_audio",
|
|
23488
23506
|
{
|
|
23489
23507
|
title: "Gerar \xE1udio (TTS)",
|
|
23490
|
-
description: 'Sintetiza fala a partir de texto (s\xEDncrono \u2014 retorna a URL na hora) usando o IA Lab da BePlus. Modelos Gemini 3.8 (`gemini-3.8-flash-lite-tts`, padr\xE3o, r\xE1pido e barato; `gemini-3.8-flash-tts`, qualidade de est\xFAdio, melhor para di\xE1logo e narra\xE7\xE3o longa) aceitam: vozes da biblioteca (milhares, por idioma; liste com `list_tts_voices` e passe o id em `voice`), tags vocais no texto como <laugh> <chuckle> <sigh> <breath> <gasp> <cough> <sneeze> <throat-clearing> <yawn> <groan> <scream> <whimper> <argh> <short pause> <long pause> (viram som de verdade), e estilo por locutor (`style` em cada speaker). No 3.8, `style_instruction` \xE9 dire\xE7\xE3o e N\xC3O \xE9 lida em voz alta. Os modelos legados (`gemini-3.1-flash-tts-preview`, `gemini-2.5-pro-preview-tts`) s\xF3 aceitam as 30 vozes cl\xE1ssicas (Kore, Puck, Charon...) e n\xE3o t\xEAm voz da biblioteca. Opcional `style_instruction` (ex.: "fale animado e pausado") e di\xE1logo com 2 locutores via `multi_speaker`. Consome diamantes por segundo de \xE1udio.' + TEAM_GATING_NOTE,
|
|
23508
|
+
description: 'Sintetiza fala a partir de texto (s\xEDncrono \u2014 retorna a URL na hora) usando o IA Lab da BePlus. Modelos Gemini 3.8 (`gemini-3.8-flash-lite-tts`, padr\xE3o, r\xE1pido e barato; `gemini-3.8-flash-tts`, qualidade de est\xFAdio, melhor para di\xE1logo e narra\xE7\xE3o longa) aceitam: vozes da biblioteca (milhares, por idioma; liste com `list_tts_voices` e passe o id em `voice`), tags vocais no texto como <laugh> <chuckle> <sigh> <breath> <gasp> <cough> <sneeze> <throat-clearing> <yawn> <groan> <scream> <whimper> <argh> <short pause> <long pause> (viram som de verdade), e estilo por locutor (`style` em cada speaker). No 3.8, `style_instruction` \xE9 dire\xE7\xE3o e N\xC3O \xE9 lida em voz alta. Os modelos legados (`gemini-3.1-flash-tts-preview`, `gemini-2.5-pro-preview-tts`) s\xF3 aceitam as 30 vozes cl\xE1ssicas (Kore, Puck, Charon...) e n\xE3o t\xEAm voz da biblioteca. Vozes pr\xF3prias (voice_xxx; liste com `list_custom_voices`, crie com `design_voice`) s\xF3 no 3.8 e sem `multi_speaker`. No 3.8, dire\xE7\xE3o por linha: `(sussurrando) texto` no in\xEDcio da linha vale at\xE9 a pr\xF3xima dire\xE7\xE3o; no di\xE1logo, `Ana (rindo): fala`; rea\xE7\xF5es `|hmm|` `|aham|` no meio da fala (s\xF3 di\xE1logo). Opcional `style_instruction` (ex.: "fale animado e pausado") e di\xE1logo com 2 locutores via `multi_speaker`. Consome diamantes por segundo de \xE1udio.' + TEAM_GATING_NOTE,
|
|
23491
23509
|
inputSchema: {
|
|
23492
23510
|
text: external_exports.string().min(1).max(1e4).describe("Texto a ser falado."),
|
|
23493
|
-
voice:
|
|
23511
|
+
voice: topVoiceSchema.default(DEFAULTS.voice).describe(VOICE_HELP_TOP),
|
|
23494
23512
|
model: external_exports.enum(TTS_MODELS).default(DEFAULTS.ttsModel).describe("Modelo TTS."),
|
|
23495
23513
|
style_instruction: external_exports.string().max(2e3).optional().describe("Instru\xE7\xE3o de estilo/tom aplicada \xE0 fala."),
|
|
23496
23514
|
multi_speaker: external_exports.object({
|
|
@@ -23504,6 +23522,14 @@ function registerAudioTools(server, client, cfg) {
|
|
|
23504
23522
|
try {
|
|
23505
23523
|
const ms = args.multi_speaker;
|
|
23506
23524
|
const voices = [args.voice, ms?.speaker1.voice, ms?.speaker2.voice].filter((v) => !!v);
|
|
23525
|
+
if (isCustomVoice(args.voice)) {
|
|
23526
|
+
if (!TTS_MODELS_38.includes(args.model)) {
|
|
23527
|
+
return errorResult("Vozes pr\xF3prias s\xF3 funcionam nos modelos Gemini 3.8 (gemini-3.8-flash-lite-tts, gemini-3.8-flash-tts).");
|
|
23528
|
+
}
|
|
23529
|
+
if (ms) {
|
|
23530
|
+
return errorResult("Vozes pr\xF3prias n\xE3o funcionam no modo di\xE1logo (multi_speaker). Use uma voz da biblioteca ou cl\xE1ssica.");
|
|
23531
|
+
}
|
|
23532
|
+
}
|
|
23507
23533
|
if (!TTS_MODELS_38.includes(args.model)) {
|
|
23508
23534
|
if (voices.some(isLibraryVoice)) {
|
|
23509
23535
|
return errorResult(
|
|
@@ -23586,6 +23612,80 @@ Contextos: ${res.contexts.join(", ")}.`
|
|
|
23586
23612
|
}
|
|
23587
23613
|
}
|
|
23588
23614
|
);
|
|
23615
|
+
server.registerTool(
|
|
23616
|
+
"list_custom_voices",
|
|
23617
|
+
{
|
|
23618
|
+
title: "Listar vozes pr\xF3prias",
|
|
23619
|
+
description: "Lista as suas vozes pr\xF3prias do TTS 3.8 (m\xE1x. 3, guardadas por 1 ano). Passe o campo `voice` (voice_xxx) em `voice` do generate_audio com um modelo 3.8, sem multi_speaker. Crie com `design_voice`. Clonar a pr\xF3pria voz exige grava\xE7\xE3o de consentimento ao vivo e s\xF3 existe no app web. Somente leitura, sem custo.",
|
|
23620
|
+
inputSchema: {}
|
|
23621
|
+
},
|
|
23622
|
+
async () => {
|
|
23623
|
+
try {
|
|
23624
|
+
const res = await client.customVoices();
|
|
23625
|
+
const head = `Vozes pr\xF3prias: ${res.used} de ${res.limit}. Criar uma voz custa ${res.design_cost} \u{1F48E}.`;
|
|
23626
|
+
if (!res.voices.length) return textResult(`${head}
|
|
23627
|
+
Nenhuma ainda. Use design_voice para criar.`);
|
|
23628
|
+
const lines = res.voices.map(
|
|
23629
|
+
(v) => `${v.id} | ${v.voice} | ${v.name} | ${v.kind} | expira ${v.expires_at.slice(0, 10)}`
|
|
23630
|
+
);
|
|
23631
|
+
return textResult(
|
|
23632
|
+
`${head} (id | voice | nome | tipo | validade):
|
|
23633
|
+
${lines.join("\n")}
|
|
23634
|
+
|
|
23635
|
+
Use o valor de "voice" (voice_xxx) no generate_audio. Para apagar, use o "id" em delete_custom_voice.`
|
|
23636
|
+
);
|
|
23637
|
+
} catch (e) {
|
|
23638
|
+
return errorResult(apiErrorToUserMessage(e));
|
|
23639
|
+
}
|
|
23640
|
+
}
|
|
23641
|
+
);
|
|
23642
|
+
server.registerTool(
|
|
23643
|
+
"design_voice",
|
|
23644
|
+
{
|
|
23645
|
+
title: "Criar voz pr\xF3pria por descri\xE7\xE3o",
|
|
23646
|
+
description: "Cria uma voz pr\xF3pria a partir de uma descri\xE7\xE3o em texto (idade, timbre, sotaque, jeito de falar). GASTA diamantes (o custo aparece em list_custom_voices; estorna se falhar) e leva cerca de 30 s. M\xE1x. 3 vozes por pessoa; a voz fica guardada por 1 ano. Depois use o `voice` retornado no generate_audio (modelos 3.8, sem multi_speaker).",
|
|
23647
|
+
inputSchema: {
|
|
23648
|
+
name: external_exports.string().min(1).max(40).describe("Nome da voz (1 a 40 caracteres)."),
|
|
23649
|
+
description: external_exports.string().min(10).max(500).describe("Como \xE9 a voz: idade, g\xEAnero, timbre, sotaque, jeito de falar (10 a 500 caracteres)."),
|
|
23650
|
+
language: external_exports.string().max(12).optional().describe("Idioma BCP-47. Padr\xE3o pt-BR."),
|
|
23651
|
+
gender: external_exports.enum(["female", "male", "neutral"]).optional()
|
|
23652
|
+
}
|
|
23653
|
+
},
|
|
23654
|
+
async (args) => {
|
|
23655
|
+
try {
|
|
23656
|
+
const res = await client.designVoice(compact(args));
|
|
23657
|
+
const v = res.voice;
|
|
23658
|
+
return textResult(
|
|
23659
|
+
`\u2705 Voz criada: ${v.name} (${v.kind}).
|
|
23660
|
+
voice: ${v.voice}
|
|
23661
|
+
id: ${v.id}
|
|
23662
|
+
` + (v.sample_url ? `Amostra: ${v.sample_url}
|
|
23663
|
+
` : "") + `Custo: ${res.diamond_cost} \u{1F48E} \xB7 Saldo: ${res.new_balance} \u{1F48E} \xB7 Expira em ${v.expires_at.slice(0, 10)}.
|
|
23664
|
+
Use o valor de "voice" no generate_audio com um modelo 3.8 (sem multi_speaker).`
|
|
23665
|
+
);
|
|
23666
|
+
} catch (e) {
|
|
23667
|
+
return errorResult(apiErrorToUserMessage(e));
|
|
23668
|
+
}
|
|
23669
|
+
}
|
|
23670
|
+
);
|
|
23671
|
+
server.registerTool(
|
|
23672
|
+
"delete_custom_voice",
|
|
23673
|
+
{
|
|
23674
|
+
title: "Apagar voz pr\xF3pria",
|
|
23675
|
+
description: "DESTRUTIVO e sem volta: apaga uma voz pr\xF3pria (aqui e no Google) e libera 1 vaga das 3. \xC1udios j\xE1 gerados com ela continuam tocando, mas n\xE3o d\xE1 para gerar novos com essa voz. N\xE3o devolve diamantes. Passe o `id` (uuid) de list_custom_voices, n\xE3o o voice_xxx. Confirme com o usu\xE1rio antes.",
|
|
23676
|
+
inputSchema: {
|
|
23677
|
+
id: external_exports.string().uuid().describe('Campo "id" (uuid) da voz em list_custom_voices.')
|
|
23678
|
+
}
|
|
23679
|
+
},
|
|
23680
|
+
async (args) => {
|
|
23681
|
+
try {
|
|
23682
|
+
await client.deleteCustomVoice(args.id);
|
|
23683
|
+
return textResult(`\u2705 Voz ${args.id} apagada. Uma vaga foi liberada.`);
|
|
23684
|
+
} catch (e) {
|
|
23685
|
+
return errorResult(apiErrorToUserMessage(e));
|
|
23686
|
+
}
|
|
23687
|
+
}
|
|
23688
|
+
);
|
|
23589
23689
|
}
|
|
23590
23690
|
|
|
23591
23691
|
// src/tools/music.ts
|
|
@@ -26937,7 +27037,7 @@ N\xF3s: ${Object.entries(ids).map(([k, v]) => `${k}=${v}`).join(" \xB7 ")}` : ""
|
|
|
26937
27037
|
import { createRequire } from "module";
|
|
26938
27038
|
var require2 = createRequire(import.meta.url);
|
|
26939
27039
|
function readVersion() {
|
|
26940
|
-
if ("0.
|
|
27040
|
+
if ("0.34.0") return "0.34.0";
|
|
26941
27041
|
try {
|
|
26942
27042
|
const pkg = require2("../package.json");
|
|
26943
27043
|
return pkg.version ?? "0.0.0-unknown";
|