n8n-nodes-digisac 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +238 -191
- package/dist/nodes/Digisac/Digisac.node.d.ts +12 -0
- package/dist/nodes/Digisac/Digisac.node.js +14 -5
- package/dist/nodes/Digisac/Digisac.node.js.map +1 -1
- package/dist/nodes/Digisac/actions/index.d.ts +2 -2
- package/dist/nodes/Digisac/actions/index.js +179 -46
- package/dist/nodes/Digisac/actions/index.js.map +1 -1
- package/dist/nodes/Digisac/generated/endpoints.js +0 -2
- package/dist/nodes/Digisac/generated/endpoints.js.map +1 -1
- package/dist/nodes/Digisac/helpers/resourceLocator.d.ts +10 -0
- package/dist/nodes/Digisac/helpers/resourceLocator.js +139 -0
- package/dist/nodes/Digisac/helpers/resourceLocator.js.map +1 -0
- package/dist/nodes/Digisac/helpers/valoresGuiados.d.ts +5 -0
- package/dist/nodes/Digisac/helpers/valoresGuiados.js +99 -0
- package/dist/nodes/Digisac/helpers/valoresGuiados.js.map +1 -0
- package/dist/nodes/Digisac/helpers/versao.d.ts +4 -0
- package/dist/nodes/Digisac/helpers/versao.js +9 -0
- package/dist/nodes/Digisac/helpers/versao.js.map +1 -0
- package/dist/nodes/Digisac/methods/listSearch.d.ts +11 -0
- package/dist/nodes/Digisac/methods/listSearch.js +62 -0
- package/dist/nodes/Digisac/methods/listSearch.js.map +1 -0
- package/dist/nodes/Digisac/transport/index.d.ts +5 -2
- package/dist/nodes/Digisac/transport/index.js +3 -0
- package/dist/nodes/Digisac/transport/index.js.map +1 -1
- package/dist/package.json +78 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +76 -66
package/README.md
CHANGED
|
@@ -1,24 +1,31 @@
|
|
|
1
1
|
# n8n-nodes-digisac
|
|
2
2
|
|
|
3
|
-
[
|
|
3
|
+
Node community do [n8n](https://n8n.io/) para integrar seus fluxos com a **API do [Digisac](https://digisac.com.br)**, plataforma de atendimento multicanal (WhatsApp e outros canais).
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](https://github.com/PedroHSGuimaraes/n8n-nodes-digisac/actions/workflows/ci.yml) [](https://buymeacoffee.com/qTny0AzFXS)
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Um único node cobre **todas as chamadas da coleção Postman pública do Digisac**: contatos, chamados, mensagens, campanhas, conexões, departamentos, usuários, tags, templates, webhooks, relatórios, estatísticas, agendamentos e demais recursos.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
[n8n](https://n8n.io/) é uma plataforma de automação de fluxos com [licença fair-code](https://docs.n8n.io/reference/license/).
|
|
10
10
|
|
|
11
|
-
-
|
|
12
|
-
- **Node único e intuitivo**: selecione **Resource -> Operation**, preencha campos simples de path, query e body, e execute.
|
|
13
|
-
- **Credencial centralizada**: Base URL e Bearer Token ficam salvos uma única vez na credencial `Digisac API`.
|
|
14
|
-
- **Pronto para AI Agent**: o node tem `usableAsTool: true` e descrições pensadas para LLMs entenderem método, caminho, parâmetros, IDs, filtros, campos de body e quando usar JSON avançado.
|
|
15
|
-
- **Sem dependências runtime**: usa `httpRequestWithAuthentication` do próprio n8n.
|
|
16
|
-
- **Catálogo rastreável**: `nodes/Digisac/generated/endpoints.ts` é gerado da documentação Postman; `docs/api-calls.md` lista todas as chamadas em português.
|
|
17
|
-
- **Publicação segura**: GitHub Actions publica no npm com provenance.
|
|
11
|
+
[Instalação](#-instalação) · [Credenciais](#-credenciais) · [Nós e Operações](#-nós-e-operações) · [Exemplos](#-exemplos-práticos) · [Tool de IA](#-usar-como-tool-de-agente-de-ia) · [Versão 1 ou 2](#-versão-1-ou-2-do-node) · [Desenvolvimento](#️-desenvolvimento) · [Versões](#-versões) · [Apoie](#-apoie-o-projeto)
|
|
18
12
|
|
|
19
|
-
|
|
13
|
+
---
|
|
20
14
|
|
|
21
|
-
|
|
15
|
+
## 🚀 Funcionalidades
|
|
16
|
+
|
|
17
|
+
- **1 node unificado** — `Digisac` com seletor **Resource → Operation**. Cada operation é uma chamada real da API, com método, caminho e origem na documentação.
|
|
18
|
+
- **Cobertura completa** — 298 chamadas em 51 recursos, geradas da coleção pública Postman.
|
|
19
|
+
- **IDs em lista pesquisável (versão 2 do node)** — contato, conexão, departamento, usuário, tag, cargo, robô e assunto de chamado aparecem como lista da sua conta, com busca, e aceitam colar o ID. Os outros IDs aceitam colar o ID no mesmo formato.
|
|
20
|
+
- **Datas e opções guiadas (versão 2 do node)** — período, `From` e `To` têm seletor de data; `Status`, `Period Type`, `Type`, participações e `Origin` são listas de opções.
|
|
21
|
+
- **Workflows salvos não mudam** — quem já usa a versão 1 continua enviando a mesma requisição.
|
|
22
|
+
- **Credencial centralizada** — Base URL e token ficam na credencial `Digisac API`.
|
|
23
|
+
- **Usável como Tool de IA** — o node tem `usableAsTool`, com descrições pensadas para o agente entender método, caminho, parâmetros e cuidados. Veja [Usar como Tool de Agente de IA](#-usar-como-tool-de-agente-de-ia).
|
|
24
|
+
- **Zero dependências de runtime** — usa o `httpRequestWithAuthentication` do próprio n8n, com timeout de 30 s em toda chamada. Passa no lint oficial `n8n-node lint` e é publicado no npm **com provenance**.
|
|
25
|
+
|
|
26
|
+
## 📦 Instalação
|
|
27
|
+
|
|
28
|
+
No n8n, acesse **Settings → Community Nodes → Install** e instale:
|
|
22
29
|
|
|
23
30
|
```text
|
|
24
31
|
n8n-nodes-digisac
|
|
@@ -30,50 +37,112 @@ Para usar community nodes como Tools de Agente de IA em n8n self-hosted, habilit
|
|
|
30
37
|
N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true
|
|
31
38
|
```
|
|
32
39
|
|
|
33
|
-
Sem essa variável, o node
|
|
40
|
+
Sem essa variável, o node funciona como node normal, mas não aparece como tool no AI Agent em instalações self-hosted.
|
|
34
41
|
|
|
35
|
-
## Credenciais
|
|
42
|
+
## 🔑 Credenciais
|
|
36
43
|
|
|
37
|
-
Crie uma credencial
|
|
44
|
+
Crie uma credencial **Digisac API**.
|
|
38
45
|
|
|
39
46
|
| Campo | O que preencher | Onde encontrar |
|
|
40
47
|
| --- | --- | --- |
|
|
41
|
-
| **Base URL** | URL base da sua conta
|
|
42
|
-
| **Access Token** | Token Bearer de acesso pessoal. | Digisac
|
|
43
|
-
| **PDF/Base URL** | Base opcional para endpoints documentados como `URLbase`, principalmente export de PDF. Se vazio,
|
|
48
|
+
| **Base URL** | URL base da sua conta, sem barra final. Exemplo: `https://suaempresa.digisac.app`. | Digisac → Conta → Informações |
|
|
49
|
+
| **Access Token** | Token Bearer de acesso pessoal. Tem as mesmas permissões do usuário que o criou. | Digisac → Conta → API → Tokens de acesso pessoal |
|
|
50
|
+
| **PDF/Base URL** | Base opcional para endpoints documentados como `URLbase`, principalmente export de PDF. Se vazio, usa a Base URL. | Use só se sua instância separar a URL de API e a de PDF |
|
|
44
51
|
|
|
45
|
-
A credencial testa o acesso com
|
|
52
|
+
A credencial testa o acesso com `GET /api/v1/me`.
|
|
46
53
|
|
|
47
|
-
|
|
48
|
-
GET /api/v1/me
|
|
49
|
-
```
|
|
54
|
+
## 🧩 Nós e Operações
|
|
50
55
|
|
|
51
|
-
|
|
56
|
+
1. Adicione o node **Digisac** ao workflow.
|
|
57
|
+
2. Escolha o **Resource**. Ele corresponde a uma pasta da documentação, como `Contatos`, `Mensagens`, `Chamados`, `Campanhas`, `Tags`, `Usuários` ou `Webhooks`.
|
|
58
|
+
3. Escolha a **Operation**. Cada uma é uma chamada real da API.
|
|
59
|
+
4. Preencha os IDs de path. Na versão 2, escolha na lista ou cole o ID no modo **By ID**.
|
|
60
|
+
5. Preencha os campos de query que aparecerem, como `Per Page`, `Start Period`, `End Period`, `Status`.
|
|
61
|
+
6. Em chamadas `POST`, `PUT` e `PATCH`, use **Body Fields**: o node gera os campos a partir do body documentado.
|
|
62
|
+
7. Use **Use Body JSON Avancado** só quando a operação exigir array, objeto livre ou algo que não coube nos campos.
|
|
63
|
+
8. Use **Options → Query Avancada JSON** só para filtros sem campo dedicado.
|
|
64
|
+
9. Em exportações CSV, TXT ou PDF, use **Options → Response Format → Text**.
|
|
52
65
|
|
|
53
|
-
|
|
54
|
-
2. Escolha o **Resource**. O resource corresponde a uma pasta da documentação, como `Contatos`, `Mensagens`, `Chamados`, `Campanhas`, `Tags`, `Usuários`, `Webhooks`.
|
|
55
|
-
3. Escolha a **Operation**. Cada operation corresponde a uma chamada real da API.
|
|
56
|
-
4. Preencha os campos obrigatórios de path, como `contactId`, `ticketId`, `serviceId`, `messageId`, `userId`, `campaignId`.
|
|
57
|
-
5. Preencha os campos de query que aparecerem, como `Per Page`, `Number`, `Service Id`, `Start Period`, `End Period`, `Status`.
|
|
58
|
-
6. Em chamadas `POST`, `PUT` e `PATCH`, use **Campos do Body**. O node gera esses campos a partir do body documentado pela Digisac.
|
|
59
|
-
7. Use **Body JSON Avançado** somente quando a operação exigir array, objeto livre ou uma estrutura que não coube nos campos gerados.
|
|
60
|
-
8. Use **Options -> Query Avançada JSON** somente para filtros muito específicos não representados por campos.
|
|
61
|
-
9. Em exports CSV/TXT/PDF, se a resposta não vier como JSON, use **Options -> Response Format -> Text**.
|
|
66
|
+
Resources **Popular** são atalhos herdados da coleção Postman para operações frequentes. Resources **General** têm o catálogo mais completo.
|
|
62
67
|
|
|
63
|
-
|
|
68
|
+
Regra para automações e Tools de IA: todo campo terminado em `Id` ou `Ids` deve vir de uma busca anterior, de uma entrada confirmada ou de um valor documentado, como `all`. Nunca copie placeholders como `{{contactId}}`.
|
|
64
69
|
|
|
65
70
|
| Campo | Uso |
|
|
66
71
|
| --- | --- |
|
|
67
|
-
| **Resource** | Área
|
|
68
|
-
| **Operation** | Chamada exata da API. A descrição mostra método, endpoint
|
|
69
|
-
| **
|
|
70
|
-
| **Campos de query** | Campos simples gerados
|
|
71
|
-
| **
|
|
72
|
-
| **
|
|
73
|
-
|
|
74
|
-
|
|
72
|
+
| **Resource** | Área da API Digisac, gerada das pastas Postman. |
|
|
73
|
+
| **Operation** | Chamada exata da API. A descrição mostra método, endpoint e origem. |
|
|
74
|
+
| **IDs de path** | Obrigatórios, extraídos de placeholders como `{{contactId}}`. |
|
|
75
|
+
| **Campos de query** | Campos simples gerados da URL documentada. |
|
|
76
|
+
| **Body Fields** | Coleção gerada do body documentado para operações de escrita. |
|
|
77
|
+
| **Options → Response Format** | `Text` para respostas que não são JSON. |
|
|
78
|
+
|
|
79
|
+
### Todas as chamadas da API
|
|
75
80
|
|
|
76
|
-
|
|
81
|
+
O catálogo completo fica em [docs/api-calls.md](docs/api-calls.md). Resumo por método:
|
|
82
|
+
|
|
83
|
+
```text
|
|
84
|
+
GET: 144 | POST: 93 | PUT: 34 | PATCH: 1 | DELETE: 26
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Resumo por recurso (gerado por `npm run generate:docs`):
|
|
88
|
+
|
|
89
|
+
<!-- digisac:recursos:start -->
|
|
90
|
+
| Recurso | Chamadas |
|
|
91
|
+
| --- | ---: |
|
|
92
|
+
| Acionamento flag no robo (General) | 1 |
|
|
93
|
+
| Agendamentos (General) | 5 |
|
|
94
|
+
| Agora (General) | 3 |
|
|
95
|
+
| Agora (Popular) | 3 |
|
|
96
|
+
| Assuntos de chamado (General) | 5 |
|
|
97
|
+
| Auditoria de autenticacao (General) | 2 |
|
|
98
|
+
| Autorizacao (General) | 1 |
|
|
99
|
+
| Autorizacao (Popular) | 1 |
|
|
100
|
+
| Avaliacoes (General) | 5 |
|
|
101
|
+
| Campanhas (General) | 7 |
|
|
102
|
+
| Campos personalizados (General) | 5 |
|
|
103
|
+
| Cargos (General) | 7 |
|
|
104
|
+
| Central de notificacoes (General) | 2 |
|
|
105
|
+
| Chamados (General) | 7 |
|
|
106
|
+
| Chamados (Popular) | 6 |
|
|
107
|
+
| Conexoes (General) | 11 |
|
|
108
|
+
| Contatos (General) | 22 |
|
|
109
|
+
| Contatos (Popular) | 22 |
|
|
110
|
+
| Controle de ausencia (General) | 1 |
|
|
111
|
+
| Creditos SMS (General) | 3 |
|
|
112
|
+
| Departamentos (General) | 6 |
|
|
113
|
+
| Distribuicao de chamados (General) | 6 |
|
|
114
|
+
| Estatisticas de atendimento (General) | 10 |
|
|
115
|
+
| Estatisticas de atendimento (Popular) | 7 |
|
|
116
|
+
| Estatisticas de avaliacoes (General) | 7 |
|
|
117
|
+
| Feriados (General) | 5 |
|
|
118
|
+
| Funil de vendas (General) | 10 |
|
|
119
|
+
| Grupos WhatsApp (General) | 4 |
|
|
120
|
+
| Historico de chamados (General) | 12 |
|
|
121
|
+
| Historico de chamados (Popular) | 9 |
|
|
122
|
+
| Idioma da plataforma (General) | 1 |
|
|
123
|
+
| Integracoes (General) | 2 |
|
|
124
|
+
| Mensagens (General) | 13 |
|
|
125
|
+
| Mensagens (Popular) | 8 |
|
|
126
|
+
| Mensagens interativas (General) | 7 |
|
|
127
|
+
| Meus dados (General) | 1 |
|
|
128
|
+
| Notificacao (General) | 3 |
|
|
129
|
+
| Organizacoes (General) | 5 |
|
|
130
|
+
| Pessoas (General) | 5 |
|
|
131
|
+
| Planos (General) | 2 |
|
|
132
|
+
| Redefinir senha (General) | 1 |
|
|
133
|
+
| Respostas rapidas (General) | 7 |
|
|
134
|
+
| Robos (General) | 6 |
|
|
135
|
+
| Tags (General) | 8 |
|
|
136
|
+
| Templates (General) | 11 |
|
|
137
|
+
| Termos de aceite (General) | 5 |
|
|
138
|
+
| Tokens (General) | 5 |
|
|
139
|
+
| Usuarios (General) | 6 |
|
|
140
|
+
| Versoes (General) | 1 |
|
|
141
|
+
| Webhooks (General) | 5 |
|
|
142
|
+
| WhatsApp (General) | 1 |
|
|
143
|
+
<!-- digisac:recursos:end -->
|
|
144
|
+
|
|
145
|
+
## 💡 Exemplos práticos
|
|
77
146
|
|
|
78
147
|
### Listar contatos
|
|
79
148
|
|
|
@@ -99,7 +168,7 @@ Preencha:
|
|
|
99
168
|
Resource: **Mensagens (General)**
|
|
100
169
|
Operation: **Enviar mensagem**
|
|
101
170
|
|
|
102
|
-
Em **
|
|
171
|
+
Em **Body Fields**, preencha:
|
|
103
172
|
|
|
104
173
|
- `Text`: `Olá, tudo bem?`
|
|
105
174
|
- `Type`: `chat`
|
|
@@ -112,18 +181,13 @@ Em **Campos do Body**, preencha:
|
|
|
112
181
|
Resource: **Mensagens (General)**
|
|
113
182
|
Operation: **Enviar imagem**, **Enviar PDF** ou **Enviar áudio**
|
|
114
183
|
|
|
115
|
-
Use **
|
|
184
|
+
Use **Body Fields** para `Text`, `Number` e `Service Id`. No campo `File`, informe somente o objeto do arquivo, não o body inteiro:
|
|
116
185
|
|
|
117
186
|
```json
|
|
118
187
|
{
|
|
119
|
-
"
|
|
120
|
-
"
|
|
121
|
-
"
|
|
122
|
-
"file": {
|
|
123
|
-
"base64": "BASE64_DO_ARQUIVO",
|
|
124
|
-
"mimetype": "application/pdf",
|
|
125
|
-
"name": "documento.pdf"
|
|
126
|
-
}
|
|
188
|
+
"base64": "BASE64_DO_ARQUIVO",
|
|
189
|
+
"mimetype": "application/pdf",
|
|
190
|
+
"name": "documento.pdf"
|
|
127
191
|
}
|
|
128
192
|
```
|
|
129
193
|
|
|
@@ -156,7 +220,7 @@ Body:
|
|
|
156
220
|
Resource: **Chamados (General)**
|
|
157
221
|
Operation: **Fechar um chamado com assunto**
|
|
158
222
|
|
|
159
|
-
Em **
|
|
223
|
+
Em **Body Fields**, preencha `Ticket Topic Ids` com:
|
|
160
224
|
|
|
161
225
|
```json
|
|
162
226
|
["TICKET_TOPIC_ID"]
|
|
@@ -181,116 +245,90 @@ Preencha os campos de query:
|
|
|
181
245
|
Resource: **Webhooks (General)**
|
|
182
246
|
Operation: **Criar webhook**
|
|
183
247
|
|
|
184
|
-
Em **
|
|
248
|
+
Em **Body Fields**, preencha `Active`, `Name`, `Url`, `Events` e `Type`. Para `Events`, use array JSON:
|
|
185
249
|
|
|
186
250
|
```json
|
|
187
251
|
["message.created", "ticket.closed"]
|
|
188
252
|
```
|
|
189
253
|
|
|
190
|
-
##
|
|
254
|
+
## 🤖 Usar como Tool de Agente de IA
|
|
191
255
|
|
|
192
|
-
O
|
|
256
|
+
O node `Digisac` é **usável como tool** por nós de **AI Agent** do n8n (Tools Agent). Isso deixa o modelo **executar ações no Digisac sozinho** — por exemplo: *"busque o contato do número 5511999998888 e envie a ele a mensagem de boas-vindas"*. A prática recomendada é criar uma tool por operação liberada para o agente. Isso limita o escopo do modelo e reduz risco de ações erradas.
|
|
193
257
|
|
|
194
|
-
|
|
258
|
+
### Como ligar (2 passos)
|
|
195
259
|
|
|
196
|
-
|
|
197
|
-
GET: 144 | POST: 93 | PUT: 34 | PATCH: 1 | DELETE: 26
|
|
198
|
-
```
|
|
260
|
+
1. **No servidor n8n**, habilite o uso de community nodes como tools (por segurança, vem **desligado por padrão**). Defina a variável de ambiente:
|
|
199
261
|
|
|
200
|
-
|
|
262
|
+
```bash
|
|
263
|
+
N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true
|
|
264
|
+
```
|
|
201
265
|
|
|
202
|
-
|
|
|
203
|
-
| --- |
|
|
204
|
-
|
|
|
205
|
-
|
|
|
206
|
-
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
| Campanhas (General) | 7 |
|
|
214
|
-
| Campos personalizados (General) | 5 |
|
|
215
|
-
| Cargos (General) | 7 |
|
|
216
|
-
| Central de notificacoes (General) | 2 |
|
|
217
|
-
| Chamados (General) | 7 |
|
|
218
|
-
| Chamados (Popular) | 6 |
|
|
219
|
-
| Conexoes (General) | 11 |
|
|
220
|
-
| Contatos (General) | 22 |
|
|
221
|
-
| Contatos (Popular) | 22 |
|
|
222
|
-
| Controle de ausencia (General) | 1 |
|
|
223
|
-
| Creditos SMS (General) | 3 |
|
|
224
|
-
| Departamentos (General) | 6 |
|
|
225
|
-
| Distribuicao de chamados (General) | 6 |
|
|
226
|
-
| Estatisticas de atendimento (General) | 10 |
|
|
227
|
-
| Estatisticas de atendimento (Popular) | 7 |
|
|
228
|
-
| Estatisticas de avaliacoes (General) | 7 |
|
|
229
|
-
| Feriados (General) | 5 |
|
|
230
|
-
| Funil de vendas (General) | 10 |
|
|
231
|
-
| Grupos WhatsApp (General) | 4 |
|
|
232
|
-
| Historico de chamados (General) | 12 |
|
|
233
|
-
| Historico de chamados (Popular) | 9 |
|
|
234
|
-
| Idioma da plataforma (General) | 1 |
|
|
235
|
-
| Integracoes (General) | 2 |
|
|
236
|
-
| Mensagens (General) | 13 |
|
|
237
|
-
| Mensagens (Popular) | 8 |
|
|
238
|
-
| Mensagens interativas (General) | 7 |
|
|
239
|
-
| Meus dados (General) | 1 |
|
|
240
|
-
| Notificacao (General) | 3 |
|
|
241
|
-
| Organizacoes (General) | 5 |
|
|
242
|
-
| Pessoas (General) | 5 |
|
|
243
|
-
| Planos (General) | 2 |
|
|
244
|
-
| Redefinir senha (General) | 1 |
|
|
245
|
-
| Respostas rapidas (General) | 7 |
|
|
246
|
-
| Robos (General) | 6 |
|
|
247
|
-
| Tags (General) | 8 |
|
|
248
|
-
| Templates (General) | 11 |
|
|
249
|
-
| Termos de aceite (General) | 5 |
|
|
250
|
-
| Tokens (General) | 5 |
|
|
251
|
-
| Usuarios (General) | 6 |
|
|
252
|
-
| Versoes (General) | 1 |
|
|
253
|
-
| Webhooks (General) | 5 |
|
|
254
|
-
| WhatsApp (General) | 1 |
|
|
266
|
+
| Instalação | Onde definir |
|
|
267
|
+
| --- | --- |
|
|
268
|
+
| **Docker / docker-compose** | Adicione em `environment:` do serviço n8n (ou no `.env`) e recrie o container (`docker compose up -d`). |
|
|
269
|
+
| **npm / npx** | Exporte antes de subir: `export N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true && n8n start`. |
|
|
270
|
+
| **n8n Cloud** | Já habilitado nos planos que suportam community nodes. |
|
|
271
|
+
|
|
272
|
+
Sem essa variável o node **não aparece** na lista de tools do AI Agent — é a causa nº 1 de "não acho o node como tool".
|
|
273
|
+
|
|
274
|
+
2. **No workflow**, adicione um node **AI Agent**, conecte um **Chat Model** e, no conector **Tool**, adicione o **Digisac**. Escolha o **Resource** e a **Operation** que o agente pode usar (ex.: *Contatos (General)* → *Listar todos os contatos*). Crie uma tool por operação.
|
|
275
|
+
|
|
276
|
+
### Deixe o modelo preencher os campos (`$fromAI`)
|
|
255
277
|
|
|
256
|
-
|
|
278
|
+
Em cada campo do node em modo tool aparece o botão **"Let the model define this parameter"**, que usa a expressão:
|
|
257
279
|
|
|
258
|
-
|
|
280
|
+
```javascript
|
|
281
|
+
{{ $fromAI('text', 'Texto exato que será enviado ao contato', 'string') }}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
- Assinatura: `$fromAI(key, description?, type?, defaultValue?)` — `key` de 1–64 caracteres (`[a-zA-Z0-9_-]`); `type` = `string` | `number` | `boolean` | `json`.
|
|
285
|
+
- Você pode **misturar**: fixar alguns campos (ex.: sempre `Origin` = `bot`) e deixar o modelo preencher outros (texto, contato, período).
|
|
286
|
+
- **Na versão 2 do node**, os campos de ID são Resource Locator. Para o modelo preencher um ID, mude o campo para o modo **By ID** e ponha a expressão `$fromAI` no valor. A lista **From List** serve para a pessoa que monta o workflow, não para o agente.
|
|
287
|
+
- As **descrições de cada operação e campo** foram escritas para o LLM entender o que cada uma faz e como preencher; quanto mais específico o System Message do agente, melhor o resultado.
|
|
259
288
|
|
|
260
289
|
### Prompt recomendado para o System Message
|
|
261
290
|
|
|
262
291
|
```text
|
|
263
292
|
Você pode usar as tools Digisac somente quando o usuário pedir para consultar, criar ou alterar dados na Digisac.
|
|
264
|
-
Nunca invente IDs.
|
|
293
|
+
Nunca invente IDs. Qualquer campo terminado em Id ou Ids deve vir de busca/listagem anterior, entrada confirmada do usuário ou valor sentinela documentado como all.
|
|
294
|
+
Não copie placeholders da documentação, como {{contactId}}, {{serviceId}} ou {{all/open/close}}. Substitua por valor real ou escolha uma opção válida.
|
|
265
295
|
Para operações POST, PUT e PATCH, envie um body JSON mínimo, somente com os campos necessários.
|
|
266
|
-
Quando a tool expuser
|
|
296
|
+
Quando a tool expuser Body Fields, preencha os campos dedicados em vez de gerar um JSON manual.
|
|
267
297
|
Use Body JSON Avançado ou Query Avançada JSON apenas quando não existir campo dedicado suficiente para a chamada.
|
|
268
298
|
Para filtros de data/hora, use ISO-8601 quando o endpoint esperar timestamp.
|
|
269
299
|
Para exportações CSV, TXT ou PDF, use Response Format = Text se a resposta não for JSON.
|
|
270
300
|
Antes de criar, editar, excluir, arquivar, bloquear, fechar chamado ou enviar mensagem, confirme que a intenção do usuário está clara.
|
|
271
301
|
```
|
|
272
302
|
|
|
273
|
-
### Exemplos de `$fromAI()`
|
|
303
|
+
### Exemplos de `$fromAI()` com os campos do node
|
|
274
304
|
|
|
275
|
-
|
|
305
|
+
**Enviar mensagem** (*Mensagens (General)* → *Enviar mensagem*), em **Body Fields**:
|
|
276
306
|
|
|
277
|
-
|
|
278
|
-
{{ $fromAI('contactId', 'ID existente de contato Digisac. Deve vir de uma busca/listagem anterior, nunca inventado.', 'string') }}
|
|
279
|
-
```
|
|
307
|
+
- `Text`: o modelo escreve o texto.
|
|
280
308
|
|
|
281
|
-
|
|
309
|
+
```javascript
|
|
310
|
+
{{ $fromAI('text', 'Texto exato que será enviado ao contato no WhatsApp/Digisac.', 'string') }}
|
|
311
|
+
```
|
|
282
312
|
|
|
283
|
-
|
|
284
|
-
{{ $fromAI('messageText', 'Texto exato que será enviado ao contato no WhatsApp/Digisac.', 'string') }}
|
|
285
|
-
```
|
|
313
|
+
- `Contact Id` (modo **By ID**): o ID vem de uma busca anterior, nunca inventado.
|
|
286
314
|
|
|
287
|
-
|
|
315
|
+
```javascript
|
|
316
|
+
{{ $fromAI('contactId', 'ID existente de contato Digisac. Deve vir de uma busca/listagem anterior.', 'string') }}
|
|
317
|
+
```
|
|
288
318
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
319
|
+
- `Type` = `chat` e `Origin` = `bot`: fixe estes dois no próprio campo, sem `$fromAI`.
|
|
320
|
+
|
|
321
|
+
**Buscar estatísticas** (*Estatísticas de atendimento (General)*), nos campos de query:
|
|
322
|
+
|
|
323
|
+
- `Start Period` e `End Period`: o seletor de data da versão 2 aceita a expressão.
|
|
292
324
|
|
|
293
|
-
|
|
325
|
+
```javascript
|
|
326
|
+
{{ $fromAI('startPeriod', 'Início do período em ISO-8601 com fuso, por exemplo 2026-07-01T00:00:00.000Z.', 'string') }}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
- `Department Id` e `User Id`: deixe `all` fixo quando o agente não precisa filtrar.
|
|
330
|
+
|
|
331
|
+
**Campo de body estruturado** (envio de arquivo, `File` em *Body Fields*):
|
|
294
332
|
|
|
295
333
|
```javascript
|
|
296
334
|
{{ $fromAI('file', 'Objeto JSON do arquivo com base64, mimetype e name quando a operação Digisac enviar mídia.', 'json') }}
|
|
@@ -306,90 +344,99 @@ Campo de body estruturado:
|
|
|
306
344
|
- Em mensagens enviadas ao cliente, gere o texto em etapa anterior e passe o texto final para a tool.
|
|
307
345
|
- Use campos dedicados sempre que existirem. Para bodies grandes ou arrays de múltiplos itens, use JSON explícito e valide campos obrigatórios no workflow antes da chamada.
|
|
308
346
|
|
|
309
|
-
|
|
347
|
+
### Referências
|
|
348
|
+
|
|
349
|
+
- [Tools Agent — n8n Docs](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/tools-agent)
|
|
350
|
+
- [Let AI specify tool parameters (`$fromAI`) — n8n Docs](https://docs.n8n.io/advanced-ai/examples/using-the-fromai-function/)
|
|
351
|
+
- [Variáveis de ambiente de nodes — n8n Docs](https://docs.n8n.io/hosting/configuration/environment-variables/nodes/)
|
|
352
|
+
|
|
353
|
+
## 🔀 Versão 1 ou 2 do node
|
|
354
|
+
|
|
355
|
+
| | **Versão 1** | **Versão 2 (padrão em node novo)** |
|
|
356
|
+
| --- | --- | --- |
|
|
357
|
+
| IDs | Texto digitado | Lista pesquisável (8 tipos) ou **By ID** (os demais) |
|
|
358
|
+
| Datas | Texto | Seletor de data, enviada em ISO UTC |
|
|
359
|
+
| Valores fixos | Texto | Lista de opções |
|
|
360
|
+
| Workflows salvos | Continuam iguais | Não são alterados |
|
|
361
|
+
|
|
362
|
+
Se um workflow salvo usa a versão 1, ele continua enviando exatamente a mesma requisição. Para ganhar os campos guiados, adicione um node novo (versão 2) e escolha o valor de novo.
|
|
363
|
+
|
|
364
|
+
## 🛠️ Desenvolvimento
|
|
310
365
|
|
|
311
366
|
```bash
|
|
367
|
+
# Instalar dependências
|
|
312
368
|
npm install
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
npm run lint
|
|
369
|
+
|
|
370
|
+
# Compilar (n8n-node build: tsc + cópia de ícones)
|
|
316
371
|
npm run build
|
|
317
|
-
npm run dev
|
|
318
|
-
```
|
|
319
372
|
|
|
320
|
-
|
|
373
|
+
# Testes (node --test sobre o dist)
|
|
374
|
+
npm test
|
|
321
375
|
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
│ └── DigisacApi.credentials.ts
|
|
326
|
-
├── nodes/
|
|
327
|
-
│ └── Digisac/
|
|
328
|
-
│ ├── Digisac.node.ts
|
|
329
|
-
│ ├── actions/
|
|
330
|
-
│ ├── generated/
|
|
331
|
-
│ ├── helpers/
|
|
332
|
-
│ └── transport/
|
|
333
|
-
├── scripts/
|
|
334
|
-
│ ├── generate-docs.mjs
|
|
335
|
-
│ └── generate-endpoints.mjs
|
|
336
|
-
└── docs/
|
|
337
|
-
└── api-calls.md
|
|
376
|
+
# Lint oficial do n8n (n8n-node lint)
|
|
377
|
+
npm run lint
|
|
378
|
+
npm run lint:fix
|
|
338
379
|
```
|
|
339
380
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
O script `scripts/generate-endpoints.mjs` baixa a coleção pública:
|
|
381
|
+
Estrutura resumida:
|
|
343
382
|
|
|
344
383
|
```text
|
|
345
|
-
|
|
384
|
+
n8n-nodes-digisac/
|
|
385
|
+
├── credentials/ # DigisacApi.credentials.ts
|
|
386
|
+
├── nodes/Digisac/
|
|
387
|
+
│ ├── actions/ # monta propriedades e executa cada chamada
|
|
388
|
+
│ ├── generated/ # catálogo gerado da coleção Postman
|
|
389
|
+
│ ├── helpers/ # IDs guiados, datas e opções (versão 2)
|
|
390
|
+
│ ├── methods/ # listSearch das listas pesquisáveis
|
|
391
|
+
│ └── transport/ # requisição HTTP com timeout
|
|
392
|
+
├── scripts/ # geradores do catálogo e dos documentos
|
|
393
|
+
├── docs/ # api-calls.md (gerado)
|
|
394
|
+
└── test/ # node --test sobre o dist
|
|
346
395
|
```
|
|
347
396
|
|
|
348
|
-
|
|
397
|
+
Os geradores são manuais e **não** rodam no build (o primeiro baixa a coleção da rede):
|
|
349
398
|
|
|
350
|
-
```
|
|
351
|
-
|
|
399
|
+
```bash
|
|
400
|
+
npm run generate:endpoints # baixa a coleção Postman e regrava o catálogo
|
|
401
|
+
npm run generate:docs # regrava docs/api-calls.md e a tabela de recursos deste README
|
|
352
402
|
```
|
|
353
403
|
|
|
354
|
-
|
|
404
|
+
## ✅ Compatibilidade
|
|
355
405
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
docs/api-calls.md
|
|
359
|
-
```
|
|
406
|
+
- Requer n8n com `n8nNodesApiVersion` 1 e uma conta Digisac com token de acesso pessoal.
|
|
407
|
+
- A versão 2 do node é a padrão em node novo; a versão 1 continua disponível para workflows salvos.
|
|
360
408
|
|
|
361
|
-
##
|
|
409
|
+
## 📚 Recursos
|
|
362
410
|
|
|
363
|
-
|
|
411
|
+
- [Documentação Postman da Digisac](https://documenter.getpostman.com/view/53282970/2sBXihpXmF)
|
|
412
|
+
- [Documentação de community nodes do n8n](https://docs.n8n.io/integrations/community-nodes/)
|
|
413
|
+
- [n8n: `$fromAI()`](https://docs.n8n.io/build/integrate-ai/ai-examples/use-ai-for-parameters/)
|
|
364
414
|
|
|
365
|
-
|
|
415
|
+
## 🚀 Publicação
|
|
366
416
|
|
|
367
|
-
|
|
368
|
-
npm version patch
|
|
369
|
-
git push origin main --tags
|
|
370
|
-
```
|
|
417
|
+
A tag `vX.Y.Z` dispara o workflow `publish.yml`, que envia a versão com `npm stage publish` e provenance. A versão **fica em espera**: ela só vai ao ar depois que o dono a aprova, com 2FA, na aba **Staged Packages** do npmjs.com. Sem a aprovação, nada muda no registro.
|
|
371
418
|
|
|
372
|
-
|
|
419
|
+
## 📈 Versões
|
|
373
420
|
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
421
|
+
- **1.1.0** — **IDs, datas e valores guiados.** Em node novo (versão 2 do node), contato, conexão, departamento, usuário, tag, cargo, robô e assunto aparecem em lista pesquisável; datas têm seletor; valores fixos viram opções. Workflows salvos continuam na versão 1. Migração para o `@n8n/node-cli` 0.55.5, lint oficial sem erros, testes, CI e timeout de 30 s. Veja o `CHANGELOG.md`.
|
|
422
|
+
- **1.0.3** — Descrições de AI Tool reforçadas: regra para campos `Id/Ids`, alertas para placeholders, orientação Popular vs General e avisos por tipo de campo.
|
|
423
|
+
- **1.0.2** — Interface simplificada: query e body com campos dedicados gerados da documentação. JSON fica em opções avançadas.
|
|
424
|
+
- **1.0.1** — Documentação em PT-BR, exemplos, instruções de AI Tool e catálogo em `docs/api-calls.md`.
|
|
425
|
+
- **1.0.0** — Primeira versão publicada: node único `Digisac`, credencial Bearer, 298 chamadas, suporte a AI Agent e publicação npm via GitHub Actions.
|
|
379
426
|
|
|
380
|
-
##
|
|
427
|
+
## 🆘 Suporte
|
|
381
428
|
|
|
382
|
-
|
|
383
|
-
- **1.0.1** — Documentação reescrita em PT-BR, com exemplos práticos, instruções de AI Tool e catálogo completo de chamadas em `docs/api-calls.md`.
|
|
384
|
-
- **1.0.0** — Primeira versão publicada. Node único `Digisac`, credencial Bearer, catálogo com 298 chamadas da documentação Postman, suporte a AI Agent e publicação npm via GitHub Actions.
|
|
429
|
+
Se algo não funcionar:
|
|
385
430
|
|
|
386
|
-
|
|
431
|
+
1. Confirme a **Base URL** e o **token** da credencial (o teste da credencial chama `GET /api/v1/me`).
|
|
432
|
+
2. Verifique se a versão do n8n é compatível.
|
|
433
|
+
3. Consulte os logs do n8n para o erro detalhado.
|
|
434
|
+
4. Abra uma [issue no GitHub](https://github.com/PedroHSGuimaraes/n8n-nodes-digisac/issues).
|
|
387
435
|
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
- [n8n: `$fromAI()`](https://docs.n8n.io/build/integrate-ai/ai-examples/use-ai-for-parameters/)
|
|
436
|
+
## ☕ Apoie o projeto
|
|
437
|
+
|
|
438
|
+
Este node é mantido de forma independente. Se ele ajuda suas automações, você pode apoiar o desenvolvimento, a manutenção e as novas integrações pelo [Buy Me a Coffee](https://buymeacoffee.com/qTny0AzFXS).
|
|
392
439
|
|
|
393
|
-
## Licença
|
|
440
|
+
## 📄 Licença
|
|
394
441
|
|
|
395
442
|
[MIT](LICENSE.md)
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
import type { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
|
|
2
2
|
export declare class Digisac implements INodeType {
|
|
3
3
|
description: INodeTypeDescription;
|
|
4
|
+
methods: {
|
|
5
|
+
listSearch: {
|
|
6
|
+
searchContacts: (this: import("n8n-workflow").ILoadOptionsFunctions, filter?: string, paginationToken?: unknown) => Promise<import("n8n-workflow").INodeListSearchResult>;
|
|
7
|
+
searchServices: (this: import("n8n-workflow").ILoadOptionsFunctions, filter?: string, paginationToken?: unknown) => Promise<import("n8n-workflow").INodeListSearchResult>;
|
|
8
|
+
searchDepartments: (this: import("n8n-workflow").ILoadOptionsFunctions, filter?: string, paginationToken?: unknown) => Promise<import("n8n-workflow").INodeListSearchResult>;
|
|
9
|
+
searchUsers: (this: import("n8n-workflow").ILoadOptionsFunctions, filter?: string, paginationToken?: unknown) => Promise<import("n8n-workflow").INodeListSearchResult>;
|
|
10
|
+
searchTags: (this: import("n8n-workflow").ILoadOptionsFunctions, filter?: string, paginationToken?: unknown) => Promise<import("n8n-workflow").INodeListSearchResult>;
|
|
11
|
+
searchRoles: (this: import("n8n-workflow").ILoadOptionsFunctions, filter?: string, paginationToken?: unknown) => Promise<import("n8n-workflow").INodeListSearchResult>;
|
|
12
|
+
searchBots: (this: import("n8n-workflow").ILoadOptionsFunctions, filter?: string, paginationToken?: unknown) => Promise<import("n8n-workflow").INodeListSearchResult>;
|
|
13
|
+
searchTicketTopics: (this: import("n8n-workflow").ILoadOptionsFunctions, filter?: string, paginationToken?: unknown) => Promise<import("n8n-workflow").INodeListSearchResult>;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
4
16
|
execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
|
|
5
17
|
}
|
|
@@ -3,6 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Digisac = void 0;
|
|
4
4
|
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
5
|
const actions_1 = require("./actions");
|
|
6
|
+
const resourceLocator_1 = require("./helpers/resourceLocator");
|
|
7
|
+
const listSearch_1 = require("./methods/listSearch");
|
|
8
|
+
const defaultResource = actions_1.resourceOptions[0]?.value?.toString() ?? '';
|
|
6
9
|
class Digisac {
|
|
7
10
|
constructor() {
|
|
8
11
|
this.description = {
|
|
@@ -10,7 +13,8 @@ class Digisac {
|
|
|
10
13
|
name: 'digisac',
|
|
11
14
|
icon: { light: 'file:digisac.png', dark: 'file:digisac.dark.png' },
|
|
12
15
|
group: ['transform'],
|
|
13
|
-
version: 1,
|
|
16
|
+
version: [1, 2],
|
|
17
|
+
defaultVersion: 2,
|
|
14
18
|
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
|
|
15
19
|
description: 'Use every documented Digisac API request from the public Postman documentation. Choose a resource folder and operation, fill required path parameters and use the generated query/body fields first. Advanced JSON fields are available only when an operation needs a custom payload or unsupported filter. Built for AI Agents: operation descriptions include method, path, source folder, required path variables, query guidance, body fields and explicit reminders to use IDs returned by Digisac instead of inventing values.',
|
|
16
20
|
defaults: {
|
|
@@ -18,7 +22,11 @@ class Digisac {
|
|
|
18
22
|
},
|
|
19
23
|
inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
|
|
20
24
|
outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
|
|
21
|
-
usableAsTool:
|
|
25
|
+
usableAsTool: {
|
|
26
|
+
replacements: {
|
|
27
|
+
description: 'Ferramenta para executar chamadas documentadas da API Digisac dentro do n8n. Use somente para tarefas de Digisac, como consultar, criar ou alterar contatos, chamados, mensagens, campanhas, conexoes, departamentos, usuarios, tags, templates, webhooks, relatorios e estatisticas. Primeiro escolha Resource e Operation; a Operation informa metodo HTTP, endpoint, origem na documentacao, parametros obrigatorios, query e body. Nunca invente IDs: qualquer campo terminado em Id ou Ids deve vir de busca/listagem anterior, entrada confirmada do usuario ou valor sentinela documentado como all. Preencha campos dedicados de path, query e Body Fields; deixe campos vazios quando nao souber. Nao copie placeholders da documentacao como {{contactId}} ou {{all/open/close}}; substitua por valor real ou escolha uma opcao valida. Use Query Avancada JSON ou Body JSON Avancado apenas quando nao existir campo dedicado suficiente. Antes de enviar mensagem, excluir, arquivar, bloquear, fechar chamado, transferir chamado ou alterar dados, confirme que a intencao do usuario esta explicita.',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
22
30
|
credentials: [
|
|
23
31
|
{
|
|
24
32
|
name: 'digisacApi',
|
|
@@ -32,12 +40,13 @@ class Digisac {
|
|
|
32
40
|
type: 'options',
|
|
33
41
|
noDataExpression: true,
|
|
34
42
|
options: actions_1.resourceOptions,
|
|
35
|
-
default:
|
|
36
|
-
description: '
|
|
43
|
+
default: defaultResource,
|
|
44
|
+
description: 'Area da API Digisac agrupada pela documentacao Postman. Resources Popular sao atalhos para operacoes frequentes; resources General contem o catalogo mais completo. Se a mesma chamada existir em Popular e General, prefira Popular para fluxos comuns e General quando precisar de uma chamada que nao existe no Popular.',
|
|
37
45
|
},
|
|
38
|
-
...actions_1.resourceProperties,
|
|
46
|
+
...(0, resourceLocator_1.withGuidedIds)(actions_1.resourceProperties),
|
|
39
47
|
],
|
|
40
48
|
};
|
|
49
|
+
this.methods = { listSearch: listSearch_1.listSearch };
|
|
41
50
|
}
|
|
42
51
|
async execute() {
|
|
43
52
|
const items = this.getInputData();
|