Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
翻訳待ち
No updates detected yet. GitHub releases will appear here.
cardapio digital ditado
翻訳待ち
Loading the full README. The saved excerpt is shown below.
Agentes de IA — bares e restaurantes Plataforma de agentes de IA (Agent-as-a-Service) adaptada para bares e restaurantes. O agente atende o cliente por mensagem, responde sobre a programação da casa e coleta pedidos de reserva — que não são confirmados na hora: entram numa fila de aprovação humana. Stack: Node + TypeScript, Claude (claude-opus-5) e Supabase (Postgres). Abra http://localhost:3000, cole a chave e o painel carrega. Conferir uma tela sem banco e sem deployRead the full README ↗
Plataforma de agentes de IA (Agent-as-a-Service) adaptada para bares e restaurantes. O agente atende o cliente por mensagem, responde sobre a programação da casa e coleta pedidos de reserva — que não são confirmados na hora: entram numa fila de aprovação humana.
Stack: Node + TypeScript, Claude (claude-opus-5) e Supabase (Postgres).
| Módulo | Estado |
|---|---|
| Schema completo no Supabase (16 tabelas, RLS, triggers, índices) | ✅ aplicado |
| Runtime do agente: histórico, ferramentas, telemetria de tokens | ✅ |
| Ferramentas de domínio (programação, informações, reserva) | ✅ |
| Módulo de aprovação de reservas + trilha de auditoria | ✅ |
| API HTTP com autenticação por chave e streaming SSE | ✅ |
| Painel web: fila de aprovação, programação e chat de teste | ✅ |
| Notificação ao cliente + webhooks assinados | ✅ |
| Canal WhatsApp de entrada e saída (Baileys, não oficial) | ✅ |
| Billing, embeddings/vector DB, editor visual de fluxo, SSO | ⬜ backlog do PRD |
npm install
cp .env.example .env # preencha ANTHROPIC_API_KEY e SUPABASE_SERVICE_ROLE_KEY
npm run seed # cria org, estabelecimento e o agente recepcionista
npm run criar-chave # gera a chave de API (aparece uma única vez)
npm run dev # sobe API + painel em http://localhost:3000
Abra http://localhost:3000, cole a chave e o painel carrega.
Sem interface, pela linha de comando:
npm run chat -- --agent recepcionista --venue ditado-popular
npm run aprovar -- --venue ditado-popular # lista pendentes
npm run aprovar -- --aprovar <protocolo>
npm run aprovar -- --recusar <protocolo> --motivo "casa lotada nesse horário"
npm run telas # lista as telas e as situações prontas
npm run telas -- rh # abre no navegador de teste e tira foto
npm run telas -- rh:ferias # abre numa situação específica
npm run telas -- rh --servir # sobe em localhost para você clicar
npm run telas -- --todas # passa por todas as telas e situações
A tela roda com dados de mentira, escritos à mão em scripts/telas/<nome>.json,
e um servidor de araque responde o que ela pedir. Não precisa de banco, de chave
nem de deploy.
O ganho está nas situações: cada arquivo declara variações da mesma tela — a casa que acabou de contratar o módulo, a semana sem venda nenhuma, o período de férias que venceu ontem. Forçar isso com dados reais custaria meia hora; aqui é um objeto de cinco linhas:
"variacoes": {
"gorjeta-semana-vazia": {
"rotulo": "semana sem nada lançado",
"guarda": { "brasa.rh.aba": "fechamento" },
"rotas": { "GET /rh/acerto": { "linhas": [], "totais": {} } }
}
}
O comando abre cada situação em 1280px e em 400px, avisa se houve erro de
JavaScript ou se a página rolou de lado, e guarda as fotos em .telas/ (fora do
Git). Quando a tela pede uma rota que o arquivo não tem, ela recebe resposta
vazia e o comando imprime, no fim, o esqueleto pronto para colar.
Para adicionar uma tela nova, copie scripts/telas/rh.json, troque modulo e
funcao pelo que a tela exporta, rode uma vez e cole o esqueleto que o comando
imprimir.
Toda rota sob /v1 exige Authorization: Bearer <chave>. Respostas seguem
{ success, data } ou { success: false, error: { code, message } }, e cada
requisição devolve um x-trace-id para correlacionar com o log.
| Rota | Escopo | O que faz |
|---|---|---|
POST /v1/runs | runs:write | Executa o agente. Com ?stream=true (ou Accept: text/event-stream) devolve SSE |
GET /v1/agents | runs:write | Agentes habilitados (?all=1 inclui os pausados) |
POST /v1/agents | runs:write | Cria um agente |
GET /v1/agents/:slug | runs:write | Detalhe, incluindo o system prompt |
PATCH /v1/agents/:slug | runs:write | Edita nome, prompt, modelo, esforço, ativo. O slug não muda |
GET /v1/agents/:slug/training | runs:write | Lista o treinamento do agente |
POST /v1/agents/:slug/training | runs:write | Adiciona texto digitado (JSON: titulo, conteudo) |
POST /v1/agents/:slug/training/upload | runs:write | Adiciona um arquivo. Corpo é o arquivo cru (sem base64); metadados na URL: ?titulo=&nome_arquivo=&media_type= |
DELETE /v1/agents/:slug/training/:id | runs:write | Remove um item de treinamento |
GET /v1/venues | reservations:read | Estabelecimentos |
GET /v1/venues/:slug/reservations | reservations:read | Fila de aprovação |
POST /v1/reservations/:id/approve | reservations:write | Aprova |
POST /v1/reservations/:id/reject | reservations:write | Recusa (exige motivo) |
GET | POST /v1/venues/:slug/events | leitura | escrita | Programação |
DELETE /v1/events/:id?venue=<slug> | reservations:write |
Eventos do stream: text_delta, tool_use, tool_result, done, error.
This is the beginning of the README. Read the rest at the original. Read the full README ↗
| Remove item |
GET /v1/venues/:slug/info | reservations:read | Base de conhecimento |
GET /v1/venues/:slug/conversations | reservations:read | Caixa de entrada. Filtros: ?canal=, ?status=, ?humanas=1 |
GET /v1/venues/:slug/metrics | reservations:read | Números do painel |
GET /v1/conversations/:id | reservations:read | Conversa com o histórico |
POST /v1/conversations/:id/takeover | reservations:write | Assume o atendimento ({"devolver":true} devolve ao agente) |
POST /v1/conversations/:id/messages | reservations:write | Resposta escrita por uma pessoa |
POST /v1/conversations/:id/close | reservations:write | Encerra ({"reabrir":true} reabre); mensagem nova do cliente reabre sozinha |
DELETE /v1/conversations/:id | reservations:write | Apaga a conversa e o histórico. Reservas sobrevivem com o vínculo anulado |
GET /health | público | Health check |