尚未偵測到更新。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.