n8n-nodes-straico-official
Version:
Official Straico node for n8n
1,203 lines (1,202 loc) • 122 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.StraicoOfficial = void 0;
const n8n_workflow_1 = require("n8n-workflow");
class StraicoOfficial {
constructor() {
this.description = {
displayName: 'Straico Official',
name: 'straicoOfficial',
icon: 'file:straico.svg',
group: ['transform'],
version: [1, 2],
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
description: 'Get data from Straico API',
defaults: {
name: 'Straico Official',
},
inputs: ['main'],
outputs: ['main'],
credentials: [
{
name: 'straicoApi',
required: true,
},
],
requestDefaults: {
baseURL: 'https://api.straico.com',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
},
properties: [
{
displayName: 'Resource',
name: 'resource',
type: 'options',
noDataExpression: true,
options: [
{
name: 'Agent',
value: 'agent',
},
{
name: 'Chat',
value: 'chat',
},
{
name: 'File',
value: 'file',
},
{
name: 'Image',
value: 'image',
},
{
name: 'Model',
value: 'models',
},
{
name: 'Prompt',
value: 'prompt',
},
{
name: 'RAG',
value: 'rag',
},
{
name: 'TTS',
value: 'tts',
},
{
name: 'User',
value: 'user',
},
{
name: 'Video',
value: 'video',
},
],
default: 'prompt',
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['user'],
},
},
options: [
{
name: 'Get Info',
value: 'get',
action: 'Get user information',
routing: {
request: {
method: 'GET',
url: '/v0/user',
},
},
},
],
default: 'get',
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['models'],
},
},
options: [
{
name: 'Get Many',
value: 'getAll',
action: 'Get all models information v1',
routing: {
request: {
method: 'GET',
url: '/v1/models',
},
},
},
{
name: 'Get All Models v2',
value: 'getAllModelsInfo',
action: 'Get all models information v2',
},
{
name: 'Get Specific Model v2',
value: 'getSpecificModel',
action: 'Get specific model information v2',
},
],
default: 'getAll',
},
{
displayName: 'Model ID',
name: 'modelId',
type: 'string',
default: '',
required: true,
description: 'The ID of the specific model to get information for (e.g., openai/gpt-4, meta-llama/llama-3.1-8b)',
placeholder: 'openai/gpt-4.1',
displayOptions: {
show: {
resource: ['models'],
operation: ['getSpecificModel'],
},
},
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['prompt'],
},
},
options: [
{
name: 'Completion',
value: 'completion',
action: 'Create a completion',
routing: {
request: {
method: 'POST',
url: '/v1/prompt/completion',
},
},
},
],
default: 'completion',
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['chat'],
},
},
options: [
{
name: 'Completion V2',
value: 'completionV2',
action: 'Create a chat completion',
routing: {
request: {
method: 'POST',
url: '/v2/chat/completions',
},
},
},
],
default: 'completionV2',
},
{
displayName: 'Model Names or IDs',
name: 'models',
type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
hint: 'Select one or more models for completion. Leave empty to use smart LLM selector.',
typeOptions: {
loadOptionsMethod: 'getModels',
},
default: [],
displayOptions: {
show: {
resource: ['prompt'],
operation: ['completion'],
},
},
routing: {
request: {
body: {
models: '={{ $value }}',
},
},
},
},
{
displayName: 'Message',
name: 'message',
type: 'string',
typeOptions: {
rows: 4,
},
default: '',
required: true,
displayOptions: {
show: {
resource: ['prompt'],
operation: ['completion'],
},
},
routing: {
request: {
body: {
message: '={{ $value }}',
},
},
},
},
{
displayName: 'Smart LLM Selector',
name: 'smart_llm_selector',
type: 'collection',
placeholder: 'Add Selector',
default: {},
displayOptions: {
show: {
resource: ['prompt'],
operation: ['completion'],
'@version': [1, 2],
},
},
options: [
{
displayName: 'Quantity',
name: 'quantity',
type: 'number',
default: 1,
description: 'Number of models to select (1-4)',
typeOptions: {
minValue: 1,
maxValue: 4,
},
},
{
displayName: 'Pricing Method',
name: 'pricing_method',
type: 'options',
options: [
{ name: 'Quality', value: 'quality' },
{ name: 'Balance', value: 'balance' },
{ name: 'Budget', value: 'budget' },
],
default: 'balance',
description: 'Pricing strategy for model selection',
},
],
},
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['prompt'],
operation: ['completion'],
},
},
options: [
{
displayName: 'Display Transcripts',
name: 'display_transcripts',
type: 'boolean',
default: false,
description: 'Whether to return transcripts of the files',
},
{
displayName: 'File URLs',
name: 'file_urls',
type: 'string',
default: '',
hint: 'e.g. https://example.com/file1.pdf,https://example.com/file2.docx',
description: 'Comma-separated list of file URLs to analyze (up to 4, previously uploaded via the File Upload endpoint)',
},
{
displayName: 'Images',
name: 'images',
type: 'string',
default: '',
hint: 'e.g. https://example.com/image1.jpg,https://example.com/image2.png',
description: 'Comma-separated list of image URLs',
},
{
displayName: 'Max Tokens',
name: 'max_tokens',
type: 'number',
default: 100,
description: 'Maximum tokens to generate',
typeOptions: {
minValue: 1,
maxValue: 2048,
},
},
{
displayName: 'Replace Failed Models',
name: 'replace_failed_models',
type: 'boolean',
default: false,
description: 'Whether to replace failed models with similar ones if available',
},
{
displayName: 'Temperature',
name: 'temperature',
type: 'number',
default: 0.7,
description: 'Controls creativity and diversity of generated text (0-2)',
typeOptions: {
minValue: 0,
maxValue: 2,
},
},
{
displayName: 'YouTube URLs',
name: 'youtube_urls',
type: 'string',
default: '',
hint: 'e.g. https://youtube.com/watch?v=abc123,https://youtube.com/watch?v=def456',
description: 'Comma-separated list of YouTube video URLs to analyze (up to 4)',
},
],
},
{
displayName: 'Simplify',
name: 'simplify',
type: 'boolean',
default: false,
description: 'Whether to return a simplified version of the response instead of the raw data',
displayOptions: {
show: {
resource: ['prompt'],
operation: ['completion'],
},
},
},
{
displayName: 'Model Names or IDs',
name: 'models',
type: 'multiOptions',
description: 'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
hint: 'Select one model for chat completion. Leave empty to use smart LLM selector.',
typeOptions: {
loadOptionsMethod: 'getModels',
},
default: [],
displayOptions: {
show: {
resource: ['chat'],
operation: ['completionV2'],
},
},
},
{
displayName: 'Previous Messages',
name: 'previousMessages',
type: 'json',
default: '',
description: 'Messages from previous chat completion (drag and drop from previous node output). Should be an array of message objects.',
hint: 'Designed for drag and drop the full_current_chat field from previous completions outputs.',
placeholder: '[{"role": "user", "content": "Hello"}, {"role": "assistant", "content": "Hi!"}]',
displayOptions: {
show: {
resource: ['chat'],
operation: ['completionV2'],
},
},
},
{
displayName: 'New Messages',
name: 'messages',
type: 'fixedCollection',
default: { message: [{ role: 'user', content: [{ type: 'text', text: '' }] }] },
required: false,
description: 'New messages to add to the chat completion (will be appended after previous messages)',
displayOptions: {
show: {
resource: ['chat'],
operation: ['completionV2'],
},
},
typeOptions: {
multipleValues: true,
},
options: [
{
name: 'message',
displayName: 'Message',
values: [
{
displayName: 'Role',
name: 'role',
type: 'options',
options: [
{
name: 'User',
value: 'user',
},
{
name: 'Assistant',
value: 'assistant',
},
],
default: 'user',
description: 'The role of the message sender',
},
{
displayName: 'Content',
name: 'content',
type: 'fixedCollection',
default: { item: [{ type: 'text', text: '' }] },
required: true,
description: 'The content of the message',
typeOptions: {
multipleValues: true,
},
options: [
{
name: 'item',
displayName: 'Content Item',
values: [
{
displayName: 'Type',
name: 'type',
type: 'options',
options: [
{
name: 'Text',
value: 'text',
},
{
name: 'Image URL',
value: 'image_url',
},
],
default: 'text',
description: 'The type of content',
},
{
displayName: 'Text',
name: 'text',
type: 'string',
default: '',
description: 'The text content',
displayOptions: {
show: {
type: ['text'],
},
},
},
{
displayName: 'Image URL',
name: 'image_url',
type: 'string',
default: '',
description: 'The URL of the image',
displayOptions: {
show: {
type: ['image_url'],
},
},
},
],
},
],
},
],
},
],
routing: {
request: {
body: {
messages: '={{ $value.message }}',
},
},
},
},
{
displayName: 'Smart LLM Selector',
name: 'smart_llm_selector',
type: 'collection',
placeholder: 'Add Selector',
default: {},
displayOptions: {
show: {
resource: ['chat'],
operation: ['completionV2'],
'@version': [1, 2],
},
},
options: [
{
displayName: 'Pricing Method',
name: 'pricing_method',
type: 'options',
options: [
{ name: 'Quality', value: 'quality' },
{ name: 'Balance', value: 'balance' },
{ name: 'Budget', value: 'budget' },
],
default: 'balance',
description: 'Pricing strategy for model selection',
},
],
},
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['chat'],
operation: ['completionV2'],
},
},
options: [
{
displayName: 'Temperature',
name: 'temperature',
type: 'number',
default: 0.7,
description: 'Controls creativity and diversity of generated text (0-2)',
typeOptions: {
minValue: 0,
maxValue: 2,
},
},
{
displayName: 'Max Tokens',
name: 'max_tokens',
type: 'number',
default: 100,
description: 'Maximum tokens to generate',
typeOptions: {
minValue: 1,
maxValue: 2048,
},
},
{
displayName: 'Replace Failed Models',
name: 'replace_failed_models',
type: 'boolean',
default: false,
description: 'Whether to replace failed models with similar ones if available',
},
],
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['image'],
},
},
options: [
{
name: 'Generate Image',
value: 'generate',
action: 'Generate an image v0',
routing: {
request: {
method: 'POST',
url: '/v0/image/generation',
},
},
},
{
name: 'Generate Image V1',
value: 'generateV1',
action: 'Generate an image v1',
routing: {
request: {
method: 'POST',
url: '/v1/image/generation',
},
},
},
],
default: 'generate',
},
{
displayName: 'Model',
name: 'model',
type: 'string',
default: 'openai/dall-e-3',
required: true,
displayOptions: {
show: {
resource: ['image'],
operation: ['generate'],
},
},
routing: {
request: {
body: {
model: '={{ $value }}',
},
},
},
},
{
displayName: 'Description',
name: 'description',
type: 'string',
typeOptions: {
rows: 3,
},
default: '',
required: true,
displayOptions: {
show: {
resource: ['image'],
operation: ['generate'],
},
},
routing: {
request: {
body: {
description: '={{ $value }}',
},
},
},
},
{
displayName: 'Size',
name: 'size',
type: 'options',
options: [
{
name: 'Square',
value: 'square',
},
{
name: 'Landscape',
value: 'landscape',
},
{
name: 'Portrait',
value: 'portrait',
},
],
default: 'landscape',
required: true,
displayOptions: {
show: {
resource: ['image'],
operation: ['generate'],
},
},
routing: {
request: {
body: {
size: '={{ $value }}',
},
},
},
},
{
displayName: 'Variations',
name: 'variations',
type: 'number',
typeOptions: {
minValue: 1,
maxValue: 4,
},
default: 1,
required: true,
displayOptions: {
show: {
resource: ['image'],
operation: ['generate'],
},
},
routing: {
request: {
body: {
variations: '={{ $value }}',
},
},
},
},
{
displayName: 'Seed',
name: 'seed',
type: 'number',
default: null,
description: 'Seed for reproducibility (only for flux and ideogram models)',
typeOptions: {
minValue: 0,
maxValue: 2147483647,
},
displayOptions: {
show: {
resource: ['image'],
operation: ['generate'],
},
},
},
{
displayName: 'Enhance Prompt',
name: 'enhance',
type: 'boolean',
default: false,
description: 'Whether to use AI to enhance the original prompt',
displayOptions: {
show: {
resource: ['image'],
operation: ['generate'],
},
},
},
{
displayName: 'Custom Enhancer',
name: 'customEnhancer',
type: 'string',
default: '',
description: 'Custom instructions for the AI to enhance the prompt',
displayOptions: {
show: {
resource: ['image'],
operation: ['generate'],
enhance: [true],
},
},
},
{
displayName: 'Model',
name: 'model',
type: 'options',
description: 'Choose from the list, or specify ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
typeOptions: {
loadOptionsMethod: 'getImageModels',
},
default: '',
required: true,
displayOptions: {
show: {
resource: ['image'],
operation: ['generateV1'],
},
},
routing: {
request: {
body: {
model: '={{ $value }}',
},
},
},
},
{
displayName: 'Description',
name: 'description',
type: 'string',
typeOptions: {
rows: 4,
},
default: '',
required: true,
description: 'A detailed textual description of the image to be generated',
displayOptions: {
show: {
resource: ['image'],
operation: ['generateV1'],
},
},
routing: {
request: {
body: {
description: '={{ $value }}',
},
},
},
},
{
displayName: 'Size',
name: 'size',
type: 'options',
options: [
{
name: 'Square',
value: 'square',
},
{
name: 'Square HD',
value: 'square_hd',
},
{
name: 'Landscape',
value: 'landscape',
},
{
name: 'Portrait',
value: 'portrait',
},
],
default: 'square',
required: true,
description: 'The desired image dimensions. Square HD is only available for fal-ai/bytedance/seedream/v4/edit model',
displayOptions: {
show: {
resource: ['image'],
operation: ['generateV1'],
},
},
routing: {
request: {
body: {
size: '={{ $value }}',
},
},
},
},
{
displayName: 'Variations',
name: 'variations',
type: 'number',
typeOptions: {
minValue: 1,
maxValue: 4,
},
default: 1,
required: true,
description: 'Number of images to generate. Minimum: 1, Maximum: 4',
displayOptions: {
show: {
resource: ['image'],
operation: ['generateV1'],
},
},
routing: {
request: {
body: {
variations: '={{ $value }}',
},
},
},
},
{
displayName: 'Image URLs',
name: 'image_urls',
type: 'string',
typeOptions: {
multipleValues: true,
multipleValueButtonText: 'Add Image URL',
},
default: [],
description: 'An array of image URLs that will be used as context. Applies to fal-ai/nano-banana-edit and fal-ai/bytedance/seedream/v4/edit models',
displayOptions: {
show: {
resource: ['image'],
operation: ['generateV1'],
model: ['fal-ai/nano-banana-edit', 'fal-ai/bytedance/seedream/v4/edit'],
},
},
routing: {
request: {
body: {
image_urls: '={{ $value }}',
},
},
},
},
{
displayName: 'Image URL',
name: 'image_url',
type: 'string',
default: '',
description: 'String with the image URL to be used as context or edition base. Applies to fal-ai/ideogram/v3/replace-background and fal-ai/flux-pro/kontext models',
displayOptions: {
show: {
resource: ['image'],
operation: ['generateV1'],
model: ['fal-ai/ideogram/v3/replace-background', 'fal-ai/flux-pro/kontext'],
},
},
routing: {
request: {
body: {
image_url: '={{ $value }}',
},
},
},
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['video'],
},
},
options: [
{
name: 'Generate Video',
value: 'generate',
action: 'Generate a video from image',
routing: {
request: {
method: 'POST',
url: '/v1/image/tovideo',
},
},
},
],
default: 'generate',
},
{
displayName: 'Model',
name: 'model',
type: 'options',
description: 'Choose from the list, or specify ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
typeOptions: {
loadOptionsMethod: 'getVideoModels',
},
default: '',
required: true,
displayOptions: {
show: {
resource: ['video'],
operation: ['generate'],
},
},
routing: {
request: {
body: {
model: '={{ $value }}',
},
},
},
},
{
displayName: 'Description',
name: 'description',
type: 'string',
typeOptions: {
rows: 3,
},
default: '',
required: true,
description: 'A detailed textual description of the video to be generated',
displayOptions: {
show: {
resource: ['video'],
operation: ['generate'],
},
},
routing: {
request: {
body: {
description: '={{ $value }}',
},
},
},
},
{
displayName: 'Size',
name: 'size',
type: 'options',
options: [
{
name: 'Square',
value: 'square',
},
{
name: 'Landscape',
value: 'landscape',
},
{
name: 'Portrait',
value: 'portrait',
},
],
default: 'landscape',
required: true,
description: 'The desired video dimensions',
displayOptions: {
show: {
resource: ['video'],
operation: ['generate'],
},
},
routing: {
request: {
body: {
size: '={{ $value }}',
},
},
},
},
{
displayName: 'Duration',
name: 'duration',
type: 'number',
typeOptions: {
minValue: 1,
maxValue: 60,
},
default: 5,
required: true,
description: 'The duration in seconds of the video. Usually, 5 is a valid value, but the valid durations depend on the model',
displayOptions: {
show: {
resource: ['video'],
operation: ['generate'],
},
},
routing: {
request: {
body: {
duration: '={{ $value }}',
},
},
},
},
{
displayName: 'Image URL',
name: 'image_url',
type: 'string',
default: '',
required: true,
description: 'The URL of the image to be taken as basis of the output video',
placeholder: 'https://example.com/image.jpg',
displayOptions: {
show: {
resource: ['video'],
operation: ['generate'],
},
},
routing: {
request: {
body: {
image_url: '={{ $value }}',
},
},
},
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['tts'],
},
},
options: [
{
name: 'Create',
value: 'create',
action: 'Convert text to speech',
routing: {
request: {
method: 'POST',
url: '/v1/tts/create',
},
},
},
],
default: 'create',
},
{
displayName: 'Model',
name: 'model',
type: 'options',
options: [
{
name: 'Eleven Multilingual V2',
value: 'eleven_multilingual_v2',
},
{
name: 'TTS-1',
value: 'tts-1',
},
],
default: 'tts-1',
required: true,
description: 'Specifies the model to use for the TTS conversion',
displayOptions: {
show: {
resource: ['tts'],
operation: ['create'],
},
},
routing: {
request: {
body: {
model: '={{ $value }}',
},
},
},
},
{
displayName: 'Text',
name: 'text',
type: 'string',
typeOptions: {
rows: 4,
},
default: '',
required: true,
description: 'The actual text content that you want to convert into speech (Up to 4,000 characters)',
displayOptions: {
show: {
resource: ['tts'],
operation: ['create'],
},
},
routing: {
request: {
body: {
text: '={{ $value }}',
},
},
},
},
{
displayName: 'Voice',
name: 'voice_id',
type: 'options',
options: [
{
name: 'Alloy',
value: 'alloy',
},
{
name: 'Echo',
value: 'echo',
},
{
name: 'Fable',
value: 'fable',
},
{
name: 'Onyx',
value: 'onyx',
},
{
name: 'Nova',
value: 'nova',
},
{
name: 'Shimmer',
value: 'shimmer',
},
],
default: 'alloy',
required: true,
description: 'Voice to use for TTS-1 model',
displayOptions: {