@exado/n8n-nodes-exado 0.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/LICENSE +21 -0
- package/README.md +132 -0
- package/dist/credentials/ExadoApi.credentials.d.ts +9 -0
- package/dist/credentials/ExadoApi.credentials.js +48 -0
- package/dist/credentials/ExadoApi.credentials.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/nodes/Exado/Exado.node.d.ts +17 -0
- package/dist/nodes/Exado/Exado.node.js +709 -0
- package/dist/nodes/Exado/Exado.node.js.map +1 -0
- package/dist/nodes/Exado/ExadoTrigger.node.d.ts +5 -0
- package/dist/nodes/Exado/ExadoTrigger.node.js +123 -0
- package/dist/nodes/Exado/ExadoTrigger.node.js.map +1 -0
- package/dist/nodes/Exado/descriptions/ChatCompletionDescription.d.ts +3 -0
- package/dist/nodes/Exado/descriptions/ChatCompletionDescription.js +181 -0
- package/dist/nodes/Exado/descriptions/ChatCompletionDescription.js.map +1 -0
- package/dist/nodes/Exado/descriptions/ChatDescription.d.ts +3 -0
- package/dist/nodes/Exado/descriptions/ChatDescription.js +78 -0
- package/dist/nodes/Exado/descriptions/ChatDescription.js.map +1 -0
- package/dist/nodes/Exado/descriptions/ConversationConfigDescription.d.ts +3 -0
- package/dist/nodes/Exado/descriptions/ConversationConfigDescription.js +115 -0
- package/dist/nodes/Exado/descriptions/ConversationConfigDescription.js.map +1 -0
- package/dist/nodes/Exado/descriptions/ConversationDescription.d.ts +3 -0
- package/dist/nodes/Exado/descriptions/ConversationDescription.js +102 -0
- package/dist/nodes/Exado/descriptions/ConversationDescription.js.map +1 -0
- package/dist/nodes/Exado/descriptions/ConversationTemplateDescription.d.ts +3 -0
- package/dist/nodes/Exado/descriptions/ConversationTemplateDescription.js +97 -0
- package/dist/nodes/Exado/descriptions/ConversationTemplateDescription.js.map +1 -0
- package/dist/nodes/Exado/descriptions/DocumentDescription.d.ts +3 -0
- package/dist/nodes/Exado/descriptions/DocumentDescription.js +221 -0
- package/dist/nodes/Exado/descriptions/DocumentDescription.js.map +1 -0
- package/dist/nodes/Exado/descriptions/EmbeddingDescription.d.ts +3 -0
- package/dist/nodes/Exado/descriptions/EmbeddingDescription.js +56 -0
- package/dist/nodes/Exado/descriptions/EmbeddingDescription.js.map +1 -0
- package/dist/nodes/Exado/descriptions/FaqTopicDescription.d.ts +3 -0
- package/dist/nodes/Exado/descriptions/FaqTopicDescription.js +89 -0
- package/dist/nodes/Exado/descriptions/FaqTopicDescription.js.map +1 -0
- package/dist/nodes/Exado/descriptions/FolderDescription.d.ts +3 -0
- package/dist/nodes/Exado/descriptions/FolderDescription.js +81 -0
- package/dist/nodes/Exado/descriptions/FolderDescription.js.map +1 -0
- package/dist/nodes/Exado/descriptions/GroupDescription.d.ts +3 -0
- package/dist/nodes/Exado/descriptions/GroupDescription.js +29 -0
- package/dist/nodes/Exado/descriptions/GroupDescription.js.map +1 -0
- package/dist/nodes/Exado/descriptions/MetadataDescription.d.ts +3 -0
- package/dist/nodes/Exado/descriptions/MetadataDescription.js +116 -0
- package/dist/nodes/Exado/descriptions/MetadataDescription.js.map +1 -0
- package/dist/nodes/Exado/descriptions/ModelDescription.d.ts +3 -0
- package/dist/nodes/Exado/descriptions/ModelDescription.js +30 -0
- package/dist/nodes/Exado/descriptions/ModelDescription.js.map +1 -0
- package/dist/nodes/Exado/descriptions/QuickDescription.d.ts +3 -0
- package/dist/nodes/Exado/descriptions/QuickDescription.js +35 -0
- package/dist/nodes/Exado/descriptions/QuickDescription.js.map +1 -0
- package/dist/nodes/Exado/exado.svg +4 -0
- package/dist/nodes/Exado/helpers/pagination.d.ts +4 -0
- package/dist/nodes/Exado/helpers/pagination.js +33 -0
- package/dist/nodes/Exado/helpers/pagination.js.map +1 -0
- package/dist/nodes/Exado/helpers/request.d.ts +15 -0
- package/dist/nodes/Exado/helpers/request.js +101 -0
- package/dist/nodes/Exado/helpers/request.js.map +1 -0
- package/dist/nodes/Exado/helpers/sse.d.ts +12 -0
- package/dist/nodes/Exado/helpers/sse.js +87 -0
- package/dist/nodes/Exado/helpers/sse.js.map +1 -0
- package/dist/nodes/Exado/helpers/upload.d.ts +2 -0
- package/dist/nodes/Exado/helpers/upload.js +24 -0
- package/dist/nodes/Exado/helpers/upload.js.map +1 -0
- package/dist/nodes/Exado/methods/loadOptions.d.ts +8 -0
- package/dist/nodes/Exado/methods/loadOptions.js +95 -0
- package/dist/nodes/Exado/methods/loadOptions.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +66 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Exado
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# @exado/n8n-nodes-exado
|
|
2
|
+
|
|
3
|
+
n8n community node for the Exado AI API — RAG chat, OpenAI-compatible completions/embeddings, document ingestion, conversations, FAQ.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
### From the n8n UI (recommended)
|
|
8
|
+
|
|
9
|
+
Self-hosted n8n only — n8n Cloud does not yet support community nodes installed at runtime.
|
|
10
|
+
|
|
11
|
+
1. Make sure `N8N_COMMUNITY_PACKAGES_ENABLED=true` is set on the n8n container (it is by default in recent n8n versions).
|
|
12
|
+
2. Open n8n → **Settings → Community Nodes → Install**.
|
|
13
|
+
3. Enter the package name:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
@exado/n8n-nodes-exado
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
4. Tick "I understand the risks" → Install. The `Exado` and `Exado Trigger` nodes appear in the palette after ~30s.
|
|
20
|
+
|
|
21
|
+
### Manually (CLI)
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
cd ~/.n8n/custom # or wherever your n8n custom dir is
|
|
25
|
+
npm install @exado/n8n-nodes-exado
|
|
26
|
+
# then restart n8n
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Local development (npm link)
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
git clone https://github.com/vado-innovation-tech/n8n-nodes-exado.git
|
|
33
|
+
cd n8n-nodes-exado
|
|
34
|
+
npm install && npm run build
|
|
35
|
+
npm link
|
|
36
|
+
|
|
37
|
+
cd ~/.n8n/custom
|
|
38
|
+
npm link @exado/n8n-nodes-exado
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Credentials
|
|
42
|
+
|
|
43
|
+
Two pieces of information are needed:
|
|
44
|
+
|
|
45
|
+
1. **Base URL** — the root of your Exado API, e.g. `https://api.exado.example.com`. No trailing slash.
|
|
46
|
+
2. **API Key** — a long-lived key with the `exado_` prefix.
|
|
47
|
+
|
|
48
|
+
To issue a key:
|
|
49
|
+
|
|
50
|
+
1. Log into the Exado web UI as any user that owns the workflows you want to drive.
|
|
51
|
+
2. Open **Settings → API Keys** (or call `POST /api/admin/api-keys` once with a Keycloak JWT).
|
|
52
|
+
3. Copy the generated key the moment it is shown — it cannot be retrieved later.
|
|
53
|
+
|
|
54
|
+
> The server's `UnifiedAuth` dependency accepts the same `exado_` key on both the public OpenAI-compat surface and the internal endpoints. One credential covers every operation this node exposes.
|
|
55
|
+
|
|
56
|
+
After saving the credential, click **Test** — the node hits `GET /api/users/me` and returns the key owner.
|
|
57
|
+
|
|
58
|
+
## Supported resources & operations
|
|
59
|
+
|
|
60
|
+
| Resource | Operations |
|
|
61
|
+
| --- | --- |
|
|
62
|
+
| **Chat** | Send Message (streaming or non-streaming) |
|
|
63
|
+
| **Chat Completion** | Create Chat Completion, Create Completion (both streaming) |
|
|
64
|
+
| **Embedding** | Create |
|
|
65
|
+
| **Model** | List Available, List OpenAI-Compatible |
|
|
66
|
+
| **Document** | Upload (Async), Upload (Sync), Get, Get Content, Get Status, Get Many, Update, Delete, Bulk Delete, Translate, Get Translation Status, Get Translation Result |
|
|
67
|
+
| **Conversation** | Get Many, Get, Ask (streaming), Get Status, Cancel Generation |
|
|
68
|
+
| **Conversation Config** | Create, Get Many |
|
|
69
|
+
| **Conversation Template** | Create, Create Conversation From Template |
|
|
70
|
+
| **Metadata** | Create, Get, Get Many, Update, Delete, Pending Status, Generate |
|
|
71
|
+
| **Folder** | Create, List Children, Rename |
|
|
72
|
+
| **Group** | Get Many, Get |
|
|
73
|
+
| **FAQ Topic** | Create, Get, Get Many, Update, Delete |
|
|
74
|
+
| **Quick** | Quick Ask |
|
|
75
|
+
|
|
76
|
+
## Trigger node
|
|
77
|
+
|
|
78
|
+
`Exado Trigger` is a polling trigger with four modes:
|
|
79
|
+
|
|
80
|
+
- **Document Ingestion Complete** — emits when a previously unseen document reaches `status: "success"`.
|
|
81
|
+
- **Translation Complete** — emits when a translation transitions to `completed`.
|
|
82
|
+
- **New Conversation** — emits for each new conversation visible to the API key.
|
|
83
|
+
- **New FAQ Topic** — emits for each new FAQ topic.
|
|
84
|
+
|
|
85
|
+
The first poll silently primes dedupe state, so the workflow does not flood-fire on existing items. Subsequent polls emit only what is new. In *Test Step* (manual) mode the trigger ignores dedupe state and emits the latest items so you can wire downstream nodes.
|
|
86
|
+
|
|
87
|
+
## Streaming usage
|
|
88
|
+
|
|
89
|
+
For Chat, Chat Completion, and Conversation → Ask, set **Stream Response** to true. By default the node consumes the full SSE stream and returns a single item:
|
|
90
|
+
|
|
91
|
+
```json
|
|
92
|
+
{
|
|
93
|
+
"content": "Hello, world!",
|
|
94
|
+
"chunks": 12,
|
|
95
|
+
"model": "gpt-4o-mini",
|
|
96
|
+
"finishReason": "stop"
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Toggle **Emit Each Chunk** to produce one output item per parsed frame. This is useful for live-streaming downstream consumers but breaks single-item nodes like Set / Merge.
|
|
101
|
+
|
|
102
|
+
Mid-stream `[ERROR]` frames are surfaced as `NodeApiError`, with the partial buffered content attached on the error context.
|
|
103
|
+
|
|
104
|
+
## Document upload example
|
|
105
|
+
|
|
106
|
+
1. Add a **Read Binary File** (or any node that produces a binary item with `binary.data`).
|
|
107
|
+
2. Wire it into an **Exado** node configured as Resource = Document, Operation = Upload (Async).
|
|
108
|
+
3. In the node's Options, set Folder Path and Parsing Mode as desired.
|
|
109
|
+
4. Downstream, poll **Get Status** until `status === "success"` (or use the **Exado Trigger** with mode = Document Ingestion Complete).
|
|
110
|
+
|
|
111
|
+
## Known limitations
|
|
112
|
+
|
|
113
|
+
- Exado does not emit `Retry-After` or `X-RateLimit-*` headers — failed requests surface as `NodeApiError` with the raw HTTP status.
|
|
114
|
+
- `Upload (Sync)` may exceed n8n's request timeout on large PDFs. Prefer `Upload (Async)` + status polling.
|
|
115
|
+
- The buffered streaming mode loads the full response into memory before returning. For very long completions use `Emit Each Chunk`.
|
|
116
|
+
- `loadOptions` dropdowns for models / groups / folders cache the first page (up to 100 items). For larger libraries enter the ID manually.
|
|
117
|
+
|
|
118
|
+
## Development
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
npm install
|
|
122
|
+
npm run dev # tsc --watch
|
|
123
|
+
npm test # jest
|
|
124
|
+
npm run lint
|
|
125
|
+
npm run build # tsc + gulp icons
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Tests use Jest with `ts-jest`. The HTTP layer is mocked at `this.helpers.httpRequestWithAuthentication` — see `tests/resources/chat.test.ts` for the standard stub.
|
|
129
|
+
|
|
130
|
+
## License
|
|
131
|
+
|
|
132
|
+
MIT — see [LICENSE](./LICENSE).
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { IAuthenticateGeneric, ICredentialTestRequest, ICredentialType, INodeProperties } from 'n8n-workflow';
|
|
2
|
+
export declare class ExadoApi implements ICredentialType {
|
|
3
|
+
name: string;
|
|
4
|
+
displayName: string;
|
|
5
|
+
documentationUrl: string;
|
|
6
|
+
properties: INodeProperties[];
|
|
7
|
+
authenticate: IAuthenticateGeneric;
|
|
8
|
+
test: ICredentialTestRequest;
|
|
9
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ExadoApi = void 0;
|
|
4
|
+
class ExadoApi {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.name = 'exadoApi';
|
|
7
|
+
this.displayName = 'Exado API';
|
|
8
|
+
this.documentationUrl = 'https://github.com/vado-innovation-tech/n8n-nodes-exado';
|
|
9
|
+
this.properties = [
|
|
10
|
+
{
|
|
11
|
+
displayName: 'Base URL',
|
|
12
|
+
name: 'baseUrl',
|
|
13
|
+
type: 'string',
|
|
14
|
+
default: 'http://localhost:8000',
|
|
15
|
+
placeholder: 'https://api.exado.example.com',
|
|
16
|
+
description: 'Root URL of the Exado API. Do not include a trailing slash; the node prepends "/api" internally.',
|
|
17
|
+
required: true,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
displayName: 'API Key',
|
|
21
|
+
name: 'apiKey',
|
|
22
|
+
type: 'string',
|
|
23
|
+
typeOptions: { password: true },
|
|
24
|
+
default: '',
|
|
25
|
+
placeholder: 'exado_…',
|
|
26
|
+
description: 'Issue keys from the Exado admin UI or via POST /api/admin/api-keys. Keys are long-lived; rotate them by deactivating in the admin UI.',
|
|
27
|
+
required: true,
|
|
28
|
+
},
|
|
29
|
+
];
|
|
30
|
+
this.authenticate = {
|
|
31
|
+
type: 'generic',
|
|
32
|
+
properties: {
|
|
33
|
+
headers: {
|
|
34
|
+
'X-API-Key': '={{ $credentials.apiKey }}',
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
this.test = {
|
|
39
|
+
request: {
|
|
40
|
+
baseURL: '={{ $credentials.baseUrl.replace(/\\/$/, "") }}',
|
|
41
|
+
url: '/api/users/me',
|
|
42
|
+
method: 'GET',
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.ExadoApi = ExadoApi;
|
|
48
|
+
//# sourceMappingURL=ExadoApi.credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExadoApi.credentials.js","sourceRoot":"","sources":["../../credentials/ExadoApi.credentials.ts"],"names":[],"mappings":";;;AAeA,MAAa,QAAQ;IAArB;QACC,SAAI,GAAG,UAAU,CAAC;QAElB,gBAAW,GAAG,WAAW,CAAC;QAG1B,qBAAgB,GAAG,yDAAyD,CAAC;QAE7E,eAAU,GAAsB;YAC/B;gBACC,WAAW,EAAE,UAAU;gBACvB,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,uBAAuB;gBAChC,WAAW,EAAE,+BAA+B;gBAC5C,WAAW,EACV,kGAAkG;gBACnG,QAAQ,EAAE,IAAI;aACd;YACD;gBACC,WAAW,EAAE,SAAS;gBACtB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC/B,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,SAAS;gBACtB,WAAW,EACV,uIAAuI;gBACxI,QAAQ,EAAE,IAAI;aACd;SACD,CAAC;QAEF,iBAAY,GAAyB;YACpC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE;gBACX,OAAO,EAAE;oBACR,WAAW,EAAE,4BAA4B;iBACzC;aACD;SACD,CAAC;QAEF,SAAI,GAA2B;YAC9B,OAAO,EAAE;gBACR,OAAO,EAAE,iDAAiD;gBAC1D,GAAG,EAAE,eAAe;gBACpB,MAAM,EAAE,KAAK;aACb;SACD,CAAC;IACH,CAAC;CAAA;AAhDD,4BAgDC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
|
|
2
|
+
import { getConversationConfigs, getDocuments, getFolders, getGroups, getMetadatas, getModels, getOpenAiModels } from './methods/loadOptions';
|
|
3
|
+
export declare class Exado implements INodeType {
|
|
4
|
+
description: INodeTypeDescription;
|
|
5
|
+
methods: {
|
|
6
|
+
loadOptions: {
|
|
7
|
+
getModels: typeof getModels;
|
|
8
|
+
getOpenAiModels: typeof getOpenAiModels;
|
|
9
|
+
getGroups: typeof getGroups;
|
|
10
|
+
getConversationConfigs: typeof getConversationConfigs;
|
|
11
|
+
getMetadatas: typeof getMetadatas;
|
|
12
|
+
getDocuments: typeof getDocuments;
|
|
13
|
+
getFolders: typeof getFolders;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
|
|
17
|
+
}
|