sapiens-mcp 1.91.3 → 1.93.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 +4 -4
- package/dist/skills.js +16 -2
- package/dist/tools/distribution.js +5 -0
- package/dist/tools/gallery.js +23 -0
- package/dist/tools/image.js +7 -0
- package/dist/tools/musicator.js +22 -1
- package/package.json +1 -1
package/dist/registry.js
CHANGED
|
@@ -75,7 +75,7 @@ export const TOOLS = {
|
|
|
75
75
|
handler: image,
|
|
76
76
|
},
|
|
77
77
|
sapiens_meta: {
|
|
78
|
-
description: "Utilitários transversais: start (porta de entrada do primeiro contato — sem login ensina a conectar, com login mostra saldo/tier + primeiros poderes com exemplo pronto + 'comece por aqui'), login (conecta a conta com o código de sapiensinteticos.com/conectar-claude, salva a sessão localmente; ela vale 90 dias e renova sozinha a cada uso), logout (desconecta de verdade: revoga a chave no servidor e apaga o token local), whoami (tier user/admin + saldo + email), credits (saldo agregado), subscription (plan + status + saldo por bucket subscription/grants/free + warnings low/critical), formats (schemas por formato), health (inclui a versão do MCP), version (qual versão do sapiens-mcp está REALMENTE rodando + se é a última do npm; não exige login; use pra saber se o client pegou a versão nova ou ficou preso em cache do npx), app_url (URLs canônicas), precos (a tabela de preço do membro
|
|
78
|
+
description: "Utilitários transversais: start (porta de entrada do primeiro contato — sem login ensina a conectar, com login mostra saldo/tier + primeiros poderes com exemplo pronto + 'comece por aqui'), login (conecta a conta com o código de sapiensinteticos.com/conectar-claude, salva a sessão localmente; ela vale 90 dias e renova sozinha a cada uso), logout (desconecta de verdade: revoga a chave no servidor e apaga o token local), whoami (tier user/admin + saldo + email), credits (saldo agregado), subscription (plan + status + saldo por bucket subscription/grants/free + warnings low/critical), formats (schemas por formato), health (inclui a versão do MCP), version (qual versão do sapiens-mcp está REALMENTE rodando + se é a última do npm; não exige login; use pra saber se o client pegou a versão nova ou ficou preso em cache do npx), app_url (URLs canônicas), precos (a tabela de preço do membro em duas carteiras separadas, com regras próprias: app = cada motor do App em Sinapses, com o detalhe por resolução e por segundo de vídeo e o link do card em /motores; api = a API da conta, com saldo próprio em dólar: preço por imagem, a partir de no vídeo (o exato pela cotação grátis) e texto por milhão de tokens com midia=texto. Sinapse não se converte em dólar. Pra comparar com fal.ai, WaveSpeed ou outro serviço que cobra em dólar, use a parte api. midia recorta, busca filtra pelo nome). Use credits/subscription antes de gerar imagem pra avisar se vai estourar.",
|
|
79
79
|
schema: metaSchema,
|
|
80
80
|
handler: meta,
|
|
81
81
|
},
|
|
@@ -90,7 +90,7 @@ export const TOOLS = {
|
|
|
90
90
|
handler: repertorio,
|
|
91
91
|
},
|
|
92
92
|
sapiens_gallery: {
|
|
93
|
-
description: "Browse, publicação e upload das imagens do user. Sub-actions: list (últimas N peças, com prompt/model/url + isPublic + acervoUrl; kind=image por default, kind=video traz os takes com posterUrl, a capa, e kind=all mistura. Depois de ingerir ou gerar vídeo, é o list kind=video que dá a capa pra mostrar miniatura + player em vez de link solto), get (1 imagem com metadados, opcionalmente base64), publish (torna a PRÓPRIA imagem pública: entra na galeria pública + feed Pinterest, e ganha página indexável /imagem/<id> se o modelo não for degen devolve publicPageUrl; publicado NÃO despublica, não existe unpublish), upload (traz pra galeria uma peça gerada FORA da casa, por sourceUrl https, filePath local ou base64; ADMIN por ora), ingest (A PONTE, qualquer conta logada: peça que a PESSOA dirigiu com a ficha do personagem daqui e um motor de fora renderizou, no crédito dela (Kie, fal, Magnific, Sogni, a própria placa): entra NATIVA na timeline e nasce PRIVADA (isPublic false), publicável DEPOIS por ela como qualquer geração da casa, nunca sozinha, com custo 0 em Sinapses e o custo real guardado em externalCost; carrega o prompt VERBATIM, as referências da casa (referenceImageIds), o personagem (characterId) e o motor (externalEngine 'provedor-motor'); a peça chega por filePath (local, só no MCP instalado), sourceUrl (o render, baixado pelo MCP na máquina da pessoa, nunca pelo servidor) ou base64; o carimbo +18 nasce na entrada pela CLASSE do provedor (peso aberto como Sogni, Replicate, HF, fal, WaveSpeed, Civitai e a própria placa entram carimbados, só a curadoria tira; serviço com moderação como Kie, Magnific, Freepik, Krea entra sem) ou por unfiltered=true dito pela pessoa (carimbo dela, ela tira depois); idempotente por sourceUrl ou pelo hash do arquivo, então re-ingerir corrige a ficha em vez de duplicar; tetos 12 MB imagem, 60 MB vídeo, 40 por dia. A chave do provedor NUNCA passa por aqui: quem gerou foi o harness da pessoa. Passo a passo na skill 'pontes'), refs (acopla peças da casa como REFERÊNCIA numa peça que já existe, de upload ou de ingest; ADMIN, e só na própria peça), processo (O COMO JUNTO DO QUE: anexa a uma peça as peças que mostram como ela foi dirigida, o mapa de rota desenhado sobre o still, a prancha de frames com o tempo de cada marco, o antes e depois de duas rodadas; elas viram a seção 'Como foi feito' na página pública da peça, na ordem que você mandar e com a sua legenda por peça; qualquer membro, só na própria peça, teto de 12. É IRMÃ do refs e a diferença importa: refs é o INSUMO que entrou na geração, processo é o REGISTRO de como ela foi dirigida, e uma lista não mexe na outra. Peça de processo privada não aparece pra quem está de fora nem em miniatura: pra aparecer, publique ela também), cast (QUEM ESTÁ EM CENA numa peça que já existe, quando é mais de uma criatura: characterIds em ordem, o protagonista primeiro, e a peça passa a contar na ficha de todos eles em vez de sumir da segunda; qualquer membro, na própria peça), parts (O INTEIRO E OS PEDAÇOS de um vídeo: o clipe de 30s que foi montado a partir de dois takes de 15s, a fita longa feita de partes. COM imageId devolve a ficha de parentesco daquela peça, quais são as partes dela e de qual inteiro ela é parte, com a url do arquivo completo pra baixar. SEM imageId devolve o que AINDA NÃO FOI MONTADO: varre os takes soltos da conta, agrupa os que têm cara de par (mesmo personagem, mesmo período, prompt de 'Part one/Part two' ou arquivo terminando em -a/-b) e diz o PORQUE de cada agrupamento, pra você saber o que falta juntar antes de o autor perguntar. É heurística e não monta nada sozinha: adianta a descoberta, quem decide é quem lê. characterId filtra por personagem. Sem custo), link_parts (LIGA o inteiro aos pedaços: imageId é o vídeo montado e partIds são os takes NA ORDEM em que aparecem nele. O juntador da casa e o ingest que traz referências de vídeo já gravam esse laço sozinhos; esta porta é pra montagem feita FORA (ffmpeg na máquina, ingest do arquivo já pronto) e pra corrigir ligação errada. Só na própria peça, teto de 16 partes, e a lista TROCA o que estava gravado antes. Sem custo), reprovar (O VETO do dono: imageId + motivo, o porquê numa frase concreta. A peça que errou (rosto do personagem trocado, mão quebrada, a referência errada) não sai mais por porta nenhuma, fila do Distribution, publicar, Telegram, e some das levas do garimpo; fica no acervo com o porquê, pra ensinar. Chame NO MESMO TURNO em que o dono condena uma peça: peça condenada e não marcada volta numa leva. desfazer=true tira o veto. Imagem e vídeo, só na própria peça, sem custo), reprovadas (as peças vetadas da conta com o prompt que as gerou e o motivo, a mais recente primeiro; characterId filtra por personagem. LEIA ANTES de gerar de novo um personagem que já teve peça reprovada: é a lista do que não repetir. Sem custo). Use list/get pra reusar imagem como referência (passe o imageId em sapiens_image mode=edit ou mode=variation) ou pra mostrar pro user o que ele já tem; publish quando o user quer divulgar a imagem dele. IMPORTANTE sobre upload: a peça entra PRIVADA e continua privada: o servidor recusa publicar e recusa compartilhar na comunidade, porque ela é do usuário e a responsabilidade é dele. O caminho pra ela virar coisa pública é usar como referência numa geração daqui e publicar o resultado. O refs escreve só proveniência (de que ficha/folha a peça nasceu): não promove nada, e um upload continua sem publicar depois de ganhar referência. COMO A PEÇA FOI FEITA: list aceita skill=<slug> e devolve só o que saiu daquela skill (o mesmo slug que sapiens_image gravou em skills), com a busca varrendo as últimas 200 peças antes de cortar no limit; cada item volta com o campo skills, e null ali quer dizer que ninguém marcou, não que foi feita sem skill.",
|
|
93
|
+
description: "Browse, publicação e upload das imagens do user. Sub-actions: list (últimas N peças, com prompt/model/url + isPublic + acervoUrl; kind=image por default, kind=video traz os takes com posterUrl, a capa, e kind=all mistura. Depois de ingerir ou gerar vídeo, é o list kind=video que dá a capa pra mostrar miniatura + player em vez de link solto), get (1 imagem com metadados, opcionalmente base64), publish (torna a PRÓPRIA imagem pública: entra na galeria pública + feed Pinterest, e ganha página indexável /imagem/<id> se o modelo não for degen devolve publicPageUrl; publicado NÃO despublica, não existe unpublish), upload (traz pra galeria uma peça gerada FORA da casa, por sourceUrl https, filePath local ou base64; ADMIN por ora), ingest (A PONTE, qualquer conta logada: peça que a PESSOA dirigiu com a ficha do personagem daqui e um motor de fora renderizou, no crédito dela (Kie, fal, Magnific, Sogni, a própria placa): entra NATIVA na timeline e nasce PRIVADA (isPublic false), publicável DEPOIS por ela como qualquer geração da casa, nunca sozinha, com custo 0 em Sinapses e o custo real guardado em externalCost; carrega o prompt VERBATIM, as referências da casa (referenceImageIds), o personagem (characterId) e o motor (externalEngine 'provedor-motor'); a peça chega por filePath (local, só no MCP instalado), sourceUrl (o render, baixado pelo MCP na máquina da pessoa, nunca pelo servidor) ou base64; o carimbo +18 nasce na entrada pela CLASSE do provedor (peso aberto como Sogni, Replicate, HF, fal, WaveSpeed, Civitai e a própria placa entram carimbados, só a curadoria tira; serviço com moderação como Kie, Magnific, Freepik, Krea entra sem) ou por unfiltered=true dito pela pessoa (carimbo dela, ela tira depois); idempotente por sourceUrl ou pelo hash do arquivo, então re-ingerir corrige a ficha em vez de duplicar; tetos 12 MB imagem, 60 MB vídeo, 40 por dia. A chave do provedor NUNCA passa por aqui: quem gerou foi o harness da pessoa. Passo a passo na skill 'pontes'), refs (acopla peças da casa como REFERÊNCIA numa peça que já existe, de upload ou de ingest; ADMIN, e só na própria peça), processo (O COMO JUNTO DO QUE: anexa a uma peça as peças que mostram como ela foi dirigida, o mapa de rota desenhado sobre o still, a prancha de frames com o tempo de cada marco, o antes e depois de duas rodadas; elas viram a seção 'Como foi feito' na página pública da peça, na ordem que você mandar e com a sua legenda por peça; qualquer membro, só na própria peça, teto de 12. É IRMÃ do refs e a diferença importa: refs é o INSUMO que entrou na geração, processo é o REGISTRO de como ela foi dirigida, e uma lista não mexe na outra. Peça de processo privada não aparece pra quem está de fora nem em miniatura: pra aparecer, publique ela também), cast (QUEM ESTÁ EM CENA numa peça que já existe, quando é mais de uma criatura: characterIds em ordem, o protagonista primeiro, e a peça passa a contar na ficha de todos eles em vez de sumir da segunda; qualquer membro, na própria peça), parts (O INTEIRO E OS PEDAÇOS de um vídeo: o clipe de 30s que foi montado a partir de dois takes de 15s, a fita longa feita de partes. COM imageId devolve a ficha de parentesco daquela peça, quais são as partes dela e de qual inteiro ela é parte, com a url do arquivo completo pra baixar. SEM imageId devolve o que AINDA NÃO FOI MONTADO: varre os takes soltos da conta, agrupa os que têm cara de par (mesmo personagem, mesmo período, prompt de 'Part one/Part two' ou arquivo terminando em -a/-b) e diz o PORQUE de cada agrupamento, pra você saber o que falta juntar antes de o autor perguntar. É heurística e não monta nada sozinha: adianta a descoberta, quem decide é quem lê. characterId filtra por personagem. Sem custo), link_parts (LIGA o inteiro aos pedaços: imageId é o vídeo montado e partIds são os takes NA ORDEM em que aparecem nele. O juntador da casa e o ingest que traz referências de vídeo já gravam esse laço sozinhos; esta porta é pra montagem feita FORA (ffmpeg na máquina, ingest do arquivo já pronto) e pra corrigir ligação errada. Só na própria peça, teto de 16 partes, e a lista TROCA o que estava gravado antes. Sem custo), reprovar (O VETO do dono: imageId + motivo, o porquê numa frase concreta. A peça que errou (rosto do personagem trocado, mão quebrada, a referência errada) não sai mais por porta nenhuma, fila do Distribution, publicar, Telegram, e some das levas do garimpo; fica no acervo com o porquê, pra ensinar. Chame NO MESMO TURNO em que o dono condena uma peça: peça condenada e não marcada volta numa leva. desfazer=true tira o veto. Imagem e vídeo, só na própria peça, sem custo), reprovadas (as peças vetadas da conta com o prompt que as gerou e o motivo, a mais recente primeiro; characterId filtra por personagem. LEIA ANTES de gerar de novo um personagem que já teve peça reprovada: é a lista do que não repetir. Sem custo), carimbo (o +18 da peça: imageId + adulta true liga, false tira, com a regra do botão da ficha: a curadoria mexe em qualquer carimbo, inclusive o que a ponte põe por classe de motor sem autor, e o dono liga na própria peça e só tira o que ele mesmo pôs. Peça carimbada não entra em praça sfw do Distribution, então tirar o carimbo de peça vestida destrava Instagram, TikTok, YouTube e LinkedIn; peça com nudez fica carimbada. Sem custo). Use list/get pra reusar imagem como referência (passe o imageId em sapiens_image mode=edit ou mode=variation) ou pra mostrar pro user o que ele já tem; publish quando o user quer divulgar a imagem dele. IMPORTANTE sobre upload: a peça entra PRIVADA e continua privada: o servidor recusa publicar e recusa compartilhar na comunidade, porque ela é do usuário e a responsabilidade é dele. O caminho pra ela virar coisa pública é usar como referência numa geração daqui e publicar o resultado. O refs escreve só proveniência (de que ficha/folha a peça nasceu): não promove nada, e um upload continua sem publicar depois de ganhar referência. COMO A PEÇA FOI FEITA: list aceita skill=<slug> e devolve só o que saiu daquela skill (o mesmo slug que sapiens_image gravou em skills), com a busca varrendo as últimas 200 peças antes de cortar no limit; cada item volta com o campo skills, e null ali quer dizer que ninguém marcou, não que foi feita sem skill.",
|
|
94
94
|
schema: gallerySchema,
|
|
95
95
|
handler: gallery,
|
|
96
96
|
},
|
|
@@ -140,7 +140,7 @@ export const TOOLS = {
|
|
|
140
140
|
handler: helen,
|
|
141
141
|
},
|
|
142
142
|
sapiens_musicator: {
|
|
143
|
-
description: "Musicator — loop completo de música via voz Sapiens, sem precisar da UI (qualquer logado; lyrics 300 / render 3000 Sinapses). Sub-actions: 'create' (cria brief+track draft num passo, custo 0, devolve trackId), 'lyrics' (gera letra PT + stylePrompt EN; passe trackId pra GRAVAR na track e deixar pronta pra render, ou sem trackId pra só receber o texto inline; 300 sinapses), 'list' (suas tracks: id/título/status/áudio), 'get' (detalhe de uma track pra acompanhar render — status/áudio/letra), 'render' (schedula synth
|
|
143
|
+
description: "Musicator — loop completo de música via voz Sapiens, sem precisar da UI (qualquer logado; lyrics 300 / render 3000 Sinapses). Sub-actions: 'create' (cria brief+track draft num passo, custo 0, devolve trackId), 'lyrics' (gera letra PT + stylePrompt EN; passe trackId pra GRAVAR na track e deixar pronta pra render, ou sem trackId pra só receber o texto inline; 300 sinapses), 'list' (suas tracks: id/título/status/áudio), 'get' (detalhe de uma track pra acompanhar render — status/áudio/letra), 'render' (schedula o synth num trackId pronto, assíncrono fire-and-forget, 3/min; `model` escolhe o motor: 'pro' Lyria 3.5 (default), 'clip' Lyria 3 Clip, 'mureka' Mureka 9.5, 'minimax' MiniMax Music 2.6, 'elevenlabs' ElevenLabs Music com `durationSeconds` 30/60/120/180; preço fixo por faixa, menos o ElevenLabs, que cobra pela duração: puxe a skill 'musica' pra tabela antes de disparar), 'publish' (publica uma faixa PRONTA do user no Acervo da Comunidade — aba Músicas — com eco no Chat e Fórum; CURADO: só admin/dono, custo 0, idempotente), 'list_public' (lê o Acervo público de músicas da Comunidade, sem custo, sem login). Fluxo cheio: create → lyrics(trackId) → render → get (poll status: rendering → ready/failed) → publish (dono). Tudo escopado por dono (só mexe nas suas tracks).",
|
|
144
144
|
schema: musicatorSchema,
|
|
145
145
|
handler: musicator,
|
|
146
146
|
},
|
|
@@ -277,7 +277,7 @@ REGRA DE OURO:
|
|
|
277
277
|
- DUAS PORTAS, lado a lado: Sinapse (sapiens_image, sapiens_video: nada pra configurar) ou a CHAVE DA PESSOA num provedor (fal, Kie, WaveSpeed, Replicate, OpenRouter, Sogni, a própria placa), que custa zero aqui. No MCP instalado, sapiens_pontes gera com a chave que mora na máquina dela (fal, Kie, WaveSpeed, Replicate, OpenRouter) e traz a peça pro acervo; no remoto, ela gera no harness dela e traz por sapiens_gallery action=ingest. sapiens_meta action=pontes diz o que ela já tem configurado: se tiver chave, ofereça as duas portas antes de gastar Sinapse. A chave NUNCA passa pelo Sapiens (nem em arg, nem no chat). Skill 'pontes'.
|
|
278
278
|
- REGRA DO TIMEOUT: geração SÍNCRONA pode estourar o teto de ~120s do cliente e voltar 'Timeout' MESMO tendo gerado e COBRADO. Nunca repita às cegas: confira antes onde o resultado cairia (a tabela de onde conferir está na skill 'primeiros-passos').
|
|
279
279
|
- "sessionToken expirado" = refaça login: sapiens_meta action=login com o código de sapiensinteticos.com/conectar-claude.
|
|
280
|
-
- sapiens_meta action=formats devolve os schemas por formato; action=whoami diz tier (user/admin) + saldo. sapiens_image e sapiens_video action=models trazem o catálogo com o preço ATUAL: consulte em vez de chutar custo.
|
|
280
|
+
- sapiens_meta action=formats devolve os schemas por formato; action=whoami diz tier (user/admin) + saldo. sapiens_image e sapiens_video action=models trazem o catálogo com o preço ATUAL: consulte em vez de chutar custo. Preço do App em Sinapses e da API em dólar (carteiras separadas, uma nunca vira a outra): sapiens_meta action=precos.
|
|
281
281
|
|
|
282
282
|
MODO COMPANHIA: sapiens_meta action=start e action=whoami podem trazer um bloco 'companion'. Quando vier companion.active=true, você INCORPORA aquele Sintético (a voz dele, o avatar, o oi dele) continuando a operar na conta e nas Sinapses do USUÁRIO. Puxe a skill 'companhia' antes de fazer isso. Se vier 'characterOffer', siga o que ele manda: são personagens que o usuário escreveu e que podem entrar em cena, e quem OFERECE é você, na hora em que a conversa encostar num deles. Só personagem de autoria dele; a alma de personagem alheio não sai por aqui.
|
|
283
283
|
|
package/dist/skills.js
CHANGED
|
@@ -73,7 +73,7 @@ Não despeje a lista inteira de tools. O start guia.
|
|
|
73
73
|
- \`sapiens_meta action=formats\`: os schemas por formato.
|
|
74
74
|
- \`sapiens_meta action=version\`: qual versão está rodando de verdade e se é a última. Não exige login.
|
|
75
75
|
- \`sapiens_image action=models\` e \`sapiens_video action=models\`: catálogo vivo com o preço ATUAL. Consulte em vez de chutar custo.
|
|
76
|
-
- \`sapiens_meta action=precos\`: a tabela de preço em
|
|
76
|
+
- \`sapiens_meta action=precos\`: a tabela de preço em duas carteiras separadas: o App em Sinapses (por resolução e por segundo de vídeo) e a API em dólar, com saldo próprio. Sinapse não vira dólar. "A API sai mais barata que a fal.ai / WaveSpeed?" se responde com a parte \`api\`.`,
|
|
77
77
|
},
|
|
78
78
|
{
|
|
79
79
|
name: "voz-da-casa",
|
|
@@ -184,6 +184,20 @@ Acervo de outra pessoa você lê, mas só o que ela deixou público.
|
|
|
184
184
|
3. **render**: passe o \`trackId\` pronto pra sintetizar o áudio (3000 Sinapses, assíncrono, teto de 3/min).
|
|
185
185
|
4. **get**: passe o \`trackId\` e vá polando o status até 'ready' (ou 'failed').
|
|
186
186
|
|
|
187
|
+
## Qual motor no render
|
|
188
|
+
|
|
189
|
+
\`model\` escolhe o motor. Sem ele, sai no Lyria 3.5.
|
|
190
|
+
|
|
191
|
+
- \`pro\`: Lyria 3.5, faixa inteira até 3 min. Único que lê imagem de referência.
|
|
192
|
+
- \`clip\`: Lyria 3 Clip, rascunho de 30s pra testar a ideia.
|
|
193
|
+
- \`mureka\`: Mureka 9.5, faixa inteira, aguenta letra de até 5.000 caracteres.
|
|
194
|
+
- \`minimax\`: MiniMax Music 2.6, faixa inteira até 5 min. Letra de 10 a 3.000 caracteres.
|
|
195
|
+
- \`elevenlabs\`: ElevenLabs Music, a pessoa escolhe a duração em \`durationSeconds\` (30, 60, 120 ou 180; sem ele, 120). Letra até 3.500 caracteres.
|
|
196
|
+
|
|
197
|
+
Todos custam o mesmo render fixo, menos o ElevenLabs, que cobra pela duração (\`durationSeconds\`): 30s 1300, 60s 2550, 120s 5050, 180s 7600 Sinapses. Diga o número e confirme antes de disparar o de 3 min.
|
|
198
|
+
|
|
199
|
+
Letra maior que o teto do motor é recusada ANTES de cobrar, com o tamanho na mensagem: corte a letra ou troque de motor. \`negativePrompt\` e \`seed\` só valem no Lyria.
|
|
200
|
+
|
|
187
201
|
Pular pro lyrics ou render sem create, ou sem os campos, falha sempre. É o erro número um deste fluxo.
|
|
188
202
|
|
|
189
203
|
Depois de pronta: \`action=publish\` põe a faixa no Acervo da Comunidade (só admin/dono, custo 0, idempotente). A publicação já nasce com player no Fórum, veja a skill \`forum\`.
|
|
@@ -947,7 +961,7 @@ Baixe e leia ANTES de escrever o código. Num agente com pasta de skills, ele en
|
|
|
947
961
|
## O que vale saber já
|
|
948
962
|
|
|
949
963
|
- Base: \`https://www.sapiensinteticos.com/api/v1\`, com \`Authorization: Bearer <chave>\`. No SDK da OpenAI, só troque o \`baseURL\`.
|
|
950
|
-
- Preço:
|
|
964
|
+
- Preço: o de cada modelo está em \`GET /models\`; vídeo cota de graça em \`POST /videos/quote\`. O valor de uma chamada pode variar um pouco com a oferta da hora. O valor de cada chamada volta no header \`x-sapiens-charge-usd\`. Pra pôr o preço da API ao lado de outro provedor (fal.ai, WaveSpeed): \`sapiens_meta action=precos\`, parte \`api\`.
|
|
951
965
|
- Vídeo cota de graça antes (\`POST /videos/quote\`), aceita \`webhook_url\` pra avisar quando termina e devolve a \`url\` do mp4 guardado. Falha do motor volta pro saldo sozinha.
|
|
952
966
|
- Saldo que acabou volta 402 \`insufficient_balance\` com \`recharge_url\` no erro: o código da pessoa deve mostrar esse link (recarga no cartão ou em stablecoin) em vez de só falhar.
|
|
953
967
|
- Uma chamada de teste antes de qualquer lote. Nunca vídeo em laço.`,
|
|
@@ -79,6 +79,7 @@ const CHANNELS = [
|
|
|
79
79
|
"bluesky-8",
|
|
80
80
|
"bluesky-9",
|
|
81
81
|
"bluesky-10",
|
|
82
|
+
"bluesky-11",
|
|
82
83
|
"farcaster",
|
|
83
84
|
"telegram",
|
|
84
85
|
// Canais de personagem no Telegram (telegram-2 = Aria, telegram-3 = Arak,
|
|
@@ -134,6 +135,10 @@ const CHANNELS = [
|
|
|
134
135
|
"tiktok-up",
|
|
135
136
|
"youtube-up",
|
|
136
137
|
"instagram-up",
|
|
138
|
+
// O segundo trio (11/10/2026), no profile de outra linhagem.
|
|
139
|
+
"tiktok-up-2",
|
|
140
|
+
"youtube-up-2",
|
|
141
|
+
"instagram-up-2",
|
|
137
142
|
// O X do Obsolete Human, pelo Buffer próprio do selo. O linkedin-page-2 saiu
|
|
138
143
|
// em 11/10/2026: o selo não tem LinkedIn, e o servidor recusa o canal com o
|
|
139
144
|
// motivo (convex/shared/canaisAposentados.ts) pra quem roda versão velha.
|
package/dist/tools/gallery.js
CHANGED
|
@@ -44,6 +44,7 @@ export const gallerySchema = z.object({
|
|
|
44
44
|
"link_parts",
|
|
45
45
|
"reprovar",
|
|
46
46
|
"reprovadas",
|
|
47
|
+
"carimbo",
|
|
47
48
|
]),
|
|
48
49
|
processo: z
|
|
49
50
|
.array(z.object({
|
|
@@ -175,6 +176,11 @@ export const gallerySchema = z.object({
|
|
|
175
176
|
.boolean()
|
|
176
177
|
.optional()
|
|
177
178
|
.describe("action=reprovar: true TIRA o veto (a peça volta a poder sair e a entrar nas levas), e o motivo vai junto. Ausente/false reprova."),
|
|
179
|
+
// --- action=carimbo: o carimbo +18 da peça ---
|
|
180
|
+
adulta: z
|
|
181
|
+
.boolean()
|
|
182
|
+
.optional()
|
|
183
|
+
.describe("action=carimbo: true LIGA o carimbo +18 na peça, false TIRA. Obrigatório nessa action. A regra é a do botão da ficha: a curadoria (admin) liga e tira qualquer carimbo, inclusive o que a ponte põe por CLASSE de motor sem autor; o dono liga na própria peça e só tira o carimbo que ele mesmo pôs. Peça carimbada não entra em praça de teto sfw do Distribution (Instagram, TikTok, YouTube, LinkedIn): tirar o carimbo de peça vestida é o que destrava a fila. Não tire carimbo de peça com nudez."),
|
|
178
184
|
});
|
|
179
185
|
// Teto igual ao do servidor (convex/galleryImport.ts): falha aqui é mais barata
|
|
180
186
|
// que falhar depois de trafegar o base64 inteiro.
|
|
@@ -691,6 +697,23 @@ export async function gallery(args) {
|
|
|
691
697
|
motivo: args.desfazer ? undefined : args.motivo?.trim(),
|
|
692
698
|
});
|
|
693
699
|
}
|
|
700
|
+
// carimbo: liga ou tira o +18 da peça, com a regra do botão da ficha
|
|
701
|
+
// (convex/shared/adultStamp.ts). Existe porque a ponte carimba por CLASSE de
|
|
702
|
+
// motor, sem autor, e vídeo vestido ficava preso fora do Instagram e do
|
|
703
|
+
// YouTube até alguém abrir a ficha.
|
|
704
|
+
if (args.action === "carimbo") {
|
|
705
|
+
if (!args.imageId) {
|
|
706
|
+
throw new Error("action=carimbo exige imageId: a peça (imagem ou vídeo, o id da galeria).");
|
|
707
|
+
}
|
|
708
|
+
if (typeof args.adulta !== "boolean") {
|
|
709
|
+
throw new Error("action=carimbo exige adulta: true liga o carimbo +18, false tira.");
|
|
710
|
+
}
|
|
711
|
+
return await convexAction("desktopMcp:galleryCarimbo", {
|
|
712
|
+
sessionToken,
|
|
713
|
+
imageId: args.imageId,
|
|
714
|
+
adulta: args.adulta,
|
|
715
|
+
});
|
|
716
|
+
}
|
|
694
717
|
// reprovadas: as peças vetadas da conta, com o prompt que gerou e o porquê,
|
|
695
718
|
// a mais recente primeiro. Leia ANTES de gerar de novo o mesmo personagem.
|
|
696
719
|
if (args.action === "reprovadas") {
|
package/dist/tools/image.js
CHANGED
|
@@ -172,6 +172,10 @@ export const imageSchema = z.object({
|
|
|
172
172
|
.max(0.9)
|
|
173
173
|
.optional()
|
|
174
174
|
.describe("Força da referência, só nas Krea 2 da WaveSpeed ('wavespeed-krea2-realism', 'wavespeed-krea2', 'wavespeed-krea2-transparencia', 'wavespeed-krea2-base'), onde a primeira referência vira a imagem-base: quanto a peça repinta. 0.2 guarda a foto quase inteira, com o rosto; 0.45 guarda pose, roupa e fundo, e o prompt muda luz e clima (o rosto sai parecido, não igual); 0.65 (o default) guarda enquadramento e roupa, e rosto e cenário saem do prompt; 0.9 guarda só a proporção. A peça sai no formato da referência, não no aspectRatio. Pra segurar rosto de personagem, o caminho é o Klein ('wavespeed-flux2' e família), não baixar a força. O campo refStrength de action=models diz quais motores aceitam e o default de cada um. Ignorado nos outros motores."),
|
|
175
|
+
pagarCom: z
|
|
176
|
+
.enum(["sinapses", "dolar"])
|
|
177
|
+
.optional()
|
|
178
|
+
.describe("De qual saldo sai a imagem. 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 peça, mesmas referências e tamanhos, preço em dólar do custo do motor naquela resolução. Use quando a pessoa pedir pra pagar com o saldo da API ou estiver sem Sinapses e com saldo em dólar. Motor sem preço em dólar (os do Civitai) recusa, e saldo em dólar curto recusa sem cobrar nada. O valor cobrado volta em pagoEmDolarUsd. Sinapse nunca vira dólar nem o contrário: são duas carteiras."),
|
|
175
179
|
mode: z
|
|
176
180
|
.enum(["create", "edit", "variation"])
|
|
177
181
|
.optional()
|
|
@@ -372,6 +376,7 @@ export async function image(args) {
|
|
|
372
376
|
refStrength: args.refStrength,
|
|
373
377
|
// Só vai quando veio: servidor de antes do campo recusaria arg desconhecido.
|
|
374
378
|
...(args.maskRegions ? { maskRegions: args.maskRegions } : {}),
|
|
379
|
+
...(args.pagarCom === "dolar" ? { pagarCom: "dolar" } : {}),
|
|
375
380
|
});
|
|
376
381
|
// Backend de antes do campo não devolve motor nem ficha: cai no id pedido e
|
|
377
382
|
// monta a ficha aqui. O nome bonito (modelName) só vem do servidor.
|
|
@@ -389,6 +394,8 @@ export async function image(args) {
|
|
|
389
394
|
acervoUrl,
|
|
390
395
|
entrega: "Ao mostrar a peça, diga o motor pelo modelName e mande o acervoUrl como link 'no acervo'. A peça é PRIVADA: link público só existe depois de sapiens_gallery action=publish (que devolve o endereço público).",
|
|
391
396
|
mimeType: result?.mimeType,
|
|
397
|
+
// Pago com o saldo em dólar da API: quanto saiu. Ausente quando foi em Sinapses.
|
|
398
|
+
...(typeof result?.pagoEmDolarUsd === "number" ? { pagoEmDolarUsd: result.pagoEmDolarUsd } : {}),
|
|
392
399
|
// Não incluir base64 no retorno (polui contexto). Quem quiser bytes
|
|
393
400
|
// chama sapiens_gallery action=get com includeBase64=true.
|
|
394
401
|
};
|
package/dist/tools/musicator.js
CHANGED
|
@@ -10,7 +10,9 @@ import { convexAction, convexQuery, getSessionToken } from "../convexClient.js";
|
|
|
10
10
|
* trackId, só devolve o texto inline (300 sinapses).
|
|
11
11
|
* - list: lista as tracks do próprio user (id, título, status, áudio).
|
|
12
12
|
* - get: detalhe de uma track (status/áudio/letra) — pra acompanhar render.
|
|
13
|
-
* - render: schedula o synth
|
|
13
|
+
* - render: schedula o synth numa track pronta. Motor em `model` (Lyria 3.5
|
|
14
|
+
* default, Lyria 3 Clip, Mureka 9.5, MiniMax Music 2.6, ElevenLabs
|
|
15
|
+
* Music). 3000 sinapses; ElevenLabs cobra pela duração.
|
|
14
16
|
* - publish: publica uma faixa PRONTA do user no Acervo da Comunidade (aba
|
|
15
17
|
* Músicas) + eco no Chat e Fórum. CURADO: só admin (dono). Custo 0.
|
|
16
18
|
* - list_public: lê o Acervo público de músicas da Comunidade (sem custo, sem
|
|
@@ -71,6 +73,19 @@ export const musicatorSchema = z.object({
|
|
|
71
73
|
.number()
|
|
72
74
|
.optional()
|
|
73
75
|
.describe("Pra action=render: seed pra reprodutibilidade do synth."),
|
|
76
|
+
model: z
|
|
77
|
+
.enum(["pro", "clip", "mureka", "minimax", "elevenlabs"])
|
|
78
|
+
.optional()
|
|
79
|
+
.describe("Pra action=render: motor da faixa. 'pro' = Lyria 3.5 (default, faixa inteira até 3 min, lê imagem de referência). " +
|
|
80
|
+
"'clip' = Lyria 3 Clip (rascunho de 30s). 'mureka' = Mureka 9.5 (faixa inteira, letra até 5.000 caracteres). " +
|
|
81
|
+
"'minimax' = MiniMax Music 2.6 (faixa inteira até 5 min, letra de 10 a 3.000 caracteres). " +
|
|
82
|
+
"'elevenlabs' = ElevenLabs Music (duração escolhida em durationSeconds, letra até 3.500 caracteres). " +
|
|
83
|
+
"Preço: o mesmo render fixo em todos, menos 'elevenlabs', que cobra pela duração (tabela na skill 'musica'; confirme com a pessoa antes). " +
|
|
84
|
+
"Só o Lyria lê imagem de referência; negativePrompt e seed são ignorados nos motores de fora do Lyria."),
|
|
85
|
+
durationSeconds: z
|
|
86
|
+
.number()
|
|
87
|
+
.optional()
|
|
88
|
+
.describe("Pra action=render com model='elevenlabs': duração da faixa em segundos, uma de 30, 60, 120 ou 180 (default 120). Ignorado nos outros motores."),
|
|
74
89
|
});
|
|
75
90
|
export async function musicator(args) {
|
|
76
91
|
// list_public é o Acervo público de músicas da Comunidade (sem custo, sem
|
|
@@ -139,6 +154,12 @@ export async function musicator(args) {
|
|
|
139
154
|
stylePromptOverride: args.stylePromptOverride,
|
|
140
155
|
negativePrompt: args.negativePrompt,
|
|
141
156
|
seed: args.seed,
|
|
157
|
+
// Só vão quando escolhidos: servidor anterior a 11/out/2026 não conhece os
|
|
158
|
+
// dois args e recusaria o pedido inteiro.
|
|
159
|
+
...(args.model ? { model: args.model } : {}),
|
|
160
|
+
...(args.model === "elevenlabs" && args.durationSeconds !== undefined
|
|
161
|
+
? { durationSeconds: args.durationSeconds }
|
|
162
|
+
: {}),
|
|
142
163
|
});
|
|
143
164
|
}
|
|
144
165
|
if (args.action === "publish") {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sapiens-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.93.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.",
|
|
6
6
|
"type": "module",
|