sapiens-mcp 1.64.1 → 1.64.2

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 CHANGED
@@ -125,7 +125,7 @@ export const TOOLS = {
125
125
  handler: musicator,
126
126
  },
127
127
  sapiens_video: {
128
- 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 (os Veo fast/quality e os dois Omni também aceitam, até 3; Lite/Kling/WAN 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-seedance-15' (Seedance 1.5 Pro: o degrau entre o 1.0 e a linha 2.x; t2v/i2v, 4-12s, 480/720/1080p, som sempre incluso sem toggle; imagem de referência e frame final ficam de fora por ora), '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 depois do Seedance 1.0 Fast, 'sapiens-video-h3' (MiniMax H3: 2K com áudio nativo incluso sem toggle, 5 a 10s, t2v/i2v e frame final; não aceita imagem de referência), 'sapiens-video-wan' (WAN 2.5, imagem que fala/canta com áudio+lip-sync, 5/10s, i2v), '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 10s 720p com áudio nativo; aceita até 3 imagens de referência e ignora durationSec/resolution, que são fixos; editOfImageId aponta um vídeo Omni seu e o prompt edita a MESMA cena, preservando câmera e ambiente) 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). Args create: model, prompt, durationSec, resolution ('480p'/'720p'/'1080p'), 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. 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, Hailuo, H3, Shot Mimic) 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, sem 'durationSec' cobra o piso de duração. 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.",
128
+ 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, Seedance 1.5 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-seedance-15' (Seedance 1.5 Pro: o degrau entre o 1.0 e a linha 2.x; t2v/i2v, 4-12s, 480/720/1080p, som sempre incluso sem toggle; imagem de referência e frame final ficam de fora por ora), '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 depois do Seedance 1.0 Fast, '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 10s 720p com áudio nativo; aceita até 3 imagens de referência e ignora durationSec/resolution, que são fixos; editOfImageId aponta um vídeo Omni seu e o prompt edita a MESMA cena, preservando câmera e ambiente) 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). Args create: model, prompt, durationSec, resolution ('480p'/'720p'/'1080p'; no H3 '768p'/'2k'), 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. 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) 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, sem 'durationSec' cobra o piso de duração. 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.",
129
129
  schema: videoSchema,
130
130
  handler: video,
131
131
  },
@@ -145,7 +145,7 @@ export const TOOLS = {
145
145
  handler: brand,
146
146
  },
147
147
  sapiens_character: {
148
- description: "Personagens (character sheets) do Sapiens — a tabela `influencers`: personagem reutilizável com imagens (pra character-lock em geração) + alma (systemPrompt), tudo amarrado à conta do dono do token (sem admin). Sub-actions: list_public (catálogo global de personagens públicos do Explorar; cada um traz mainImageUrl/imageUrls usáveis direto como referenceImageUrls em sapiens_image; sem custo, sem login), get (detalhe de 1 por characterId — público+ativo qualquer um vê, draft/privado só o dono; systemPrompt só volta pro dono), list_mine (os personagens do próprio user, inclui drafts/privados), create (cria rascunho na conta: name + gender + opcional form/title/systemPrompt), add_image (adiciona imagem ao próprio personagem via imageUrl público OU sourceImageId da galeria; 1ª vira principal), set_card (edita alma/título/lema em inglês/nome/nome por extenso/forma do próprio), set_presence (escreve onde o personagem existe FORA da casa: redes sociais por handle, Fanvue, site e o email dele, este último privado), activate (tira do rascunho e libera o personagem pra USAR nas gerações do dono; exige ≥1 imagem. NÃO torna público: quem publica é set_visibility, e ativar é gesto reversível e privado), set_visibility (isPublic true=Explorar+slug / false=privado). GESTÃO de imagem (por url, pegue as urls atuais em action=get campo imageUrls): remove_image (tira uma), set_main_image (define a principal), reorder_images (nova ordem via orderedUrls, posição 0=principal), e delete (apaga o personagem, permanente). FORMA (`form`, o que tipo de CORPO ele tem: human default, humanoid, animal (bicho real), creature (ser inventado), object, abstract): não é enfeite de cadastro, é o que a ficha, as figurinhas e o vídeo leem pra decidir se descrevem rosto e mãos ou silhueta e postura, e é ele que impede uma criatura de voltar desenhada como pessoa. Mande no create sempre que o personagem não for gente; personagem que já existe sem ele conserta com set_card form=creature. Ausente = human, que é o que a casa desenhava antes do campo existir. NOME E NOME POR EXTENSO (`name` e `fullName`): `name` é como o personagem é CHAMADO e é o que toda tela desenha; `fullName` é o nome inteiro, pra quem tem apelido ('Crow Girl' na tela, 'Kaia Crowe' por extenso). Um não substitui o outro, e o extenso não mexe no slug da página nem no cartão de nome do vídeo: batizar personagem que já existe não muda endereço publicado nem assinatura de peça que já saiu. Vem em action=get e list_mine no campo `fullName` (null = ainda sem nome por extenso). TRAÇO (`style`, em que TÉCNICA ele é feito: auto default, realista, anime, manhwa, 3d, custom): irmão da forma, e a divisão é limpa, a forma diz que CORPO é esse e o traço diz como ele é DESENHADO. As mesmas três peças leem daqui. No 'auto' a peça não afirma técnica nenhuma e as imagens de referência mandam; 'realista' é fotografia, 'anime' é cel shading com contorno de tinta, 'manhwa' é pintura de webtoon, '3d' é render com material e oclusão, 'custom' usa a linha escrita em `styleNote` (até 140 caracteres, ex: aquarela sobre papel texturizado). Mande sempre que o personagem tiver técnica definida: até ago/2026 a ficha cravava vocabulário de desenho e devolvia personagem fotográfico virado em ilustração. Conserto sem custo em quem já existe: set_card style=realista. PRESENÇA (set_presence, de graça): o ENDEREÇO do personagem, o que faltava pra ele existir fora da ficha. `socials` é {rede: handle} nas redes instagram, tiktok, youtube, x, threads, bluesky, twitch, spotify, fanvue, patreon, onlyfans, telegram; `websiteUrl` é o site dele e `email` é o email do personagem, o que cadastra e recupera as contas dele nas redes. As redes e o site são PÚBLICOS; o email é PRIVADO e fica só com o dono, mesmo com o personagem publicado, porque email é chave de conta e isca de spam, não canal de contato. Em action=get e list_public de personagem de OUTRA pessoa, o campo simplesmente não vem. É MERGE: mandar {fanvue:'helen'} não apaga o instagram, e pra apagar uma rede se manda ela vazia. O que volta em action=get são as duas formas, `presence` (o handle cru, que é o que se reedita) e `presenceLinks` (o link já montado, pra mostrar sem remontar URL na mão). Vale a pena preencher quando o personagem TEM conta de verdade: é o que separa uma ficha de um ser com endereço, e a página pública dele desenha as redes e o site (nunca o email). FICHA (generate_sheet, COBRA 450 Sinapses): desenha a página-pôster do personagem no traço das imagens que ele já tem (exige pelo menos uma), em duas orientações (arg `orientation`): 'portrait' (default) é a página de processo, pose, expressões, trocas de roupa e adereços soltos na folha; 'landscape' é a prancha larga, com a volta completa à esquerda, a figura grande no meio, poses à direita, estudos de silhueta, expressão e detalhe embaixo e um painel CHARACTER ID na ponta. A personalidade sai da alma (systemPrompt) e é ela que escolhe roupa e objeto, então personagem com alma escrita rende ficha melhor. Cada geração é um estilo NOVO e elas acumulam no personagem (campo sheetUrls em action=get), nenhuma apaga a anterior, e a ficha já entra na galeria dele como referência das próximas gerações. É geração síncrona: se voltar Timeout, cheque action=get antes de repetir, senão cobra duas vezes. STICKERS (generate_stickers, COBRA 550 Sinapses): desenha 5 stickers do personagem DE UMA VEZ. Uma folha só, em 2K, com as cinco figuras separadas sobre um fundo verde chroma, recortada por código em peças 512x512 transparentes abaixo de 100KB (o teto do WhatsApp). É por isso que sai o preço de UMA imagem em 2K e não de cinco: quem paga é a folha. As peças entram no pack do personagem (um por personagem, os lotes acumulam) e já ficam no picker de expressão do dono, no chat e no Fórum. Arg `moods`: até 5 humores do vocabulário comum por slug (kkkkk, amei, isso, hmm, chega, que, aff, bora, socorro, seinao, valeu, ainao, seila, ideia, calma, contatudo, perfeito, euavisei, naovourir, zzz, somaisum, sextou, merecido, quedia, tudobem); faltando, a casa completa com os mais usados. Arg `hint`: direcionamento curto do autor (roupa, adereço, clima), até 140 caracteres. Arg `stickerTier`: 'folha' (default) é esse lote de cinco, desenhado no Gemini 3.1 Flash; 'unica' (COBRA 900 Sinapses) desenha UM sticker por vez no Gemini 3 Pro, o motor mais fiel da casa, com a figura sozinha no quadro e o dobro de pixel por peça, e leva só o PRIMEIRO mood da lista. Pra encher o pack, folha; pra traço difícil ou a reação que vira a cara do personagem, a unica. Ao oferecer a escolha, diga o NOME DO MOTOR e o que ele troca: adjetivo vago de acabamento não informa nada a quem vai pagar. Os dois caem no MESMO pack e acumulam. Sem legenda queimada na imagem, de propósito: modelo erra acento em português, então o rótulo fica na row e serve de busca no picker. Exige pelo menos uma imagem no personagem (é dela que sai a cara) e é geração síncrona: se voltar Timeout, cheque sapiens_gallery antes de repetir. Quando a resposta vem com ok=false, a folha foi gerada e paga mas o corte falhou; ela está na galeria e o recorte de novo é de graça, pela web. Publicar o pack na vitrine e o carimbo da casa (que é o que põe no picker de todo mundo) são gestos da web, não desta tool. CHARACTER VIDEO (a ficha que anda): o personagem atravessa 6 mundos em 12s, trocando de roupa em cada um, com som gerado junto, e o último plano fecha a peça com ele parando e encarando a câmera. A peça volta FECHADA pelas duas portas (tela e agente), sem ninguém pedir: o personagem se apresenta no cartão de nome por cima do fim do último plano, com o LEMA em inglês embaixo (o campo `titleEn`, escrito uma vez em set_card), e só depois a casa assina. Quem não tem lema recebe o subtítulo que o roteiro inventou naquele take, e ele muda no take seguinte. O fecho é asset, não geração: zero Sinapse a mais, e é fail-open, então a resposta traz `closed` e `nameCard` dizendo o que entrou de verdade em vez de prometer um cartão que não está no arquivo. Pra colocar esse cartão num vídeo que JÁ existe, o caminho é a ficha do take na web (gaveta do fecho, 'Apresentação do personagem'), também sem custo. Exige FICHA gerada (é dela que saem a cara e o guarda-roupa), não só imagem. Duas actions, nesta ordem: plan_video (COBRA 50 Sinapses) devolve os 6 planos que a alma do personagem escolheu, com ambiente, ato, enquadramento e roupa. Cada plano vem nas duas línguas: em inglês (setting/act/wardrobe, que é o que vai pro motor) e em português (settingPt/actPt/wardrobePt). MOSTRE a versão em português pro autor, o público da casa é brasileiro e roteiro que ele lê de través não é roteiro aprovado; peça de novo quantas vezes ele quiser, porque trocar sai por 50 e o take errado sai por milhares. replan_shot (COBRA 15 Sinapses) reescreve UM plano e não toca nos outros cinco: os seis são cenas independentes, então quando o autor gosta de quatro e implica com um, troque só aquele em vez de sortear tudo de novo (mande os 6 planos em `shots`, o número em `shotIndex`, e o que ele quer diferente em `shotHint`; volta só o plano trocado, e é você que remonta o roteiro). Depois generate_video (COBRA) renderiza, com os planos aprovados no arg `shots` e o MOTOR no arg `videoTier`: 'draft' (5.400 Sinapses) é o Seedance 2.0 Mini, metade do preço, que tropeça em mão, pouca luz e câmera rápida, e 'final' (8.640 Sinapses) é o Seedance 2.0 Fast, que segura o que o Mini erra. A peça é a MESMA nos dois (mesmos 6 planos, 12s, 720p, com som), então ofereça pelo nome do motor e pelo que ele troca, nunca por adjetivo vago de acabamento. Vertical ou horizontal pelo arg `orientation`. Chamar generate_video SEM `shots` funciona, mas escreve um roteiro novo às cegas e cobra igual: não faça isso sem o autor ter visto o que vai receber. É geração síncrona e demorada: se voltar Timeout, cheque sapiens_gallery antes de repetir. Fluxo de criação: create → add_image (1+) → set_card (opcional) → activate. PARE AÍ. O personagem nasce e continua PRIVADO, e é assim que ele serve pro dono: dá pra gerar, referenciar e iterar sem ninguém ver. set_visibility isPublic=true é o gesto de PUBLICAR no Explorar, com slug público, e nÃO é passo de fluxo: só chame quando o dono pedir pra publicar aquele personagem, com essas palavras. Na dúvida, não publique e pergunte. Pra usar um personagem público como referência numa geração, pegue mainImageUrl em list_public/get e passe em sapiens_image referenceImageUrls.",
148
+ description: "Personagens (character sheets) do Sapiens — a tabela `influencers`: personagem reutilizável com imagens (pra character-lock em geração) + alma (systemPrompt), tudo amarrado à conta do dono do token (sem admin). Sub-actions: list_public (catálogo global de personagens públicos do Explorar; cada um traz mainImageUrl/imageUrls usáveis direto como referenceImageUrls em sapiens_image; sem custo, sem login), get (detalhe de 1 por characterId — público+ativo qualquer um vê, draft/privado só o dono; systemPrompt só volta pro dono), list_mine (os personagens do próprio user, inclui drafts/privados), create (cria rascunho na conta: name + gender + opcional form/title/systemPrompt), add_image (adiciona imagem ao próprio personagem via imageUrl público OU sourceImageId da galeria; 1ª vira principal), set_card (edita alma/título/lema em inglês/nome/nome por extenso/forma do próprio), set_presence (escreve onde o personagem existe FORA da casa: redes sociais por handle, Fanvue, site e o email dele, este último privado), activate (tira do rascunho e libera o personagem pra USAR nas gerações do dono; exige ≥1 imagem. NÃO torna público: quem publica é set_visibility, e ativar é gesto reversível e privado), set_visibility (isPublic true=Explorar+slug / false=privado). GESTÃO de imagem (por url, pegue as urls atuais em action=get campo imageUrls): remove_image (tira uma), set_main_image (define a principal), reorder_images (nova ordem via orderedUrls, posição 0=principal), e delete (apaga o personagem, permanente). FORMA (`form`, o que tipo de CORPO ele tem: human default, humanoid, animal (bicho real), creature (ser inventado), object, abstract): não é enfeite de cadastro, é o que a ficha, as figurinhas e o vídeo leem pra decidir se descrevem rosto e mãos ou silhueta e postura, e é ele que impede uma criatura de voltar desenhada como pessoa. Mande no create sempre que o personagem não for gente; personagem que já existe sem ele conserta com set_card form=creature. Ausente = human, que é o que a casa desenhava antes do campo existir. NOME E NOME POR EXTENSO (`name` e `fullName`): `name` é como o personagem é CHAMADO e é o que toda tela desenha; `fullName` é o nome inteiro, pra quem tem apelido ('Crow Girl' na tela, 'Kaia Crowe' por extenso). Um não substitui o outro, e o extenso não mexe no slug da página nem no cartão de nome do vídeo: batizar personagem que já existe não muda endereço publicado nem assinatura de peça que já saiu. Vem em action=get e list_mine no campo `fullName` (null = ainda sem nome por extenso). TRAÇO (`style`, em que TÉCNICA ele é feito: auto default, realista, anime, manhwa, 3d, custom): irmão da forma, e a divisão é limpa, a forma diz que CORPO é esse e o traço diz como ele é DESENHADO. As mesmas três peças leem daqui. No 'auto' a peça não afirma técnica nenhuma e as imagens de referência mandam; 'realista' é fotografia, 'anime' é cel shading com contorno de tinta, 'manhwa' é pintura de webtoon, '3d' é render com material e oclusão, 'custom' usa a linha escrita em `styleNote` (até 140 caracteres, ex: aquarela sobre papel texturizado). Mande sempre que o personagem tiver técnica definida: até ago/2026 a ficha cravava vocabulário de desenho e devolvia personagem fotográfico virado em ilustração. Conserto sem custo em quem já existe: set_card style=realista. PRESENÇA (set_presence, de graça): o ENDEREÇO do personagem, o que faltava pra ele existir fora da ficha. `socials` é {rede: handle} nas redes instagram, tiktok, youtube, x, threads, bluesky, twitch, spotify, fanvue, patreon, onlyfans, telegram; `websiteUrl` é o site dele e `email` é o email do personagem, o que cadastra e recupera as contas dele nas redes. As redes e o site são PÚBLICOS; o email é PRIVADO e fica só com o dono, mesmo com o personagem publicado, porque email é chave de conta e isca de spam, não canal de contato. Em action=get e list_public de personagem de OUTRA pessoa, o campo simplesmente não vem. É MERGE: mandar {fanvue:'helen'} não apaga o instagram, e pra apagar uma rede se manda ela vazia. O que volta em action=get são as duas formas, `presence` (o handle cru, que é o que se reedita) e `presenceLinks` (o link já montado, pra mostrar sem remontar URL na mão). Vale a pena preencher quando o personagem TEM conta de verdade: é o que separa uma ficha de um ser com endereço, e a página pública dele desenha as redes e o site (nunca o email). FICHA (generate_sheet, COBRA 450 Sinapses): desenha a página-pôster do personagem no traço das imagens que ele já tem (exige pelo menos uma), em duas orientações (arg `orientation`): 'portrait' (default) é a página de processo, pose, expressões, trocas de roupa e adereços soltos na folha; 'landscape' é a prancha larga, com a volta completa à esquerda, a figura grande no meio, poses à direita, estudos de silhueta, expressão e detalhe embaixo e um painel CHARACTER ID na ponta. A personalidade sai da alma (systemPrompt) e é ela que escolhe roupa e objeto, então personagem com alma escrita rende ficha melhor. Cada geração é um estilo NOVO e elas acumulam no personagem (campo sheetUrls em action=get), nenhuma apaga a anterior, e a ficha já entra na galeria dele como referência das próximas gerações. É geração síncrona: se voltar Timeout, cheque action=get antes de repetir, senão cobra duas vezes. STICKERS (generate_stickers, COBRA 550 Sinapses): desenha 5 stickers do personagem DE UMA VEZ. Uma folha só, em 2K, com as cinco figuras separadas sobre um fundo verde chroma, recortada por código em peças 512x512 transparentes abaixo de 100KB (o teto do WhatsApp). É por isso que sai o preço de UMA imagem em 2K e não de cinco: quem paga é a folha. As peças entram no pack do personagem (um por personagem, os lotes acumulam) e já ficam no picker de expressão do dono, no chat e no Fórum. Arg `moods`: até 5 humores do vocabulário comum por slug (kkkkk, amei, isso, hmm, chega, que, aff, bora, socorro, seinao, valeu, ainao, seila, ideia, calma, contatudo, perfeito, euavisei, naovourir, zzz, somaisum, sextou, merecido, quedia, tudobem); faltando, a casa completa com os mais usados. Arg `hint`: direcionamento curto do autor (roupa, adereço, clima), até 140 caracteres. Arg `stickerTier`: 'folha' (default) é esse lote de cinco, desenhado no Gemini 3.1 Flash; 'unica' (COBRA 900 Sinapses) desenha UM sticker por vez no Gemini 3 Pro, o motor mais fiel da casa, com a figura sozinha no quadro e o dobro de pixel por peça, e leva só o PRIMEIRO mood da lista. Pra encher o pack, folha; pra traço difícil ou a reação que vira a cara do personagem, a unica. Ao oferecer a escolha, diga o NOME DO MOTOR e o que ele troca: adjetivo vago de acabamento não informa nada a quem vai pagar. Os dois caem no MESMO pack e acumulam. Sem legenda queimada na imagem, de propósito: modelo erra acento em português, então o rótulo fica na row e serve de busca no picker. Exige pelo menos uma imagem no personagem (é dela que sai a cara) e é geração síncrona: se voltar Timeout, cheque sapiens_gallery antes de repetir. Quando a resposta vem com ok=false, a folha foi gerada e paga mas o corte falhou; ela está na galeria e o recorte de novo é de graça, pela web. Publicar o pack na vitrine e o carimbo da casa (que é o que põe no picker de todo mundo) são gestos da web, não desta tool. CHARACTER VIDEO (a ficha que anda): o personagem atravessa 6 mundos em 12s, trocando de roupa em cada um, com som gerado junto, e o último plano fecha a peça com ele parando e encarando a câmera. A peça volta FECHADA pelas duas portas (tela e agente), sem ninguém pedir: o personagem se apresenta no cartão de nome por cima do fim do último plano, com o LEMA em inglês embaixo (o campo `titleEn`, escrito uma vez em set_card), e só depois a casa assina. Quem não tem lema recebe o subtítulo que o roteiro inventou naquele take, e ele muda no take seguinte. O fecho é asset, não geração: zero Sinapse a mais, e é fail-open, então a resposta traz `closed` e `nameCard` dizendo o que entrou de verdade em vez de prometer um cartão que não está no arquivo. Pra colocar esse cartão num vídeo que JÁ existe, o caminho é a ficha do take na web (gaveta do fecho, 'Apresentação do personagem'), também sem custo. Exige FICHA gerada (é dela que saem a cara e o guarda-roupa), não só imagem. Duas actions, nesta ordem: plan_video (COBRA 50 Sinapses) devolve os 6 planos que a alma do personagem escolheu, com ambiente, ato, enquadramento e roupa. Cada plano vem nas duas línguas: em inglês (setting/act/wardrobe, que é o que vai pro motor) e em português (settingPt/actPt/wardrobePt). MOSTRE a versão em português pro autor, o público da casa é brasileiro e roteiro que ele lê de través não é roteiro aprovado; peça de novo quantas vezes ele quiser, porque trocar sai por 50 e o take errado sai por milhares. replan_shot (COBRA 15 Sinapses) reescreve UM plano e não toca nos outros cinco: os seis são cenas independentes, então quando o autor gosta de quatro e implica com um, troque só aquele em vez de sortear tudo de novo (mande os 6 planos em `shots`, o número em `shotIndex`, e o que ele quer diferente em `shotHint`; volta só o plano trocado, e é você que remonta o roteiro). Depois generate_video (COBRA) renderiza, com os planos aprovados no arg `shots` e o MOTOR no arg `videoTier`: 'draft' (5.400 Sinapses) é o Seedance 2.0 Mini, metade do preço, que tropeça em mão, pouca luz e câmera rápida, e 'final' (8.640 Sinapses) é o Seedance 2.0 Fast, que segura o que o Mini erra. A peça é a MESMA nos dois (mesmos 6 planos, 12s, 720p, com som), então ofereça pelo nome do motor e pelo que ele troca, nunca por adjetivo vago de acabamento. Vertical ou horizontal pelo arg `orientation`. Chamar generate_video SEM `shots` funciona, mas escreve um roteiro novo às cegas e cobra igual: não faça isso sem o autor ter visto o que vai receber. É geração demorada: se voltar Timeout, cheque sapiens_gallery antes de repetir. Resposta com `pending: true` (sem `url`) quer dizer ACEITO E COBRADO: o servidor continua renderizando sozinho (até 25 min) e a peça chega na ficha já fechada; NÃO repita a chamada, isso cobraria de novo, confira depois em sapiens_gallery. Fluxo de criação: create → add_image (1+) → set_card (opcional) → activate. PARE AÍ. O personagem nasce e continua PRIVADO, e é assim que ele serve pro dono: dá pra gerar, referenciar e iterar sem ninguém ver. set_visibility isPublic=true é o gesto de PUBLICAR no Explorar, com slug público, e nÃO é passo de fluxo: só chame quando o dono pedir pra publicar aquele personagem, com essas palavras. Na dúvida, não publique e pergunte. Pra usar um personagem público como referência numa geração, pegue mainImageUrl em list_public/get e passe em sapiens_image referenceImageUrls.",
149
149
  schema: characterSchema,
150
150
  handler: character,
151
151
  },
package/dist/skills.js CHANGED
@@ -234,8 +234,8 @@ Duração é o que pesa aqui, não o modelo: um take de 30s em 720p passa de 40
234
234
 
235
235
  ## Os outros modelos
236
236
 
237
- - \`sapiens-video-h3\`: MiniMax H3, o mais barato por pixel da casa, com som nativo, texto ou imagem. 5 a 15s em \`2k\` ou \`768p\` (o 2K longo demora uns 9 minutos: volta \`pending\` e termina sozinho). 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.
238
- - \`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.
237
+ - \`sapiens-video-h3\`: MiniMax H3, o mais barato por pixel da casa, com som nativo, texto ou imagem. 5 a 15s em \`2k\` ou \`768p\` (o 2K longo demora uns 9 minutos: volta \`pending\` e termina sozinho). 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 33% mais por segundo.
238
+ - \`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, vai a 15s em 480p e 720p e para em 10s no 1080p.
239
239
  - \`sapiens-video-kling\`: Kling 3.0 Pro, anima imagem, 3 a 15s, som opcional.
240
240
  - \`sapiens-video-wan\`: WAN 2.5, imagem que fala ou canta, com lip-sync, 5 ou 10s.
241
241
  - \`sapiens-video-wan-3\`: WAN 3.0, texto ou imagem, som nativo, frame final e 1080p, 5 a 10s.
@@ -404,6 +404,8 @@ sapiens_character action=set_card systemPrompt="<a alma dele: quem é, como fala
404
404
  sapiens_character action=activate
405
405
  \`\`\`
406
406
 
407
+ **Personagem da casa é ADULTO, e o servidor cobra.** 18 anos é o piso, 21 ou mais é o padrão: a alma declara a idade em número na primeira linha ("28 anos", nunca "parece mais nova que") e não escreve "criança", "adolescente", "menino", "menina" nem idade abaixo de 18, nem falando do passado dele nem de terceiros (troque por "casa de família", "os mais novos"). O \`create\` e o \`set_card\` recusam com a reescrita sugerida; não insista com a mesma frase, reescreva.
408
+
407
409
  **Ativar NÃO é publicar, e publicar não é passo de fluxo.** O \`activate\` só tira o personagem do rascunho pra ele poder ser USADO: ele continua privado, só você vê, e dá pra gerar e iterar com ele à vontade assim. Quem coloca no Explorar, com página pública e slug, é outro gesto (\`set_visibility isPublic=true\`), e esse aí só acontece quando você pedir com essas palavras. Um agente operando por você nunca deve publicar por conta própria: na dúvida, deixa privado e pergunta. Ativar dispara um aviso no Discord da casa (é o alarme que te conta que alguém mexeu), publicar é que muda quem enxerga.
408
410
 
409
411
  **O \`titleEn\` é o lema que a peça em movimento escreve.** O cartão de nome que fecha o Character Video desenha o nome do personagem e, embaixo, essa linha. Cartão é assinatura: precisa sair igual em toda peça, e é por isso que o lema mora na ficha em vez de nascer a cada roteiro. Personagem sem \`titleEn\` recebe o subtítulo que o roteiro daquele take inventou, e o próximo take vem com outro. Teto de 48 caracteres, que é o que cabe numa linha do cartão sem encolher a letra.
@@ -521,10 +521,16 @@ export async function character(args) {
521
521
  });
522
522
  }
523
523
  // -------- generate_video: o Character Video (a ficha que anda) --------
524
- // Geração SÍNCRONA que COBRA CARO e demora minutos: cai na regra do timeout.
524
+ // Geração que COBRA CARO e demora minutos: cai na regra do timeout.
525
525
  // Se voltar Timeout, NÃO repita às cegas: confira em sapiens_gallery se o
526
526
  // take caiu.
527
527
  //
528
+ // `pending: true` na resposta (sem `url`): o take foi ACEITO E COBRADO e o
529
+ // servidor continua renderizando por conta própria (até 25 min). NÃO repita
530
+ // a chamada, isso cobraria de novo; a peça chega na ficha do personagem
531
+ // sozinha, já fechada (cartão + marca). Diga isso ao autor e confira depois
532
+ // em sapiens_gallery (ou sapiens_character action=get).
533
+ //
528
534
  // Mande `shots` com o roteiro que o autor APROVOU (o que veio do plan_video,
529
535
  // com edição dele se houver). Sem `shots`, o servidor escreve um roteiro novo
530
536
  // na hora e cobra do mesmo jeito, então o caminho educado é sempre planejar,
@@ -70,6 +70,11 @@ const CHANNELS = [
70
70
  "youtube-community",
71
71
  // Update de Canal do WhatsApp: browser-driven, não há API de Canal.
72
72
  "whatsapp",
73
+ // Fanvue: o feed (post) e a caixa de mensagem (mass message). Duas
74
+ // superfícies da mesma conta, dois canais. A peça daqui escolhe QUEM VÊ
75
+ // (audience, só no feed) e POR QUANTO (priceCents, nos dois).
76
+ "fanvue",
77
+ "fanvue-dm",
73
78
  // Segunda conta da mesma rede, nomeada (Model A).
74
79
  "instagram-pro",
75
80
  "threads-pro",
@@ -117,6 +122,14 @@ export const distributionSchema = z.object({
117
122
  .boolean()
118
123
  .optional()
119
124
  .describe("queue: despachar de propósito por uma conta de OUTRA frente (a peça da Helen saindo pelo canal da casa). Sem isto o servidor recusa quando a identidade da peça discorda da identidade declarada da conta, e o erro diz quais são as contas certas."),
125
+ audience: z
126
+ .enum(["public", "subscribers"])
127
+ .optional()
128
+ .describe("queue, só canal fanvue: QUEM VÊ o post. subscribers = só quem paga a assinatura; public = quem segue de graça também. Ausente = subscribers, porque campo esquecido não pode abrir peça fechada. Nos outros canais é ignorado."),
129
+ priceCents: z
130
+ .number()
131
+ .optional()
132
+ .describe("queue, só canais fanvue e fanvue-dm: preço em CENTAVOS de dólar (pay-per-view). 1200 = $12. Piso de 300 na API deles, e peça paga EXIGE mídia. Ausente ou 0 = de graça pra quem já tem acesso."),
120
133
  notes: z.string().optional().describe("queue: recado pra você mesmo na hora de postar."),
121
134
  itemId: z.string().optional().describe("status: o id da peça (vem do list ou do queue)."),
122
135
  status: z
@@ -150,6 +163,8 @@ export async function distribution(args) {
150
163
  assetKind: args.assetKind,
151
164
  voice: args.voice,
152
165
  allowOtherFront: args.allowOtherFront,
166
+ audience: args.audience,
167
+ priceCents: args.priceCents,
153
168
  notes: args.notes,
154
169
  });
155
170
  return {
@@ -15,6 +15,7 @@ const MODELS = [
15
15
  "nano-banana-2", // gemini-3.1-flash-image-preview (V2, Flash 3.1) · COM refs · adder até 4K · DEFAULT
16
16
  "gpt-image-2-low", // Azure gpt-image-2 quality=low
17
17
  "gpt-image-2-high", // Azure gpt-image-2 quality=high · o motor de texto legível
18
+ "muse-image", // Meta Muse Image · barato na edição por referência (10 refs no catálogo, 5 pelo MCP) · sem escada de resolução · moderação apertada, não é +18
18
19
  // ByteDance via ModelArk direto. Corp/censurado, 2K nativo, COM refs (até 4).
19
20
  // (O "nova-canvas" ficava aqui e saiu: a AWS matou o modelo. Pedido antigo
20
21
  // ainda funciona, o backend faz o alias pro gpt-image-2-low.)
@@ -34,6 +35,7 @@ const MODELS = [
34
35
  "wavespeed-krea2", // Krea-2 Turbo pela WaveSpeed: MESMA base das fal-krea2-*, sem o
35
36
  // classificador de entrada da fal (que barra corpo nu como assunto mesmo sem palavra
36
37
  // de nudez no prompt). Aceita referência de VERDADE (img2img) + Ousadia. 2K nativo.
38
+ "wavespeed-krea2-base", // Krea 2 Base: a MESMA base 12B da Livre, sem LoRA nenhuma (nem realismo, nem NSFW). Img2img + 2K.
37
39
  // Civitai (sdcpp, rápido). Família FLUX no Civitai saiu: lenta demais (>5min,
38
40
  // estoura o poll). Pra flux uncensored use wavespeed-flux-nsfw.
39
41
  "civitai-wai-illustrious", // anime Illustrious
@@ -45,6 +47,12 @@ const MODELS = [
45
47
  // LoRA do catálogo não vai junto (o endpoint de style não a aceita).
46
48
  "fal-krea2-realism-v2", // Krea 2 Realism (LoRA RudySen, venceu o A/B de 30/ago) · txt2img
47
49
  ];
50
+ // Motor ATIVO no catálogo que fica fora do enum DE PROPÓSITO, com o motivo. O
51
+ // gate audit:catalog-parity (apps/sapiens) lê este mapa: id ativo que não está
52
+ // nem no enum nem aqui é erro (o Krea 2 Base e o Muse Image ficaram semanas
53
+ // assim, listados em action=models e recusados no generate). Hoje vazio: todo
54
+ // motor ativo de imagem entra.
55
+ export const IMAGE_FORA_DE_PROPOSITO = {};
48
56
  export const imageSchema = z.object({
49
57
  action: z.enum(["generate", "request_generation", "compose", "models"]),
50
58
  prompt: z
@@ -54,7 +62,7 @@ export const imageSchema = z.object({
54
62
  model: z
55
63
  .enum(MODELS)
56
64
  .optional()
57
- .describe("Default 'nano-banana-2' (Flash 3.1 com refs). 'nano-banana-max' (Pro 3) = qualidade alta. 'gpt-image-2-low/high' = Azure. 'seedream-4-5'/'seedream-5-0'/'seedream-5-0-pro' = ByteDance 2K nativo, cinematográfico, aceita até 4 referências (o 5.0 é a geração nova, entende prompt complexo melhor; o 5.0-pro é o topo da linha). 'grok-2-image'/'grok-2-image-quality' = xAI Grok Imagine da geração anterior (moderação frouxa +18, aceita refs e aspect; quality é mais fiel pra character lock); 'grok-imagine-2' = Grok Imagine Image 2.0, a geração nova de ago/2026, que é a melhor da linha integrando desenho e foto na mesma peça. DEGEN (uncensored, gate +18): 'wavespeed-chroma' (fotorrealista rápido), 'wavespeed-flux2' (Flux.2 Klein), 'wavespeed-flux-nsfw' (flux+LoRA NSFW, Ousadia regulável via loraIntensity), 'wavespeed-klein-anime' (Flux.2 Klein + LoRA anime, inteligente+controlável), 'wavespeed-klein-anime-plus' (Klein anime +18, Ousadia regulável), 'wavespeed-krea2' (Krea 2 Livre: a MESMA base 12B das fal-krea2-*, hospedada na WaveSpeed, SEM o classificador de entrada da fal é o caminho quando a fal devolve 422 num prompt que não tem palavra de nudez; aceita referência img2img de verdade, Ousadia regulável e 2K) = WaveSpeed rápido; 'civitai-wai-illustrious'/'civitai-nova-anime-xl' (anime), 'civitai-pony-v6' (Pony V6 XL, base nº1) = Civitai sdcpp rápido. 'fal-krea2-realism-v2' (na tela chama Krea 2 Realism: Krea-2 Turbo 12B + LoRA de realismo, fal.ai, ~4s, pele crua e contraluz que não lava; o sufixo -v2 do id é o nome do arquivo de LoRA, não geração nova do motor) = aceita até 3 referências de ESTILO (paleta/luz/textura de uma série), não character lock; com referência a LoRA não vai junto."),
65
+ .describe("Default 'nano-banana-2' (Flash 3.1 com refs). 'nano-banana-max' (Pro 3) = qualidade alta. 'gpt-image-2-low/high' = Azure. 'muse-image' (Muse Image, da Meta) = barato na edição por referência e bom pra segurar personagem (10 refs no catálogo; pelo MCP vale o teto de 5 do campo referenceImageUrls); sem escada de resolução (o motor decide o tamanho e cobra o mesmo) e moderação apertada, NÃO serve pra +18. 'seedream-4-5'/'seedream-5-0'/'seedream-5-0-pro' = ByteDance 2K nativo, cinematográfico, aceita até 4 referências (o 5.0 é a geração nova, entende prompt complexo melhor; o 5.0-pro é o topo da linha). 'grok-2-image'/'grok-2-image-quality' = xAI Grok Imagine da geração anterior (moderação frouxa +18, aceita refs e aspect; quality é mais fiel pra character lock); 'grok-imagine-2' = Grok Imagine Image 2.0, a geração nova de ago/2026, que é a melhor da linha integrando desenho e foto na mesma peça. DEGEN (uncensored, gate +18): 'wavespeed-chroma' (fotorrealista rápido), 'wavespeed-flux2' (Flux.2 Klein), 'wavespeed-flux-nsfw' (flux+LoRA NSFW, Ousadia regulável via loraIntensity), 'wavespeed-klein-anime' (Flux.2 Klein + LoRA anime, inteligente+controlável), 'wavespeed-klein-anime-plus' (Klein anime +18, Ousadia regulável), 'wavespeed-krea2' (Krea 2 Livre: a MESMA base 12B das fal-krea2-*, hospedada na WaveSpeed, SEM o classificador de entrada da fal: é o caminho quando a fal devolve 422 num prompt que não tem palavra de nudez; aceita referência img2img de verdade, Ousadia regulável e 2K), 'wavespeed-krea2-base' (Krea 2 Base: a mesma base 12B da Livre SEM LoRA nenhuma, nem realismo nem NSFW; é o motor como ele é, com img2img e 2K, pra quem quer ver a base crua ou temperar com o próprio prompt; sem Ousadia, que é a LoRA que ele não carrega) = WaveSpeed rápido; 'civitai-wai-illustrious'/'civitai-nova-anime-xl' (anime), 'civitai-pony-v6' (Pony V6 XL, base nº1) = Civitai sdcpp rápido. 'fal-krea2-realism-v2' (na tela chama Krea 2 Realism: Krea-2 Turbo 12B + LoRA de realismo, fal.ai, ~4s, pele crua e contraluz que não lava; o sufixo -v2 do id é o nome do arquivo de LoRA, não geração nova do motor) = aceita até 3 referências de ESTILO (paleta/luz/textura de uma série), não character lock; com referência a LoRA não vai junto."),
58
66
  aspectRatio: z
59
67
  .enum(["1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3"])
60
68
  .optional()
@@ -71,11 +79,11 @@ export const imageSchema = z.object({
71
79
  referenceImageUrls: z
72
80
  .array(httpUrl())
73
81
  .optional()
74
- .describe("Até 4 URLs públicas de referência pra combinar numa geração só (character/style lock), igual ao modal 'Selecionar Referência' do gerador web. Fontes: sua galeria (sapiens_gallery, campo url), o Acervo, e personagens públicos (sapiens_character action=list_public → mainImageUrl/imageUrls). Restrito a hosts do Sapiens (Bunny CDN / Convex) + Wikimedia. Requer model com refs: nano-banana-2, gpt-image-2-*, grok-2-image* ou fal-krea2-* (nesses, referência de ESTILO, teto de 3). Soma com sourceImageIds (teto total de 4)."),
82
+ .describe("URLs públicas de referência pra combinar numa geração só (character/style lock), igual ao modal 'Selecionar Referência' do gerador web. Fontes: sua galeria (sapiens_gallery, campo url), o Acervo, e personagens públicos (sapiens_character action=list_public → mainImageUrl/imageUrls). Restrito a hosts do Sapiens (Bunny CDN / Convex) + Wikimedia. Requer model com refs (o campo supportsReferences em action=models é a fonte): nano-banana-*, gpt-image-2-*, muse-image, seedream-*, grok-* (até 3), wavespeed-krea2 e wavespeed-krea2-base (img2img: a primeira referência vira a imagem-base, 1 ref) ou fal-krea2-* (referência de ESTILO, teto de 3). Soma com sourceImageIds: até 5 no total (acima disso o servidor recusa a chamada), e cada motor corta no seu teto quando ele é menor (Seedream 4, Grok 3, Krea 2 Livre/Base 1; o campo maxReferences em action=models é a fonte)."),
75
83
  sourceImageIds: z
76
84
  .array(z.string())
77
85
  .optional()
78
- .describe("Até 4 IDs de imagens da SUA galeria (`generatedImages:_id` via sapiens_gallery) usadas como referência. Alternativa por-id ao referenceImageUrls pras suas próprias imagens (ownership checado). Soma com referenceImageUrls (teto total de 4)."),
86
+ .describe("IDs de imagens da SUA galeria (`generatedImages:_id` via sapiens_gallery) usadas como referência. Alternativa por-id ao referenceImageUrls pras suas próprias imagens (ownership checado). Soma com referenceImageUrls: até 5 no total, e o motor corta no teto dele quando é menor (ver referenceImageUrls)."),
79
87
  brandSlug: z
80
88
  .string()
81
89
  .optional()
@@ -45,7 +45,7 @@ export const referenceSchema = z.object({
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
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/people/hasObject/objeto)."),
48
+ "'pose_map' (seu banco privado de POSE: mapa de profundidade de corpo num quadro parado, aceita term/orientation/people/hasObject/objeto/favoritesOnly/collection/sort, mais semantic e similarTo pra busca por sentido)."),
49
49
  handle: z
50
50
  .string()
51
51
  .optional()
@@ -100,6 +100,29 @@ export const referenceSchema = z.object({
100
100
  .string()
101
101
  .optional()
102
102
  .describe("Só bucket 'pose_map': um objeto específico ('corda', 'espada', 'arco', 'cama')."),
103
+ favoritesOnly: z
104
+ .boolean()
105
+ .optional()
106
+ .describe("Só bucket 'pose_map': apenas as poses que o dono marcou com estrela. É o recorte mais forte que existe — comece por ele quando o pedido for vago."),
107
+ collection: z
108
+ .string()
109
+ .optional()
110
+ .describe("Só bucket 'pose_map': uma coleção nomeada pelo dono ('ação', 'editorial', 'íntimo')."),
111
+ semantic: z
112
+ .boolean()
113
+ .optional()
114
+ .describe("Só bucket 'pose_map': lê o `term` como DESCRIÇÃO da cena em vez de palavra-chave. " +
115
+ "É o caminho pra pedido que nenhuma tag cobre ('alguém se protegendo do vento', " +
116
+ "'caindo de costas apoiado num braço'). Frase inteira funciona melhor que palavra solta."),
117
+ similarTo: z
118
+ .string()
119
+ .optional()
120
+ .describe("Só bucket 'pose_map': o id de uma pose; devolve as MAIS PARECIDAS com ela. " +
121
+ "Use quando o usuário gostou de uma e quer variações do mesmo gesto."),
122
+ sort: z
123
+ .enum(["recent", "used"])
124
+ .optional()
125
+ .describe("Só bucket 'pose_map': 'recent' (entrada no banco, default) ou 'used' (as que ele acabou de usar, mais úteis pra continuar uma série)."),
103
126
  mode: z
104
127
  .enum(["mine", "public"])
105
128
  .optional()
@@ -132,6 +155,31 @@ export async function reference(args) {
132
155
  error: "browse exige `bucket` (history | favorites | videos | stock_video | acervo | characters | depth_map | pose_map).",
133
156
  };
134
157
  }
158
+ // Busca por SENTIDO e "parecidas com esta" saem por outra porta: vetor não
159
+ // pagina como lista, e o `referenceBrowse` é o navegador de banco, não o
160
+ // buscador. Mesmo bucket, mesma identidade, resposta no mesmo formato.
161
+ if (args.bucket === "pose_map" && (args.semantic || args.similarTo)) {
162
+ const res = await convexAction("poseRefs:mcpSearchByMeaning", {
163
+ sessionToken,
164
+ term: args.semantic ? args.term : undefined,
165
+ similarTo: args.similarTo,
166
+ people: args.people,
167
+ limit: args.limit,
168
+ });
169
+ const itens = res?.items ?? [];
170
+ return {
171
+ bucket: "pose_map",
172
+ modo: args.similarTo ? "parecidas" : "sentido",
173
+ count: itens.length,
174
+ items: itens,
175
+ note: itens.length
176
+ ? "Vizinhança por SENTIDO, da mais parecida pra menos (`score` é a distância). " +
177
+ "Cada item traz `descricao`: leia antes de escolher, é ela que diz o que o corpo faz. " +
178
+ "Use a `url` em sapiens_image referenceImageUrls."
179
+ : "Nenhuma pose do seu banco chegou perto disso. Tente descrever o CORPO (apoio, direção do tronco, " +
180
+ "o que os braços fazem) em vez da cena, ou use browse com people/hasObject.",
181
+ };
182
+ }
135
183
  const res = await convexAction("mcpReferences:referenceBrowse", {
136
184
  sessionToken,
137
185
  bucket: args.bucket,
@@ -146,6 +194,9 @@ export async function reference(args) {
146
194
  people: args.people,
147
195
  hasObject: args.hasObject,
148
196
  objeto: args.objeto,
197
+ favoritesOnly: args.favoritesOnly,
198
+ collection: args.collection,
199
+ sort: args.sort,
149
200
  });
150
201
  let note;
151
202
  if (args.bucket === "videos") {
@@ -162,7 +213,7 @@ export async function reference(args) {
162
213
  }
163
214
  else if (args.bucket === "pose_map") {
164
215
  note =
165
- "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. Cada item diz `people` (solo/dupla/grupo) e `objeto` (null = corpo limpo); pra recortar, mande people/hasObject/objeto em vez de tentar pela busca escrita. `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.";
216
+ "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. Cada item diz `people` (solo/dupla/grupo), `objeto` (null = corpo limpo), `favorite` e `useCount`; pra recortar, mande people/hasObject/objeto em vez de tentar pela busca escrita. Pedido vago ('uma pose boa pra isso') começa por favoritesOnly=true ou sort='used': é a curadoria que o dono já fez, e ela vale mais que mil opções. `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.";
166
217
  }
167
218
  else if (args.bucket === "acervo" || args.bucket === "characters") {
168
219
  note =
@@ -86,9 +86,10 @@ import { httpUrl } from "../schema.js";
86
86
  * - sapiens-video-h3 MiniMax H3 — ÁUDIO nativo, frame final (role 'end'), t2v/i2v. O
87
87
  * menor custo por pixel da prateleira. Áudio vem sempre e já está
88
88
  * no preço (não tem toggle). 5 a 15s em '2k' (2560x1440) ou
89
- * '768p'. Sem `resolution` cai no 2k, que custa 40% mais por
90
- * segundo. O 2K de 15s demora ~9min: volta `pending` e termina
91
- * sozinho no servidor, não gere de novo.
89
+ * '768p', a escada inteira nos dois tiers. Sem `resolution` cai
90
+ * no 2k, que custa 33% mais por segundo. O 2K de 15s leva uns
91
+ * 9min de render: o create volta na hora com status 'rendering',
92
+ * acompanhe em action=status e não gere de novo.
92
93
  * ACEITA referência desde set/2026: até 9 imagens (role 'ref') e 3
93
94
  * vídeos (role 'refvideo', somando 15s), que é o caminho de take
94
95
  * longo com personagem travada. Referência e frame inicial são
@@ -99,9 +100,15 @@ import { httpUrl } from "../schema.js";
99
100
  * segundo de vídeo mais barato da casa (250 Sinapses/s em 480p) e
100
101
  * o render mais rápido (5s em 480p sai em meio minuto).
101
102
  * - sapiens-video-seedance-spicy Seedance 2.0 Spicy — o Seedance 2.0 SEM freio, também i2v puro.
102
- * Som nativo. 4 a 15s em 480p; em 720p e 1080p para em 10s até
103
- * alguém medir o render nesses tiers.
103
+ * Som nativo. 4 a 15s em 480p e 720p; em 1080p para em 10s até
104
+ * alguém medir o render nesse tier (15s ali é take de 9 mil
105
+ * Sinapses que ninguém viu sair).
104
106
  * - sapiens-video-wan WAN 2.5 — imagem que fala/canta (áudio+lip-sync nativo), 5/10s (i2v)
107
+ * - sapiens-video-wan-3 WAN 3.0: a geração seguinte da linha WAN. Texto OU imagem (t2v/i2v),
108
+ * som nativo com interruptor (mesmo preço ligado ou desligado), frame
109
+ * final (role 'end'), 5/8/10s em 480/720/1080p. Sem imagem de
110
+ * referência (o reference-to-video do provider é outro endpoint,
111
+ * fora até o roteador saber escolher).
105
112
  * - sapiens-video-kling-motion Kling Motion — transfere o movimento de um vídeo pra uma imagem
106
113
  * (PRECISA de pessoa com tronco visível na imagem E no vídeo;
107
114
  * vídeo de referência MÁX 10s — o provider recusa acima disso —
@@ -128,7 +135,9 @@ import { httpUrl } from "../schema.js";
128
135
  * sem referência e sem frame final. Economiza pouco contra o 1.5 Pro e perde três
129
136
  * capacidades. Quem quer queimar tentativa barata usa o
130
137
  * `sapiens-video-seedance-2-mini`, que custa metade do 2.0 com o repertório inteiro.
131
- * Não "conserte" essa ausência: ela é decisão (29/jul/2026).
138
+ * Não "conserte" essa ausência: ela é decisão (29/jul/2026), escrita em
139
+ * VIDEO_FORA_DE_PROPOSITO logo abaixo do enum. O gate audit:catalog-parity cobra
140
+ * que todo motor ATIVO do catálogo esteja no enum ou nessa lista, com motivo.
132
141
  *
133
142
  * CUSTO: server-side por config (duração x resolução [x áudio]). NÃO existe "o preço"
134
143
  * de um motor por segundo: existe faixa. Omitir `resolution` não pega o meio nem o
@@ -154,6 +163,7 @@ const VIDEO_MODELS = [
154
163
  "sapiens-video-h3-spicy",
155
164
  "sapiens-video-seedance-spicy",
156
165
  "sapiens-video-wan",
166
+ "sapiens-video-wan-3",
157
167
  "sapiens-video-kling-motion",
158
168
  "sapiens-video-shot-mimic",
159
169
  "sapiens-video-lite",
@@ -164,6 +174,15 @@ const VIDEO_MODELS = [
164
174
  // e o override admin que religa), mas nasce desligado: peça o 1.1.
165
175
  "sapiens-video-omni",
166
176
  ];
177
+ // Motor ATIVO no catálogo que fica fora do enum DE PROPÓSITO, com o motivo. O
178
+ // gate audit:catalog-parity (apps/sapiens) lê este mapa: id ativo que não está
179
+ // nem no enum nem aqui é erro, porque action=models lista, a skill manda usar e
180
+ // o create recusa com erro de schema (foi assim com o WAN 3.0 por dois meses).
181
+ export const VIDEO_FORA_DE_PROPOSITO = {
182
+ "sapiens-video-seedance-fast": "Seedance 1.0 Fast, geração velha: sem áudio, sem referência e sem frame final. " +
183
+ "Economiza pouco contra o 1.5 Pro e perde três capacidades; tentativa barata é o " +
184
+ "sapiens-video-seedance-2-mini. Decisão de 29/jul/2026.",
185
+ };
167
186
  const FILM_KINDS = ["demo", "aula-tour", "essay", "tipografia-musical", "dataviz"];
168
187
  const FILM_STATUSES = ["rascunho", "na_fila", "renderizando", "pronto"];
169
188
  export const videoSchema = z.object({
@@ -304,24 +323,24 @@ export const videoSchema = z.object({
304
323
  .enum(VIDEO_MODELS)
305
324
  .optional()
306
325
  .describe("action=create (opcional quando você passa templateSlug: a receita traz o motor) e action=price (obrigatório). O catálogo POR MODELO (capacidades, referências, tetos, FAIXA de preço) mora na description desta tool e VIVO em action=models; a skill 'video' (sapiens_skill) guia a escolha. " +
307
- "Atalho de famílias: seedance/seedance-2-*/seedance-25 = cena+áudio+referências (o 25 estica até 30s e o preço acompanha), seedance-15 = degrau 1.5, kling = anima imagem, wan = imagem que fala, " +
308
- "hailuo/hailuo-pro = movimento puro sem áudio, h3 = 2K com áudio, kling-motion/shot-mimic = transferência de movimento/plano, lite/fast/quality = Veo 3.1, omni = Gemini com áudio nativo."),
326
+ "Atalho de famílias: seedance/seedance-2-*/seedance-25 = cena+áudio+referências (o 25 estica até 30s e o preço acompanha), seedance-15 = degrau 1.5, kling = anima imagem, wan = WAN 2.5, imagem que fala, wan-3 = WAN 3.0, texto ou imagem com som e frame final, " +
327
+ "hailuo/hailuo-pro = movimento puro sem áudio, h3 = 2K ou 768p com áudio e até 9 imagens + 3 vídeos de referência, h3-spicy/seedance-spicy = os mesmos motores sem freio de conteúdo, só a partir de imagem (i2v), kling-motion/shot-mimic = transferência de movimento/plano, lite/fast/quality = Veo 3.1, omni = Gemini com áudio nativo."),
309
328
  durationSec: z
310
329
  .number()
311
330
  .optional()
312
- .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. " +
331
+ .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 2.5 5/10, WAN 3.0 5/8/10, H3 5/6/8/10/12/15 nos dois tiers (768p e 2k), H3 Spicy 3-15, Seedance 2.0 Spicy 4-15 em 480p e 720p, 4-10 em 1080p. " +
313
332
  "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. " +
314
333
  "action=shadows: duração do vídeo-fonte, se souber (cobra 200/s; sem ela, flat ~2000)."),
315
334
  resolution: z
316
335
  .enum(["480p", "720p", "1080p", "768p", "2k"])
317
336
  .optional()
318
- .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. " +
337
+ .describe("action=create e action=price: resolução (Seedance, WAN 2.5 e 3.0, Shot Mimic, H3, H3 Spicy, Seedance Spicy). NÃO existe default 720p aqui: resolução ausente, ou fora do que o motor aceita, cai no tier MAIS CARO do motor. " +
319
338
  "É 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. " +
320
- "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)."),
339
+ "O H3 usa '768p' ou '2k' (sem eles cai no 2k, que custa 33% mais por segundo); o H3 Spicy usa '480p'/'768p'/'1080p'. Kling e a linha Hailuo 2.3 não usam este campo (resolução fixa pelo motor)."),
321
340
  audio: z
322
341
  .boolean()
323
342
  .optional()
324
- .describe("action=create e action=price: liga áudio. Seedance = on por default; Kling 'sound' = +50% no preço. WAN é áudio nativo sempre."),
343
+ .describe("action=create e action=price: liga áudio. Seedance = on por default; Kling 'sound' = +50% no preço. WAN 2.5 é áudio nativo sempre; WAN 3.0 tem interruptor, mesmo preço ligado ou desligado. H3 e H3 Spicy: o som vem sempre e já está no preço, o campo não muda nada. Seedance Spicy: tem interruptor (audio=false sai mudo, pra sonorizar depois), mesmo preço ligado ou desligado."),
325
344
  editOfImageId: z
326
345
  .string()
327
346
  .optional()
@@ -370,30 +389,31 @@ export const videoSchema = z.object({
370
389
  endImageId: z
371
390
  .string()
372
391
  .optional()
373
- .describe("Frame FINAL: generatedImages:_id da SUA galeria. Vira reference role 'end' (suporte varia por modelo)."),
392
+ .describe("Frame FINAL: generatedImages:_id da SUA galeria. Vira reference role 'end'. Pelo catálogo aceitam: Seedance 2.0/Fast/Mini/2.5, Kling 3.0 Pro, WAN 3.0, H3 e H3 Spicy; o resto não promete (Seedance Spicy, Hailuo, WAN 2.5 e Seedance 1.5 não expõem)."),
374
393
  endImageUrl: httpUrl()
375
394
  .optional()
376
- .describe("Frame FINAL: url pública de galeria/Acervo/personagem. Vira reference role 'end' (suporte varia por modelo)."),
395
+ .describe("Frame FINAL: url pública de galeria/Acervo/personagem. Vira reference role 'end' (mesmos motores de endImageId)."),
377
396
  // Imagens de REFERÊNCIA (Seedance reference_images): guiam estilo/personagem/
378
397
  // composição SEM virar o 1º frame. Fluxo storyboard: folha de key poses +
379
398
  // personagem como refs num text-to-video.
380
399
  referenceImageIds: z
381
400
  .array(z.string())
382
401
  .optional()
383
- .describe("action=create (Seedance até 4; Veo fast/quality e Omni até 3; Lite/Kling/WAN NÃO): generatedImages:_id da SUA galeria " +
402
+ .describe("action=create (Seedance 2.0/Fast/Mini/2.5 até 4; H3 até 9; Veo Fast/Quality e Omni 1.1 até 3; Lite, Kling, Hailuo, WAN 2.5 e 3.0, Seedance 1.5 e os dois Spicy NÃO): generatedImages:_id da SUA galeria " +
384
403
  "como imagens de REFERÊNCIA (role 'ref'). Diferente de startImageId: NÃO viram o 1º frame, guiam " +
385
404
  "estilo/personagem/composição. Fluxo storyboard: gere a folha com sapiens_image " +
386
- "templateSlug='storyboard-sapiens-v1' (ou -vertical-v1) e passe folha + personagem aqui."),
405
+ "templateSlug='storyboard-sapiens-v1' (ou -vertical-v1) e passe folha + personagem aqui. " +
406
+ "No H3 referência e frame inicial são EXCLUSIVOS (endpoints diferentes no provider): mande refs OU startImage*, não os dois."),
387
407
  referenceImageUrls: z
388
408
  .array(httpUrl())
389
409
  .optional()
390
- .describe("action=create (Seedance até 4; Veo fast/quality até 3): URLs públicas (Bunny/Convex/Wikimedia) como imagens de " +
410
+ .describe("action=create (mesmos motores e tetos de referenceImageIds: Seedance até 4, H3 até 9, Veo Fast/Quality e Omni 1.1 até 3): URLs públicas (Bunny/Convex/Wikimedia) como imagens de " +
391
411
  "REFERÊNCIA (role 'ref'). Soma com referenceImageIds. No prompt, cite as referências por descrição " +
392
412
  "(ex: 'use the storyboard reference as ordered key poses; ignore line-sketch artifacts')."),
393
413
  referenceVideoUrls: z
394
414
  .array(httpUrl())
395
415
  .optional()
396
- .describe("action=create ( Seedance): 1 URL pública (host da casa) de um VÍDEO DE MOVIMENTO (role 'refvideo' -> reference_videos, <=15s): " +
416
+ .describe("action=create (Seedance 2.0/Fast/Mini/2.5: 1 vídeo; H3: até 3, somando 15s): URL pública (host da casa) de um VÍDEO DE MOVIMENTO (role 'refvideo' -> reference_videos, <=15s): " +
397
417
  "a coreografia/câmera do clipe GUIA o take sem ser recriado plano a plano (isso é o Shot Mimic). " +
398
418
  "Combina com o fluxo storyboard: folha = beats, vídeo = movimento, personagem = identidade. " +
399
419
  "Depth Maps do banco de motion servem direto (ADMIN: descubra com action=shadows-list)."),
@@ -414,8 +434,8 @@ export const videoSchema = z.object({
414
434
  referenceImagePaths: z
415
435
  .array(z.string())
416
436
  .optional()
417
- .describe("action=create ( Seedance): imagens de REFERÊNCIA a partir de ARQUIVOS LOCAIS do seu PC só no MCP instalado (stdio). " +
418
- "Caminhos absolutos; PNG/JPEG/WebP até 8MB cada, até 4 no total (somando com referenceImageIds/Urls). Viram reference role 'ref'."),
437
+ .describe("action=create (mesmos motores de referenceImageIds): imagens de REFERÊNCIA a partir de ARQUIVOS LOCAIS do seu PC, só no MCP instalado (stdio). " +
438
+ "Caminhos absolutos; PNG/JPEG/WebP até 8MB cada, até o teto do motor no total (Seedance 4, H3 9, somando com referenceImageIds/Urls). Viram reference role 'ref'."),
419
439
  });
420
440
  // Teto do arquivo local que vira frame de vídeo. Frame inicial/final não precisa
421
441
  // ser pesado; 8MB cobre um PNG/JPEG grande com folga e evita estourar o payload
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sapiens-mcp",
3
- "version": "1.64.1",
3
+ "version": "1.64.2",
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",