n8n-nodes-jev 0.2.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.md ADDED
@@ -0,0 +1,19 @@
1
+ Copyright 2026 Brains of Bots
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
+ of the Software, and to permit persons to whom the Software is furnished to do
8
+ so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,300 @@
1
+ # n8n-nodes-jev
2
+
3
+ [![CI](https://github.com/vibe-with-me-tools/n8n-nodes-jev/actions/workflows/ci.yml/badge.svg)](https://github.com/vibe-with-me-tools/n8n-nodes-jev/actions/workflows/ci.yml)
4
+ [![npm version](https://img.shields.io/npm/v/n8n-nodes-jev.svg)](https://www.npmjs.com/package/n8n-nodes-jev)
5
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE.md)
6
+
7
+ An [n8n](https://n8n.io) community node for **Jev**, a decision model from [TypeSafe](https://docs.typesafe.ai).
8
+
9
+ Many workflows have a step where something needs a judgment. Which team should handle this ticket? Is this lead a good fit? Does this message contain personal data? Jev answers questions like these. You define the question and the answers it can give, and Jev returns one of your answers with a probability for each option. It doesn't write text, so there's no JSON to parse and no free-form reply to check.
10
+
11
+ The probabilities are what make this useful in a workflow. When Jev isn't sure, the numbers show it, so you can send that item to a person instead of acting on a guess.
12
+
13
+ ![How the Jev node works](docs/images/how-it-works.svg)
14
+
15
+ ## Contents
16
+
17
+ - [Why use Jev for this step](#why-use-jev-for-this-step)
18
+ - [Question types](#question-types)
19
+ - [When to use it](#when-to-use-it)
20
+ - [Use cases](#use-cases)
21
+ - [Installation](#installation)
22
+ - [Credentials](#credentials)
23
+ - [Operations](#operations)
24
+ - [Example workflows](#example-workflows)
25
+ - [Writing good questions](#writing-good-questions)
26
+ - [Limits and costs](#limits-and-costs)
27
+ - [Development](#development)
28
+
29
+ ## Why use Jev for this step
30
+
31
+ In n8n today, a judgment step usually means an LLM node, a Structured Output Parser, and an IF node to catch replies that don't match the format. A general-purpose LLM can do the job, but it writes its answer out token by token, and you have to check whatever comes back.
32
+
33
+ Jev is built only for this kind of step. It doesn't write a reply. It scores the options you gave it and returns the result.
34
+
35
+ | | LLM with a structured-output prompt | Jev |
36
+ | --- | --- | --- |
37
+ | **What comes back** | Generated text that should match your format, so you parse and validate it | One of your options, always. It can't return a value you didn't define. |
38
+ | **Speed** | Grows with the length of the reply, because every output token is generated | Most requests finish in about 100 ms, according to TypeSafe. All questions in a request are answered in parallel. |
39
+ | **Cost** | Input and output tokens | Input tokens only, at $0.042 per million. Output is free. |
40
+ | **Knowing when it's unsure** | No built-in signal in the answer. Some APIs expose token probabilities, but they don't map directly onto your options. | A probability for every option, trained to be calibrated, so a low number means send it to a person |
41
+ | **Same input, same answer** | Can vary between runs | Designed to give stable answers on repeated runs |
42
+
43
+ For scale: in TypeSafe's own cost comparison (September 2026), a small general-purpose model, gpt-5.4-mini, costs $0.75 per million input tokens and $4.50 per million output tokens.
44
+
45
+ Asking several questions in one request also saves time and money. In a TypeSafe [benchmark](https://docs.typesafe.ai/cookbooks/parallel_questions), 13 questions about one document took 0.27 s and cost $0.0005 as a single request, compared with 2.71 s and $0.0061 as 13 separate requests, with the same answers. The node always sends all of an item's questions in one request.
46
+
47
+ What you give up: Jev can't write, summarize, or explain its answer. When a step needs text, keep an LLM for that step and use Jev for the decisions around it. See [When to use it](#when-to-use-it).
48
+
49
+ Figures are from TypeSafe's [System One](https://docs.typesafe.ai/concepts/system-one), [Models](https://docs.typesafe.ai/models), and [cascade cookbook](https://docs.typesafe.ai/cookbooks/sde_cascade) pages as of September 2026. Check those pages for current numbers.
50
+
51
+ ## Question types
52
+
53
+ Every question is one of three types. You can mix them in one request, and they're all answered together.
54
+
55
+ | Type | Use it to ask | You get back | Example |
56
+ | --- | --- | --- | --- |
57
+ | **Choice** | Which of these options fits? | The chosen option, a probability per option, and a confidence value | *Which team should handle this?* billing / technical / sales |
58
+ | **Score** | Where does this fall on a scale you describe? | A weighted score (it can fall between levels), probabilities, and confidence | *How frustrated is the customer?* calm → frustrated → very angry |
59
+ | **Noul** | Is this statement true? | The probability that the answer is yes, from 0 to 1 | *Does the message contain a card number?* |
60
+
61
+ **Confidence** is a number from 0 to 1 that Jev calculates from the probabilities. It's high when one answer clearly wins and low when the probabilities are spread out. Choice and Score answers include it; Noul answers are already a probability. See [Confidence](https://docs.typesafe.ai/confidence) in the TypeSafe docs.
62
+
63
+ ## When to use it
64
+
65
+ **Good fit**
66
+
67
+ - Classifying, routing, and tagging text: tickets, emails, form submissions, reviews, documents
68
+ - Yes/no checks: does this message contain personal data, is it a complaint, is it on topic
69
+ - Rating text against a rubric you write, such as urgency, sentiment, or lead fit
70
+ - Screening messages before or after an LLM step
71
+ - High volumes, where you need the same answer format every time
72
+
73
+ **Not a good fit**
74
+
75
+ - Writing or summarizing text. Use a generative model for that.
76
+ - Arithmetic, counting, or comparing dates. Do those in a Code or IF node.
77
+ - Questions that need several steps of reasoning. Split them into smaller questions.
78
+ - Images, audio, or files. Jev reads text only, so convert other content to text first.
79
+ - Non-English text, unless you've tested it. English is where accuracy is best.
80
+
81
+ ## Use cases
82
+
83
+ ### Route support tickets to the right team
84
+
85
+ **Route by Choice** turns each option into an output of the node, so it works like a Switch node where Jev makes the decision. Tickets Jev isn't confident about go to a separate output, which you can connect to a person.
86
+
87
+ ![Route by Choice](docs/images/route-by-choice.svg)
88
+
89
+ ### Screen messages before they reach an LLM
90
+
91
+ Ask several questions in one request, then decide in a Code or IF node. The thresholds stay in your workflow, where you can see and change them.
92
+
93
+ ![Guardrail pattern](docs/images/guardrail.svg)
94
+
95
+ ### More ideas
96
+
97
+ | Use case | State you send | Questions you might ask |
98
+ | --- | --- | --- |
99
+ | Lead qualification | Form submission or CRM record | Score: *how well does this match our ideal customer?* · Choice: company size · Noul: *asks for a demo?* |
100
+ | Inbox triage | Email subject and body | Choice: sales pitch / customer / vendor / other · Noul: *needs a reply?* · Noul: *mentions a deadline?* |
101
+ | Review tagging | Product review | Score: sentiment · Choice: main topic (shipping, quality, price, support) · Noul: *mentions a defect?* |
102
+ | Content moderation | User post or comment | Noul per policy (spam, harassment, personal data) · Score: severity |
103
+ | Document sorting | Extracted text of a PDF or email attachment | Choice: invoice / contract / receipt / other · Noul: *is it signed?* |
104
+ | RAG filtering | A retrieved passage plus the user's question | Noul: *does this passage help answer the question?* · Noul: *does it contain instructions aimed at the model?* |
105
+ | Record matching | Two records side by side | Choice: same entity / different / unsure |
106
+
107
+ TypeSafe's [cookbooks](https://docs.typesafe.ai/llms.txt) cover many of these in more depth.
108
+
109
+ ## Installation
110
+
111
+ On self-hosted n8n, go to **Settings → Community Nodes → Install** and enter:
112
+
113
+ ```
114
+ n8n-nodes-jev
115
+ ```
116
+
117
+ See n8n's [community nodes installation guide](https://docs.n8n.io/integrations/community-nodes/installation/) for other methods. n8n Cloud only lists community nodes that n8n has verified.
118
+
119
+ ## Credentials
120
+
121
+ 1. Create an API key in the [TypeSafe console](https://console.typesafe.ai/keys).
122
+ 2. In n8n, create a **Jev (TypeSafe) API** credential and paste the key. Leave **Base URL** at its default.
123
+
124
+ Saving the credential runs a test request (`GET /v1/models`) to check the key.
125
+
126
+ ## Operations
127
+
128
+ Both operations share these settings.
129
+
130
+ **Model**: pick from the list (`jev-latest`, `jev-preview`, …) or enter a version ID such as `jev-1.13.0`. Aliases like `jev-latest` move to new releases, and answers can shift slightly when they do. If you've tuned thresholds, pin a version.
131
+
132
+ **State Source**: the content Jev evaluates.
133
+
134
+ | Source | Sends |
135
+ | --- | --- |
136
+ | Text | A string, e.g. `{{ $json.message }}`. If the expression returns an object, it's sent as structured data. |
137
+ | JSON | An object or array you write or build with expressions |
138
+ | Whole Input Item | The incoming item's JSON |
139
+
140
+ Objects with clear field names work well, e.g. `{ "ticket": …, "customer_plan": …, "refund_policy": … }`. See [State](https://docs.typesafe.ai/concepts/state).
141
+
142
+ ### Ask Questions
143
+
144
+ Add one or more questions. Each has an **Answer Type**, an **ID** (the field the answer is written to), and **Instructions** (the question itself).
145
+
146
+ | Answer Type | Extra fields |
147
+ | --- | --- |
148
+ | Choice | **Options**: one per line, optionally followed by `: description` |
149
+ | Score | **Levels**: one per line, lowest first |
150
+ | Noul | **Yes Means** / **No Means** (both optional) |
151
+
152
+ ```
153
+ billing: Payments, invoices, refunds
154
+ technical: Bugs, outages, integrations
155
+ sales: Pricing, plans, upgrades
156
+ ```
157
+
158
+ Options and Levels also accept an expression that returns an array, or for Choice, an `{ option: description }` object.
159
+
160
+ To use the API's full question format, including JSON objects as instructions or criteria, set **Define Questions** to *Using JSON* and paste a `questions` map from the [API reference](https://docs.typesafe.ai/api).
161
+
162
+ **Output** (default, with *Simplify Output* on):
163
+
164
+ ```json
165
+ {
166
+ "message": "I was charged twice for order A-104. Please refund the duplicate.",
167
+ "jev": {
168
+ "department": "billing",
169
+ "department_confidence": 0.93,
170
+ "frustration": 1.1,
171
+ "frustration_level": "Frustrated but civil",
172
+ "frustration_confidence": 0.84,
173
+ "is_urgent": 0.21,
174
+ "_model": "jev-1.13.0"
175
+ }
176
+ }
177
+ ```
178
+
179
+ | Answer Type | Fields written |
180
+ | --- | --- |
181
+ | Choice | `<id>` (the chosen option), `<id>_confidence` |
182
+ | Score | `<id>` (the weighted score), `<id>_level` (the most likely level's text), `<id>_confidence` |
183
+ | Noul | `<id>` (the probability of yes) |
184
+
185
+ `_model` is the version that answered. Turn off **Simplify Output** to get the full API response, including every probability and token usage.
186
+
187
+ ### Route by Choice
188
+
189
+ 1. **Instructions**: what to decide, e.g. *Which team should handle this ticket?*
190
+ 2. **Routes**: at least two. Each route's **Name** becomes an output. **Use When** describes what belongs there. Names can't be expressions, because they define the outputs.
191
+ 3. **Low Confidence Handling**:
192
+ - *Send to Low Confidence Output* (default) adds a last output for items whose confidence is below the **Confidence Threshold** (default 0.5).
193
+ - *Send to Best Route Anyway* doesn't add the extra output.
194
+
195
+ Each item leaves through one output and carries:
196
+
197
+ ```json
198
+ "jev": {
199
+ "route": "technical",
200
+ "confidence": 0.94,
201
+ "lowConfidence": false,
202
+ "probabilities": { "billing": 0.03, "technical": 0.96, "sales": 0.01 },
203
+ "_model": "jev-1.13.0"
204
+ }
205
+ ```
206
+
207
+ ### Options
208
+
209
+ | Option | Default | Description |
210
+ | --- | --- | --- |
211
+ | Include Input Fields | on | Keep the incoming item's fields next to the answers |
212
+ | Output Field | `jev` | Field the answers are written to |
213
+ | Simplify Output | on | Flat fields instead of the raw response (Ask Questions only) |
214
+ | Max Retries | 3 | Retries when TypeSafe returns `429` (rate limited) or `529` (overloaded), with exponential backoff that honors `retry-after` |
215
+ | Timeout (ms) | 60000 | How long to wait for a response |
216
+
217
+ ### As an AI Agent tool
218
+
219
+ The node can also be used as a tool: it appears as **Jev Tool** in an AI Agent's tool list. It's useful when you want the agent to get a structured decision, such as a policy check or a classification, instead of reasoning about it in free text.
220
+
221
+ ## Example workflows
222
+
223
+ Import these from [`examples/`](examples) with **Workflows → Import from File**, then pick your Jev credential on the Jev node.
224
+
225
+ | Workflow | Shows |
226
+ | --- | --- |
227
+ | [Support ticket triage](examples/support-ticket-triage.json) | Ask Questions with Choice, Score, and Noul together; an IF node escalates urgent or angry tickets |
228
+ | [Route tickets by team](examples/route-tickets-by-team.json) | Route by Choice with three team outputs and a Low Confidence output for human review |
229
+ | [Message guardrail](examples/message-guardrail.json) | JSON questions, the whole input item as state, and a Code node that decides pass, review, or block |
230
+
231
+ ## Writing good questions
232
+
233
+ Most of this comes from TypeSafe's notes on [known limitations](https://docs.typesafe.ai/model-jaggedness/jev-1.13).
234
+
235
+ - **One decision per question.** Ask *is it urgent?* and *which team?* separately, not *is it an urgent billing issue?* Extra questions in the same request cost little.
236
+ - **Say exactly what you mean.** Jev reads instructions literally. Put borderline cases in the option descriptions, e.g. `billing: Payments and refunds, including disputed charges`.
237
+ - **Make options that don't overlap,** and add an `other` option when inputs can fall outside your set.
238
+ - **Keep numbers and dates in the workflow.** Ask Jev to find or classify the value, then compare it in an IF or Code node.
239
+ - **Send only what the question needs.** Long state full of unrelated detail lowers accuracy.
240
+ - **Set thresholds by risk.** A wrong route to the sales queue costs little. A wrong refund approval costs more, so gate it at a higher confidence.
241
+ - **Test on your own data** before relying on it, and look at the items that end up in the low-confidence path.
242
+
243
+ ## Limits and costs
244
+
245
+ - **One API request per input item.** Items are processed one after another. For large batches, use n8n's **Loop Over Items** node to control the pace.
246
+ - **Context:** up to 64k tokens per request, of which the state plus the longest question can use 32k.
247
+ - **Rate limits and pricing** are set by TypeSafe and billed per input token. Check the [Models](https://docs.typesafe.ai/models) page for current numbers. The node retries rate-limited requests automatically.
248
+ - **Text only.** State must be a string, a JSON object, or an array.
249
+
250
+ ## Development
251
+
252
+ ```bash
253
+ npm install
254
+ npm run dev # starts n8n with this node loaded and rebuilds on change
255
+ npm test # runs the test suite
256
+ npm run typecheck # type-checks the node and the tests
257
+ npm run build
258
+ npm run lint
259
+ ```
260
+
261
+ The tests in [`test/`](test) use [Vitest](https://vitest.dev) with a stubbed n8n context and a fake API, so they need no API key or running n8n. They cover question building, output flattening, routing, retries, error handling, and the example workflows. Test files use the `.mts` extension so n8n's node linter, which applies n8n Cloud's runtime rules to `.ts` files, doesn't treat them as node code.
262
+
263
+ `npm run dev` needs Node.js 24 or newer, because it runs the latest n8n. In dev mode n8n registers the node as `CUSTOM.jev` instead of `n8n-nodes-jev.jev`. To import the example workflows into a dev instance, change the node type first:
264
+
265
+ ```bash
266
+ sed 's/"n8n-nodes-jev\.jev"/"CUSTOM.jev"/' examples/route-tickets-by-team.json > /tmp/route-dev.json
267
+ ```
268
+
269
+ ### Releasing
270
+
271
+ Releases are published to npm by the [Publish workflow](.github/workflows/publish.yml) when a version tag is pushed. n8n requires community nodes to be published this way, with npm provenance, to be eligible for verification. Don't run `npm publish` from your machine.
272
+
273
+ 1. Move the entries under **Unreleased** in [CHANGELOG.md](CHANGELOG.md) to a new version heading and commit.
274
+ 2. Bump the version. This commits the change and creates a tag such as `v0.3.0`:
275
+
276
+ ```bash
277
+ npm version minor -m "chore: release %s"
278
+ ```
279
+
280
+ 3. Push the commit and the tag:
281
+
282
+ ```bash
283
+ git push --follow-tags
284
+ ```
285
+
286
+ The workflow checks that the tag matches `package.json`, runs the type-check and tests, then lints, builds, and publishes.
287
+
288
+ Use `npm version` rather than `npm run release`: n8n's release command regenerates CHANGELOG.md from commit messages, which replaces the hand-written entries.
289
+
290
+ **One-time npm setup.** The first publish needs an npm access token saved as the `NPM_TOKEN` repository secret. Once the package exists on npm, add this repository as a [Trusted Publisher](https://docs.npmjs.com/trusted-publishers) in the package settings (workflow `publish.yml`) and delete the secret. The workflow file lists the exact steps.
291
+
292
+ ## Links
293
+
294
+ - [TypeSafe documentation](https://docs.typesafe.ai) and [API reference](https://docs.typesafe.ai/api)
295
+ - [n8n community nodes](https://docs.n8n.io/integrations/#community-nodes)
296
+ - [Changelog](CHANGELOG.md)
297
+
298
+ ## License
299
+
300
+ [MIT](LICENSE.md). This community node is maintained by Brains of Bots. Jev and the TypeSafe API are provided by TypeSafe.
@@ -0,0 +1,10 @@
1
+ import type { IAuthenticateGeneric, Icon, ICredentialTestRequest, ICredentialType, INodeProperties } from 'n8n-workflow';
2
+ export declare class JevApi implements ICredentialType {
3
+ name: string;
4
+ displayName: string;
5
+ icon: Icon;
6
+ documentationUrl: string;
7
+ properties: INodeProperties[];
8
+ authenticate: IAuthenticateGeneric;
9
+ test: ICredentialTestRequest;
10
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JevApi = void 0;
4
+ class JevApi {
5
+ constructor() {
6
+ this.name = 'jevApi';
7
+ this.displayName = 'Jev (TypeSafe) API';
8
+ this.icon = { light: 'file:../icons/jev.svg', dark: 'file:../icons/jev.dark.svg' };
9
+ this.documentationUrl = 'https://docs.typesafe.ai/introduction/quickstart';
10
+ this.properties = [
11
+ {
12
+ displayName: 'API Key',
13
+ name: 'apiKey',
14
+ type: 'string',
15
+ typeOptions: { password: true },
16
+ default: '',
17
+ required: true,
18
+ description: 'Create a key at https://console.typesafe.ai/keys',
19
+ },
20
+ {
21
+ displayName: 'Base URL',
22
+ name: 'baseUrl',
23
+ type: 'string',
24
+ default: 'https://api.typesafe.ai',
25
+ description: 'Only change this if TypeSafe has given you a different API host',
26
+ },
27
+ ];
28
+ this.authenticate = {
29
+ type: 'generic',
30
+ properties: {
31
+ headers: {
32
+ Authorization: '=Bearer {{$credentials.apiKey}}',
33
+ },
34
+ },
35
+ };
36
+ this.test = {
37
+ request: {
38
+ baseURL: '={{$credentials.baseUrl.replace(/\\/+$/, "")}}',
39
+ url: '/v1/models',
40
+ method: 'GET',
41
+ },
42
+ };
43
+ }
44
+ }
45
+ exports.JevApi = JevApi;
46
+ //# sourceMappingURL=JevApi.credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JevApi.credentials.js","sourceRoot":"","sources":["../../credentials/JevApi.credentials.ts"],"names":[],"mappings":";;;AAQA,MAAa,MAAM;IAAnB;QACC,SAAI,GAAG,QAAQ,CAAC;QAEhB,gBAAW,GAAG,oBAAoB,CAAC;QAEnC,SAAI,GAAS,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;QAEpF,qBAAgB,GAAG,kDAAkD,CAAC;QAEtE,eAAU,GAAsB;YAC/B;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,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,kDAAkD;aAC/D;YACD;gBACC,WAAW,EAAE,UAAU;gBACvB,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,yBAAyB;gBAClC,WAAW,EAAE,iEAAiE;aAC9E;SACD,CAAC;QAEF,iBAAY,GAAyB;YACpC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE;gBACX,OAAO,EAAE;oBACR,aAAa,EAAE,iCAAiC;iBAChD;aACD;SACD,CAAC;QAEF,SAAI,GAA2B;YAC9B,OAAO,EAAE;gBACR,OAAO,EAAE,gDAAgD;gBACzD,GAAG,EAAE,YAAY;gBACjB,MAAM,EAAE,KAAK;aACb;SACD,CAAC;IACH,CAAC;CAAA;AA5CD,wBA4CC"}
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="60" height="60" viewBox="0 0 60 60" fill="none">
2
+ <rect x="2" y="2" width="56" height="56" rx="14" fill="#5C7CFA"/>
3
+ <circle cx="16" cy="30" r="5" fill="#FFFFFF"/>
4
+ <path d="M21 30 H28 M28 30 C33 30 34 18 42 18 M28 30 C33 30 34 42 42 42" stroke="#FFFFFF" stroke-width="3.5" stroke-linecap="round" fill="none"/>
5
+ <circle cx="45" cy="18" r="4" fill="#A5D8FF"/>
6
+ <circle cx="45" cy="42" r="4" fill="#FFFFFF"/>
7
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="60" height="60" viewBox="0 0 60 60" fill="none">
2
+ <rect x="2" y="2" width="56" height="56" rx="14" fill="#3B5BDB"/>
3
+ <circle cx="16" cy="30" r="5" fill="#FFFFFF"/>
4
+ <path d="M21 30 H28 M28 30 C33 30 34 18 42 18 M28 30 C33 30 34 42 42 42" stroke="#FFFFFF" stroke-width="3.5" stroke-linecap="round" fill="none"/>
5
+ <circle cx="45" cy="18" r="4" fill="#A5D8FF"/>
6
+ <circle cx="45" cy="42" r="4" fill="#FFFFFF"/>
7
+ </svg>
@@ -0,0 +1,11 @@
1
+ import type { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
2
+ import { searchModels } from './listSearch/searchModels';
3
+ export declare class Jev implements INodeType {
4
+ description: INodeTypeDescription;
5
+ methods: {
6
+ listSearch: {
7
+ searchModels: typeof searchModels;
8
+ };
9
+ };
10
+ execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
11
+ }
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Jev = void 0;
4
+ const n8n_workflow_1 = require("n8n-workflow");
5
+ const searchModels_1 = require("./listSearch/searchModels");
6
+ const descriptions_1 = require("./shared/descriptions");
7
+ const questions_1 = require("./shared/questions");
8
+ const route_1 = require("./shared/route");
9
+ const transport_1 = require("./shared/transport");
10
+ function parseJsonParameter(value, label, itemIndex) {
11
+ if (typeof value !== 'string')
12
+ return value;
13
+ try {
14
+ return (0, n8n_workflow_1.jsonParse)(value);
15
+ }
16
+ catch {
17
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `${label} is not valid JSON`, { itemIndex });
18
+ }
19
+ }
20
+ class Jev {
21
+ constructor() {
22
+ this.description = {
23
+ displayName: 'Jev',
24
+ name: 'jev',
25
+ icon: { light: 'file:../../icons/jev.svg', dark: 'file:../../icons/jev.dark.svg' },
26
+ group: ['transform'],
27
+ version: 1,
28
+ subtitle: '={{ $parameter["model"].cachedResultName || $parameter["model"].value }}',
29
+ description: "Ask TypeSafe's Jev model typed questions, or route items by its choice, with calibrated confidence",
30
+ defaults: {
31
+ name: 'Jev',
32
+ },
33
+ usableAsTool: true,
34
+ inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
35
+ outputs: `={{(${route_1.configuredOutputs})($parameter)}}`,
36
+ credentials: [
37
+ {
38
+ name: 'jevApi',
39
+ required: true,
40
+ },
41
+ ],
42
+ properties: [
43
+ descriptions_1.operationProperty,
44
+ descriptions_1.modelProperty,
45
+ ...descriptions_1.stateProperties,
46
+ ...descriptions_1.questionProperties,
47
+ ...descriptions_1.routeProperties,
48
+ descriptions_1.optionsProperty,
49
+ ],
50
+ };
51
+ this.methods = {
52
+ listSearch: {
53
+ searchModels: searchModels_1.searchModels,
54
+ },
55
+ };
56
+ }
57
+ async execute() {
58
+ var _a;
59
+ const items = this.getInputData();
60
+ const operation = this.getNodeParameter('operation', 0);
61
+ const routeFields = operation === 'route' ? this.getNodeParameter('routes.values', 0, []) : [];
62
+ const routeNames = routeFields.map((route) => { var _a; return ((_a = route.name) !== null && _a !== void 0 ? _a : '').trim(); });
63
+ const lowConfidenceOutput = operation === 'route' && this.getNodeParameter('lowConfidence', 0) !== 'bestRoute';
64
+ const outputCount = operation === 'route' ? routeNames.length + (lowConfidenceOutput ? 1 : 0) : 1;
65
+ const returnData = Array.from({ length: Math.max(outputCount, 1) }, () => []);
66
+ for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {
67
+ try {
68
+ const model = this.getNodeParameter('model', itemIndex, '', {
69
+ extractValue: true,
70
+ });
71
+ if (!model) {
72
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Select a model', { itemIndex });
73
+ }
74
+ const state = getState.call(this, itemIndex, items[itemIndex]);
75
+ const options = this.getNodeParameter('options', itemIndex, {});
76
+ const questions = operation === 'route'
77
+ ? {
78
+ [route_1.ROUTE_QUESTION_ID]: (0, route_1.buildRouteQuestion)(this.getNodeParameter('routeInstructions', itemIndex, ''), routeFields),
79
+ }
80
+ : getQuestions.call(this, itemIndex);
81
+ const response = await transport_1.jevApiRequest.call(this, 'POST', '/v1/systemone', { state, model, questions }, { maxRetries: options.maxRetries, timeout: options.timeout, itemIndex });
82
+ let outputIndex = 0;
83
+ let result;
84
+ if (operation === 'route') {
85
+ const threshold = lowConfidenceOutput
86
+ ? this.getNodeParameter('confidenceThreshold', itemIndex, 0.5)
87
+ : 0;
88
+ const decision = (0, route_1.decideRoute)(response, routeNames, lowConfidenceOutput, threshold);
89
+ outputIndex = decision.outputIndex;
90
+ result = decision.result;
91
+ }
92
+ else {
93
+ result = options.simplify === false ? response : (0, questions_1.simplifyResponse)(response);
94
+ }
95
+ const outputField = ((_a = options.outputField) === null || _a === void 0 ? void 0 : _a.trim()) || 'jev';
96
+ const includeInput = options.includeInputFields !== false;
97
+ returnData[outputIndex].push({
98
+ json: includeInput
99
+ ? { ...items[itemIndex].json, [outputField]: result }
100
+ : { [outputField]: result },
101
+ binary: includeInput ? items[itemIndex].binary : undefined,
102
+ pairedItem: { item: itemIndex },
103
+ });
104
+ }
105
+ catch (error) {
106
+ const nodeError = error instanceof questions_1.QuestionDefinitionError
107
+ ? new n8n_workflow_1.NodeOperationError(this.getNode(), error.message, { itemIndex })
108
+ : error;
109
+ if (this.continueOnFail()) {
110
+ returnData[0].push({
111
+ json: { ...items[itemIndex].json, error: nodeError.message },
112
+ pairedItem: { item: itemIndex },
113
+ });
114
+ continue;
115
+ }
116
+ if (nodeError.context)
117
+ nodeError.context.itemIndex = itemIndex;
118
+ throw nodeError;
119
+ }
120
+ }
121
+ return returnData;
122
+ }
123
+ }
124
+ exports.Jev = Jev;
125
+ function getState(itemIndex, item) {
126
+ const source = this.getNodeParameter('stateSource', itemIndex);
127
+ if (source === 'inputItem')
128
+ return item.json;
129
+ if (source === 'json') {
130
+ const state = parseJsonParameter.call(this, this.getNodeParameter('stateJson', itemIndex), 'State (JSON)', itemIndex);
131
+ if (state === null || typeof state !== 'object') {
132
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'State (JSON) must be a JSON object or array', {
133
+ itemIndex,
134
+ });
135
+ }
136
+ return state;
137
+ }
138
+ const text = this.getNodeParameter('stateText', itemIndex, '');
139
+ if (text !== null && typeof text === 'object')
140
+ return text;
141
+ const state = String(text !== null && text !== void 0 ? text : '');
142
+ if (!state.trim())
143
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'State is empty', { itemIndex });
144
+ return state;
145
+ }
146
+ function getQuestions(itemIndex) {
147
+ const mode = this.getNodeParameter('questionMode', itemIndex);
148
+ if (mode === 'json') {
149
+ const value = parseJsonParameter.call(this, this.getNodeParameter('questionsJson', itemIndex), 'Questions (JSON)', itemIndex);
150
+ return (0, questions_1.validateQuestionsJson)(value);
151
+ }
152
+ const fields = this.getNodeParameter('questions.question', itemIndex, []);
153
+ return (0, questions_1.buildQuestionsFromFields)(fields);
154
+ }
155
+ //# sourceMappingURL=Jev.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Jev.node.js","sourceRoot":"","sources":["../../../nodes/Jev/Jev.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ {
2
+ "node": "n8n-nodes-jev.jev",
3
+ "nodeVersion": "1.0",
4
+ "codexVersion": "1.0",
5
+ "categories": ["AI", "Development"],
6
+ "resources": {
7
+ "credentialDocumentation": [
8
+ {
9
+ "url": "https://github.com/vibe-with-me-tools/n8n-nodes-jev#credentials"
10
+ }
11
+ ],
12
+ "primaryDocumentation": [
13
+ {
14
+ "url": "https://github.com/vibe-with-me-tools/n8n-nodes-jev#readme"
15
+ }
16
+ ]
17
+ }
18
+ }
@@ -0,0 +1,2 @@
1
+ import type { ILoadOptionsFunctions, INodeListSearchResult } from 'n8n-workflow';
2
+ export declare function searchModels(this: ILoadOptionsFunctions, filter?: string): Promise<INodeListSearchResult>;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.searchModels = searchModels;
4
+ const transport_1 = require("../shared/transport");
5
+ async function searchModels(filter) {
6
+ var _a;
7
+ const response = await transport_1.jevApiRequest.call(this, 'GET', '/v1/models');
8
+ const models = ((_a = response.models) !== null && _a !== void 0 ? _a : []);
9
+ const query = filter === null || filter === void 0 ? void 0 : filter.toLowerCase();
10
+ return {
11
+ results: models
12
+ .map((model) => ({
13
+ name: String(model.name),
14
+ value: String(model.name),
15
+ description: [model.description, model.release_date].filter(Boolean).join(' · '),
16
+ }))
17
+ .filter((model) => !query || model.name.toLowerCase().includes(query)),
18
+ };
19
+ }
20
+ //# sourceMappingURL=searchModels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchModels.js","sourceRoot":"","sources":["../../../../nodes/Jev/listSearch/searchModels.ts"],"names":[],"mappings":";;AAGA,oCAiBC;AAnBD,mDAAoD;AAE7C,KAAK,UAAU,YAAY,CAEjC,MAAe;;IAEf,MAAM,QAAQ,GAAG,MAAM,yBAAa,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,CAAC,MAAA,QAAQ,CAAC,MAAM,mCAAI,EAAE,CAAkB,CAAC;IACxD,MAAM,KAAK,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,EAAE,CAAC;IAEpC,OAAO;QACN,OAAO,EAAE,MAAM;aACb,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAChB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;YACxB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;YACzB,WAAW,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;SAChF,CAAC,CAAC;aACF,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;KACvE,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { INodeProperties } from 'n8n-workflow';
2
+ export declare const operationProperty: INodeProperties;
3
+ export declare const modelProperty: INodeProperties;
4
+ export declare const stateProperties: INodeProperties[];
5
+ export declare const questionProperties: INodeProperties[];
6
+ export declare const optionsProperty: INodeProperties;
7
+ export declare const routeProperties: INodeProperties[];