vek1 — integrações externas
Integrações externas
| Integração | Onde | Para quê |
|---|---|---|
| vek1-api (HTTP interno) | lib/api-client/* + lib/auth-http-adapter.ts |
Toda escrita em DB, auth, embeddings, chat IA, file processing, email, PIX webhook relay, billing. Base URL VEK1_API_URL. 3 escopos de token. |
| Postgres self-host | lib/db/{index,schema}.ts (Drizzle) |
Schema source-of-truth. Reads SSR raros; writes pelo vek1-api. Connection postgresql://vek1:***@187.127.24.217:5434/vek1?sslmode=disable. |
| Better Auth | lib/auth.ts, auth-client.ts, auth-server.ts, auth-http-adapter.ts, route api/auth/[...all] |
Email/password com auto-sign-in. Persistência delegada via HTTP adapter. |
| MinIO/S3 | lib/storage.ts |
Container mimic-minio. Bucket vek1. Endpoint https://mimic-cdn.kodama.solutions. Key prefix companies/{user.id}/.... |
| Evolution API v2.3.x | lib/evolution-instance.ts, lib/whatsapp-handler.ts, webhooks/evolution/route.ts |
WhatsApp send/receive, instância, QR Code. Endpoint https://evolution.kodama.solutions. Migração planejada → Meta Cloud API oficial (Solution Partner): vek1/whatsapp-cloud-api-migration. |
| AbacatePay | lib/abacate-pay.ts, webhooks/abacate-pay/route.ts |
Gateway PIX cliente final do lojista (orders). Token por store. |
| Stripe | @stripe/stripe-js + @stripe/react-stripe-js no frontend (Elements); SDK Python no vek1-api |
Billing vek ↔ lojista (subscription + metered + topup). Webhook configurado pros 6 events (sub./invoice./payment_intent.succeeded). Test mode em prod. |
| Resend | NÃO no vek1 — via apiClient.email.* → vek1-api /internal/email/* |
Transactional (reset password, billing emails grace flow). Token Resend mora no env do vek1-api. |
vek1-api /embed |
lib/embeddings.ts |
Proxy pra Ollama bge-m3 (1024 dim). |
vek1-api /chat |
agent-chat.tsx, whatsapp-handler.ts |
Função canônica de conversação. Function calling. |
vek1-api /billing/plans-public |
app/pricing/page.tsx |
Endpoint público sem auth pra landing /pricing consumir via HTTPS em vez de TCP direto Postgres. |
| — | Decomissionado em PR #43. | |
| — | Removido em PR #43. | |
| GitHub Actions | .github/workflows/ci.yml |
Lint + test + build (Bun). Envs CI são placeholders. |
| Codecov / CodeRabbit | step opcional + .coderabbit.yaml |
Coverage + auto-review |
Endpoints vek1-api consumidos via apiClient
Auth scope (X-Auth-Token)
/internal/auth/users, /internal/auth/sessions, /internal/auth/accounts, /internal/auth/verifications — full CRUD purpose-built.
App scope (X-Internal-Token + X-Actor-User-Id)
- Billing:
GET /internal/billing/plans,GET .../summary,POST .../subscriptions,DELETE .../subscriptions,POST .../setup-intent,POST .../topup,GET/PATCH .../settings,GET .../usage-this-month,GET .../invoices,POST .../_trigger-{usage-report,overage-charge}(debug) - Orders, Leads, Agents, Products+files, Documents, Stores, Company, Dashboard, Messages, Audit, Token usage — detalhes em vek1-api/endpoints
Webhook scope (X-Webhook-Token)
| Origem | Path no vek1-api |
|---|---|
/api/webhooks/abacate-pay relay |
POST /webhooks/abacate-pay |
Better Auth sendResetPassword |
POST /internal/email/send-reset-password |
| Stock sync inbound ERP → vek1 | POST /webhooks/stock-sync/{store_id} (HMAC) |
| billing_emails (grace flow, charge_succeeded/failed) | mesmo endpoint email via Resend |
Endpoints PÚBLICOS vek1-api (sem token)
POST /chat,POST /embed,POST /extract-lead,POST /process-file(conversa + RAG core)GET /agents(lista tipos)GET /billing/plans-public(lista planos ativos pra /pricing — sem PII)POST /webhooks/stripe(assinatura HMAC valida)
Evolution API (WhatsApp)
- Endpoint:
https://evolution.kodama.solutions, versão v2.3.x - Cliente custom:
lib/evolution-instance.ts(fetch direto, sem lib externa) - Webhook receive:
POST /api/webhooks/evolution— nunca retorna 500 - Quirks (ver
evolution-debugger):- LID privacy: phone real em
senderPnoukey.remoteJidAlt - Payload às vezes aninhado em
data.message fromMe=truesempre ignorar
- LID privacy: phone real em
Stripe (LIVE em test mode)
- Test mode keys configurados no vek1 (
STRIPE_SECRET_KEY,NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY,STRIPE_WEBHOOK_SECRET) e no vek1-api VPS - Webhook endpoint:
https://vek1-api.kodama.solutions/webhooks/stripeconfigurado pros 6 events - 3 Products + 6 Prices com lookup_keys
_v2:vek1_starter_monthly_v2(R$ 199) +vek1_starter_overage_per_million_v2(R$ 39 / Meter)vek1_pro_monthly_v2(R$ 599) +vek1_pro_overage_per_million_v2(R$ 28 / Meter)vek1_business_monthly_v2(R$ 1.499) +vek1_business_overage_per_million_v2(R$ 20 / Meter)
- Meter
vek1.tokens_consumed(sum aggregation, customer mapping by-id, value em million units) seed-stripe-plans.tsidempotente cria tudo. v1 Prices antigos mantidos pra subs pré-existentes.
Variáveis de ambiente (.env.local / Vercel)
# vek1-api integration
VEK1_API_URL=https://vek1-api.kodama.solutions
INTERNAL_API_TOKEN=...
INTERNAL_AUTH_TOKEN=...
INTERNAL_WEBHOOK_TOKEN=...
# Postgres (raro — /pricing migrou pra HTTPS via vek1-api)
DATABASE_URL=postgresql://vek1:***@187.127.24.217:5434/vek1?sslmode=disable
# Better Auth
BETTER_AUTH_SECRET=...
BETTER_AUTH_URL=https://vek1.vercel.app
NEXT_PUBLIC_BETTER_AUTH_URL=https://vek1.vercel.app
BETTER_AUTH_TRUSTED_ORIGINS=https://vek1.vercel.app,https://*.vek1.vercel.app
# MinIO
S3_ENDPOINT=https://mimic-cdn.kodama.solutions
S3_REGION=us-east-1
S3_ACCESS_KEY_ID=vek1
S3_SECRET_ACCESS_KEY=...
S3_BUCKET=vek1
S3_PUBLIC_URL=https://mimic-cdn.kodama.solutions
# Evolution
NEXT_PUBLIC_EVOLUTION_API_URL=https://evolution.kodama.solutions
NEXT_PUBLIC_EVOLUTION_API_KEY=...
EVOLUTION_API_URL=...
EVOLUTION_API_KEY=...
# Chat backend
NEXT_PUBLIC_API_URL=https://vek1-api.kodama.solutions
# Stripe (test mode)
STRIPE_SECRET_KEY=sk_test_...
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_...
STRIPE_WEBHOOK_SECRET=whsec_...
# SEO (opcional)
NEXT_PUBLIC_SITE_URL=https://vek1.vercel.app
Removidos após PR #43 (não usar): NEXT_PUBLIC_SUPABASE_*, NEXT_PUBLIC_OPENAI_API_KEY, NEXT_PUBLIC__EVOLUTION_API_KEY (typo).
Aviso de segurança (pendente)
- DATABASE_URL TCP plaintext entre Vercel e VPS (
sslmode=disable). TLS pendente. - Reduzido após PR #82: /pricing não usa mais TCP direto, vai via HTTPS no vek1-api. Mas resto do app (queries SSR ocasionais) ainda usa Drizzle direto.