beplus-mcp 0.14.0 → 0.16.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 (2) hide show
  1. package/dist/index.js +70 -7
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -486,8 +486,12 @@ var IMAGE_MODELS = [
486
486
  "google/nano-banana-2",
487
487
  "google/nano-banana-pro",
488
488
  "openai/gpt-image-2",
489
+ "bytedance/seedream-5.0-lite",
490
+ "bytedance/seedream-5.0-pro",
489
491
  "midjourney"
490
492
  ];
493
+ var SEEDREAM_LITE_SIZES = ["2K", "3K", "4K"];
494
+ var SEEDREAM_PRO_SIZES = ["1K", "2K"];
491
495
  var VIDEO_MODELS = [
492
496
  "bytedance/seedance-2.0",
493
497
  "bytedance/seedance-2.0-fast",
@@ -581,8 +585,13 @@ function registerGenerationTools(server, client, cfg) {
581
585
  title: "Gerar imagem",
582
586
  description: "Gera uma imagem a partir de um prompt usando o IA Lab da BePlus. R\xE1pido (~10-30s). Consome diamantes da conta vinculada. Apenas `prompt` \xE9 obrigat\xF3rio; passe `reference_images` (URLs p\xFAblicas OU caminhos de arquivo local \u2014 o MCP sobe pro R2 automaticamente) para image-to-image. Veja custos com estimate_cost / list_models." + TEAM_GATING_NOTE,
583
587
  inputSchema: {
584
- prompt: z.string().min(1).max(4e3).describe("Descri\xE7\xE3o da imagem desejada."),
585
- model: z.enum(IMAGE_MODELS).default(DEFAULTS.imageModel).describe("nano-banana-2 = barato/r\xE1pido; nano-banana-pro = melhor qualidade; gpt-image-2 = OpenAI."),
588
+ // Sem teto local: quem conhece o limite de cada provedor é o backend, e
589
+ // ele responde com quanto reduzir. Um `.max()` aqui rejeitava prompts
590
+ // que o modelo aceita (Seedream/nano-banana não têm limite publicado).
591
+ prompt: z.string().min(1).describe("Descri\xE7\xE3o da imagem desejada."),
592
+ model: z.enum(IMAGE_MODELS).default(DEFAULTS.imageModel).describe(
593
+ "nano-banana-2 = barato/r\xE1pido; nano-banana-pro = melhor qualidade; gpt-image-2 = OpenAI; seedream-5.0-lite = mais barato do cat\xE1logo, \xFAnico que chega a 4K, gera s\xE9ries e mant\xE9m o ESTILO da imagem de refer\xEAncia; seedream-5.0-pro = acabamento fotorrealista, s\xF3 at\xE9 2K \u2014 preserva o personagem da refer\xEAncia mas costuma reinterpretar o estilo (um vetor flat volta em 3D)."
594
+ ),
586
595
  aspect_ratio: z.enum(ASPECT_RATIOS).optional().describe("Propor\xE7\xE3o (nano-banana). Padr\xE3o 1:1."),
587
596
  resolution: z.enum(IMAGE_RESOLUTIONS).optional().describe("Resolu\xE7\xE3o (nano-banana): 1K/2K/4K. Padr\xE3o 1K."),
588
597
  reference_images: z.array(z.string().min(1)).max(16).optional().describe(
@@ -590,7 +599,12 @@ function registerGenerationTools(server, client, cfg) {
590
599
  ),
591
600
  google_search: z.boolean().optional().describe("nano-banana-2: aterra a imagem em busca web do Google (fatos atuais). Padr\xE3o false."),
592
601
  image_search: z.boolean().optional().describe("nano-banana-2: usa busca de imagens do Google como refer\xEAncia visual. Padr\xE3o false."),
593
- size: z.enum(["1024x1024", "1536x1024", "1024x1536", "auto"]).optional().describe("Tamanho (gpt-image-2)."),
602
+ size: z.enum(["1024x1024", "1536x1024", "1024x1536", "auto", "1K", "2K", "3K", "4K"]).optional().describe(
603
+ "Tamanho. gpt-image-2: 1024x1024/1536x1024/1024x1536/auto. Seedream Lite: 2K/3K/4K (padr\xE3o 2K). Seedream Pro: 1K/2K apenas \u2014 o Pro N\xC3O faz 3K/4K."
604
+ ),
605
+ batch_images: z.number().int().min(2).max(15).optional().describe(
606
+ "Seedream 5.0 LITE apenas: gera uma s\xE9rie de imagens relacionadas numa chamada (2-15). Cada imagem \xE9 cobrada. O Seedream Pro N\xC3O suporta \u2014 passar aqui devolve erro."
607
+ ),
594
608
  quality: z.enum(["low", "medium", "high", "auto"]).optional().describe("Qualidade (gpt-image-2)."),
595
609
  background: z.enum(["opaque", "transparent", "auto"]).optional().describe("Fundo (gpt-image-2). transparent s\xF3 com output_format png/webp. Padr\xE3o opaque."),
596
610
  moderation: z.enum(["low", "auto"]).optional().describe("Modera\xE7\xE3o (gpt-image-2). Padr\xE3o low."),
@@ -619,6 +633,33 @@ function registerGenerationTools(server, client, cfg) {
619
633
  try {
620
634
  const isGoogle = args.model.startsWith("google/");
621
635
  const isMidjourney = args.model === "midjourney";
636
+ const isSeedreamLite = args.model === "bytedance/seedream-5.0-lite";
637
+ const isSeedreamPro = args.model === "bytedance/seedream-5.0-pro";
638
+ const isSeedream = isSeedreamLite || isSeedreamPro;
639
+ if (isSeedream) {
640
+ const allowed = isSeedreamPro ? SEEDREAM_PRO_SIZES : SEEDREAM_LITE_SIZES;
641
+ if (args.size && !allowed.includes(args.size)) {
642
+ return errorResult(
643
+ `${args.model} aceita size ${allowed.join("/")} (voc\xEA pediu ${args.size}). ` + (isSeedreamPro ? "O Pro n\xE3o faz 3K/4K \u2014 use o seedream-5.0-lite para resolu\xE7\xF5es maiores." : "O Lite n\xE3o faz 1K \u2014 use o seedream-5.0-pro se quiser a resolu\xE7\xE3o menor.")
644
+ );
645
+ }
646
+ if (args.batch_images && isSeedreamPro) {
647
+ return errorResult(
648
+ "O seedream-5.0-pro n\xE3o suporta gera\xE7\xE3o em s\xE9rie (batch_images). Use bytedance/seedream-5.0-lite para gerar v\xE1rias imagens relacionadas de uma vez."
649
+ );
650
+ }
651
+ if (args.output_format === "webp") {
652
+ return errorResult(`${args.model} aceita apenas png ou jpeg (webp n\xE3o \xE9 suportado).`);
653
+ }
654
+ const maxRefs = isSeedreamPro ? 10 : 14;
655
+ if (args.reference_images && args.reference_images.length > maxRefs) {
656
+ return errorResult(
657
+ `${args.model} aceita no m\xE1ximo ${maxRefs} imagens de refer\xEAncia (voc\xEA passou ${args.reference_images.length}).`
658
+ );
659
+ }
660
+ } else if (args.batch_images) {
661
+ return errorResult("batch_images s\xF3 existe no bytedance/seedream-5.0-lite.");
662
+ }
622
663
  const reference_images = await resolveRefs(cfg, args.reference_images);
623
664
  let style_reference;
624
665
  if (isMidjourney && args.style_reference) {
@@ -632,7 +673,12 @@ function registerGenerationTools(server, client, cfg) {
632
673
  reference_images,
633
674
  google_search: args.google_search,
634
675
  image_search: args.image_search,
635
- size: args.size,
676
+ size: args.size ?? (isSeedream ? "2K" : void 0),
677
+ // Série do Seedream Lite: o backend lê o par sequential_image_generation
678
+ // + max_images (nomes da API da BytePlus). `batch_images` é só o nome
679
+ // amigável exposto aqui.
680
+ sequential_image_generation: isSeedreamLite && args.batch_images ? "auto" : void 0,
681
+ max_images: isSeedreamLite && args.batch_images ? args.batch_images : void 0,
636
682
  quality: isMidjourney ? args.mj_quality : args.quality,
637
683
  background: args.background,
638
684
  moderation: args.moderation,
@@ -759,7 +805,9 @@ ${BUDGET_BLOCKED_GUIDANCE}`);
759
805
  title: "Gerar v\xEDdeo",
760
806
  description: "Gera um v\xEDdeo curto usando o IA Lab da BePlus. LENTO (geralmente 1-5+ min). Aguarda at\xE9 ~2 min; se n\xE3o terminar, retorna o generation_id e o status \u2014 ent\xE3o use check_generation. Consome diamantes (mais caro para dura\xE7\xF5es/resolu\xE7\xF5es maiores). Suporta image-to-video (`first_frame_image`), \xFAltimo frame (`last_frame_image`), refer\xEAncias de imagem/v\xEDdeo/\xE1udio, prompt negativo, \xE1udio gerado e mais \u2014 os campos aceitos variam por modelo (consulte list_models). `kling-v2.6-motion-control` usa `first_frame_image` + `motion_video`. Imagens com rosto de pessoa REAL s\xE3o bloqueadas pela modera\xE7\xE3o do provedor (use ilustra\xE7\xF5es/personagens)." + TEAM_GATING_NOTE,
761
807
  inputSchema: {
762
- prompt: z.string().min(1).max(4e3).describe("Descri\xE7\xE3o do v\xEDdeo desejado."),
808
+ // Sem teto local — ver nota em generate_image. O Seedance não publica
809
+ // limite; o Kling publica 2500 e o backend recusa dizendo quanto cortar.
810
+ prompt: z.string().min(1).describe("Descri\xE7\xE3o do v\xEDdeo desejado."),
763
811
  model: z.enum(VIDEO_MODELS).default(DEFAULTS.videoModel).describe("seedance-2.0-fast = barato/r\xE1pido; seedance-2.0 = melhor; kling-v3-video = alternativa."),
764
812
  aspect_ratio: z.enum(ASPECT_RATIOS).optional().describe("Propor\xE7\xE3o. Padr\xE3o 16:9."),
765
813
  resolution: z.enum(VIDEO_RESOLUTIONS).optional().describe("480p/720p/1080p/4K (1080p/4K S\xD3 no seedance-2.0 standard; fast e mini aceitam apenas 480p/720p). Padr\xE3o 720p."),
@@ -952,14 +1000,29 @@ ${list}${flagsLine(status)}` }, ...blocks] };
952
1000
  const model = g?.model ?? p?.model ?? "(modelo desconhecido)";
953
1001
  const prompt = g?.prompt ?? p?.prompt ?? "(sem prompt)";
954
1002
  const configs = g?.input_params ?? p?.configs ?? {};
955
- const inputs = p?.input_image_urls ?? [];
1003
+ const meta = g?.metadata ?? {};
1004
+ const asUrls = (v) => Array.isArray(v) ? v.filter((x) => typeof x === "string" && !!x) : [];
1005
+ const asUrl = (v) => typeof v === "string" && v ? v : void 0;
1006
+ const pick = (fromDb, fromTag) => {
1007
+ const db = asUrls(fromDb);
1008
+ return db.length > 0 ? db : asUrls(fromTag);
1009
+ };
1010
+ const images = pick(meta.input_image_urls, p?.input_image_urls);
1011
+ const refVideos = pick(meta.reference_video_urls, p?.reference_video_urls);
1012
+ const refAudios = pick(meta.reference_audio_urls, p?.reference_audio_urls);
1013
+ const motionVideo = asUrl(meta.motion_video_url) ?? asUrl(p?.motion_video_url);
1014
+ const endImage = asUrl(meta.end_image_url) ?? asUrl(p?.end_image_url);
956
1015
  const lines = [
957
1016
  `\u{1F9EC} Dados da gera\xE7\xE3o (${r.source === "db" ? "registro da conta" : "metadata do arquivo"}):`,
958
1017
  `\u2022 Modelo: ${model}`,
959
1018
  `\u2022 Prompt: ${prompt}`,
960
1019
  `\u2022 Configs: ${JSON.stringify(configs)}`
961
1020
  ];
962
- if (inputs.length) lines.push(`\u2022 Inputs: ${inputs.join(", ")}`);
1021
+ if (images.length) lines.push(`\u2022 Imagens de entrada: ${images.join(", ")}`);
1022
+ if (endImage) lines.push(`\u2022 Frame final: ${endImage}`);
1023
+ if (refVideos.length) lines.push(`\u2022 V\xEDdeos de refer\xEAncia: ${refVideos.join(", ")}`);
1024
+ if (refAudios.length) lines.push(`\u2022 \xC1udios de refer\xEAncia: ${refAudios.join(", ")}`);
1025
+ if (motionVideo) lines.push(`\u2022 V\xEDdeo de motion control: ${motionVideo}`);
963
1026
  if (p?.generation_id) lines.push(`\u2022 generation_id: ${p.generation_id}`);
964
1027
  return textResult(lines.join("\n"));
965
1028
  } catch (e) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "beplus-mcp",
3
- "version": "0.14.0",
3
+ "version": "0.16.0",
4
4
  "description": "Conector MCP da equipe BePlus — gere imagens/vídeos/áudio e consulte calls, projetos e clientes pela sua conta BePlus (diamantes, limites e histórico aplicados pela plataforma).",
5
5
  "type": "module",
6
6
  "bin": {