@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.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +132 -0
  3. package/dist/credentials/ExadoApi.credentials.d.ts +9 -0
  4. package/dist/credentials/ExadoApi.credentials.js +48 -0
  5. package/dist/credentials/ExadoApi.credentials.js.map +1 -0
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.js +3 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/nodes/Exado/Exado.node.d.ts +17 -0
  10. package/dist/nodes/Exado/Exado.node.js +709 -0
  11. package/dist/nodes/Exado/Exado.node.js.map +1 -0
  12. package/dist/nodes/Exado/ExadoTrigger.node.d.ts +5 -0
  13. package/dist/nodes/Exado/ExadoTrigger.node.js +123 -0
  14. package/dist/nodes/Exado/ExadoTrigger.node.js.map +1 -0
  15. package/dist/nodes/Exado/descriptions/ChatCompletionDescription.d.ts +3 -0
  16. package/dist/nodes/Exado/descriptions/ChatCompletionDescription.js +181 -0
  17. package/dist/nodes/Exado/descriptions/ChatCompletionDescription.js.map +1 -0
  18. package/dist/nodes/Exado/descriptions/ChatDescription.d.ts +3 -0
  19. package/dist/nodes/Exado/descriptions/ChatDescription.js +78 -0
  20. package/dist/nodes/Exado/descriptions/ChatDescription.js.map +1 -0
  21. package/dist/nodes/Exado/descriptions/ConversationConfigDescription.d.ts +3 -0
  22. package/dist/nodes/Exado/descriptions/ConversationConfigDescription.js +115 -0
  23. package/dist/nodes/Exado/descriptions/ConversationConfigDescription.js.map +1 -0
  24. package/dist/nodes/Exado/descriptions/ConversationDescription.d.ts +3 -0
  25. package/dist/nodes/Exado/descriptions/ConversationDescription.js +102 -0
  26. package/dist/nodes/Exado/descriptions/ConversationDescription.js.map +1 -0
  27. package/dist/nodes/Exado/descriptions/ConversationTemplateDescription.d.ts +3 -0
  28. package/dist/nodes/Exado/descriptions/ConversationTemplateDescription.js +97 -0
  29. package/dist/nodes/Exado/descriptions/ConversationTemplateDescription.js.map +1 -0
  30. package/dist/nodes/Exado/descriptions/DocumentDescription.d.ts +3 -0
  31. package/dist/nodes/Exado/descriptions/DocumentDescription.js +221 -0
  32. package/dist/nodes/Exado/descriptions/DocumentDescription.js.map +1 -0
  33. package/dist/nodes/Exado/descriptions/EmbeddingDescription.d.ts +3 -0
  34. package/dist/nodes/Exado/descriptions/EmbeddingDescription.js +56 -0
  35. package/dist/nodes/Exado/descriptions/EmbeddingDescription.js.map +1 -0
  36. package/dist/nodes/Exado/descriptions/FaqTopicDescription.d.ts +3 -0
  37. package/dist/nodes/Exado/descriptions/FaqTopicDescription.js +89 -0
  38. package/dist/nodes/Exado/descriptions/FaqTopicDescription.js.map +1 -0
  39. package/dist/nodes/Exado/descriptions/FolderDescription.d.ts +3 -0
  40. package/dist/nodes/Exado/descriptions/FolderDescription.js +81 -0
  41. package/dist/nodes/Exado/descriptions/FolderDescription.js.map +1 -0
  42. package/dist/nodes/Exado/descriptions/GroupDescription.d.ts +3 -0
  43. package/dist/nodes/Exado/descriptions/GroupDescription.js +29 -0
  44. package/dist/nodes/Exado/descriptions/GroupDescription.js.map +1 -0
  45. package/dist/nodes/Exado/descriptions/MetadataDescription.d.ts +3 -0
  46. package/dist/nodes/Exado/descriptions/MetadataDescription.js +116 -0
  47. package/dist/nodes/Exado/descriptions/MetadataDescription.js.map +1 -0
  48. package/dist/nodes/Exado/descriptions/ModelDescription.d.ts +3 -0
  49. package/dist/nodes/Exado/descriptions/ModelDescription.js +30 -0
  50. package/dist/nodes/Exado/descriptions/ModelDescription.js.map +1 -0
  51. package/dist/nodes/Exado/descriptions/QuickDescription.d.ts +3 -0
  52. package/dist/nodes/Exado/descriptions/QuickDescription.js +35 -0
  53. package/dist/nodes/Exado/descriptions/QuickDescription.js.map +1 -0
  54. package/dist/nodes/Exado/exado.svg +4 -0
  55. package/dist/nodes/Exado/helpers/pagination.d.ts +4 -0
  56. package/dist/nodes/Exado/helpers/pagination.js +33 -0
  57. package/dist/nodes/Exado/helpers/pagination.js.map +1 -0
  58. package/dist/nodes/Exado/helpers/request.d.ts +15 -0
  59. package/dist/nodes/Exado/helpers/request.js +101 -0
  60. package/dist/nodes/Exado/helpers/request.js.map +1 -0
  61. package/dist/nodes/Exado/helpers/sse.d.ts +12 -0
  62. package/dist/nodes/Exado/helpers/sse.js +87 -0
  63. package/dist/nodes/Exado/helpers/sse.js.map +1 -0
  64. package/dist/nodes/Exado/helpers/upload.d.ts +2 -0
  65. package/dist/nodes/Exado/helpers/upload.js +24 -0
  66. package/dist/nodes/Exado/helpers/upload.js.map +1 -0
  67. package/dist/nodes/Exado/methods/loadOptions.d.ts +8 -0
  68. package/dist/nodes/Exado/methods/loadOptions.js +95 -0
  69. package/dist/nodes/Exado/methods/loadOptions.js.map +1 -0
  70. package/dist/tsconfig.tsbuildinfo +1 -0
  71. 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"}
@@ -0,0 +1 @@
1
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -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
+ }