diff --git a/credentials/DigitalOceanServerlessInference.credentials.ts b/credentials/DigitalOceanServerlessInferenceApi.credentials.ts similarity index 81% rename from credentials/DigitalOceanServerlessInference.credentials.ts rename to credentials/DigitalOceanServerlessInferenceApi.credentials.ts index 07173a1..1cb04f0 100644 --- a/credentials/DigitalOceanServerlessInference.credentials.ts +++ b/credentials/DigitalOceanServerlessInferenceApi.credentials.ts @@ -4,9 +4,9 @@ import { INodeProperties, } from 'n8n-workflow'; -export class DigitalOceanServerlessInference implements ICredentialType { - name = 'digitalOceanServerlessInference'; - displayName = 'DigitalOcean Gradientâ„¢ AI Platform'; +export class DigitalOceanServerlessInferenceApi implements ICredentialType { + name = 'digitalOceanServerlessInferenceApi'; + displayName = 'DigitalOcean Gradientâ„¢ AI Platform API'; documentationUrl = 'https://docs.digitalocean.com/products/gradient-ai-platform/how-to/use-serverless-inference/'; properties: INodeProperties[] = [ { diff --git a/nodes/ServerlessInferenceNode/DO-Gradient-AI-Agentic-Cloud-logo.svg b/nodes/ServerlessInference/DO-Gradient-AI-Agentic-Cloud-logo.svg similarity index 100% rename from nodes/ServerlessInferenceNode/DO-Gradient-AI-Agentic-Cloud-logo.svg rename to nodes/ServerlessInference/DO-Gradient-AI-Agentic-Cloud-logo.svg diff --git a/nodes/ServerlessInferenceNode/DO-gradient-ai-logo-white.svg b/nodes/ServerlessInference/DO-gradient-ai-logo-white.svg similarity index 100% rename from nodes/ServerlessInferenceNode/DO-gradient-ai-logo-white.svg rename to nodes/ServerlessInference/DO-gradient-ai-logo-white.svg diff --git a/nodes/ServerlessInferenceNode/ServerlessInference.node.json b/nodes/ServerlessInference/DigitalOceanGradientServerlessInference.node.json similarity index 100% rename from nodes/ServerlessInferenceNode/ServerlessInference.node.json rename to nodes/ServerlessInference/DigitalOceanGradientServerlessInference.node.json diff --git a/nodes/ServerlessInferenceNode/ServerlessInference.node.ts b/nodes/ServerlessInference/DigitalOceanGradientServerlessInference.node.ts similarity index 96% rename from nodes/ServerlessInferenceNode/ServerlessInference.node.ts rename to nodes/ServerlessInference/DigitalOceanGradientServerlessInference.node.ts index 831aa46..a5d4b53 100644 --- a/nodes/ServerlessInferenceNode/ServerlessInference.node.ts +++ b/nodes/ServerlessInference/DigitalOceanGradientServerlessInference.node.ts @@ -21,7 +21,7 @@ export class ServerlessInference implements INodeType { outputs: [NodeConnectionType.Main], credentials: [ { - name: 'digitalOceanServerlessInference', + name: 'digitalOceanServerlessInferenceApi', required: true, }, ], diff --git a/nodes/ServerlessInferenceNode/GenericFunctions.ts b/nodes/ServerlessInference/GenericFunctions.ts similarity index 100% rename from nodes/ServerlessInferenceNode/GenericFunctions.ts rename to nodes/ServerlessInference/GenericFunctions.ts diff --git a/nodes/ServerlessInferenceNode/TextDescription.ts b/nodes/ServerlessInference/TextDescription.ts similarity index 94% rename from nodes/ServerlessInferenceNode/TextDescription.ts rename to nodes/ServerlessInference/TextDescription.ts index a836c83..b738ed2 100644 --- a/nodes/ServerlessInferenceNode/TextDescription.ts +++ b/nodes/ServerlessInference/TextDescription.ts @@ -17,7 +17,7 @@ export const textOperations: INodeProperties[] = [ { name: 'Complete', value: 'complete', - action: 'Create a Text Completion', + action: 'Create a text completion', description: 'Create one or more completions for a given text', routing: { request: { @@ -37,8 +37,7 @@ const completeOperations: INodeProperties[] = [ displayName: 'Model', name: 'model', type: 'options', - description: - 'The model which will generate the completion. Learn more', + description: 'The model which will generate the completion. Learn more.', displayOptions: { show: { operation: ['complete'], @@ -84,7 +83,7 @@ const completeOperations: INodeProperties[] = [ property: 'model', }, }, - default: 'openai-gpt-oss-120b', + default: '', }, { displayName: 'Input Type', @@ -230,6 +229,69 @@ const sharedOperations: INodeProperties[] = [ }, }, options: [ + { + displayName: 'Frequency Penalty', + name: 'frequencyPenalty', + description: 'Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far.', + type: 'number', + default: undefined, + typeOptions: { + maxValue: 2, + minValue: -2, + numberPrecision: 2, + }, + routing: { + send: { + type: 'body', + property: 'frequency_penalty', + }, + }, + }, + { + displayName: 'Logit Bias', + name: 'logitBias', + description: 'Modify the likelihood of specified tokens appearing in the completion (JSON object mapping token IDs to bias values)', + type: 'string', + default: '', + placeholder: '{"50256": -100}', + routing: { + send: { + type: 'body', + property: 'logit_bias', + value: '={{$parameter.logitBias ? JSON.parse($parameter.logitBias) : undefined}}', + }, + }, + }, + { + displayName: 'Logprobs', + name: 'logprobs', + description: 'Whether to return log probabilities of the output tokens', + type: 'boolean', + default: false, + routing: { + send: { + type: 'body', + property: 'logprobs', + }, + }, + }, + { + displayName: 'Max Completion Tokens', + name: 'maxCompletionTokens', + description: + 'The maximum number of tokens that can be generated in the chat completion. This value can be used to control costs for text generated via API.', + type: 'number', + default: undefined, + typeOptions: { + minValue: 1, + }, + routing: { + send: { + type: 'body', + property: 'max_completion_tokens', + }, + }, + }, { displayName: 'Maximum Number of Tokens', name: 'maxTokens', @@ -254,53 +316,17 @@ const sharedOperations: INodeProperties[] = [ }, }, { - displayName: 'Max Completion Tokens', - name: 'maxCompletionTokens', - description: - 'The maximum number of tokens that can be generated in the chat completion. This value can be used to control costs for text generated via API.', - type: 'number', - default: undefined, - typeOptions: { - minValue: 1, - }, + displayName: 'Metadata', + name: 'metadata', + description: 'Developer-defined metadata to attach to the completion (JSON object)', + type: 'string', + default: '', + placeholder: '{"purpose": "testing"}', routing: { send: { type: 'body', - property: 'max_completion_tokens', - }, - }, - }, - { - displayName: 'Temperature', - name: 'temperature', - default: 0.7, - typeOptions: { maxValue: 2, minValue: 0, numberPrecision: 2 }, - description: - 'Controls randomness: Lowering results in less random completions. As the temperature approaches zero, the model will become deterministic and repetitive.', - type: 'number', - routing: { - send: { - type: 'body', - property: 'temperature', - }, - }, - }, - { - displayName: 'Top P', - name: 'topP', - description: - 'An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass.', - type: 'number', - default: undefined, - typeOptions: { - maxValue: 1, - minValue: 0, - numberPrecision: 3, - }, - routing: { - send: { - type: 'body', - property: 'top_p', + property: 'metadata', + value: '={{$parameter.metadata ? JSON.parse($parameter.metadata) : undefined}}', }, }, }, @@ -321,10 +347,43 @@ const sharedOperations: INodeProperties[] = [ }, }, }, + { + displayName: 'Presence Penalty', + name: 'presencePenalty', + description: 'Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far.', + type: 'number', + default: undefined, + typeOptions: { + maxValue: 2, + minValue: -2, + numberPrecision: 2, + }, + routing: { + send: { + type: 'body', + property: 'presence_penalty', + }, + }, + }, + { + displayName: 'Stop Sequences', + name: 'stop', + description: 'Up to 4 sequences where the API will stop generating further tokens', + type: 'string', + default: '', + placeholder: 'e.g. \\n, Human:, AI:', + routing: { + send: { + type: 'body', + property: 'stop', + value: '={{$parameter.stop ? $parameter.stop.split(",").map(s => s.trim()) : undefined}}', + }, + }, + }, { displayName: 'Stream', name: 'stream', - description: 'If set, partial message deltas will be sent, like in ChatGPT', + description: 'Whether partial message deltas will be sent, like in ChatGPT', type: 'boolean', default: false, routing: { @@ -349,7 +408,7 @@ const sharedOperations: INodeProperties[] = [ { displayName: 'Include Usage', name: 'includeUsage', - description: 'If set, an additional chunk will be streamed before the data: [DONE] message', + description: 'Whether to include an additional chunk before the data: [DONE] message', type: 'boolean', default: false, }, @@ -363,133 +422,71 @@ const sharedOperations: INodeProperties[] = [ }, }, { - displayName: 'Stop Sequences', - name: 'stop', - description: 'Up to 4 sequences where the API will stop generating further tokens', + displayName: 'Temperature', + name: 'temperature', + default: 0.7, + typeOptions: { maxValue: 2, minValue: 0, numberPrecision: 2 }, + description: + 'Controls randomness: Lowering results in less random completions. As the temperature approaches zero, the model will become deterministic and repetitive.', + type: 'number', + routing: { + send: { + type: 'body', + property: 'temperature', + }, + }, + }, + { + displayName: 'Tool Choice', + name: 'toolChoice', + description: 'Controls which (if any) tool is called by the model', + type: 'options', + options: [ + { + name: 'Auto', + value: 'auto', + description: 'The model can pick between generating a message or calling one or more tools', + }, + { + name: 'None', + value: 'none', + description: 'The model will not call any tool and instead generates a message', + }, + { + name: 'Required', + value: 'required', + description: 'The model must call one or more tools', + }, + { + name: 'Function', + value: 'function', + description: 'Specifies a particular tool via {"type": "function", "function": {"name": "my_function"}}', + }, + ], + default: 'auto', + routing: { + send: { + type: 'body', + property: 'tool_choice', + }, + }, + }, + { + displayName: 'Tool Choice Function Name', + name: 'toolChoiceFunctionName', + description: 'The name of the function to call when tool choice is set to function', type: 'string', default: '', - placeholder: 'e.g. \\n, Human:, AI:', - routing: { - send: { - type: 'body', - property: 'stop', - value: '={{$parameter.stop ? $parameter.stop.split(",").map(s => s.trim()) : undefined}}', - }, - }, - }, - { - displayName: 'Presence Penalty', - name: 'presencePenalty', - description: - 'Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far', - type: 'number', - default: undefined, - typeOptions: { - maxValue: 2, - minValue: -2, - numberPrecision: 2, - }, - routing: { - send: { - type: 'body', - property: 'presence_penalty', - }, - }, - }, - { - displayName: 'Frequency Penalty', - name: 'frequencyPenalty', - description: - 'Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far', - type: 'number', - default: undefined, - typeOptions: { - maxValue: 2, - minValue: -2, - numberPrecision: 2, - }, - routing: { - send: { - type: 'body', - property: 'frequency_penalty', - }, - }, - }, - { - displayName: 'Logprobs', - name: 'logprobs', - description: 'Whether to return log probabilities of the output tokens', - type: 'boolean', - default: false, - routing: { - send: { - type: 'body', - property: 'logprobs', - }, - }, - }, - { - displayName: 'Top Logprobs', - name: 'topLogprobs', - description: 'An integer between 0 and 20 specifying the number of most likely tokens to return at each token position', - type: 'number', - default: undefined, displayOptions: { show: { - logprobs: [true], + toolChoice: ['function'], }, }, - typeOptions: { - minValue: 0, - maxValue: 20, - }, routing: { send: { type: 'body', - property: 'top_logprobs', - }, - }, - }, - { - displayName: 'User Identifier', - name: 'user', - description: 'A unique identifier representing your end-user, which can help monitor and detect abuse', - type: 'string', - default: '', - routing: { - send: { - type: 'body', - property: 'user', - }, - }, - }, - { - displayName: 'Logit Bias', - name: 'logitBias', - description: 'Modify the likelihood of specified tokens appearing in the completion (JSON object mapping token IDs to bias values)', - type: 'string', - default: '', - placeholder: '{"50256": -100}', - routing: { - send: { - type: 'body', - property: 'logit_bias', - value: '={{$parameter.logitBias ? JSON.parse($parameter.logitBias) : undefined}}', - }, - }, - }, - { - displayName: 'Metadata', - name: 'metadata', - description: 'Developer-defined metadata to attach to the completion (JSON object)', - type: 'string', - default: '', - placeholder: '{"purpose": "testing"}', - routing: { - send: { - type: 'body', - property: 'metadata', - value: '={{$parameter.metadata ? JSON.parse($parameter.metadata) : undefined}}', + property: 'tool_choice', + value: '={{"type": "function", "function": {"name": $parameter.toolChoiceFunctionName}}}', }, }, }, @@ -553,56 +550,55 @@ const sharedOperations: INodeProperties[] = [ }, }, { - displayName: 'Tool Choice', - name: 'toolChoice', - description: 'Controls which (if any) tool is called by the model', - type: 'options', - options: [ - { - name: 'Auto', - value: 'auto', - description: 'The model can pick between generating a message or calling one or more tools', + displayName: 'Top Logprobs', + name: 'topLogprobs', + description: 'An integer between 0 and 20 specifying the number of most likely tokens to return at each token position', + type: 'number', + default: undefined, + displayOptions: { + show: { + logprobs: [true], }, - { - name: 'None', - value: 'none', - description: 'The model will not call any tool and instead generates a message', - }, - { - name: 'Required', - value: 'required', - description: 'The model must call one or more tools', - }, - { - name: 'Function', - value: 'function', - description: 'Specifies a particular tool via {"type": "function", "function": {"name": "my_function"}}', - }, - ], - default: 'auto', + }, + typeOptions: { + minValue: 0, + maxValue: 20, + }, routing: { send: { type: 'body', - property: 'tool_choice', + property: 'top_logprobs', }, }, }, { - displayName: 'Tool Choice Function Name', - name: 'toolChoiceFunctionName', - description: 'The name of the function to call when tool choice is set to function', - type: 'string', - default: '', - displayOptions: { - show: { - toolChoice: ['function'], - }, + displayName: 'Top P', + name: 'topP', + description: 'An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass', + type: 'number', + default: undefined, + typeOptions: { + maxValue: 1, + minValue: 0, + numberPrecision: 3, }, routing: { send: { type: 'body', - property: 'tool_choice', - value: '={{"type": "function", "function": {"name": $parameter.toolChoiceFunctionName}}}', + property: 'top_p', + }, + }, + }, + { + displayName: 'User Identifier', + name: 'user', + description: 'A unique identifier representing your end-user, which can help monitor and detect abuse', + type: 'string', + default: '', + routing: { + send: { + type: 'body', + property: 'user', }, }, }, diff --git a/package.json b/package.json index 1374717..50de728 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "n8n-node-digitalocean-gradient-serverless-inference", + "name": "@digitalocean/n8n-nodes-digitalocean-gradient-serverless-inference", "version": "1.0.0", "description": "This is an n8n community node for the DigitalOcean Gradientâ„¢ AI Platform Serverless Inference API", "keywords": [ @@ -13,7 +13,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/digitalocean-labs/n8n-node-gradient-serverless-inference.git" + "url": "git+https://github.com/digitalocean-labs/n8n-node-gradient-serverless-inference.git" }, "engines": { "node": ">=20.15" @@ -49,5 +49,325 @@ }, "peerDependencies": { "n8n-workflow": "*" + }, + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "ajv": "^6.12.6", + "ansi-regex": "^5.0.1", + "ansi-styles": "^4.3.0", + "anymatch": "^3.1.3", + "argparse": "^2.0.1", + "array-each": "^1.0.1", + "array-slice": "^1.1.0", + "array-union": "^2.1.0", + "assert": "^2.1.0", + "ast-types": "^0.15.2", + "async-done": "^2.0.0", + "async-settle": "^2.0.0", + "asynckit": "^0.4.0", + "available-typed-arrays": "^1.0.7", + "axios": "^1.8.2", + "b4a": "^1.6.7", + "bach": "^2.0.1", + "balanced-match": "^1.0.2", + "bare-events": "^2.6.1", + "base64-js": "^1.5.1", + "binary-extensions": "^2.3.0", + "bl": "^5.1.0", + "brace-expansion": "^2.0.2", + "braces": "^3.0.3", + "buffer": "^6.0.3", + "call-bind": "^1.0.8", + "call-bind-apply-helpers": "^1.0.2", + "call-bound": "^1.0.4", + "callsites": "^3.1.0", + "camel-case": "^4.1.2", + "chalk": "^4.1.2", + "charenc": "^0.0.2", + "chokidar": "^3.6.0", + "cliui": "^7.0.4", + "clone": "^2.1.2", + "color-convert": "^2.0.1", + "color-name": "^1.1.4", + "combined-stream": "^1.0.8", + "concat-map": "^0.0.1", + "convert-source-map": "^2.0.0", + "copy-props": "^4.0.0", + "cross-spawn": "^7.0.6", + "crypt": "^0.0.2", + "debug": "^4.4.1", + "deep-equal": "^2.2.0", + "deep-is": "^0.1.4", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "delayed-stream": "^1.0.0", + "detect-file": "^1.0.0", + "dir-glob": "^3.0.1", + "doctrine": "^3.0.0", + "dunder-proto": "^1.0.1", + "each-props": "^3.0.0", + "emoji-regex": "^8.0.0", + "end-of-stream": "^1.4.5", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-get-iterator": "^1.1.3", + "es-object-atoms": "^1.1.1", + "escalade": "^3.2.0", + "escape-string-regexp": "^4.0.0", + "eslint-config-riot": "^1.0.0", + "eslint-plugin-local": "^1.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^4.2.1", + "espree": "^9.6.1", + "esprima": "^4.0.1", + "esprima-next": "^5.8.4", + "esquery": "^1.6.0", + "esrecurse": "^4.3.0", + "estraverse": "^5.3.0", + "esutils": "^2.0.3", + "expand-tilde": "^2.0.2", + "extend": "^3.0.2", + "fast-deep-equal": "^3.1.3", + "fast-fifo": "^1.3.2", + "fast-glob": "^3.3.3", + "fast-json-stable-stringify": "^2.1.0", + "fast-levenshtein": "^2.0.6", + "fastest-levenshtein": "^1.0.16", + "fastq": "^1.19.1", + "file-entry-cache": "^6.0.1", + "fill-range": "^7.1.1", + "find-up": "^5.0.0", + "findup-sync": "^5.0.0", + "fined": "^2.0.0", + "flagged-respawn": "^2.0.0", + "flat-cache": "^3.2.0", + "flatted": "^3.3.3", + "follow-redirects": "^1.15.11", + "for-each": "^0.3.5", + "for-in": "^1.0.2", + "for-own": "^1.0.0", + "form-data": "^4.0.0", + "fs-mkdirp-stream": "^2.0.1", + "fs.realpath": "^1.0.0", + "function-bind": "^1.1.2", + "functions-have-names": "^1.2.3", + "get-caller-file": "^2.0.5", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "glob": "^7.2.3", + "glob-parent": "^6.0.2", + "glob-stream": "^8.0.3", + "glob-watcher": "^6.0.0", + "global-modules": "^1.0.0", + "global-prefix": "^1.0.2", + "globals": "^13.24.0", + "globby": "^11.1.0", + "glogg": "^2.2.0", + "gopd": "^1.2.0", + "graceful-fs": "^4.2.11", + "graphemer": "^1.4.0", + "gulp-cli": "^3.1.0", + "gulplog": "^2.2.0", + "has-bigints": "^1.1.0", + "has-flag": "^4.0.0", + "has-property-descriptors": "^1.0.2", + "has-symbols": "^1.1.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2", + "homedir-polyfill": "^1.0.3", + "iconv-lite": "^0.6.3", + "ieee754": "^1.2.1", + "ignore": "^5.3.2", + "import-fresh": "^3.3.1", + "imurmurhash": "^0.1.4", + "indefinite": "^2.5.2", + "inflight": "^1.0.6", + "inherits": "^2.0.4", + "ini": "^1.3.8", + "internal-slot": "^1.1.0", + "interpret": "^3.1.1", + "is-absolute": "^1.0.0", + "is-arguments": "^1.2.0", + "is-array-buffer": "^3.0.5", + "is-bigint": "^1.1.0", + "is-binary-path": "^2.1.0", + "is-boolean-object": "^1.2.2", + "is-buffer": "^1.1.6", + "is-callable": "^1.2.7", + "is-core-module": "^2.16.1", + "is-date-object": "^1.1.0", + "is-extglob": "^2.1.1", + "is-fullwidth-code-point": "^3.0.0", + "is-generator-function": "^1.1.0", + "is-glob": "^4.0.3", + "is-map": "^2.0.3", + "is-nan": "^1.3.2", + "is-negated-glob": "^1.0.0", + "is-number": "^7.0.0", + "is-number-object": "^1.1.1", + "is-path-inside": "^3.0.3", + "is-plain-object": "^5.0.0", + "is-regex": "^1.2.1", + "is-relative": "^1.0.0", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-unc-path": "^1.0.0", + "is-valid-glob": "^1.0.0", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.4", + "is-windows": "^1.0.2", + "isarray": "^2.0.5", + "isexe": "^2.0.0", + "isobject": "^3.0.1", + "jmespath": "^0.16.0", + "js-base64": "^3.7.2", + "js-yaml": "^4.1.0", + "json-buffer": "^3.0.1", + "json-schema-traverse": "^0.4.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "jssha": "^3.3.1", + "keyv": "^4.5.4", + "last-run": "^2.0.0", + "lead": "^4.0.0", + "levn": "^0.4.1", + "liftoff": "^5.0.1", + "locate-path": "^6.0.0", + "lodash": "^4.17.21", + "lodash.merge": "^4.6.2", + "lower-case": "^2.0.2", + "luxon": "^3.4.4", + "map-cache": "^0.2.2", + "math-intrinsics": "^1.1.0", + "md5": "^2.3.0", + "merge2": "^1.4.1", + "micromatch": "^4.0.8", + "mime-db": "^1.52.0", + "mime-types": "^2.1.35", + "minimatch": "^9.0.5", + "ms": "^2.1.3", + "mute-stdout": "^2.0.0", + "n8n-workflow": "^1.82.0", + "natural-compare": "^1.4.0", + "no-case": "^3.0.4", + "normalize-path": "^3.0.0", + "now-and-later": "^3.0.0", + "object-inspect": "^1.13.4", + "object-is": "^1.1.6", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "object.defaults": "^1.1.0", + "object.pick": "^1.3.0", + "once": "^1.4.0", + "optionator": "^0.9.4", + "p-limit": "^3.1.0", + "p-locate": "^5.0.0", + "parent-module": "^1.0.1", + "parse-filepath": "^1.0.2", + "parse-passwd": "^1.0.0", + "pascal-case": "^3.1.2", + "path-exists": "^4.0.0", + "path-is-absolute": "^1.0.1", + "path-key": "^3.1.1", + "path-parse": "^1.0.7", + "path-root": "^0.1.1", + "path-root-regex": "^0.1.2", + "path-type": "^4.0.0", + "picomatch": "^2.3.1", + "pluralize": "^8.0.0", + "possible-typed-array-names": "^1.1.0", + "prelude-ls": "^1.2.1", + "proxy-from-env": "^1.1.0", + "punycode": "^2.3.1", + "queue-microtask": "^1.2.3", + "readable-stream": "^3.6.2", + "readdirp": "^3.6.0", + "recast": "^0.21.5", + "rechoir": "^0.8.0", + "regexp.prototype.flags": "^1.5.4", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "replace-homedir": "^2.0.0", + "require-directory": "^2.1.1", + "resolve": "^1.22.10", + "resolve-dir": "^1.0.1", + "resolve-from": "^4.0.0", + "resolve-options": "^2.0.0", + "reusify": "^1.1.0", + "rimraf": "^3.0.2", + "run-parallel": "^1.2.0", + "safe-buffer": "^5.2.1", + "safe-regex-test": "^1.1.0", + "safer-buffer": "^2.1.2", + "sax": "^1.4.1", + "semver": "^7.7.2", + "semver-greatest-satisfied-range": "^2.0.0", + "sentence-case": "^3.0.4", + "set-function-length": "^1.2.2", + "set-function-name": "^2.0.2", + "shebang-command": "^2.0.0", + "shebang-regex": "^3.0.0", + "side-channel": "^1.1.0", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "sparkles": "^2.1.0", + "stop-iteration-iterator": "^1.1.0", + "stream-composer": "^1.0.2", + "stream-exhaust": "^1.0.2", + "streamx": "^2.22.1", + "string-width": "^4.2.3", + "string_decoder": "^1.3.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.1", + "supports-color": "^7.2.0", + "supports-preserve-symlinks-flag": "^1.0.0", + "sver": "^1.8.4", + "teex": "^1.0.1", + "text-decoder": "^1.2.3", + "text-table": "^0.2.0", + "title-case": "^3.0.3", + "to-regex-range": "^5.0.1", + "to-through": "^3.0.0", + "transliteration": "^2.3.5", + "ts-api-utils": "^2.1.0", + "tslib": "^2.8.1", + "type-check": "^0.4.0", + "type-fest": "^0.20.2", + "unc-path-regex": "^0.1.2", + "undertaker": "^2.0.0", + "undertaker-registry": "^2.0.0", + "upper-case-first": "^2.0.2", + "uri-js": "^4.4.1", + "util": "^0.12.5", + "util-deprecate": "^1.0.2", + "v8flags": "^4.0.1", + "value-or-function": "^4.0.0", + "vinyl": "^3.0.1", + "vinyl-contents": "^2.0.0", + "vinyl-fs": "^4.0.2", + "vinyl-sourcemap": "^2.0.0", + "which": "^2.0.2", + "which-boxed-primitive": "^1.1.1", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.19", + "word-wrap": "^1.2.5", + "wrap-ansi": "^7.0.0", + "wrappy": "^1.0.2", + "xml2js": "^0.6.2", + "xmlbuilder": "^11.0.1", + "y18n": "^5.0.8", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yocto-queue": "^0.1.0", + "zod": "^3.24.1" + }, + "bugs": { + "url": "https://github.com/digitalocean-labs/n8n-node-gradient-serverless-inference/issues" } -} \ No newline at end of file +}