SimplesZap + Tokia
Como o SimplesZap (WhatsApp Business SaaS da IT Booster Global) consome o Tokia como provedor de IA — sem precisar integrar OpenAI/Anthropic/etc diretamente em cada fluxo WhatsApp.
Quem deve ler: dev SimplesZap configurando IA WhatsApp. Cliente SaaS comum NÃO precisa fazer nada — SimplesZap cuida do roteamento internamente; você compra SimplesZap normal e a IA "funciona".
Por quê SimplesZap → Tokia?
Princípio CLAUDE.md da IT Booster (decisão arquitetural fundamental):
Tokia ≠ SimplesZap — Tokia é cérebro de IA; SimplesZap é canal WhatsApp. Tokia não vende "WhatsApp Bot" como feature (canibaliza SimplesZap). Integração é via SimplesZap consumir Tokia internamente.
Consequência prática:
- SimplesZap NÃO contrata OpenAI/Anthropic/Fal.ai diretamente — usa Tokia
- 1 contrato (Tokia ↔ providers) em vez de N contratos (SimplesZap ↔ N providers)
- Markup IT Booster centralizado em 1 lugar (Tokia), facilita auditoria
- Cliente que assina os 2 produtos tem 1 saldo BRL (futuro: shared balance, hoje separado por simplicidade)
Setup
- Admin Tokia roda
node scripts/tokia-provision-simpleszap.mjs(no monorepo usetokia). Provisiona profilesimpleszap-internal@itbooster.com.br+ key aliastokia-simpleszapcom rate limit 600 req/min. - Copia a key
sk-tokia-...impressa. - Adiciona em
SimplesZap/.env:SIMPLESZAP_TOKIA_KEY=sk-tokia-...
Exemplo JavaScript / Node
import OpenAI from "openai";
const tokia = new OpenAI({
baseURL: "https://api.usetokia.com/v1",
apiKey: process.env.SIMPLESZAP_TOKIA_KEY,
defaultHeaders: {
"x-tokia-client": "simpleszap",
},
});
export async function gerarRespostaWhatsApp(prompt, modelo = "gpt-4o-mini") {
const completion = await tokia.chat.completions.create({
model: modelo,
messages: [
{ role: "system", content: "Você é assistente do SimplesZap respondendo via WhatsApp em PT-BR." },
{ role: "user", content: prompt },
],
max_tokens: 300,
temperature: 0.7,
});
// Loga request_id pra debug cross-system Tokia ↔ SimplesZap
const requestId = completion._raw?.headers?.["x-tokia-request-id"];
console.log({ tokia_request_id: requestId, model: modelo });
return completion.choices[0]?.message?.content ?? "";
}Exemplo Python
from openai import OpenAI
import os
tokia = OpenAI(
base_url="https://api.usetokia.com/v1",
api_key=os.environ["SIMPLESZAP_TOKIA_KEY"],
default_headers={"x-tokia-client": "simpleszap"},
)
def gerar_resposta_whatsapp(prompt: str, modelo: str = "gpt-4o-mini") -> str:
completion = tokia.chat.completions.create(
model=modelo,
messages=[
{"role": "system", "content": "Você é assistente do SimplesZap em PT-BR."},
{"role": "user", "content": prompt},
],
max_tokens=300,
temperature=0.7,
)
return completion.choices[0].message.content or ""Headers obrigatórios
Authorization: Bearer sk-tokia-...— sua key SimplesZapx-tokia-client: simpleszap— identifica origem do tráfego no Tokia admin dashboard (separa de "direct", "tokia-chat", etc — Sprint 324)x-tokia-request-id(opcional, mas RECOMENDADO) — gera UUID client-side, Tokia ecoa de volta no response header. Permite debug correlacionado quando WhatsApp user reportar problema.
Billing interno
SimplesZap NÃO paga via PIX/cartão. É carry-over interno IT Booster:
- Balance inicial R$ 5000 BRL por quarter (financiamento IT Booster mãe)
- Adjusts via admin /dashboard/admin/users + "Ajustar saldo" no profile
simpleszap-internal@itbooster.com.br - Consumption real aparece em /dashboard/admin/chat (clients-summary filtrado futuro por
x-tokia-client=simpleszap— Sprint 526) - Relatórios SimplesZap pra cliente final incluem o custo IA repassado da Tokia (decisão financeira IT Booster)
Modelos recomendados pra WhatsApp
- gpt-4o-mini — default. Bom equilíbrio velocidade/qualidade. Markup 2x.
- gemini-flash — mais rápido + bom PT-BR. Markup 2.5x.
- deepseek-v3 — mais barato. Markup 3x mas custo upstream baixo.
- test-free (gpt-oss-120b) — pra desenvolvimento/teste sem debitar saldo.
Anti-abuso
- Rate limit: 600 req/min por key SimplesZap (5x default Tokia 120 RPM)
- Hard cap saldo: se SimplesZap zerar saldo, keys são auto-suspensas pelo cron Tokia (chama upstream falha). Refill via admin balance adjust.
- IP allowlist: NÃO usada (SimplesZap multi-container, IPs voláteis)
Troubleshooting
Ver /docs/troubleshooting geral. Erros específicos SimplesZap:
- HTTP 429 "rate_limit_exceeded" — SimplesZap bateu 600 req/min. Implementa retry com exponential backoff + reduzir paralelismo.
- HTTP 402 "exhausted_balance" — saldo SimplesZap zerou. Admin Tokia precisa fazer balance adjust pra refill.
- HTTP 401 "invalid_authorization" — key expirou/revogada. Re-provisionar via
tokia-provision-simpleszap.mjs.
Roadmap futuro
- Sprint 536: evento webhook outbound
simpleszap.message_relayedpra clientes Tokia+SimplesZap - Sprint 600+: shared balance — cliente que assina os 2 produtos tem 1 saldo único
- Sprint 700+: SimplesZap como "tier" dedicado no /pricing pra venda cruzada
Decisão arquitetural completa: DR-030 no monorepo usetokia. Repo SimplesZap (privado IT Booster): inael/simpleszap.