@n8n/n8n-nodes-langchain
Version:

245 lines • 8.75 kB
JavaScript
;
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