尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Bot que recebe uma foto de um produto no WhatsApp e responde com as melhores opções equivalentes na Shopee (link de afiliado já atribuído). O núcleo (Shopee + concierge) nunca importa nada de channel/. Isso é de propósito: pra trocar de instância Z-API, ou até trocar WhatsApp por outro canal (Instagram oficial, por exemplo, se um dia fizer sentido), você só troca o arquivo dentro de channel/ e as variáveis de ambiente — nada no núcleo muda. O que já está pronto e validado查看完整 README ↗
Bot que recebe uma foto de um produto no WhatsApp e responde com as melhores opções equivalentes na Shopee (link de afiliado já atribuído).
src/lib/shopee/ -> núcleo Shopee (busca + geração de link) — não sabe nada de canal
src/lib/concierge/ -> núcleo do concierge (sessão, reconhecimento, ranking, resposta) — não sabe nada de canal
src/lib/channel/ -> conector de canal (hoje: Z-API). É a ÚNICA peça que fala com o WhatsApp.
src/app/api/webhook/zapi/ -> endpoint HTTP que a Z-API chama quando chega mensagem
O núcleo (Shopee + concierge) nunca importa nada de channel/. Isso é
de propósito: pra trocar de instância Z-API, ou até trocar WhatsApp por
outro canal (Instagram oficial, por exemplo, se um dia fizer sentido),
você só troca o arquivo dentro de channel/ e as variáveis de ambiente
— nada no núcleo muda.
.env (copie de .env.example): Shopee (você já
tem), Z-API da instância que decidiu usar, e uma chave da OpenAI
(custo pequeno por foto processada, mas real — confirme se topa antes
de ligar em produção).src/app/api/webhook/zapi/route.ts explica esse risco. Se for a
mesma instância, o ideal é ter um único endpoint recebendo tudo e
decidindo o que é concierge e o que é BancaZAP (hoje este projeto só
cobre a parte do concierge).Só trocar ZAPI_INSTANCE_ID, ZAPI_TOKEN e ZAPI_CLIENT_TOKEN no
ambiente de produção e reconfigurar o webhook na nova instância. Nenhum
arquivo de código precisa mudar.
cp .env.example .env # preencha SHOPEE_APP_ID e SHOPEE_SECRET
npm install
npm run test:search -- "fone de ouvido bluetooth"
recognizeProductImage + searchProductsByKeyword direto, sem
precisar do WhatsApp ainda.compare.ts: a
foto do usuário + as fotos dos top ~8 candidatos (pré-filtrados por
texto/nota/venda) vão juntas pro modelo de visão, que classifica
cada uma com honestidade (inclusive "não relacionado", pra descartar
opções que só batem a palavra-chave mas não o produto). Isso
substituiu o match só por texto que gerava sugestões fora de
contexto (categoria certa, mas estilo/preço bem diferentes).Este repositório está conectado a um projeto Vercel com deploy automático a cada push na branch main — não precisa mais copiar variáveis de ambiente a cada atualização de código.
O sourcing coleta ofertas reais, grava produtos e snapshots no Supabase,
aplica os cortes e o score mínimo de 75 e gera até três links de afiliado.
Não publica em WhatsApp ou Instagram. Os candidatos permanecem em
discovered: o desconto informado pela Shopee ainda é um proxy, sem
verificação de queda histórica e com confiança de histórico zerada.
Configure SUPABASE_URL e SUPABASE_SERVICE_ROLE_KEY no servidor, além
das variáveis de .env.example. O projeto de banco é babamanager-pro
(czocwdlygdslyuoixmhh). A chave service role nunca vai para o navegador.
A migration versionada usa 20260912035120, o timestamp confirmado no
histórico do Supabase; não é necessário reaplicá-la nesse projeto.
npm ci
npx tsc --noEmit
npm run test:router
npm run test:deals
npm run build
npm run source:deals
O script carrega .env. Se as credenciais estiverem em .env.local, defina
DOTENV_CONFIG_PATH=.env.local antes de executá-lo (PowerShell:
$env:DOTENV_CONFIG_PATH='.env.local'). O JSON final informa erros e
quantos candidatos tiveram o link gerado e confirmado no banco. Nenhum
candidato aprovado é um resultado possível; o mínimo de 75 não é reduzido.
GET /api/health consulta o banco a cada chamada, sem cache: retorna HTTP
200 com ok: true quando todas as variáveis obrigatórias e o banco estão
disponíveis, ou HTTP 503 quando existe alguma pendência. Isso não valida
as credenciais externas nem o recebimento de mensagens pela Z-API.