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 +14 -1
- package/dist/tools/image.js +26 -1
- package/dist/tools/reference.js +9 -4
- package/dist/tools/video.js +33 -10
- package/package.json +1 -1
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
|
-
|
|
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ó:
|
package/dist/tools/image.js
CHANGED
|
@@ -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();
|
package/dist/tools/reference.js
CHANGED
|
@@ -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("
|
|
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.";
|
package/dist/tools/video.js
CHANGED
|
@@ -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 —
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
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
|
|
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.
|
|
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",
|