UNPKG

@n8n/n8n-nodes-langchain

Version:

![Banner image](https://user-images.githubusercontent.com/10284570/173569848-c624317f-42b1-45a6-ab09-f0ea3c247648.png)

245 lines 8.75 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.description = void 0; exports.execute = execute; const n8n_workflow_1 = require("n8n-workflow"); const transport_1 = require("../../../transport"); const descriptions_1 = require("../descriptions"); const properties = [ (0, descriptions_1.modelRLC)('modelSearch'), { displayName: 'Name', name: 'name', type: 'string', default: '', description: 'The name of the assistant. The maximum length is 256 characters.', placeholder: 'e.g. My Assistant', required: true, }, { displayName: 'Description', name: 'description', type: 'string', default: '', description: 'The description of the assistant. The maximum length is 512 characters.', placeholder: 'e.g. My personal assistant', }, { displayName: 'Instructions', name: 'instructions', type: 'string', description: 'The system instructions that the assistant uses. The maximum length is 32768 characters.', default: '', typeOptions: { rows: 2, }, }, { displayName: 'Code Interpreter', name: 'codeInterpreter', type: 'boolean', default: false, description: 'Whether to enable the code interpreter that allows the assistants to write and run Python code in a sandboxed execution environment, find more <a href="https://platform.openai.com/docs/assistants/tools/code-interpreter" target="_blank">here</a>', }, { displayName: 'Knowledge Retrieval', name: 'knowledgeRetrieval', type: 'boolean', default: false, description: 'Whether to augments the assistant with knowledge from outside its model, such as proprietary product information or documents, find more <a href="https://platform.openai.com/docs/assistants/tools/knowledge-retrieval" target="_blank">here</a>', }, { displayName: 'Files', name: 'file_ids', type: 'multiOptions', description: 'The files to be used by the assistant, there can be a maximum of 20 files attached to the assistant. You can use expression to pass file IDs as an array or comma-separated string.', typeOptions: { loadOptionsMethod: 'getFiles', }, default: [], hint: "Add more files by using the 'Upload a File' operation", displayOptions: { show: { codeInterpreter: [true], }, hide: { knowledgeRetrieval: [true], }, }, }, { displayName: 'Files', name: 'file_ids', type: 'multiOptions', description: 'The files to be used by the assistant, there can be a maximum of 20 files attached to the assistant', typeOptions: { loadOptionsMethod: 'getFiles', }, default: [], hint: "Add more files by using the 'Upload a File' operation", displayOptions: { show: { knowledgeRetrieval: [true], }, hide: { codeInterpreter: [true], }, }, }, { displayName: 'Files', name: 'file_ids', type: 'multiOptions', description: 'The files to be used by the assistant, there can be a maximum of 20 files attached to the assistant', typeOptions: { loadOptionsMethod: 'getFiles', }, default: [], hint: "Add more files by using the 'Upload a File' operation", displayOptions: { show: { knowledgeRetrieval: [true], codeInterpreter: [true], }, }, }, { displayName: 'Add custom n8n tools when you <i>message</i> your assistant (rather than when creating it)', name: 'noticeTools', type: 'notice', default: '', }, { displayName: 'Options', name: 'options', placeholder: 'Add Option', type: 'collection', default: {}, options: [ { displayName: 'Output Randomness (Temperature)', name: 'temperature', default: 1, typeOptions: { maxValue: 1, minValue: 0, numberPrecision: 1 }, description: 'Controls randomness: Lowering results in less random completions. As the temperature approaches zero, the model will become deterministic and repetitive. We generally recommend altering this or temperature but not both.', type: 'number', }, { displayName: 'Output Randomness (Top P)', name: 'topP', default: 1, typeOptions: { maxValue: 1, minValue: 0, numberPrecision: 1 }, description: 'An alternative to sampling with temperature, controls diversity via nucleus sampling: 0.5 means half of all likelihood-weighted options are considered. We generally recommend altering this or temperature but not both.', type: 'number', }, { displayName: 'Fail if Assistant Already Exists', name: 'failIfExists', type: 'boolean', default: false, description: 'Whether to fail an operation if the assistant with the same name already exists', }, ], }, ]; const displayOptions = { show: { operation: ['create'], resource: ['assistant'], }, }; exports.description = (0, n8n_workflow_1.updateDisplayOptions)(displayOptions, properties); async function execute(i) { const model = this.getNodeParameter('modelId', i, '', { extractValue: true }); const name = this.getNodeParameter('name', i); const assistantDescription = this.getNodeParameter('description', i); const instructions = this.getNodeParameter('instructions', i); const codeInterpreter = this.getNodeParameter('codeInterpreter', i); const knowledgeRetrieval = this.getNodeParameter('knowledgeRetrieval', i); let file_ids = this.getNodeParameter('file_ids', i, []); if (typeof file_ids === 'string') { file_ids = file_ids.split(',').map((file_id) => file_id.trim()); } const options = this.getNodeParameter('options', i, {}); if (options.failIfExists) { const assistants = []; let has_more = true; let after; do { const response = (await transport_1.apiRequest.call(this, 'GET', '/assistants', { headers: { 'OpenAI-Beta': 'assistants=v2', }, qs: { limit: 100, after, }, })); for (const assistant of response.data || []) { assistants.push(assistant.name); } has_more = response.has_more; if (has_more) { after = response.last_id; } else { break; } } while (has_more); if (assistants.includes(name)) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), `An assistant with the same name '${name}' already exists`, { itemIndex: i }); } } if (file_ids.length > 20) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'The maximum number of files that can be attached to the assistant is 20', { itemIndex: i }); } const body = { model, name, description: assistantDescription, instructions, }; const tools = []; if (codeInterpreter) { tools.push({ type: 'code_interpreter', }); body.tool_resources = { ...(body.tool_resources ?? {}), code_interpreter: { file_ids, }, }; } if (knowledgeRetrieval) { tools.push({ type: 'file_search', }); body.tool_resources = { ...(body.tool_resources ?? {}), file_search: { vector_stores: [ { file_ids, }, ], }, }; } if (tools.length) { body.tools = tools; } const response = await transport_1.apiRequest.call(this, 'POST', '/assistants', { body, headers: { 'OpenAI-Beta': 'assistants=v2', }, }); return [ { json: response, pairedItem: { item: i }, }, ]; } //# sourceMappingURL=create.operation.js.map