sapiens-mcp 1.62.8 → 1.63.1

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/dist/skills.js CHANGED
@@ -206,6 +206,8 @@ Dar som a um vídeo SEU já pronto é \`sapiens_video action=sonorize\`, não é
206
206
 
207
207
  \`action=models\` (sem custo, sem login) lista os modelos ativos com durações, resoluções, disponibilidade e a FAIXA de preço: o padrão, o piso e o teto, cada um dizendo em qual configuração acontece. Motor de preço-por-segundo não tem "um preço": o mesmo modelo custa 3x mais em 1080p e 30s do que em 720p e 5s.
208
208
 
209
+ Dois campos do payload evitam garimpo na lista. bestFor diz pra que o motor serve (audio = som nativo, fala = lip-sync, referencia = aceita referência de quem aparece, movimento = precisa de vídeo-guia, longo = passa dos 15s): filtre por aqui antes de comparar preço. family + variant dizem quem é o mesmo motor em geração ou tier diferente: as seis linhas de Seedance (1.0 Fast, 1.5 Pro, 2.0, 2.0 Fast, 2.0 Mini, 2.5) são UM motor, não seis. Escolha a família pelo trabalho, depois a variante pela conta.
210
+
209
211
  \`action=price\` (sem custo, sem login) cota a configuração EXATA antes de rodar: passe \`model\`, \`durationSec\`, \`resolution\` e \`audio\` e receba o número que vai ser debitado, calculado pela mesma função que cobra. Ela também avisa quando o motor não aceita o que você pediu e vai cobrar outra coisa (\`clamped\`), o que acontece quando a duração não existe no enum ou a resolução cai num tier diferente.
210
212
 
211
213
  Use \`price\` sempre que a pessoa perguntar quanto custa, e ANTES de qualquer \`create\` que não seja o default. Dizer o piso como se fosse o preço final é o jeito mais rápido de queimar a confiança dela: a cobrança vem maior e a culpa é sua.
@@ -230,6 +232,8 @@ Duração é o que pesa aqui, não o modelo: um take de 30s em 720p passa de 40
230
232
 
231
233
  ## Os outros modelos
232
234
 
235
+ - \`sapiens-video-h3\`: MiniMax H3, o mais barato por pixel da casa, com som nativo, texto ou imagem. A duração depende da resolução: \`2k\` vai até 10s, \`768p\` vai até 15s (o motor de 2K é lento demais pra 15s e o take se perderia no meio). Aceita até 9 imagens e 3 vídeos de referência, e é o caminho de take LONGO com personagem travada. Referência e frame inicial não vão juntos: escolha um. Sem \`resolution\` cai no 2k, que custa 40% mais por segundo.
236
+ - \`sapiens-video-h3-spicy\` e \`sapiens-video-seedance-spicy\`: os mesmos motores SEM freio de conteúdo. Os dois partem de uma IMAGEM sua (não fazem texto puro), e é isso que trava a identidade: quem aparece já veio pronto na imagem, o motor só dá movimento. O H3 Spicy é o mais barato e o mais rápido da casa (250 Sinapses o segundo em 480p, 3 a 15s); o Seedance Spicy tem o peso do 2.0 e para em 10s nos tiers acima de 480p.
233
237
  - \`sapiens-video-kling\`: Kling 3.0 Pro, anima imagem, 3 a 15s, som opcional.
234
238
  - \`sapiens-video-wan\`: WAN 2.5, imagem que fala ou canta, com lip-sync, 5 ou 10s.
235
239
  - \`sapiens-video-wan-3\`: WAN 3.0, texto ou imagem, som nativo, frame final e 1080p, 5 a 10s.
@@ -256,7 +260,7 @@ O \`brief\` aceita \`subject\`, \`persona\`, \`hook\` (\`line\` e \`emotion\`),
256
260
 
257
261
  ## Fluxo storyboard (o que dá o melhor resultado)
258
262
 
259
- Até 4 imagens de REFERÊNCIA via \`referenceImageIds\` / \`referenceImageUrls\` / \`referenceImagePaths\` guiam estilo, personagem e composição SEM virar o primeiro frame.
263
+ Imagens de REFERÊNCIA via \`referenceImageIds\` / \`referenceImageUrls\` / \`referenceImagePaths\` guiam estilo, personagem e composição SEM virar o primeiro frame. O teto é do motor: 4 no Seedance 2.0, 9 no H3.
260
264
 
261
265
  1. Gere a folha de key poses com \`sapiens_image templateSlug='storyboard-sapiens-v1'\`.
262
266
  2. Passe folha e personagem como refs num text-to-video.
@@ -304,6 +308,15 @@ Proibidos no prompt: "tarot card illustration", "intimate scale", "card-style po
304
308
 
305
309
  \`action=generate\` com \`prompt\`, \`model\` e \`aspectRatio\`. \`action=models\` (sem custo, sem login) lista o catálogo vivo com preço atual, resolução máxima e se o modelo aceita referência.
306
310
 
311
+ ## Escolher motor em dois passos
312
+
313
+ A lista de action=models é longa e ordenada por PREÇO, que não é a pergunta de quem vai gerar. Três campos do payload resolvem isso:
314
+
315
+ - bestFor: pra que o motor serve, num vocabulário fechado (foto, anime, texto pra palavra legível na arte, personagem pra segurar a mesma pessoa, adulto). FILTRE por aqui antes de comparar preço.
316
+ - family + variant: motores com a MESMA family são o mesmo motor em versão diferente (Krea 2 tem Realism, Livre e Base; Gemini tem 3 Pro e 3.1 Flash). O retorno traz um índice families já montado.
317
+
318
+ O caminho: filtre por bestFor, escolha a família, e só então compare as variantes dela entre si. Trocar de família porque uma variante é mais barata costuma trocar o resultado inteiro; trocar de variante dentro da família troca preço e acabamento, não o motor.
319
+
307
320
  ## Multi-referência
308
321
 
309
322
  Combine até 4 imagens como referência numa geração só:
@@ -136,6 +136,17 @@ export async function image(args) {
136
136
  .map((m) => ({
137
137
  id: m.id,
138
138
  label: m.label,
139
+ // Família + variante: várias entradas da lista são o MESMO motor em
140
+ // tempero ou geração diferente (Krea 2 Realism/Livre/Base, Gemini 3
141
+ // Pro/3.1 Flash). Sem estes dois campos o cliente vê ids soltos e trata
142
+ // como motores sem relação, que foi o mesmo problema que a prateleira
143
+ // do browser tinha antes de agrupar. Ausência = motor sozinho.
144
+ family: m.family ?? null,
145
+ variant: m.variantLabel ?? null,
146
+ // Pra que este motor serve, no vocabulário fechado do catálogo: foto,
147
+ // anime, texto, personagem, adulto. É o que responde "qual motor pra
148
+ // isso" sem o cliente ter que interpretar vinte taglines.
149
+ bestFor: m.bestFor ?? [],
139
150
  priceSinapses: m.effectivePriceSinapses,
140
151
  maxResolution: m.maxResolution ?? "4K",
141
152
  resolutionAdders: m.resolutionAdders,
@@ -143,12 +154,26 @@ export async function image(args) {
143
154
  degen: /^(civitai-|wavespeed-|fal-)/.test(String(m.id)),
144
155
  note: m.description ?? null,
145
156
  }));
157
+ // Índice por família, pro cliente escolher em dois passos como a tela faz:
158
+ // primeiro o motor, depois a versão. Só entra família com 2+ variantes.
159
+ const families = {};
160
+ for (const m of models) {
161
+ if (!m.family)
162
+ continue;
163
+ (families[m.family] ??= { variants: [] }).variants.push(m.id);
164
+ }
165
+ for (const key of Object.keys(families)) {
166
+ if (families[key].variants.length < 2)
167
+ delete families[key];
168
+ }
146
169
  return {
147
170
  count: models.length,
148
171
  default: "nano-banana-2",
149
172
  models,
173
+ families,
150
174
  note: "priceSinapses é o preço COBRADO em 1K (já com override admin). Acima de 1K some o adder de resolutionAdders[size], que vem clampado ao teto do motor: em modelo que para em 2K, a chave '4K' repete o valor de 2K porque é isso que a cobrança aplica quando você pede 4K nele. " +
151
- "Preço final = priceSinapses + resolutionAdders[size]. degen=+18 (gate na galeria).",
175
+ "Preço final = priceSinapses + resolutionAdders[size]. degen=+18 (gate na galeria). " +
176
+ "Modelos com a MESMA family são o mesmo motor em versão diferente (o variant diz qual): compare preço e nota entre eles antes de trocar de família.",
152
177
  };
153
178
  }
154
179
  const sessionToken = getSessionToken();
@@ -39,12 +39,13 @@ export const referenceSchema = z.object({
39
39
  // set/2026). Fica no enum, depreciado e sem aparecer nas descrições, porque
40
40
  // client publicado continua mandando ele e a regra de retrocompat da casa
41
41
  // proíbe quebrar quem está atrasado. O servidor aceita os dois.
42
- .enum(["history", "favorites", "videos", "stock_video", "acervo", "characters", "depth_map", "deepshadow"])
42
+ .enum(["history", "favorites", "videos", "stock_video", "acervo", "characters", "depth_map", "pose_map", "deepshadow"])
43
43
  .optional()
44
44
  .describe("Só 'browse': qual banco navegar: 'history' (suas imagens recentes), 'favorites' (as que você curtiu), " +
45
45
  "'videos' (seus vídeos), 'stock_video' (Banco de Vídeo da casa: clipes/B-roll prontos, aceita term/orientation/loopOnly), " +
46
46
  "'acervo' (stock + comunidade públicos de IMAGEM), 'characters' (personagens), " +
47
- "'depth_map' (guias de movimento: os SEUS com shadowSource='mine', ou o banco curado da casa por default)."),
47
+ "'depth_map' (guias de movimento: os SEUS com shadowSource='mine', ou o banco curado da casa por default), " +
48
+ "'pose_map' (seu banco privado de POSE: mapa de profundidade de corpo num quadro parado, aceita term/orientation)."),
48
49
  handle: z
49
50
  .string()
50
51
  .optional()
@@ -82,7 +83,7 @@ export const referenceSchema = z.object({
82
83
  orientation: z
83
84
  .enum(["vertical", "horizontal", "square"])
84
85
  .optional()
85
- .describe("Só bucket 'stock_video': filtra formato (vertical 9:16, horizontal 16:9, square 1:1)."),
86
+ .describe("Buckets 'stock_video' e 'pose_map': filtra formato (vertical 9:16, horizontal 16:9, square 1:1)."),
86
87
  loopOnly: z
87
88
  .boolean()
88
89
  .optional()
@@ -116,7 +117,7 @@ export async function reference(args) {
116
117
  if (args.action === "browse") {
117
118
  if (!args.bucket) {
118
119
  return {
119
- error: "browse exige `bucket` (history | favorites | videos | stock_video | acervo | characters | depth_map).",
120
+ error: "browse exige `bucket` (history | favorites | videos | stock_video | acervo | characters | depth_map | pose_map).",
120
121
  };
121
122
  }
122
123
  const res = await convexAction("mcpReferences:referenceBrowse", {
@@ -144,6 +145,10 @@ export async function reference(args) {
144
145
  note =
145
146
  "Guias de movimento (mapa de profundidade). Use a `url` em sapiens_video referenceVideoUrls: a coreografia e a câmera do clipe guiam o take. `thumbnailUrl` é só preview (a soma com esqueleto), nunca mande ela como driving. Teto de duração varia por motor.";
146
147
  }
148
+ else if (args.bucket === "pose_map") {
149
+ note =
150
+ "Poses do SEU banco privado (mapa de profundidade de corpo). Use a `url` em sapiens_image referenceImageUrls pra guiar a POSE da figura, do mesmo jeito que o depth_map guia o movimento no vídeo. `thumbnailUrl` é só preview da grade. É material privado seu: a peça gerada a partir dele é geração normal e publica normal, mas a pose em si não é acervo público da casa.";
151
+ }
147
152
  else if (args.bucket === "acervo" || args.bucket === "characters") {
148
153
  note =
149
154
  "São referências públicas: use a `url` (characters trazem mainImageUrl + imageUrls) em sapiens_image referenceImageUrls, ou em sapiens_video startImageUrl/endImageUrl. Não são suas, então NÃO entram em sourceImageIds.";
@@ -77,12 +77,25 @@ import { httpUrl } from "../schema.js";
77
77
  * Motor puro: SEM áudio, SEM referência, SEM frame final.
78
78
  * - sapiens-video-hailuo-pro Hailuo 2.3 Pro — o mesmo em 1080p, 5s fixo (duração não é param).
79
79
  * É o 1080p mais barato da casa depois do Seedance 1.0 Fast.
80
- * - sapiens-video-h3 MiniMax H3 — 2K (2560x1440) com ÁUDIO nativo, 5/6/8/10s (t2v/i2v),
81
- * frame final (role 'end'). O menor custo por pixel da prateleira.
82
- * Áudio vem sempre e já está no preço (não tem toggle). NÃO aceita
83
- * imagem de referência: no H3 isso é outro endpoint, ainda fora.
84
- * O provider faz até 15s; a casa para em 10 (o render de 5s leva
85
- * ~3min e o poll do backend morre em 8).
80
+ * - sapiens-video-h3 MiniMax H3 — ÁUDIO nativo, frame final (role 'end'), t2v/i2v. O
81
+ * menor custo por pixel da prateleira. Áudio vem sempre e já está
82
+ * no preço (não tem toggle). A DURAÇÃO DEPENDE DA RESOLUÇÃO: em
83
+ * '2k' (2560x1440) vai até 10s, em '768p' vai até 15s. Não é
84
+ * escolha de catálogo, é o poll do backend: 2K de 15s leva mais
85
+ * que os 8min e o kill não devolve Sinapse. Sem `resolution` cai
86
+ * no 2k, que custa 40% mais por segundo.
87
+ * ACEITA referência desde set/2026: até 9 imagens (role 'ref') e 3
88
+ * vídeos (role 'refvideo', somando 15s), que é o caminho de take
89
+ * longo com personagem travada. Referência e frame inicial são
90
+ * EXCLUSIVOS (endpoints diferentes no provider): mande um dos dois.
91
+ * - sapiens-video-h3-spicy MiniMax H3 Spicy — o H3 SEM freio de conteúdo, a partir de uma
92
+ * imagem sua (i2v puro: a identidade entra pela imagem, não pelo
93
+ * texto). 3 a 15s, 480p/768p/1080p, som nativo, frame final. É o
94
+ * segundo de vídeo mais barato da casa (250 Sinapses/s em 480p) e
95
+ * o render mais rápido (5s em 480p sai em meio minuto).
96
+ * - sapiens-video-seedance-spicy Seedance 2.0 Spicy — o Seedance 2.0 SEM freio, também i2v puro.
97
+ * Som nativo. 4 a 15s em 480p; em 720p e 1080p para em 10s até
98
+ * alguém medir o render nesses tiers.
86
99
  * - sapiens-video-wan WAN 2.5 — imagem que fala/canta (áudio+lip-sync nativo), 5/10s (i2v)
87
100
  * - sapiens-video-kling-motion Kling Motion — transfere o movimento de um vídeo pra uma imagem
88
101
  * (PRECISA de pessoa com tronco visível na imagem E no vídeo;
@@ -133,6 +146,8 @@ const VIDEO_MODELS = [
133
146
  "sapiens-video-hailuo",
134
147
  "sapiens-video-hailuo-pro",
135
148
  "sapiens-video-h3",
149
+ "sapiens-video-h3-spicy",
150
+ "sapiens-video-seedance-spicy",
136
151
  "sapiens-video-wan",
137
152
  "sapiens-video-kling-motion",
138
153
  "sapiens-video-shot-mimic",
@@ -289,15 +304,15 @@ export const videoSchema = z.object({
289
304
  durationSec: z
290
305
  .number()
291
306
  .optional()
292
- .describe("action=create e action=price: duração em segundos (Omni ignora). Seedance 2.0/Shot Mimic 4-15, Seedance 2.5 4-30 (o preço acompanha: confirme a duração com a pessoa antes de passar de 15), Seedance 1.5 4-12, Kling 3-15, WAN 5/10, H3 5/6/8/10. " +
307
+ .describe("action=create e action=price: duração em segundos (Omni ignora). Seedance 2.0/Shot Mimic 4-15, Seedance 2.5 4-30 (o preço acompanha: confirme a duração com a pessoa antes de passar de 15), Seedance 1.5 4-12, Kling 3-15, WAN 5/10, H3 5/6/8/10 em 2k e 5/6/8/10/12/15 em 768p. " +
293
308
  "O PREÇO ESCALA COM A DURAÇÃO. Omitir não é 'a config padrão da casa': duração ausente, ou fora do leque do motor, cai no PISO de duração do motor. " +
294
309
  "action=shadows: duração do vídeo-fonte, se souber (cobra 200/s; sem ela, flat ~2000)."),
295
310
  resolution: z
296
- .enum(["480p", "720p", "1080p"])
311
+ .enum(["480p", "720p", "1080p", "768p", "2k"])
297
312
  .optional()
298
- .describe("action=create e action=price: resolução (Seedance/WAN/Shot Mimic). NÃO existe default 720p aqui: resolução ausente, ou fora do que o motor aceita, cai no tier MAIS CARO do motor. " +
313
+ .describe("action=create e action=price: resolução (Seedance/WAN/Shot Mimic/H3). NÃO existe default 720p aqui: resolução ausente, ou fora do que o motor aceita, cai no tier MAIS CARO do motor. " +
299
314
  "É isso que faz um create sem este campo custar muito mais que o piso do catálogo (em sapiens-video-seedance vira 1080p, não 480p). Passe sempre a resolução que você quer pagar, e confira com action=price antes. " +
300
- "Kling e a linha Hailuo/H3 não usam este campo (resolução fixa pelo motor)."),
315
+ "O H3 usa '768p' ou '2k' (sem eles cai no 2k, que custa 40% mais por segundo). Kling e a linha Hailuo 2.3 não usam este campo (resolução fixa pelo motor)."),
301
316
  audio: z
302
317
  .boolean()
303
318
  .optional()
@@ -492,6 +507,14 @@ export async function video(args) {
492
507
  id: m.id,
493
508
  engine: m.engine,
494
509
  label: m.label,
510
+ // Família + variante: o Seedance sozinho tem SEIS entradas nesta lista
511
+ // (1.0 Fast, 1.5 Pro, 2.0, 2.0 Fast, 2.0 Mini, 2.5) e são o mesmo motor
512
+ // em geração/tier diferente. Sem os dois campos o cliente lê seis
513
+ // motores sem relação. Ausência = motor sozinho.
514
+ family: m.family ?? null,
515
+ variant: m.variantLabel ?? null,
516
+ // Pra que este motor serve: audio, fala, referencia, movimento, longo.
517
+ bestFor: m.bestFor ?? [],
495
518
  // "por-segundo" = o preço MUDA com duração, resolução e (no Kling) áudio.
496
519
  // "por-clipe" = preço fixo, config não mexe na conta.
497
520
  priceMode: m.priceMode ?? null,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sapiens-mcp",
3
- "version": "1.62.8",
3
+ "version": "1.63.1",
4
4
  "mcpName": "com.sapiensinteticos/sapiens",
5
5
  "description": "MCP server pra operar o Sapiens Sintéticos (sapiensinteticos.com) pelo Claude Code: gerar imagem, escrever artigo, voz, música e mais, na sua conta. Login pelo código de sapiensinteticos.com/conectar-claude.",
6
6
  "type": "module",