sapiens-mcp 1.95.1 → 1.96.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 +3 -3
- package/dist/skills.js +25 -1
- package/dist/tools/distribution.js +2 -0
- package/dist/tools/image.js +12 -2
- package/dist/tools/repertorio.js +46 -1
- package/dist/tools/video.js +20 -0
- package/package.json +1 -1
package/dist/registry.js
CHANGED
|
@@ -71,7 +71,7 @@ export const TOOLS = {
|
|
|
71
71
|
handler: carrossel,
|
|
72
72
|
},
|
|
73
73
|
sapiens_image: {
|
|
74
|
-
description: "Operações de imagem via Sapiens (Gemini, GPT Image 2 e 2.5, Grok, Seedream/ByteDance). Sub-actions: 'generate' (gera imagem completa imediato — prompt+model+aspectRatio+size; suporta mode=edit/variation e MULTI-REFERÊNCIA: combine até 4 imagens como referência numa geração só, igual ao modal 'Selecionar Referência' do web — via referenceImageUrls (sua galeria + Acervo + personagens públicos de sapiens_character) e/ou sourceImageIds (ids da sua galeria); refs valem pros modelos robustos nano-banana-2/gpt-image-2-*/grok-2-image*/seedream-*; EDIÇÃO POR ÁREA: sourceImageId + maskRegions (caixas em fração da imagem) muda SÓ a região marcada e devolve o resto igual ao pixel, no nano-banana-2 e no nano-banana-max, pelo preço da geração comum), 'compose' (combina persona+screen via Gemini pra app-demo Shorts; 25 sinapses, rate limit 10/min). generate=image one-shot, compose=montar start frame app-demo. 'request_generation' é legado e recusa sem cobrar: vídeo nasce inteiro em sapiens_video action=create. TEMPLATE: passe templateSlug numa generate pra usar um super-prompt travado da casa — o `prompt` vira só a CENA (quem + pose + objeto-conceito) e o template embrulha estilo+fundo+enquadramento+ref de traço. 'retrato-sapiens-v1' = retrato editorial cartoon de um personagem no grid verde Sapiens (mesma 'mão' dos artigos); sem ref própria, injeta a Helen como âncora de traço (passar referenceImageUrls troca quem aparece). Mutuamente exclusivo com brandSlug. Sub-action 'models' (sem custo, sem login): lista o catálogo vivo (modelos ativos + preço cobrado em 1K com override admin + resolutionAdders, o adder por resolução já clampado ao teto de cada motor + maxResolution + se aceita referência) pra descobrir modelo/preço em vez de chutar. O preço de uma geração é priceSinapses + resolutionAdders[size], então 2K/4K custam MAIS que o número base: nunca cite o base como se fosse o total quando o size não for 1K. NOTA: generate é SÍNCRONA e cobra ao concluir; modelo pesado (Pro, gpt-image-2-high, Grok quality, 2K/4K) cai na REGRA DO TIMEOUT (cheque sapiens_gallery action=list antes de repetir, evita cobrança dupla).",
|
|
74
|
+
description: "Operações de imagem via Sapiens (Gemini, GPT Image 2 e 2.5, Grok, Seedream/ByteDance). Sub-actions: 'upscale' (sourceImageId de uma imagem SUA pronta: a mesma peça em resolução maior vira peça nova no acervo, a original fica; cobra Sinapses, preço fixo igual ao da ficha no site; SÍNCRONA e pode passar de 2 min, então Timeout é o cliente desistindo: olhe sapiens_gallery action=list antes de repetir), 'sombra' (sourceImageId de uma foto SUA pronta: extrai a sombra, o mapa de profundidade colorido da foto, como peça nova no acervo, pra usar de referência de pose e volume; cobra Sinapses, preço fixo; síncrona), 'generate' (gera imagem completa imediato — prompt+model+aspectRatio+size; suporta mode=edit/variation e MULTI-REFERÊNCIA: combine até 4 imagens como referência numa geração só, igual ao modal 'Selecionar Referência' do web — via referenceImageUrls (sua galeria + Acervo + personagens públicos de sapiens_character) e/ou sourceImageIds (ids da sua galeria); refs valem pros modelos robustos nano-banana-2/gpt-image-2-*/grok-2-image*/seedream-*; EDIÇÃO POR ÁREA: sourceImageId + maskRegions (caixas em fração da imagem) muda SÓ a região marcada e devolve o resto igual ao pixel, no nano-banana-2 e no nano-banana-max, pelo preço da geração comum), 'compose' (combina persona+screen via Gemini pra app-demo Shorts; 25 sinapses, rate limit 10/min). generate=image one-shot, compose=montar start frame app-demo. 'request_generation' é legado e recusa sem cobrar: vídeo nasce inteiro em sapiens_video action=create. TEMPLATE: passe templateSlug numa generate pra usar um super-prompt travado da casa — o `prompt` vira só a CENA (quem + pose + objeto-conceito) e o template embrulha estilo+fundo+enquadramento+ref de traço. 'retrato-sapiens-v1' = retrato editorial cartoon de um personagem no grid verde Sapiens (mesma 'mão' dos artigos); sem ref própria, injeta a Helen como âncora de traço (passar referenceImageUrls troca quem aparece). Mutuamente exclusivo com brandSlug. Sub-action 'models' (sem custo, sem login): lista o catálogo vivo (modelos ativos + preço cobrado em 1K com override admin + resolutionAdders, o adder por resolução já clampado ao teto de cada motor + maxResolution + se aceita referência) pra descobrir modelo/preço em vez de chutar. O preço de uma geração é priceSinapses + resolutionAdders[size], então 2K/4K custam MAIS que o número base: nunca cite o base como se fosse o total quando o size não for 1K. NOTA: generate é SÍNCRONA e cobra ao concluir; modelo pesado (Pro, gpt-image-2-high, Grok quality, 2K/4K) cai na REGRA DO TIMEOUT (cheque sapiens_gallery action=list antes de repetir, evita cobrança dupla).",
|
|
75
75
|
schema: imageSchema,
|
|
76
76
|
handler: image,
|
|
77
77
|
},
|
|
@@ -86,7 +86,7 @@ export const TOOLS = {
|
|
|
86
86
|
handler: skill,
|
|
87
87
|
},
|
|
88
88
|
sapiens_repertorio: {
|
|
89
|
-
description: "Acervo pessoal de filme/série/anime/jogo/jogo de tabuleiro/livro/música/pessoa (Repertório, o segundo cérebro do user). Reads: list (filtros mediaType/status), search (texto em title/genres/tags), get (detalhe), popArticles, resolve (busca capa/ano/id nos providers server-side: OMDb/IGDB-Twitch/AniList/Google Books/iTunes/Wikidata). Mutations (qualquer logado, mexem no PRÓPRIO acervo): add_item, update_item (status/rating/tags/note/isPublic), remove_item. CAPTURA ONE-SHOT travada na lista de providers: quando o user fala natural ('acabei de ver Duna 2, nota 9', 'tô jogando Hollow Knight', 'li tal livro'), (1) infira mediaType e status (assisti/zerei/li=completed, quero=backlog, tô jogando/vendo=active, dropei=dropped) e rating se citado; (2) chame action=resolve {mediaType, query}, escolha o candidato certo e faça add_item passando SÓ o source + externalId DELE + os campos pessoais (status/rating/tags/note). O servidor re-resolve no provider e grava título/capa/ano canônicos — você NÃO manda título/capa nem inventa externalId. (3) Se o resolve não achar (lista vazia/providerKeyMissing), NÃO dá pra adicionar: diga ao user que não encontrou nos providers (não fabrique entry manual). Upsert/dedup por (userId, source, externalId). Só pergunte se ambíguo entre candidatos. FERRAMENTAS DE IA (Repertório de Ferramentas): fluxo separado (vêm do catálogo aitag, não dos providers de mídia). action=search_tools {query} acha a ferramenta no catálogo e devolve o toolId; action=add_tool {toolId, favorite?, rating?, note?} grava como mediaType 'tool' (estar no acervo já é 'usei'; favorite=true liga a estrela). Use quando o user fala 'adiciona o Midjourney/Cursor no meu repertório de ferramentas' ou 'uso tal ferramenta de IA'. Cada ferramenta aponta pra página dela no aitag. SAPIENS (pessoas, ombros de gigantes; a aba no site chama Sapiens): mediaType 'person' cataloga gente que inspira (cineasta, mangaká, cientista, escritor) via Wikidata. Mesmo fluxo de mídia: resolve {mediaType:'person', query:'Osamu Tezuka'} → add_item com source 'wikidata' + o QID do candidato. O servidor grava foto, ocupações, bio e o link da Wikipedia; entra como completed (estar no acervo = me inspira). Use quando o user fala 'adiciona o Miyazaki nas minhas inspirações/nos meus sapiens/no meu repertório'. JOGO DE TABULEIRO (e de cartas; a aba no site chama Tabuleiro): mediaType 'boardgame', porque 'game' é videogame e o IGDB não conhece tabuleiro. Também via Wikidata: resolve {mediaType:'boardgame', query:'Galactic Cruise'} → add_item com source 'wikidata' + o QID do candidato. Busque pelo título em inglês, que é como a Wikidata cadastra; o designer vem no campo authors do candidato e separa homônimos. O servidor grava designers, editoras e o link da página do jogo no BGG. Lançamento muito recente pode ainda não estar na Wikidata: resolve vazio = diga isso à pessoa, não fabrique. Use quando o user fala 'joguei Catan', 'quero jogar Rebirth', 'adiciona esse jogo de tabuleiro'.",
|
|
89
|
+
description: "Acervo pessoal de filme/série/anime/jogo/jogo de tabuleiro/livro/música/pessoa (Repertório, o segundo cérebro do user). Reads: list (filtros mediaType/status), search (texto em title/genres/tags), get (detalhe), popArticles, resolve (busca capa/ano/id nos providers server-side: OMDb/IGDB-Twitch/AniList/Google Books/iTunes/Wikidata). Mutations (qualquer logado, mexem no PRÓPRIO acervo): add_item, update_item (status/rating/tags/note/isPublic), remove_item. CAPTURA ONE-SHOT travada na lista de providers: quando o user fala natural ('acabei de ver Duna 2, nota 9', 'tô jogando Hollow Knight', 'li tal livro'), (1) infira mediaType e status (assisti/zerei/li=completed, quero=backlog, tô jogando/vendo=active, dropei=dropped) e rating se citado; (2) chame action=resolve {mediaType, query}, escolha o candidato certo e faça add_item passando SÓ o source + externalId DELE + os campos pessoais (status/rating/tags/note). O servidor re-resolve no provider e grava título/capa/ano canônicos — você NÃO manda título/capa nem inventa externalId. (3) Se o resolve não achar (lista vazia/providerKeyMissing), NÃO dá pra adicionar: diga ao user que não encontrou nos providers (não fabrique entry manual). Upsert/dedup por (userId, source, externalId). Só pergunte se ambíguo entre candidatos. FERRAMENTAS DE IA (Repertório de Ferramentas): fluxo separado (vêm do catálogo aitag, não dos providers de mídia). action=search_tools {query} acha a ferramenta no catálogo e devolve o toolId; action=add_tool {toolId, favorite?, rating?, note?} grava como mediaType 'tool' (estar no acervo já é 'usei'; favorite=true liga a estrela). Use quando o user fala 'adiciona o Midjourney/Cursor no meu repertório de ferramentas' ou 'uso tal ferramenta de IA'. Cada ferramenta aponta pra página dela no aitag. CATÁLOGO (ADMIN, o dono): action=catalog_tool cadastra no AItag uma ferramenta OPEN SOURCE que ainda não está lá {toolId, name, githubUrl, categoryEn, descriptionEn, descriptionPt, e de preferência reviewEn/reviewPt, websiteUrl, tags}; devolve created, toolId e a url aitag.app/tool/<toolId>. Idempotente: o mesmo repo (mesmo com outro toolId) devolve a ficha existente e só preenche a análise que estiver vazia, nunca sobrescreve. Rode search_tools antes; é a porta da skill achado. SAPIENS (pessoas, ombros de gigantes; a aba no site chama Sapiens): mediaType 'person' cataloga gente que inspira (cineasta, mangaká, cientista, escritor) via Wikidata. Mesmo fluxo de mídia: resolve {mediaType:'person', query:'Osamu Tezuka'} → add_item com source 'wikidata' + o QID do candidato. O servidor grava foto, ocupações, bio e o link da Wikipedia; entra como completed (estar no acervo = me inspira). Use quando o user fala 'adiciona o Miyazaki nas minhas inspirações/nos meus sapiens/no meu repertório'. JOGO DE TABULEIRO (e de cartas; a aba no site chama Tabuleiro): mediaType 'boardgame', porque 'game' é videogame e o IGDB não conhece tabuleiro. Também via Wikidata: resolve {mediaType:'boardgame', query:'Galactic Cruise'} → add_item com source 'wikidata' + o QID do candidato. Busque pelo título em inglês, que é como a Wikidata cadastra; o designer vem no campo authors do candidato e separa homônimos. O servidor grava designers, editoras e o link da página do jogo no BGG. Lançamento muito recente pode ainda não estar na Wikidata: resolve vazio = diga isso à pessoa, não fabrique. Use quando o user fala 'joguei Catan', 'quero jogar Rebirth', 'adiciona esse jogo de tabuleiro'.",
|
|
90
90
|
schema: repertorioSchema,
|
|
91
91
|
handler: repertorio,
|
|
92
92
|
},
|
|
@@ -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. 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. 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.",
|
|
150
150
|
schema: videoSchema,
|
|
151
151
|
handler: video,
|
|
152
152
|
},
|
package/dist/skills.js
CHANGED
|
@@ -296,6 +296,14 @@ Frame de borda e referência são caminhos EXCLUSIVOS no Seedance 2.0/Fast/Mini/
|
|
|
296
296
|
|
|
297
297
|
NÃO chame create de novo enquanto renderiza: cria outro vídeo e cobra de novo. Falha de provider refunda sozinha.
|
|
298
298
|
|
|
299
|
+
## Resolução maior
|
|
300
|
+
|
|
301
|
+
\`action=upscale\` com \`imageId\` (um vídeo SEU pronto) e \`resolution\` como o ALVO (\`720p\`, \`1080p\`, \`2k\` ou \`4k\`) cria uma versão maior ao lado do original, que fica intacto. Cobra Sinapses por segundo do clipe, e o alvo maior custa mais: confirme o alvo com a pessoa antes. É assíncrono como o create: acompanhe em \`action=status\` e não peça de novo enquanto renderiza. Upscale de uma variante que já é upscale é recusado.
|
|
302
|
+
|
|
303
|
+
## De qual saldo sai
|
|
304
|
+
|
|
305
|
+
A conta tem duas carteiras: Sinapses (o App) e o saldo em dólar da API (Developers). O take sai de qualquer uma das duas: \`create\` com \`pagarCom: "dolar"\` cobra no saldo da API, mesmo motor e mesma config, e o valor volta em \`pagoEmDolarUsd\`. Sem o campo, sai em Sinapses (e o \`action=price\` cota em Sinapses). Use o dólar quando a pessoa pedir ou quando ela estiver sem Sinapses e com saldo na API. Falha do render devolve no mesmo saldo. Sinapse não vira dólar nem o contrário.
|
|
306
|
+
|
|
299
307
|
## Sonorizar
|
|
300
308
|
|
|
301
309
|
\`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 (MMAudio, 20 Sinapses/s do clipe, mín 100), e o original fica intacto.
|
|
@@ -375,6 +383,19 @@ Pra mudar SÓ um pedaço da peça (trocar o objeto da mão, apagar uma placa, p
|
|
|
375
383
|
- \`generate\` é SÍNCRONA e cobra ao concluir. Modelo pesado (Pro, gpt-image-2-high, Grok quality, Seedream 5.0 Pro, 2K/4K) cai na regra do timeout: cheque \`sapiens_gallery action=list\` antes de repetir, senão cobra duas vezes. O \`seedream-5-0-pro\` foi medido em ~140s, ACIMA do teto de 120s do cliente, então o Timeout nele é o esperado e a imagem está lá.
|
|
376
384
|
- Uma imagem só vira pública (e ganha página indexável) com \`sapiens_gallery action=publish\`.
|
|
377
385
|
|
|
386
|
+
## Depois de pronta: resolução maior e sombra
|
|
387
|
+
|
|
388
|
+
Duas ações da ficha do site saem por aqui, sobre uma imagem SUA já pronta (\`sourceImageId\`), e a peça nova entra no acervo ao lado da original, que fica intacta:
|
|
389
|
+
|
|
390
|
+
- \`action=upscale\`: a mesma peça em resolução maior. Use quando a pessoa vai imprimir, recortar ou levar pra vídeo em tela grande.
|
|
391
|
+
- \`action=sombra\`: o mapa de profundidade da foto (colorido, não em cinza), pra usar como referência de pose e volume numa geração seguinte.
|
|
392
|
+
|
|
393
|
+
As duas cobram Sinapses, preço fixo igual ao da ficha. São síncronas e o upscale pode passar de 2 minutos: Timeout é o cliente desistindo, não o servidor. Olhe \`sapiens_gallery action=list\` antes de repetir, senão cobra duas vezes.
|
|
394
|
+
|
|
395
|
+
## De qual saldo sai
|
|
396
|
+
|
|
397
|
+
A conta tem duas carteiras: Sinapses (o App) e o saldo em dólar da API (Developers). A imagem sai de qualquer uma das duas: \`pagarCom: "dolar"\` cobra no saldo da API, mesmo motor e mesma peça, e o valor volta em \`pagoEmDolarUsd\`. Sem o campo, sai em Sinapses. Use o dólar quando a pessoa pedir ou quando ela estiver sem Sinapses e com saldo na API. Sinapse não vira dólar nem o contrário. Motor do Civitai não sai em dólar.
|
|
398
|
+
|
|
378
399
|
## Peça reprovada ensina a próxima
|
|
379
400
|
|
|
380
401
|
Quando a pessoa condena uma peça ("mudou o rosto dela", "a mão está quebrada", "não é ela"), marque NO MESMO TURNO: \`sapiens_gallery action=reprovar imageId=<id> motivo='<o porquê numa frase concreta>'\`. O motivo bom diz a CAUSA, não só o sintoma: "trocou o rosto: gerada só com o personagem, sem as fotos de rosto do passaporte" ensina mais que "ficou feia". A reprovada não sai mais por porta nenhuma (fila de distribuição, publicar, canal) e some das sugestões do que postar; ela fica no acervo pra ensinar. Peça condenada e não marcada volta numa leva semanas depois, porque nada nela diz que foi condenada.
|
|
@@ -948,7 +969,10 @@ Trazendo slides de outro editor: crie o carrossel, leia o catálogo no \`get\` e
|
|
|
948
969
|
description: "A API da pessoa (compatível com OpenAI, saldo em dólar, separado das Sinapses) pra quando ela quer chamar os motores da casa de dentro de um script, app ou agente próprio. Puxe antes de escrever código que chama www.sapiensinteticos.com/api/v1 ou quando ela perguntar de chave, saldo da API ou cobrança de uma chamada.",
|
|
949
970
|
body: `## API ou MCP
|
|
950
971
|
|
|
951
|
-
Este connector opera a conta pela conversa
|
|
972
|
+
Este connector opera a conta pela conversa. A API é outra porta: a pessoa chama os motores de texto, imagem e vídeo de dentro do código dela, no formato da OpenAI, e paga do saldo em DÓLAR da conta. As duas portas são da MESMA conta e se enxergam:
|
|
973
|
+
|
|
974
|
+
- O que a API gera entra no acervo da conta. Imagem e vídeo viram peça marcada \`source: api\` (ache com \`sapiens_gallery\` e use como qualquer peça: referência, vídeo, publicar). Música e efeito sonoro viram faixa da conta (ache com \`sapiens_musicator action=list\`).
|
|
975
|
+
- O saldo em dólar também paga peça por aqui: \`sapiens_image\` e \`sapiens_video action=create\` com \`pagarCom: "dolar"\` (detalhe nas skills \`imagem\` e \`video\`). Sinapse não vira dólar nem o contrário: são duas carteiras, e a pessoa escolhe de qual sai.
|
|
952
976
|
|
|
953
977
|
Use a API quando a pessoa quer automatizar fora da conversa (script, app, agente dela, lote). Pra operar a conta aqui, siga com as tools.
|
|
954
978
|
|
|
@@ -92,6 +92,8 @@ const CHANNELS = [
|
|
|
92
92
|
"telegram-6",
|
|
93
93
|
"telegram-7",
|
|
94
94
|
"telegram-8",
|
|
95
|
+
"telegram-9",
|
|
96
|
+
"telegram-10",
|
|
95
97
|
// nostr: protocolo, nao empresa. Publica por WebSocket atras de "use node".
|
|
96
98
|
"nostr",
|
|
97
99
|
// Are.na: um canal por CANAL de la (o Are.na nao tem feed).
|
package/dist/tools/image.js
CHANGED
|
@@ -108,7 +108,7 @@ function defaultSizeFor(model) {
|
|
|
108
108
|
return model && DEFAULT_2K_MODELS.has(model) ? "2K" : undefined;
|
|
109
109
|
}
|
|
110
110
|
export const imageSchema = z.object({
|
|
111
|
-
action: z.enum(["generate", "request_generation", "compose", "models"]),
|
|
111
|
+
action: z.enum(["generate", "request_generation", "compose", "models", "upscale", "sombra"]),
|
|
112
112
|
prompt: z
|
|
113
113
|
.string()
|
|
114
114
|
.optional()
|
|
@@ -183,7 +183,7 @@ export const imageSchema = z.object({
|
|
|
183
183
|
sourceImageId: z
|
|
184
184
|
.string()
|
|
185
185
|
.optional()
|
|
186
|
-
.describe("ID de imagem do gallery do próprio user (`generatedImages:_id`). Obrigatório pra mode=edit ou mode=variation. Use sapiens_gallery action=list pra descobrir IDs."),
|
|
186
|
+
.describe("ID de imagem do gallery do próprio user (`generatedImages:_id`). Obrigatório pra mode=edit ou mode=variation, e pra action=upscale e action=sombra (a peça de origem). Use sapiens_gallery action=list pra descobrir IDs."),
|
|
187
187
|
maskRegions: z
|
|
188
188
|
.array(z.object({
|
|
189
189
|
shape: z.enum(["ellipse", "rect"]).optional(),
|
|
@@ -299,6 +299,16 @@ export async function image(args) {
|
|
|
299
299
|
}
|
|
300
300
|
const sessionToken = getSessionToken();
|
|
301
301
|
// v1.8: compose tem args próprios, validação separada
|
|
302
|
+
// Ações da ficha do site sobre uma imagem SUA pronta: a peça nova entra no
|
|
303
|
+
// acervo como versão, e a de origem fica intacta. Síncronas e com custo fixo;
|
|
304
|
+
// o servidor prova a posse e cobra pelo token, nunca por arg.
|
|
305
|
+
if (args.action === "upscale" || args.action === "sombra") {
|
|
306
|
+
if (!args.sourceImageId) {
|
|
307
|
+
throw new Error(`action=${args.action} exige sourceImageId (uma imagem SUA pronta; ache em sapiens_gallery action=list).`);
|
|
308
|
+
}
|
|
309
|
+
const fn = args.action === "upscale" ? "imageUpscale:aumentarResolucao" : "depthFoto:extrairSombraDaFoto";
|
|
310
|
+
return await convexAction(fn, { imageId: args.sourceImageId, sessionToken });
|
|
311
|
+
}
|
|
302
312
|
if (args.action === "compose") {
|
|
303
313
|
if (!args.instruction || args.instruction.trim().length < 5) {
|
|
304
314
|
throw new Error("action=compose exige 'instruction' (mínimo 5 chars).");
|
package/dist/tools/repertorio.js
CHANGED
|
@@ -45,6 +45,7 @@ export const repertorioSchema = z.object({
|
|
|
45
45
|
"remove_item",
|
|
46
46
|
"search_tools",
|
|
47
47
|
"add_tool",
|
|
48
|
+
"catalog_tool",
|
|
48
49
|
]),
|
|
49
50
|
// Reads
|
|
50
51
|
userId: z
|
|
@@ -75,7 +76,30 @@ export const repertorioSchema = z.object({
|
|
|
75
76
|
toolId: z
|
|
76
77
|
.string()
|
|
77
78
|
.optional()
|
|
78
|
-
.describe("Pra add_tool: o toolId EXATO de um candidato do action=search_tools (catálogo aitag). Dedup por (userId, source aitag, externalId=toolId)."),
|
|
79
|
+
.describe("Pra add_tool: o toolId EXATO de um candidato do action=search_tools (catálogo aitag). Dedup por (userId, source aitag, externalId=toolId). Pra catalog_tool: o toolId NOVO da ficha, em kebab-case minúsculo (vira o endereço aitag.app/tool/<toolId>)."),
|
|
80
|
+
// catalog_tool (ADMIN): cadastra ferramenta open source no catálogo do AItag.
|
|
81
|
+
// Lista fechada de propósito: curadoria, afiliação, nota e ícone continuam
|
|
82
|
+
// gesto do dono no aitag.app/admin.
|
|
83
|
+
name: z.string().optional().describe("Pra catalog_tool: o nome do produto como o projeto escreve (HyperFrames, não hyperframes)."),
|
|
84
|
+
githubUrl: z
|
|
85
|
+
.string()
|
|
86
|
+
.optional()
|
|
87
|
+
.describe("Pra catalog_tool: o repo, https://github.com/<owner>/<repo>. É a chave do dedup: o mesmo repo com outro toolId devolve a ficha que já existe."),
|
|
88
|
+
websiteUrl: z.string().optional().describe("Pra catalog_tool: a homepage do projeto (https). Ausente, vale o githubUrl."),
|
|
89
|
+
categoryEn: z
|
|
90
|
+
.string()
|
|
91
|
+
.optional()
|
|
92
|
+
.describe("Pra catalog_tool: UMA destas, exata: Text & Writing, Image & Design, Video & Animation, Voice & Audio, Coding & Development, Marketing & SEO, Data Analysis & Productivity, Research & Education, Agents & Bots, Creative Automation, Privacy & Web3, Experimental Tools, Technical Utilities, Aggregators & Meta Tools, Adult 18+."),
|
|
93
|
+
categoryPt: z.string().optional().describe("Pra catalog_tool: opcional; ausente, o servidor copia a de uma vizinha da mesma categoria."),
|
|
94
|
+
descriptionEn: z.string().optional().describe("Pra catalog_tool: uma frase do que a ferramenta faz, em inglês (até 400)."),
|
|
95
|
+
descriptionPt: z.string().optional().describe("Pra catalog_tool: a mesma frase em português (até 400)."),
|
|
96
|
+
reviewEn: z
|
|
97
|
+
.string()
|
|
98
|
+
.optional()
|
|
99
|
+
.describe("Pra catalog_tool: a análise editorial em inglês, 3 a 5 frases na voz da casa. É o gate de indexação da página: sem ela, a ficha fica fora do Google."),
|
|
100
|
+
reviewPt: z.string().optional().describe("Pra catalog_tool: a análise editorial em português."),
|
|
101
|
+
tagsEn: z.array(z.string()).optional().describe("Pra catalog_tool: até 10 tags em inglês."),
|
|
102
|
+
tagsPt: z.array(z.string()).optional().describe("Pra catalog_tool: até 10 tags em português."),
|
|
79
103
|
favorite: z
|
|
80
104
|
.boolean()
|
|
81
105
|
.optional()
|
|
@@ -124,6 +148,27 @@ export async function repertorio(args) {
|
|
|
124
148
|
})),
|
|
125
149
|
};
|
|
126
150
|
}
|
|
151
|
+
// catalog_tool (ADMIN): cadastra ferramenta open source no catálogo do AItag,
|
|
152
|
+
// ou devolve a que já existe (dedup por toolId e pelo repo do GitHub). Ficha
|
|
153
|
+
// existente nunca é sobrescrita: o servidor só preenche a análise que estiver
|
|
154
|
+
// vazia. Quem gateia é o Convex (requireMcpAdmin).
|
|
155
|
+
if (args.action === "catalog_tool") {
|
|
156
|
+
return await convexMutation("aitag/mcpCatalog:mcpCatalogTool", {
|
|
157
|
+
sessionToken: getSessionToken(),
|
|
158
|
+
toolId: need(args.toolId, "toolId"),
|
|
159
|
+
name: need(args.name, "name"),
|
|
160
|
+
githubUrl: need(args.githubUrl, "githubUrl"),
|
|
161
|
+
websiteUrl: args.websiteUrl,
|
|
162
|
+
categoryEn: need(args.categoryEn, "categoryEn"),
|
|
163
|
+
categoryPt: args.categoryPt,
|
|
164
|
+
descriptionEn: need(args.descriptionEn, "descriptionEn"),
|
|
165
|
+
descriptionPt: need(args.descriptionPt, "descriptionPt"),
|
|
166
|
+
reviewEn: args.reviewEn,
|
|
167
|
+
reviewPt: args.reviewPt,
|
|
168
|
+
tagsEn: args.tagsEn,
|
|
169
|
+
tagsPt: args.tagsPt,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
127
172
|
// resolve: busca metadado (capa/ano/id) nos providers server-side, com as
|
|
128
173
|
// keys que vivem no env do Convex. Faz a captura por conversa de filme/série/
|
|
129
174
|
// jogo entrar COM capa (anime/livro/música já vêm keyless). Devolve
|
package/dist/tools/video.js
CHANGED
|
@@ -225,6 +225,7 @@ export const videoSchema = z.object({
|
|
|
225
225
|
"shadows",
|
|
226
226
|
"shadows-list",
|
|
227
227
|
"sonorize",
|
|
228
|
+
"upscale",
|
|
228
229
|
"film-list",
|
|
229
230
|
"film-get",
|
|
230
231
|
"film-upsert",
|
|
@@ -393,6 +394,10 @@ export const videoSchema = z.object({
|
|
|
393
394
|
.enum(["edit", "extend"])
|
|
394
395
|
.optional()
|
|
395
396
|
.describe("action=create com sourceVideoId/sourceVideoUrl: 'edit' (padrão) edita o clipe; 'extend' continua ele (durationSec = segundos do pedaço novo, 4/6/8/10)."),
|
|
397
|
+
pagarCom: z
|
|
398
|
+
.enum(["sinapses", "dolar"])
|
|
399
|
+
.optional()
|
|
400
|
+
.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."),
|
|
396
401
|
// --- action=generate (legado) ---
|
|
397
402
|
imageId: z
|
|
398
403
|
.string()
|
|
@@ -786,6 +791,19 @@ export async function video(args) {
|
|
|
786
791
|
imageId: args.imageId,
|
|
787
792
|
});
|
|
788
793
|
}
|
|
794
|
+
if (args.action === "upscale") {
|
|
795
|
+
if (!args.imageId) {
|
|
796
|
+
throw new Error("action=upscale exige imageId (o clipe SEU, já completed, que vai ganhar resolução).");
|
|
797
|
+
}
|
|
798
|
+
if (!args.resolution) {
|
|
799
|
+
throw new Error("action=upscale exige resolution, o alvo: '720p', '1080p', '2k' ou '4k'. O preço é por segundo do clipe e sobe com o alvo.");
|
|
800
|
+
}
|
|
801
|
+
return await convexAction("mcpExtrasActions:mcpVideoUpscale", {
|
|
802
|
+
sessionToken,
|
|
803
|
+
sourceImageId: args.imageId,
|
|
804
|
+
target: args.resolution,
|
|
805
|
+
});
|
|
806
|
+
}
|
|
789
807
|
if (args.action === "sonorize") {
|
|
790
808
|
if (!args.imageId) {
|
|
791
809
|
throw new Error("action=sonorize exige imageId (o clipe SEU, já completed, que vai ganhar som).");
|
|
@@ -853,6 +871,8 @@ export async function video(args) {
|
|
|
853
871
|
sourceVideoId: args.sourceVideoId,
|
|
854
872
|
sourceVideoUrl: args.sourceVideoUrl,
|
|
855
873
|
sourceVideoMode: args.sourceVideoMode,
|
|
874
|
+
// Só vai quando veio: servidor de antes do campo recusaria arg desconhecido.
|
|
875
|
+
...(args.pagarCom === "dolar" ? { pagarCom: "dolar" } : {}),
|
|
856
876
|
});
|
|
857
877
|
}
|
|
858
878
|
if (args.action === "shadows") {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sapiens-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.96.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",
|