sapiens-mcp 1.98.0 → 1.99.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/dist/registry.js +1 -1
- package/dist/skills.js +9 -2
- package/dist/tools/gallery.js +73 -13
- package/dist/tools/video.js +15 -3
- package/package.json +1 -1
package/dist/registry.js
CHANGED
|
@@ -146,7 +146,7 @@ export const TOOLS = {
|
|
|
146
146
|
handler: musicator,
|
|
147
147
|
},
|
|
148
148
|
sapiens_video: {
|
|
149
|
-
description: "Sapiens Video — gera vídeo (qualquer membro logado; vídeo é caro, cobra as Sinapses da sua conta). Sub-action 'create' (recomendada): escolhe modelo + config e gera num call (cria a row + renderiza). Modelos: 'sapiens-video-seedance' (Seedance 2.0, cena+áudio nativo, 4-15s, 480/720/1080p, t2v/i2v; aceita até 4 imagens de REFERÊNCIA via referenceImageIds/referenceImageUrls/referenceImagePaths (o H3 aceita até 9, os Veo Fast/Quality e o Omni 1.1 até 3; Lite, Kling, Hailuo, WAN 2.5 e 3.0 e os dois Spicy não), que guiam estilo/personagem/composição SEM virar o 1º frame — é o fluxo STORYBOARD: gere a folha de key poses com sapiens_image templateSlug='storyboard-sapiens-v1', passe folha + personagem como refs num t2v e descreva o take contínuo no prompt, citando as refs por descrição e mandando ignorar o traço do sketch; aceita também 1 VÍDEO DE MOVIMENTO via referenceVideoUrls (role 'refvideo' -> reference_videos, <=15s, host da casa): a coreografia/câmera do clipe guia o take, combinável com a folha), 'sapiens-video-seedance-2-fast' e 'sapiens-video-seedance-2-mini' (os irmãos do 2.0: MESMO repertório completo, incluindo referência, frame final e vídeo de movimento; o Fast custa 20% menos e o Mini METADE, ambos com teto 720p — pedir 1080p neles entrega e cobra 720p. Use o Mini pra iterar enquadramento/prompt barato e feche no 'sapiens-video-seedance' quando o take estiver certo), 'sapiens-video-seedance-25' (Seedance 2.5, a geração SEGUINTE e não um quarto tier da 2.0: take de 4 a 30s num fôlego, edita e estende vídeo, mesmo repertório de referência mais ÁUDIO como referência; teto 720p e ~1,5x o preço por segundo do 2.0. Duração é o que pesa aqui: 30s em 720p passa de 40 mil Sinapses, então confirme a duração com a pessoa antes de disparar. Quem precisa de 1080p fica no 'sapiens-video-seedance'), 'sapiens-video-kling' (Kling 3.0 Pro, anima imagem, 3-15s, sound opcional, i2v/t2v), 'sapiens-video-hailuo' (Hailuo 2.3 da MiniMax, física e movimento em 768p, 6 ou 10s, t2v/i2v) e 'sapiens-video-hailuo-pro' (o mesmo em 1080p, 5s fixo — duração não é param aqui): motores PUROS, sem áudio nativo, sem imagens de referência e sem frame final, então quem precisa disso fica no Seedance 2.0; o Pro é o 1080p mais barato da casa, 'sapiens-video-h3' (MiniMax H3: som nativo incluso sem toggle, 5 a 15s em '2k' ou '768p' (sem resolution cai no 2k, que custa 33% mais por segundo), t2v/i2v e frame final; ACEITA até 9 imagens e 3 vídeos de referência (somando 15s), o caminho de take longo com personagem travada; referência e frame inicial são exclusivos, mande um dos dois; o 2K de 15s leva uns 9 minutos de render, acompanhe em status e não gere de novo), 'sapiens-video-h3-spicy' (MiniMax H3 Spicy: o H3 SEM freio de conteúdo, i2v puro a partir de uma imagem sua, que é o que trava a identidade; 3 a 15s, 480p/768p/1080p, som nativo, frame final; o segundo de vídeo mais barato e o render mais rápido da casa), 'sapiens-video-seedance-spicy' (Seedance 2.0 Spicy: o 2.0 SEM freio, também i2v puro, som nativo; 4 a 15s em 480p e 720p, para em 10s em 1080p; sem frame final; o som tem interruptor no mesmo preço), 'sapiens-video-wan' (WAN 2.5, imagem que fala/canta com áudio+lip-sync, 5/10s, i2v), 'sapiens-video-wan-3' (WAN 3.0: texto ou imagem, som nativo com interruptor no mesmo preço, frame final, 5/8/10s em 480/720/1080p; sem imagem de referência), 'sapiens-video-kling-motion' (Motion transfer: passa o movimento de um vídeo pra uma imagem, PRECISA de pessoa com tronco visível na imagem E no vídeo), 'sapiens-video-shot-mimic' (Shot Mimic: recria o plano/câmera/cortes de um vídeo de referência como cena nova), 'sapiens-video-omni-11' (Gemini Omni 1.1: texto ou imagem vira vídeo de 4, 6, 8 ou 10s (sem durationSec, 10s) com áudio nativo, de '360p' a '4k' (sem resolution, 720p; 360p custa 1/3 do 720p, 1080p 1,5x, 4k 3x); aceita até 3 imagens de referência; editOfImageId aponta um vídeo Omni seu e o prompt edita a MESMA cena, preservando câmera e ambiente; e VÍDEO-FONTE: sourceVideoId (vídeo seu da galeria) ou sourceVideoUrl (link da casa), mp4 até 10 s, editado (sourceVideoMode 'edit', o padrão, ex: trocar a pessoa do vídeo pelo personagem da imagem de referência, cobrado pelo tamanho do clipe) ou estendido ('extend', cobrado pelo durationSec do pedaço novo)) e 'sapiens-video-omni' (o 1.0 preview: mesmo preço e mesmo repertório, desligado por default, existe pra comparar com o 1.1), 'sapiens-video-lite/fast/quality' (Veo 3.1: 4, 6 ou 8s, sem durationSec sai 8s; com imagem de referência ou frame final o Google só faz 8s). Args create: model, prompt, durationSec, resolution ('480p'/'720p'/'1080p'; no H3 '768p'/'2k'; no Omni 1.1 '360p' a '4k'), audio, aspectRatio. RECEITA DE TAKE (templateSlug + brief), o irmão do templateSlug da imagem: em vez de escrever o prompt inteiro, passe templateSlug e a receita travada da casa embrulha a cena com estilo, cenário, arco, áudio e look, e ainda escolhe o motor (por isso model fica opcional). O `prompt` vira só a CENA e o `brief` preenche os campos do formato (subject, persona, hook, shots com voiceLine e propVisible, uvps, language, energy); campo vazio some do prompt em vez de virar buraco. Receitas de hoje: 'ugc-vertical-v1' (selfie que fala, o formato nativo de Reels/TikTok/Shorts), 'unboxing-vertical-v1' (mãos e reveal, som real do papel e do lacre), 'app-demo-vertical-v1' (a tela do app legível na mão da pessoa) e 'reflexao-vertical-v1' (talking-head lento pra ideia ou ensaio). Override de model/aspectRatio/durationSec/resolution vale dentro do que a receita aceita, e o erro lista as opções. Sub-action 'templates' (sem custo, sem login) traz o catálogo vivo com spec default, whitelist e os briefFields de cada uma. Isto substitui a tool sapiens_shorts, que era admin-only e só falava Veo 3.1 Fast; o mesmo UGC de 8s sai a 720p no Seedance 2.0 Mini por bem menos. FRAME INICIAL/FINAL POR REFERÊNCIA (recomendado): startImageId/endImageId (id da sua galeria) ou startImageUrl/endImageUrl (url de galeria/Acervo/personagem) — resolvidos server-side igual à imagem, descubra via sapiens_reference. FRAME POR ARQUIVO LOCAL (só no MCP instalado/stdio, não no remoto): startImagePath/endImagePath = caminho absoluto de uma imagem no seu PC (PNG/JPEG/WebP até 8MB); o processo lê o arquivo e sobe como frame inicial/final, igual a subir no gerador do site — 1 imagem inicial + 1 final por vídeo, então pra vários vídeos rode create uma vez por imagem. No remoto use id/url. Alternativa base64: references (role 'start'=imagem i2v, 'end'=frame final, 'driving'=vídeo de movimento do Motion). Suporte a frame final varia por modelo. Custo server-side por config. Sub-action 'generate' (legado): renderiza um imageId de vídeo já criado no site. Retorna {success, url, imageId, cost}. VITRINE (sem custo): sub-action 'demos' lista os SEUS demo films (kind=demo do Estúdio de Vídeo) com slug + estado de vitrine; sub-action 'showcase' põe/tira um demo (por slug) do mini-cinema da /conectar-claude, com showcaseTag (chip de capacidade) e showcaseOrder (ordem asc). Fluxo: 'demos' pra achar o slug, depois 'showcase' com showcase=true. Só entra na vitrine pública se for a conta da casa. VÍDEOS PROGRAMÁTICOS (ADMIN, sem custo): o Lab do Estúdio de Vídeo (/experimentos/films, tabela videoSpecs, 5 kinds: demo | aula-tour | essay | tipografia-musical | dataviz) opera por aqui sem browser — 'film-list' (todos os kinds; filtros filmKind/filmStatus), 'film-get' (spec inteiro por slug), 'film-upsert' (cria/atualiza por slug, idempotente; spec = objeto JSON no shape do 'Copiar spec' da tela, validação no servidor), 'film-status' (produção por slug: filmStatus + videoUrl + durationSecMeasured; o fecho do render é os três num call), 'film-publish' (Acervo aba Fitas + portfólio; exige pronto+URL), 'film-delete' (limpar rascunho). O RENDER do filme segue no agente local (skill /film, repo da casa): o MCP registra e fecha o ciclo, não renderiza. create é ASSÍNCRONA: cria o row, debita e volta NA HORA com {imageId, status:'rendering', cost} (não espera o render, que leva de segundos a minutos). Acompanhe com a sub-action 'status' (imageId) até status='completed' (traz a url) ou 'error'/'blocked'. NÃO chame create de novo enquanto renderiza (cria outro vídeo e cobra de novo); falha de provider refunda sozinha. EDIÇÃO (as ações da ficha do site, cada uma vira peça nova e o original fica): 'trim' (imageId + startSec, endSec opcional: corta um trecho; grátis), 'join' (imageIds: 2 a 8 vídeos SEUS na ordem, até 180 s somados: compilado; grátis), 'fecho' (imageId + ending 'marca'/'sapiens'/'none', watermark, musicUrl de trilha da casa, nameCard {name, subtitle}: fecha o vídeo com a assinatura da casa; grátis), 'render-ref' (imageId do take + refUrl da folha que o gerou: a peça com a referência ao lado; cobra Sinapses, o mesmo par já feito volta de graça). Síncronas, podem passar de 2 min: Timeout é o cliente desistindo, olhe sapiens_gallery action=list kind=video antes de repetir. RESOLUÇÃO: 'upscale' (imageId de vídeo SEU completed + resolution = o alvo, '720p', '1080p', '2k' ou '4k') gera uma VARIANTE nova em resolução maior, o original fica intacto; cobra Sinapses por segundo do clipe, mais caro quanto maior o alvo, assíncrona como o create (acompanhe em status). SOM: 'sonorize' (imageId de vídeo SEU completed + prompt do som da cena) gera uma VARIANTE nova com trilha sincronizada (20 Sinapses/s, o original fica intacto; sonorize sempre o original, nunca uma variante). ADMIN: 'shadows' (videoUrl + title) extrai o depth map (depth-map) de um vídeo: entra na sua timeline de vídeos e no Acervo como driving reutilizável; 'shadows-list' lista os depth maps prontos. PREÇO DE VÍDEO É FAIXA, NÃO NÚMERO: nos motores por segundo (todo Seedance, Kling, WAN 2.5 e 3.0, Hailuo, H3, os dois Spicy, Shot Mimic, e desde out/2026 o Veo 3.1 e o Gemini Omni) a conta é duração x resolução [x áudio], e OMITIR não pega o barato: sem 'resolution' o servidor cobra o tier MAIS CARO do motor (menos o Gemini Omni 1.1, que fica no 720p), sem 'durationSec' cobra o piso de duração (no Veo e no Omni, o padrão: 8s e 10s). Um create de Seedance 2.0 sem resolution debita 1080p. Nunca prometa um valor sem cotar: sub-action 'price' (sem custo, sem login) devolve o número EXATO que o create vai debitar pra model + durationSec + resolution + audio, e avisa (clamped=true) quando o que você pediu não é o que vai ser cobrado. Sub-action 'models' (sem custo, sem login): lista os modelos ativos + a faixa de preço calculada pela mesma função que debita (priceDefault = o que uma chamada sem config custa, priceMin e priceMax = os dois cantos do motor, cada um com a config que o produz) + config (durações/resoluções) + disponibilidade (motor em preview pode aparecer como 'em breve'). LEGENDA (fita, por slug): 'caption-list' (sem custo, mostra os idiomas que a peça já tem), 'caption-generate' (captionLang = idioma FALADO; captionTrio=true já traduz pro trio da casa pt+en+ja na mesma chamada) e 'caption-translate' (captionLang = destino, parte sempre da faixa original). Cobra por minuto começado de vídeo: 50 Sinapses o minuto transcrito, 20 o traduzido, com a duração vindo do doc da peça. A legenda é desenhada pela casa em dois estilos (discreta e social), trocáveis no play sem regerar e sem custo.",
|
|
149
|
+
description: "Sapiens Video — gera vídeo (qualquer membro logado; vídeo é caro, cobra as Sinapses da sua conta). Sub-action 'create' (recomendada): escolhe modelo + config e gera num call (cria a row + renderiza). Modelos: 'sapiens-video-seedance' (Seedance 2.0, cena+áudio nativo, 4-15s, 480/720/1080p, t2v/i2v; aceita até 4 imagens de REFERÊNCIA via referenceImageIds/referenceImageUrls/referenceImagePaths (o H3 aceita até 9, os Veo Fast/Quality e o Omni 1.1 até 3; Lite, Kling, Hailuo, WAN 2.5 e 3.0 e os dois Spicy não), que guiam estilo/personagem/composição SEM virar o 1º frame — é o fluxo STORYBOARD: gere a folha de key poses com sapiens_image templateSlug='storyboard-sapiens-v1', passe folha + personagem como refs num t2v e descreva o take contínuo no prompt, citando as refs por descrição e mandando ignorar o traço do sketch; aceita também 1 VÍDEO DE MOVIMENTO via referenceVideoUrls (role 'refvideo' -> reference_videos, <=15s, host da casa): a coreografia/câmera do clipe guia o take, combinável com a folha), 'sapiens-video-seedance-2-fast' e 'sapiens-video-seedance-2-mini' (os irmãos do 2.0: MESMO repertório completo, incluindo referência, frame final e vídeo de movimento; o Fast custa 20% menos e o Mini METADE, ambos com teto 720p — pedir 1080p neles entrega e cobra 720p. Use o Mini pra iterar enquadramento/prompt barato e feche no 'sapiens-video-seedance' quando o take estiver certo), 'sapiens-video-seedance-25' (Seedance 2.5, a geração SEGUINTE e não um quarto tier da 2.0: take de 4 a 30s num fôlego, edita e estende vídeo, mesmo repertório de referência mais ÁUDIO como referência; teto 720p e ~1,5x o preço por segundo do 2.0. Duração é o que pesa aqui: 30s em 720p passa de 40 mil Sinapses, então confirme a duração com a pessoa antes de disparar. Quem precisa de 1080p fica no 'sapiens-video-seedance'), 'sapiens-video-kling' (Kling 3.0 Pro, anima imagem, 3-15s, sound opcional, i2v/t2v), 'sapiens-video-hailuo' (Hailuo 2.3 da MiniMax, física e movimento em 768p, 6 ou 10s, t2v/i2v) e 'sapiens-video-hailuo-pro' (o mesmo em 1080p, 5s fixo — duração não é param aqui): motores PUROS, sem áudio nativo, sem imagens de referência e sem frame final, então quem precisa disso fica no Seedance 2.0; o Pro é o 1080p mais barato da casa, 'sapiens-video-h3' (MiniMax H3: som nativo incluso sem toggle, 5 a 15s em '2k' ou '768p' (sem resolution cai no 2k, que custa 33% mais por segundo), t2v/i2v e frame final; ACEITA até 9 imagens e 3 vídeos de referência (somando 15s), o caminho de take longo com personagem travada; referência e frame inicial são exclusivos, mande um dos dois; o 2K de 15s leva uns 9 minutos de render, acompanhe em status e não gere de novo), 'sapiens-video-h3-spicy' (MiniMax H3 Spicy: o H3 SEM freio de conteúdo, i2v puro a partir de uma imagem sua, que é o que trava a identidade; 3 a 15s, 480p/768p/1080p, som nativo, frame final; o segundo de vídeo mais barato e o render mais rápido da casa), 'sapiens-video-seedance-spicy' (Seedance 2.0 Spicy: o 2.0 SEM freio, também i2v puro, som nativo; 4 a 15s em 480p e 720p, para em 10s em 1080p; sem frame final; o som tem interruptor no mesmo preço), 'sapiens-video-wan' (WAN 2.5, imagem que fala/canta com áudio+lip-sync, 5/10s, i2v), 'sapiens-video-wan-3' (WAN 3.0: texto ou imagem, som nativo com interruptor no mesmo preço, frame final, 5/8/10s em 480/720/1080p; sem imagem de referência), 'sapiens-video-kling-motion' (Motion transfer: passa o movimento de um vídeo pra uma imagem, PRECISA de pessoa com tronco visível na imagem E no vídeo), 'sapiens-video-shot-mimic' (Shot Mimic: recria o plano/câmera/cortes de um vídeo de referência como cena nova), 'sapiens-video-omni-11' (Gemini Omni 1.1: texto ou imagem vira vídeo de 4, 6, 8 ou 10s (sem durationSec, 10s) com áudio nativo, de '360p' a '4k' (sem resolution, 720p; 360p custa 1/3 do 720p, 1080p 1,5x, 4k 3x); aceita até 3 imagens de referência; editOfImageId aponta um vídeo Omni seu e o prompt edita a MESMA cena, preservando câmera e ambiente; e VÍDEO-FONTE: sourceVideoId (vídeo seu da galeria) ou sourceVideoUrl (link da casa), mp4 até 10 s, editado (sourceVideoMode 'edit', o padrão, ex: trocar a pessoa do vídeo pelo personagem da imagem de referência, cobrado pelo tamanho do clipe) ou estendido ('extend', cobrado pelo durationSec do pedaço novo)) e 'sapiens-video-omni' (o 1.0 preview: mesmo preço e mesmo repertório, desligado por default, existe pra comparar com o 1.1), 'sapiens-video-lite/fast/quality' (Veo 3.1: 4, 6 ou 8s, sem durationSec sai 8s; com imagem de referência ou frame final o Google só faz 8s). Args create: model, prompt, durationSec, resolution ('480p'/'720p'/'1080p'; no H3 '768p'/'2k'; no Omni 1.1 '360p' a '4k'), audio, aspectRatio. RECEITA DE TAKE (templateSlug + brief), o irmão do templateSlug da imagem: em vez de escrever o prompt inteiro, passe templateSlug e a receita travada da casa embrulha a cena com estilo, cenário, arco, áudio e look, e ainda escolhe o motor (por isso model fica opcional). O `prompt` vira só a CENA e o `brief` preenche os campos do formato (subject, persona, hook, shots com voiceLine e propVisible, uvps, language, energy); campo vazio some do prompt em vez de virar buraco. Receitas de hoje: 'ugc-vertical-v1' (selfie que fala, o formato nativo de Reels/TikTok/Shorts), 'unboxing-vertical-v1' (mãos e reveal, som real do papel e do lacre), 'app-demo-vertical-v1' (a tela do app legível na mão da pessoa) e 'reflexao-vertical-v1' (talking-head lento pra ideia ou ensaio). Override de model/aspectRatio/durationSec/resolution vale dentro do que a receita aceita, e o erro lista as opções. Sub-action 'templates' (sem custo, sem login) traz o catálogo vivo com spec default, whitelist e os briefFields de cada uma. Isto substitui a tool sapiens_shorts, que era admin-only e só falava Veo 3.1 Fast; o mesmo UGC de 8s sai a 720p no Seedance 2.0 Mini por bem menos. FRAME INICIAL/FINAL POR REFERÊNCIA (recomendado): startImageId/endImageId (id da sua galeria) ou startImageUrl/endImageUrl (url de galeria/Acervo/personagem) — resolvidos server-side igual à imagem, descubra via sapiens_reference. FRAME POR ARQUIVO LOCAL (só no MCP instalado/stdio, não no remoto): startImagePath/endImagePath = caminho absoluto de uma imagem no seu PC (PNG/JPEG/WebP até 8MB); o processo lê o arquivo e sobe como frame inicial/final, igual a subir no gerador do site — 1 imagem inicial + 1 final por vídeo, então pra vários vídeos rode create uma vez por imagem. No remoto use id/url. Alternativa base64: references (role 'start'=imagem i2v, 'end'=frame final, 'driving'=vídeo de movimento do Motion). Suporte a frame final varia por modelo. Custo server-side por config. Sub-action 'generate' (legado): renderiza um imageId de vídeo já criado no site. Retorna {success, url, imageId, cost}. VITRINE (sem custo): sub-action 'demos' lista os SEUS demo films (kind=demo do Estúdio de Vídeo) com slug + estado de vitrine; sub-action 'showcase' põe/tira um demo (por slug) do mini-cinema da /conectar-claude, com showcaseTag (chip de capacidade) e showcaseOrder (ordem asc). Fluxo: 'demos' pra achar o slug, depois 'showcase' com showcase=true. Só entra na vitrine pública se for a conta da casa. VÍDEOS PROGRAMÁTICOS (ADMIN, sem custo): o Lab do Estúdio de Vídeo (/experimentos/films, tabela videoSpecs, 5 kinds: demo | aula-tour | essay | tipografia-musical | dataviz) opera por aqui sem browser — 'film-list' (todos os kinds; filtros filmKind/filmStatus), 'film-get' (spec inteiro por slug), 'film-upsert' (cria/atualiza por slug, idempotente; spec = objeto JSON no shape do 'Copiar spec' da tela, validação no servidor), 'film-status' (produção por slug: filmStatus + videoUrl + durationSecMeasured; o fecho do render é os três num call), 'film-publish' (Acervo aba Fitas + portfólio; exige pronto+URL), 'film-delete' (limpar rascunho). O RENDER do filme segue no agente local (skill /film, repo da casa): o MCP registra e fecha o ciclo, não renderiza. create é ASSÍNCRONA: cria o row, debita e volta NA HORA com {imageId, status:'rendering', cost} (não espera o render, que leva de segundos a minutos). Acompanhe com a sub-action 'status' (imageId) até status='completed' (traz a url) ou 'error'/'blocked'. NÃO chame create de novo enquanto renderiza (cria outro vídeo e cobra de novo); falha de provider refunda sozinha. EDIÇÃO (as ações da ficha do site, cada uma vira peça nova e o original fica): 'trim' (imageId + startSec, endSec opcional: corta um trecho; grátis), 'join' (imageIds: 2 a 8 vídeos SEUS na ordem, até 180 s somados: compilado; grátis), 'fecho' (imageId + ending 'marca'/'sapiens'/'none', watermark, musicUrl de trilha da casa, nameCard {name, subtitle}: fecha o vídeo com a assinatura da casa; grátis), 'render-ref' (imageId do take + refUrl da folha que o gerou: a peça com a referência ao lado; cobra Sinapses, o mesmo par já feito volta de graça). Síncronas, podem passar de 2 min: Timeout é o cliente desistindo, olhe sapiens_gallery action=list kind=video antes de repetir. RESOLUÇÃO: 'upscale' (imageId de vídeo SEU completed + resolution = o alvo, '720p', '1080p', '2k' ou '4k') gera uma VARIANTE nova em resolução maior, o original fica intacto; cobra Sinapses por segundo do clipe, mais caro quanto maior o alvo, assíncrona como o create (acompanhe em status). SOM: 'sonorize' (imageId de vídeo SEU completed + prompt do som da cena) gera uma VARIANTE nova com trilha sincronizada (o original fica intacto; sonorize sempre o original, nunca uma variante). engine escolhe o motor: 'mmaudio-v2' (default, 20 Sinapses/s, som do zero pra clipe mudo) ou 'mirelo-sfx-2.0' (42 Sinapses/s, GUARDA a fala do clipe, tira a música e refaz o resto). ADMIN: 'shadows' (videoUrl + title) extrai o depth map (depth-map) de um vídeo: entra na sua timeline de vídeos e no Acervo como driving reutilizável; 'shadows-list' lista os depth maps prontos. PREÇO DE VÍDEO É FAIXA, NÃO NÚMERO: nos motores por segundo (todo Seedance, Kling, WAN 2.5 e 3.0, Hailuo, H3, os dois Spicy, Shot Mimic, e desde out/2026 o Veo 3.1 e o Gemini Omni) a conta é duração x resolução [x áudio], e OMITIR não pega o barato: sem 'resolution' o servidor cobra o tier MAIS CARO do motor (menos o Gemini Omni 1.1, que fica no 720p), sem 'durationSec' cobra o piso de duração (no Veo e no Omni, o padrão: 8s e 10s). Um create de Seedance 2.0 sem resolution debita 1080p. Nunca prometa um valor sem cotar: sub-action 'price' (sem custo, sem login) devolve o número EXATO que o create vai debitar pra model + durationSec + resolution + audio, e avisa (clamped=true) quando o que você pediu não é o que vai ser cobrado. Sub-action 'models' (sem custo, sem login): lista os modelos ativos + a faixa de preço calculada pela mesma função que debita (priceDefault = o que uma chamada sem config custa, priceMin e priceMax = os dois cantos do motor, cada um com a config que o produz) + config (durações/resoluções) + disponibilidade (motor em preview pode aparecer como 'em breve'). LEGENDA (fita, por slug): 'caption-list' (sem custo, mostra os idiomas que a peça já tem), 'caption-generate' (captionLang = idioma FALADO; captionTrio=true já traduz pro trio da casa pt+en+ja na mesma chamada) e 'caption-translate' (captionLang = destino, parte sempre da faixa original). Cobra por minuto começado de vídeo: 50 Sinapses o minuto transcrito, 20 o traduzido, com a duração vindo do doc da peça. A legenda é desenhada pela casa em dois estilos (discreta e social), trocáveis no play sem regerar e sem custo.",
|
|
150
150
|
schema: videoSchema,
|
|
151
151
|
handler: video,
|
|
152
152
|
},
|
package/dist/skills.js
CHANGED
|
@@ -317,7 +317,14 @@ A conta tem duas carteiras: Sinapses (o App) e o saldo em dólar da API (Develop
|
|
|
317
317
|
|
|
318
318
|
## Sonorizar
|
|
319
319
|
|
|
320
|
-
\`action=sonorize\` com \`imageId\` de um vídeo SEU já completed e \`prompt\` descrevendo o som da cena (ambiente, materiais, impactos). Sai uma VARIANTE nova com trilha sincronizada ao movimento
|
|
320
|
+
\`action=sonorize\` com \`imageId\` de um vídeo SEU já completed e \`prompt\` descrevendo o som da cena (ambiente, materiais, impactos). Sai uma VARIANTE nova com trilha sincronizada ao movimento, e o original fica intacto. Dois motores no \`engine\`:
|
|
321
|
+
|
|
322
|
+
- \`mmaudio-v2\` (o default): som inteiro do zero (MMAudio, 20 Sinapses/s do clipe, mín 100). Pra clipe MUDO: se o clipe já tem fala, ela se perde.
|
|
323
|
+
- \`mirelo-sfx-2.0\`: GUARDA a fala que o clipe já tem, tira a música que veio junto e refaz o resto do som em volta (Mirelo SFX 2.0, 42 Sinapses/s do clipe, mín 210). É o motor pro take que nasceu com diálogo e trilha que ninguém pediu.
|
|
324
|
+
|
|
325
|
+
Na dúvida, pergunte se o clipe tem fala que precisa ficar.
|
|
326
|
+
|
|
327
|
+
O Mirelo recusa, sem cobrar, a peça que entrou de fora (ingest: a casa não sabe quanto ela dura) e o clipe acima de 180s. Peça de fora passa antes no \`action=trim\` (o corte nasce medido) e você sonoriza o corte; clipe longo, corte em partes.
|
|
321
328
|
|
|
322
329
|
Sonorize sempre o ORIGINAL, nunca uma variante. Acompanhe com \`action=status\` no imageId NOVO que o sonorize devolve.
|
|
323
330
|
|
|
@@ -1026,7 +1033,7 @@ Dois modelos de texto que escolhem, a cada pedido, qual modelo responde, e cobra
|
|
|
1026
1033
|
### Jev Router (no POST /chat/completions)
|
|
1027
1034
|
|
|
1028
1035
|
- \`model: "jev-router"\`: o router da TypeSafe escolhe o modelo e o esforço de raciocínio de cada pedido. O \`model\` da resposta é o que ele escolheu.
|
|
1029
|
-
-
|
|
1036
|
+
- O preço varia com o modelo que ele escolher. Não dá pra cotar antes: leia o \`x-sapiens-charge-usd\` de cada chamada e, em lote, confira o gasto do dia em \`GET /balance\`.
|
|
1030
1037
|
|
|
1031
1038
|
## Decisão: o Laya (POST /systemone)
|
|
1032
1039
|
|
package/dist/tools/gallery.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { basename, extname } from "node:path";
|
|
3
4
|
import { createHash } from "node:crypto";
|
|
4
5
|
import { convexAction, convexMutation, convexQuery, describeConvexError, getSessionToken, isRemoteContext, } from "../convexClient.js";
|
|
5
6
|
import { assertPublicHttpsUrl, fetchPublicHttps } from "../publicFetch.js";
|
|
@@ -96,7 +97,7 @@ export const gallerySchema = z.object({
|
|
|
96
97
|
filePath: z
|
|
97
98
|
.string()
|
|
98
99
|
.optional()
|
|
99
|
-
.describe("action=upload/ingest: caminho ABSOLUTO de um arquivo local (png, jpg, webp,
|
|
100
|
+
.describe("action=upload/ingest: caminho ABSOLUTO de um arquivo local: no upload só imagem (png, jpg, webp, gif, avif), no ingest também mp4 e mov. O conteúdo é conferido pelos bytes antes de subir, e arquivo que não é peça é recusado sem ser enviado. SÓ no MCP instalado (stdio): é a porta de quem gerou na própria máquina ou baixou o render antes; no remoto use sourceUrl. No ingest, o sha256 do arquivo vira a chave de idempotência."),
|
|
100
101
|
base64: z
|
|
101
102
|
.string()
|
|
102
103
|
.optional()
|
|
@@ -104,7 +105,7 @@ export const gallerySchema = z.object({
|
|
|
104
105
|
mimeType: z
|
|
105
106
|
.string()
|
|
106
107
|
.optional()
|
|
107
|
-
.describe("action=upload/ingest: tipo do arquivo (image/png, video/mp4...). Detectado sozinho a partir da URL/extensão/resposta HTTP quando omitido."),
|
|
108
|
+
.describe("action=upload/ingest: tipo do arquivo (image/png, video/mp4...). Detectado sozinho a partir da URL/extensão/resposta HTTP quando omitido. Em filePath e base64 vale o tipo que os bytes mostram, não este."),
|
|
108
109
|
note: z
|
|
109
110
|
.string()
|
|
110
111
|
.optional()
|
|
@@ -209,23 +210,85 @@ function mimeFromPath(p) {
|
|
|
209
210
|
const ext = p.split("?")[0].split("#")[0].split(".").pop()?.toLowerCase();
|
|
210
211
|
return ext ? EXT_MIME[ext] : undefined;
|
|
211
212
|
}
|
|
213
|
+
// Marcas ISO BMFF de HEIC/HEIF: imagem que a galeria não hospeda, e que sem
|
|
214
|
+
// esta lista passaria por vídeo (o ftyp é o mesmo do mp4).
|
|
215
|
+
const MARCAS_HEIF = new Set(["heic", "heix", "heim", "heis", "mif1", "msf1"]);
|
|
216
|
+
/**
|
|
217
|
+
* O tipo da peça pelos primeiros bytes, ou undefined quando não é imagem nem
|
|
218
|
+
* vídeo que a casa aceita. A extensão sozinha não prova nada: sem isto, um
|
|
219
|
+
* filePath qualquer (o .env.local, uma chave) subia pro CDN como image/png, e
|
|
220
|
+
* bastava uma frase plantada num README lido por skill (auditoria de prompt
|
|
221
|
+
* injection, 15/10/2026).
|
|
222
|
+
*/
|
|
223
|
+
export function mimeDosBytes(b) {
|
|
224
|
+
const txt = (ini, fim) => b.length >= fim ? Buffer.from(b.subarray(ini, fim)).toString("latin1") : "";
|
|
225
|
+
if (txt(0, 8) === "\x89PNG\r\n\x1a\n")
|
|
226
|
+
return "image/png";
|
|
227
|
+
if (b.length >= 3 && b[0] === 0xff && b[1] === 0xd8 && b[2] === 0xff)
|
|
228
|
+
return "image/jpeg";
|
|
229
|
+
if (txt(0, 6) === "GIF87a" || txt(0, 6) === "GIF89a")
|
|
230
|
+
return "image/gif";
|
|
231
|
+
if (txt(0, 4) === "RIFF" && txt(8, 12) === "WEBP")
|
|
232
|
+
return "image/webp";
|
|
233
|
+
if (txt(4, 8) === "ftyp") {
|
|
234
|
+
// A caixa ftyp traz a marca principal e as compatíveis (o byte 12 é versão).
|
|
235
|
+
const caixa = Math.min(b.length, ((b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3]) >>> 0);
|
|
236
|
+
const marcas = [txt(8, 12)];
|
|
237
|
+
for (let i = 16; i + 4 <= caixa; i += 4)
|
|
238
|
+
marcas.push(txt(i, i + 4));
|
|
239
|
+
if (marcas.includes("avif") || marcas.includes("avis"))
|
|
240
|
+
return "image/avif";
|
|
241
|
+
if (marcas.some((m) => MARCAS_HEIF.has(m)))
|
|
242
|
+
return undefined;
|
|
243
|
+
return marcas[0] === "qt " ? "video/quicktime" : "video/mp4";
|
|
244
|
+
}
|
|
245
|
+
// QuickTime antigo abre direto num átomo, sem ftyp.
|
|
246
|
+
if (["moov", "mdat", "wide", "free", "skip"].includes(txt(4, 8)))
|
|
247
|
+
return "video/quicktime";
|
|
248
|
+
return undefined;
|
|
249
|
+
}
|
|
250
|
+
/** Confere que os bytes são peça (imagem; vídeo só onde aceitaVideo) e devolve o mime deles. */
|
|
251
|
+
function exigePeca(bytes, nome, aceitaVideo) {
|
|
252
|
+
const mime = mimeDosBytes(bytes);
|
|
253
|
+
if (!mime || (!aceitaVideo && !mime.startsWith("image/"))) {
|
|
254
|
+
throw new Error(`${nome} não é ${aceitaVideo ? "imagem nem vídeo" : "imagem"} que a galeria aceita (o conteúdo não bate com png, jpg, webp, gif, avif${aceitaVideo ? ", mp4 ou mov" : ""}). Nada foi enviado.`);
|
|
255
|
+
}
|
|
256
|
+
return mime;
|
|
257
|
+
}
|
|
258
|
+
const EXT_IMAGEM = ["png", "jpg", "jpeg", "webp", "gif", "avif"];
|
|
259
|
+
const EXT_VIDEO = ["mp4", "mov"];
|
|
260
|
+
/**
|
|
261
|
+
* Lê o filePath de upload/ingest só quando ele É a peça: a extensão é
|
|
262
|
+
* conferida ANTES de abrir o arquivo (o que não é peça nem chega a ser lido) e
|
|
263
|
+
* os bytes depois. O mime que segue pro servidor é o dos bytes, não o que o
|
|
264
|
+
* nome ou o argumento dizem.
|
|
265
|
+
*/
|
|
266
|
+
export async function lerPecaLocal(filePath, aceitaVideo) {
|
|
267
|
+
const aceitas = aceitaVideo ? [...EXT_IMAGEM, ...EXT_VIDEO] : EXT_IMAGEM;
|
|
268
|
+
const nome = basename(filePath);
|
|
269
|
+
const ext = extname(filePath).slice(1).toLowerCase();
|
|
270
|
+
if (!aceitas.includes(ext)) {
|
|
271
|
+
throw new Error(`filePath aceita só ${aceitas.join(", ")}: "${nome}" não é peça. Nada foi lido nem enviado.`);
|
|
272
|
+
}
|
|
273
|
+
const bytes = await readFile(filePath);
|
|
274
|
+
return { bytes, mimeType: exigePeca(bytes, `"${nome}"`, aceitaVideo) };
|
|
275
|
+
}
|
|
212
276
|
/** Resolve sourceUrl | filePath | base64 nos bytes prontos pro Convex. */
|
|
213
277
|
async function resolveUploadBytes(args) {
|
|
214
278
|
if (args.base64?.trim()) {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
return { base64: args.base64.trim(), mimeType };
|
|
279
|
+
// Mesma régua do filePath: o agente que lê um arquivo e o codifica à mão
|
|
280
|
+
// não pode subir texto como imagem por esta porta.
|
|
281
|
+
const bytes = Buffer.from(args.base64.trim().replace(/^data:[^;]+;base64,/, ""), "base64");
|
|
282
|
+
return { base64: args.base64.trim(), mimeType: exigePeca(bytes, "O base64", false) };
|
|
219
283
|
}
|
|
220
284
|
if (args.filePath) {
|
|
221
285
|
if (isRemoteContext()) {
|
|
222
286
|
throw new Error("filePath só funciona no MCP instalado (stdio). No remoto, mande sourceUrl.");
|
|
223
287
|
}
|
|
224
|
-
const buf = await
|
|
288
|
+
const { bytes: buf, mimeType } = await lerPecaLocal(args.filePath, false);
|
|
225
289
|
if (buf.byteLength > MAX_UPLOAD_BYTES) {
|
|
226
290
|
throw new Error(`Arquivo grande demais: ${(buf.byteLength / 1024 / 1024).toFixed(1)} MB (teto 12 MB).`);
|
|
227
291
|
}
|
|
228
|
-
const mimeType = args.mimeType || mimeFromPath(args.filePath) || "image/png";
|
|
229
292
|
return { base64: buf.toString("base64"), mimeType };
|
|
230
293
|
}
|
|
231
294
|
if (args.sourceUrl) {
|
|
@@ -263,10 +326,8 @@ async function resolveIngestBytes(args) {
|
|
|
263
326
|
};
|
|
264
327
|
const hexDe = (bytes) => createHash("sha256").update(bytes).digest("hex");
|
|
265
328
|
if (args.base64?.trim()) {
|
|
266
|
-
const mimeType = args.mimeType ||
|
|
267
|
-
args.base64.match(/^data:([^;]+);base64,/)?.[1] ||
|
|
268
|
-
"image/png";
|
|
269
329
|
const bytes = Buffer.from(args.base64.trim().replace(/^data:[^;]+;base64,/, ""), "base64");
|
|
330
|
+
const mimeType = exigePeca(bytes, "O base64", true);
|
|
270
331
|
confereTeto(bytes, mimeType, "Peça");
|
|
271
332
|
const hex = hexDe(bytes);
|
|
272
333
|
return { bytes, mimeType, sourceKey: `sha256:${hex}`, sha256: hex };
|
|
@@ -275,8 +336,7 @@ async function resolveIngestBytes(args) {
|
|
|
275
336
|
if (isRemoteContext()) {
|
|
276
337
|
throw new Error("filePath só funciona no MCP instalado (stdio). No remoto, mande sourceUrl.");
|
|
277
338
|
}
|
|
278
|
-
const bytes = await
|
|
279
|
-
const mimeType = args.mimeType || mimeFromPath(args.filePath) || "image/png";
|
|
339
|
+
const { bytes, mimeType } = await lerPecaLocal(args.filePath, true);
|
|
280
340
|
confereTeto(bytes, mimeType, "Arquivo");
|
|
281
341
|
const hex = hexDe(bytes);
|
|
282
342
|
return { bytes, mimeType, sourceKey: `sha256:${hex}`, sha256: hex };
|
package/dist/tools/video.js
CHANGED
|
@@ -60,9 +60,11 @@ import { httpUrl } from "../schema.js";
|
|
|
60
60
|
* com as duas views por ficha: url = depth map puro (driving pros
|
|
61
61
|
* geradores) e skeletonUrl = a soma (sombras + esqueleto, preview
|
|
62
62
|
* humano que separa personagem de objeto). Sem custo.
|
|
63
|
-
* - sonorize: dá som a um clipe SEU já gerado
|
|
64
|
-
*
|
|
65
|
-
*
|
|
63
|
+
* - sonorize: dá som a um clipe SEU já gerado: imageId + prompt do som da cena
|
|
64
|
+
* -> VARIANTE nova com trilha sincronizada (o original fica intacto).
|
|
65
|
+
* engine escolhe o motor: MMAudio v2 (default, som do zero) ou
|
|
66
|
+
* Mirelo SFX 2.0 (guarda a fala do clipe). Cobra por segundo do
|
|
67
|
+
* clipe na tabela do motor; poll via action=status.
|
|
66
68
|
*
|
|
67
69
|
* Vídeos Programáticos (Estúdio de Vídeo, /experimentos/films) — ADMIN, sem custo.
|
|
68
70
|
* O Lab de specs da casa (tabela videoSpecs, 5 kinds: demo | aula-tour | essay |
|
|
@@ -423,6 +425,14 @@ export const videoSchema = z.object({
|
|
|
423
425
|
.enum(["sinapses", "dolar"])
|
|
424
426
|
.optional()
|
|
425
427
|
.describe("action=create: de qual saldo sai o take. Default 'sinapses' (o saldo do App). 'dolar' cobra no saldo em dólar da API da conta (o mesmo de Developers), sem tocar nas Sinapses: mesmo motor, mesma config, preço em dólar do custo do motor naquela duração, resolução e áudio. Use quando a pessoa pedir pra pagar com o saldo da API ou estiver sem Sinapses e com saldo em dólar. Saldo em dólar curto recusa sem cobrar nada; motor sem preço em dólar recusa. Falha do render estorna no mesmo saldo. O valor cobrado volta em pagoEmDolarUsd. Sinapse nunca vira dólar nem o contrário: são duas carteiras."),
|
|
428
|
+
engine: z
|
|
429
|
+
.enum(["mmaudio-v2", "mirelo-sfx-2.0"])
|
|
430
|
+
.optional()
|
|
431
|
+
.describe("action=sonorize: o motor de som. 'mmaudio-v2' (default) gera o som inteiro do zero, pra clipe MUDO: se o clipe já tem fala, ela se perde. " +
|
|
432
|
+
"'mirelo-sfx-2.0' GUARDA a fala que o clipe já tem, tira a música que veio junto e refaz o resto do som em volta: é o motor pra take de Seedance, H3 ou Omni que nasceu com diálogo e trilha que ninguém pediu. " +
|
|
433
|
+
"O Mirelo custa mais por segundo; cote com a pessoa antes. Sem o campo, MMAudio. " +
|
|
434
|
+
"O Mirelo recusa, sem cobrar, peça que entrou de fora (ingest, a casa não sabe a duração dela) e clipe acima de 180s: " +
|
|
435
|
+
"passe a peça de fora antes em action=trim e sonorize o corte; clipe longo, corte em partes."),
|
|
426
436
|
// --- action=generate (legado) ---
|
|
427
437
|
imageId: z
|
|
428
438
|
.string()
|
|
@@ -878,6 +888,8 @@ export async function video(args) {
|
|
|
878
888
|
sessionToken,
|
|
879
889
|
sourceImageId: args.imageId,
|
|
880
890
|
prompt: args.prompt,
|
|
891
|
+
// Só vai quando a pessoa escolheu: backend de antes do Mirelo recusa campo desconhecido.
|
|
892
|
+
...(args.engine ? { engine: args.engine } : {}),
|
|
881
893
|
});
|
|
882
894
|
}
|
|
883
895
|
if (args.action === "extend") {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sapiens-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.99.0",
|
|
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. mcprush.com-bd2545268b8471cdb213c674",
|
|
6
6
|
"type": "module",
|