mirror of
https://github.com/n8n-io/n8n.git
synced 2025-03-05 20:50:17 -08:00
Merge d99bd2fedc
into 8790a0df3d
This commit is contained in:
commit
31ffd0fee9
59
packages/nodes-base/credentials/PerplexityApi.credentials.ts
Normal file
59
packages/nodes-base/credentials/PerplexityApi.credentials.ts
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
import type {
|
||||||
|
IAuthenticateGeneric,
|
||||||
|
ICredentialTestRequest,
|
||||||
|
ICredentialType,
|
||||||
|
INodeProperties,
|
||||||
|
} from 'n8n-workflow';
|
||||||
|
|
||||||
|
export class PerplexityApi implements ICredentialType {
|
||||||
|
name = 'perplexityApi';
|
||||||
|
|
||||||
|
displayName = 'Perplexity API';
|
||||||
|
|
||||||
|
documentationUrl = 'https://docs.perplexity.ai/api-reference/chat-completions';
|
||||||
|
|
||||||
|
properties: INodeProperties[] = [
|
||||||
|
{
|
||||||
|
displayName: 'API Key',
|
||||||
|
name: 'apiKey',
|
||||||
|
type: 'string',
|
||||||
|
typeOptions: { password: true },
|
||||||
|
required: true,
|
||||||
|
default: '',
|
||||||
|
description: 'Your Perplexity API key. Get it from your Perplexity account.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Base URL',
|
||||||
|
name: 'baseUrl',
|
||||||
|
type: 'string',
|
||||||
|
default: 'https://api.perplexity.ai',
|
||||||
|
description: 'The base URL for the Perplexity API. Defaults to "https://api.perplexity.ai".',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
authenticate: IAuthenticateGeneric = {
|
||||||
|
type: 'generic',
|
||||||
|
properties: {
|
||||||
|
headers: {
|
||||||
|
Authorization: '=Bearer {{$credentials.apiKey}}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
test: ICredentialTestRequest = {
|
||||||
|
request: {
|
||||||
|
baseURL: '={{$credentials.baseUrl}}',
|
||||||
|
url: '/chat/completions',
|
||||||
|
method: 'POST',
|
||||||
|
body: {
|
||||||
|
model: 'r1-1776',
|
||||||
|
messages: [{ role: 'user', content: 'test' }],
|
||||||
|
},
|
||||||
|
headers: {
|
||||||
|
Authorization: '=Bearer {{$credentials.apiKey}}',
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
json: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,340 @@
|
||||||
|
import type { INodeProperties } from 'n8n-workflow';
|
||||||
|
|
||||||
|
import { sendErrorPostReceive } from './GenericFunctions';
|
||||||
|
|
||||||
|
export const chatCompletionsOperations: INodeProperties[] = [
|
||||||
|
{
|
||||||
|
displayName: 'Operation',
|
||||||
|
name: 'operation',
|
||||||
|
type: 'options',
|
||||||
|
noDataExpression: true,
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
resource: ['chat'],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: 'Message a Model',
|
||||||
|
value: 'complete',
|
||||||
|
action: 'Message a model',
|
||||||
|
description: 'Create one or more completions for a given text',
|
||||||
|
routing: {
|
||||||
|
request: {
|
||||||
|
method: 'POST',
|
||||||
|
url: '/chat/completions',
|
||||||
|
},
|
||||||
|
output: { postReceive: [sendErrorPostReceive] },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
default: 'complete',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export const chatCompletionsFields: INodeProperties[] = [
|
||||||
|
{
|
||||||
|
displayName: 'Model',
|
||||||
|
name: 'model',
|
||||||
|
type: 'resourceLocator',
|
||||||
|
default: { mode: 'list', value: '' },
|
||||||
|
required: true,
|
||||||
|
modes: [
|
||||||
|
{
|
||||||
|
displayName: 'From List',
|
||||||
|
name: 'list',
|
||||||
|
type: 'list',
|
||||||
|
typeOptions: {
|
||||||
|
searchListMethod: 'getModels',
|
||||||
|
searchable: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'By ID',
|
||||||
|
name: 'id',
|
||||||
|
type: 'string',
|
||||||
|
placeholder: 'e.g. sonar-deep-research',
|
||||||
|
validation: [
|
||||||
|
{
|
||||||
|
type: 'regex',
|
||||||
|
properties: {
|
||||||
|
regex: '^[a-zA-Z0-9-]+$',
|
||||||
|
errorMessage:
|
||||||
|
'Not a valid Perplexity model ID. Model IDs must contain only alphanumeric characters and hyphens.',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
description: 'The model which will generate the completion',
|
||||||
|
routing: {
|
||||||
|
send: {
|
||||||
|
type: 'body',
|
||||||
|
property: 'model',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Messages',
|
||||||
|
name: 'messages',
|
||||||
|
type: 'fixedCollection',
|
||||||
|
required: true,
|
||||||
|
typeOptions: {
|
||||||
|
multipleValues: true,
|
||||||
|
},
|
||||||
|
placeholder: 'Add Message',
|
||||||
|
default: {
|
||||||
|
message: [
|
||||||
|
{
|
||||||
|
role: 'user',
|
||||||
|
content: '',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
resource: ['chat'],
|
||||||
|
operation: ['complete'],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
displayName: 'Message',
|
||||||
|
name: 'message',
|
||||||
|
values: [
|
||||||
|
{
|
||||||
|
displayName: 'Text',
|
||||||
|
name: 'content',
|
||||||
|
required: true,
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
description: 'The content of the message to be sent',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Role',
|
||||||
|
name: 'role',
|
||||||
|
required: true,
|
||||||
|
type: 'options',
|
||||||
|
options: [
|
||||||
|
{ name: 'User', value: 'user' },
|
||||||
|
{ name: 'System', value: 'system' },
|
||||||
|
{ name: 'Assistant', value: 'assistant' },
|
||||||
|
],
|
||||||
|
default: 'user',
|
||||||
|
description:
|
||||||
|
"Role in shaping the model's response, it tells the model how it should behave and interact with the user",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
routing: {
|
||||||
|
send: {
|
||||||
|
type: 'body',
|
||||||
|
property: 'messages',
|
||||||
|
value: '={{ $value.message }}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Options',
|
||||||
|
name: 'options',
|
||||||
|
type: 'collection',
|
||||||
|
placeholder: 'Add Option',
|
||||||
|
default: {},
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
resource: ['chat'],
|
||||||
|
operation: ['complete'],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
displayName: 'Frequency Penalty',
|
||||||
|
name: 'frequency_penalty',
|
||||||
|
type: 'number',
|
||||||
|
default: 1,
|
||||||
|
typeOptions: {
|
||||||
|
minValue: 1,
|
||||||
|
},
|
||||||
|
description:
|
||||||
|
"Values greater than 1.0 penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim",
|
||||||
|
routing: {
|
||||||
|
send: {
|
||||||
|
type: 'body',
|
||||||
|
property: 'frequency_penalty',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Maximum Number of Tokens',
|
||||||
|
name: 'max_tokens',
|
||||||
|
type: 'number',
|
||||||
|
default: 0,
|
||||||
|
description:
|
||||||
|
'The maximum number of tokens to generate in the completion. The number of tokens requested plus the number of prompt tokens sent in messages must not exceed the context window token limit of model requested.',
|
||||||
|
routing: {
|
||||||
|
send: {
|
||||||
|
type: 'body',
|
||||||
|
property: 'max_tokens',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Presence Penalty',
|
||||||
|
name: 'presence_penalty',
|
||||||
|
type: 'number',
|
||||||
|
default: 0,
|
||||||
|
description:
|
||||||
|
"A value between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics. A value between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.",
|
||||||
|
typeOptions: {
|
||||||
|
minValue: -2.0,
|
||||||
|
maxValue: 2.0,
|
||||||
|
},
|
||||||
|
routing: {
|
||||||
|
send: {
|
||||||
|
type: 'body',
|
||||||
|
property: 'presence_penalty',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Search Recency Filter',
|
||||||
|
name: 'search_recency',
|
||||||
|
type: 'options',
|
||||||
|
options: [
|
||||||
|
{ name: 'Hour', value: 'hour' },
|
||||||
|
{ name: 'Day', value: 'day' },
|
||||||
|
{ name: 'Week', value: 'week' },
|
||||||
|
{ name: 'Month', value: 'month' },
|
||||||
|
],
|
||||||
|
default: 'month',
|
||||||
|
description: 'Returns search results within the specified time interval',
|
||||||
|
routing: {
|
||||||
|
send: {
|
||||||
|
type: 'body',
|
||||||
|
property: 'search_recency',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Output Randomness (Temperature)',
|
||||||
|
name: 'temperature',
|
||||||
|
type: 'number',
|
||||||
|
default: 0.2,
|
||||||
|
description:
|
||||||
|
'The amount of randomness in the response, valued between 0 inclusive and 2 exclusive. Higher values are more random, and lower values are more deterministic.',
|
||||||
|
typeOptions: {
|
||||||
|
minValue: 0,
|
||||||
|
maxValue: 2,
|
||||||
|
},
|
||||||
|
routing: {
|
||||||
|
send: {
|
||||||
|
type: 'body',
|
||||||
|
property: 'temperature',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Output Randomness (Top K)',
|
||||||
|
name: 'top_k',
|
||||||
|
type: 'number',
|
||||||
|
default: 0,
|
||||||
|
description:
|
||||||
|
'The number of tokens to keep for highest top-k filtering, specified as an integer between 0 and 2048 inclusive. If set to 0, top-k filtering is disabled. We recommend either altering Top K or Top P, but not both.',
|
||||||
|
typeOptions: {
|
||||||
|
minValue: 0,
|
||||||
|
maxValue: 2048,
|
||||||
|
},
|
||||||
|
routing: {
|
||||||
|
send: {
|
||||||
|
type: 'body',
|
||||||
|
property: 'top_k',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Output Randomness (Top P)',
|
||||||
|
name: 'top_p',
|
||||||
|
type: 'number',
|
||||||
|
default: 0.9,
|
||||||
|
description:
|
||||||
|
'The nucleus sampling threshold, valued between 0 and 1 inclusive. For each subsequent token, the model considers the results of the tokens with top_p probability mass. We recommend either altering top_k or top_p, but not both.',
|
||||||
|
typeOptions: {
|
||||||
|
minValue: 0,
|
||||||
|
maxValue: 1,
|
||||||
|
},
|
||||||
|
routing: {
|
||||||
|
send: {
|
||||||
|
type: 'body',
|
||||||
|
property: 'top_p',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Return Images',
|
||||||
|
name: 'return_images',
|
||||||
|
type: 'boolean',
|
||||||
|
default: false,
|
||||||
|
description:
|
||||||
|
'Whether determines or not a request to an online model should return images. Requires Perplexity API usage Tier-2.',
|
||||||
|
routing: {
|
||||||
|
send: {
|
||||||
|
type: 'body',
|
||||||
|
property: 'return_images',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Return Related Questions',
|
||||||
|
name: 'return_related_questions',
|
||||||
|
type: 'boolean',
|
||||||
|
default: false,
|
||||||
|
description:
|
||||||
|
'Whether determines or not a request to an online model should return related questions. Requires Perplexity API usage Tier-2.',
|
||||||
|
routing: {
|
||||||
|
send: {
|
||||||
|
type: 'body',
|
||||||
|
property: 'return_related_questions',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Search Domain Filter',
|
||||||
|
name: 'search_domain_filter',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
description:
|
||||||
|
'Limit the citations used by the online model to URLs from the specified domains. For blacklisting, add a - to the beginning of the domain string (e.g., -domain1). Currently limited to 3 domains. Requires Perplexity API usage Tier-3.',
|
||||||
|
placeholder: 'e.g. domain1,domain2,-domain3',
|
||||||
|
routing: {
|
||||||
|
send: {
|
||||||
|
type: 'body',
|
||||||
|
property: 'search_domain_filter',
|
||||||
|
value: '={{ $value.split(",").map(domain => domain.trim()) }}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Simplify Output',
|
||||||
|
name: 'simplifyOutput',
|
||||||
|
type: 'boolean',
|
||||||
|
default: false,
|
||||||
|
description: 'Whether to return only essential fields (ID, citations, message)',
|
||||||
|
routing: {
|
||||||
|
output: {
|
||||||
|
postReceive: [
|
||||||
|
{
|
||||||
|
type: 'set',
|
||||||
|
enabled: '={{$value}}',
|
||||||
|
properties: {
|
||||||
|
value:
|
||||||
|
'={{ { "id": $response.body?.id, "created": $response.body?.created, "citations": $response.body?.citations, "message": $response.body?.choices?.[0]?.message?.content } }}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
60
packages/nodes-base/nodes/Perplexity/GenericFunctions.ts
Normal file
60
packages/nodes-base/nodes/Perplexity/GenericFunctions.ts
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
import type {
|
||||||
|
IExecuteSingleFunctions,
|
||||||
|
ILoadOptionsFunctions,
|
||||||
|
IN8nHttpFullResponse,
|
||||||
|
INodeExecutionData,
|
||||||
|
INodeListSearchResult,
|
||||||
|
INodePropertyOptions,
|
||||||
|
JsonObject,
|
||||||
|
} from 'n8n-workflow';
|
||||||
|
import { NodeApiError } from 'n8n-workflow';
|
||||||
|
|
||||||
|
export async function sendErrorPostReceive(
|
||||||
|
this: IExecuteSingleFunctions,
|
||||||
|
data: INodeExecutionData[],
|
||||||
|
response: IN8nHttpFullResponse,
|
||||||
|
): Promise<INodeExecutionData[]> {
|
||||||
|
if (String(response.statusCode).startsWith('4') || String(response.statusCode).startsWith('5')) {
|
||||||
|
throw new NodeApiError(this.getNode(), response as unknown as JsonObject);
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
export async function getModels(
|
||||||
|
this: ILoadOptionsFunctions,
|
||||||
|
filter?: string,
|
||||||
|
): Promise<INodeListSearchResult> {
|
||||||
|
const models: INodePropertyOptions[] = [
|
||||||
|
{
|
||||||
|
name: 'Sonar Deep Research',
|
||||||
|
value: 'sonar-deep-research',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Sonar Reasoning Pro',
|
||||||
|
value: 'sonar-reasoning-pro',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Sonar Reasoning',
|
||||||
|
value: 'sonar-reasoning',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Sonar Pro',
|
||||||
|
value: 'sonar-pro',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Sonar',
|
||||||
|
value: 'sonar',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'R1-1776',
|
||||||
|
value: 'r1-1776',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const filteredModels = filter
|
||||||
|
? models.filter((model) => model.name.toLowerCase().includes(filter.toLowerCase()))
|
||||||
|
: models;
|
||||||
|
|
||||||
|
return {
|
||||||
|
results: filteredModels,
|
||||||
|
};
|
||||||
|
}
|
18
packages/nodes-base/nodes/Perplexity/Perplexity.node.json
Normal file
18
packages/nodes-base/nodes/Perplexity/Perplexity.node.json
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"node": "n8n-nodes-base.perplexity",
|
||||||
|
"nodeVersion": "1.0",
|
||||||
|
"codexVersion": "1.0",
|
||||||
|
"categories": ["Utility"],
|
||||||
|
"resources": {
|
||||||
|
"credentialDocumentation": [
|
||||||
|
{
|
||||||
|
"url": "https://docs.n8n.io/integrations/builtin/credentials/perplexity/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"primaryDocumentation": [
|
||||||
|
{
|
||||||
|
"url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-langchain.perplexity/"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
55
packages/nodes-base/nodes/Perplexity/Perplexity.node.ts
Normal file
55
packages/nodes-base/nodes/Perplexity/Perplexity.node.ts
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
import type { INodeType, INodeTypeDescription } from 'n8n-workflow';
|
||||||
|
import { NodeConnectionType } from 'n8n-workflow';
|
||||||
|
|
||||||
|
import { chatCompletionsFields, chatCompletionsOperations } from './ChatCompletionsDescription';
|
||||||
|
import { getModels } from './GenericFunctions';
|
||||||
|
|
||||||
|
export class Perplexity implements INodeType {
|
||||||
|
description: INodeTypeDescription = {
|
||||||
|
displayName: 'Perplexity',
|
||||||
|
name: 'perplexity',
|
||||||
|
icon: { light: 'file:perplexity.svg', dark: 'file:perplexity.dark.svg' },
|
||||||
|
group: ['transform'],
|
||||||
|
version: 1,
|
||||||
|
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
|
||||||
|
description: 'Interact with the Perplexity API to generate AI responses with citations.',
|
||||||
|
defaults: {
|
||||||
|
name: 'Perplexity',
|
||||||
|
},
|
||||||
|
inputs: [NodeConnectionType.Main],
|
||||||
|
outputs: [NodeConnectionType.Main],
|
||||||
|
credentials: [
|
||||||
|
{
|
||||||
|
name: 'perplexityApi',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
requestDefaults: {
|
||||||
|
baseURL: '={{ $credentials.baseUrl ?? "https://api.perplexity.ai" }}',
|
||||||
|
ignoreHttpStatusErrors: true,
|
||||||
|
},
|
||||||
|
properties: [
|
||||||
|
{
|
||||||
|
displayName: 'Resource',
|
||||||
|
name: 'resource',
|
||||||
|
type: 'hidden',
|
||||||
|
noDataExpression: true,
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: 'Chat',
|
||||||
|
value: 'chat',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
default: 'chat',
|
||||||
|
},
|
||||||
|
...chatCompletionsOperations,
|
||||||
|
...chatCompletionsFields,
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
methods = {
|
||||||
|
listSearch: {
|
||||||
|
getModels,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
35
packages/nodes-base/nodes/Perplexity/perplexity.svg
Normal file
35
packages/nodes-base/nodes/Perplexity/perplexity.svg
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
<?xml version="1.0" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
|
||||||
|
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||||
|
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="270.000000pt" height="270.000000pt" viewBox="0 0 270.000000 270.000000"
|
||||||
|
preserveAspectRatio="xMidYMid meet">
|
||||||
|
<metadata>
|
||||||
|
Created by potrace 1.14, written by Peter Selinger 2001-2017
|
||||||
|
</metadata>
|
||||||
|
<g transform="translate(0.000000,270.000000) scale(0.100000,-0.100000)"
|
||||||
|
fill="#000000" stroke="none">
|
||||||
|
<path d="M185 2691 c-86 -21 -158 -93 -175 -175 -7 -35 -10 -415 -8 -1196 3
|
||||||
|
-1276 -2 -1180 73 -1253 20 -20 54 -42 74 -49 53 -19 2349 -19 2402 0 20 7 54
|
||||||
|
29 74 49 75 73 70 -23 73 1253 2 817 -1 1161 -9 1200 -9 46 -19 63 -64 106
|
||||||
|
-42 41 -63 54 -104 63 -59 13 -2284 14 -2336 2z m786 -547 l314 -255 3 255 2
|
||||||
|
256 60 0 60 0 2 -255 3 -256 315 257 315 257 3 -292 2 -291 135 0 135 0 0
|
||||||
|
-450 0 -450 -135 0 -135 0 -2 -296 -3 -295 -312 275 c-172 152 -315 276 -318
|
||||||
|
276 -3 0 -5 -133 -5 -295 l0 -295 -60 0 -60 0 0 295 c0 162 -2 295 -5 295 -3
|
||||||
|
0 -146 -124 -318 -276 l-312 -276 -3 296 -2 296 -135 0 -135 0 0 450 0 450
|
||||||
|
135 0 135 0 0 290 c0 160 2 290 4 290 2 0 145 -115 317 -256z"/>
|
||||||
|
<path d="M780 1981 l0 -161 215 0 216 0 -203 151 c-112 84 -209 156 -215 162
|
||||||
|
-10 7 -13 -24 -13 -152z"/>
|
||||||
|
<path d="M1706 1982 l-210 -157 209 -3 c114 -1 210 -1 212 1 2 2 2 74 1 160
|
||||||
|
l-3 156 -209 -157z"/>
|
||||||
|
<path d="M510 1370 l0 -330 70 0 70 0 0 88 0 88 38 35 c20 20 146 127 280 239
|
||||||
|
133 111 242 204 242 206 0 2 -157 4 -350 4 l-350 0 0 -330z"/>
|
||||||
|
<path d="M1490 1696 c0 -2 126 -102 280 -223 l280 -218 0 -107 0 -108 70 0 70
|
||||||
|
0 0 330 0 330 -350 0 c-192 0 -350 -2 -350 -4z"/>
|
||||||
|
<path d="M1028 1392 l-247 -217 0 -283 c-1 -233 1 -282 12 -275 8 4 122 104
|
||||||
|
255 222 l242 214 0 278 c0 154 -3 279 -7 279 -5 0 -119 -98 -255 -218z"/>
|
||||||
|
<path d="M1410 1332 l0 -279 242 -214 c133 -118 247 -218 255 -222 11 -7 13
|
||||||
|
42 12 275 l0 283 -245 215 c-135 118 -249 217 -254 218 -6 2 -10 -101 -10
|
||||||
|
-276z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
|
@ -274,6 +274,7 @@
|
||||||
"dist/credentials/PagerDutyOAuth2Api.credentials.js",
|
"dist/credentials/PagerDutyOAuth2Api.credentials.js",
|
||||||
"dist/credentials/PayPalApi.credentials.js",
|
"dist/credentials/PayPalApi.credentials.js",
|
||||||
"dist/credentials/PeekalinkApi.credentials.js",
|
"dist/credentials/PeekalinkApi.credentials.js",
|
||||||
|
"dist/credentials/PerplexityApi.credentials.js",
|
||||||
"dist/credentials/PhantombusterApi.credentials.js",
|
"dist/credentials/PhantombusterApi.credentials.js",
|
||||||
"dist/credentials/PhilipsHueOAuth2Api.credentials.js",
|
"dist/credentials/PhilipsHueOAuth2Api.credentials.js",
|
||||||
"dist/credentials/PipedriveApi.credentials.js",
|
"dist/credentials/PipedriveApi.credentials.js",
|
||||||
|
@ -688,6 +689,7 @@
|
||||||
"dist/nodes/PayPal/PayPal.node.js",
|
"dist/nodes/PayPal/PayPal.node.js",
|
||||||
"dist/nodes/PayPal/PayPalTrigger.node.js",
|
"dist/nodes/PayPal/PayPalTrigger.node.js",
|
||||||
"dist/nodes/Peekalink/Peekalink.node.js",
|
"dist/nodes/Peekalink/Peekalink.node.js",
|
||||||
|
"dist/nodes/Perplexity/Perplexity.node.js",
|
||||||
"dist/nodes/Phantombuster/Phantombuster.node.js",
|
"dist/nodes/Phantombuster/Phantombuster.node.js",
|
||||||
"dist/nodes/PhilipsHue/PhilipsHue.node.js",
|
"dist/nodes/PhilipsHue/PhilipsHue.node.js",
|
||||||
"dist/nodes/Pipedrive/Pipedrive.node.js",
|
"dist/nodes/Pipedrive/Pipedrive.node.js",
|
||||||
|
|
Loading…
Reference in a new issue