diff --git a/packages/components/nodes/tools/OpenApiToolkit/OpenApiToolkit.ts b/packages/components/nodes/tools/OpenApiToolkit/OpenApiToolkit.ts new file mode 100644 index 00000000..a7dc1800 --- /dev/null +++ b/packages/components/nodes/tools/OpenApiToolkit/OpenApiToolkit.ts @@ -0,0 +1,69 @@ +import { INode, INodeData, INodeParams } from '../../../src/Interface' +import { OpenApiToolkit } from 'langchain/agents' +import { JsonSpec, JsonObject } from 'langchain/tools' +import { BaseLanguageModel } from 'langchain/base_language' +import { load } from 'js-yaml' + +class OpenApiToolkit_Tools implements INode { + label: string + name: string + description: string + type: string + icon: string + category: string + baseClasses: string[] + inputs: INodeParams[] + + constructor() { + this.label = 'OpenApi Toolkit' + this.name = 'openApiToolkit' + this.type = 'OpenApiToolkit' + this.icon = 'openai.png' + this.category = 'Tools' + this.description = 'Load OpenAPI specification' + this.inputs = [ + { + label: 'OpenAI Api Key', + name: 'openAIApiKey', + type: 'password' + }, + { + label: 'Language Model', + name: 'model', + type: 'BaseLanguageModel' + }, + { + label: 'YAML File', + name: 'yamlFile', + type: 'file', + fileType: '.yaml' + } + ] + this.baseClasses = [this.type, 'Tool'] + } + + async init(nodeData: INodeData): Promise { + const openAIApiKey = nodeData.inputs?.openAIApiKey as string + const model = nodeData.inputs?.model as BaseLanguageModel + const yamlFileBase64 = nodeData.inputs?.yamlFile as string + + const splitDataURI = yamlFileBase64.split(',') + splitDataURI.pop() + const bf = Buffer.from(splitDataURI.pop() || '', 'base64') + const utf8String = bf.toString('utf-8') + const data = load(utf8String) as JsonObject + if (!data) { + throw new Error('Failed to load OpenAPI spec') + } + + const headers = { + 'Content-Type': 'application/json', + Authorization: `Bearer ${openAIApiKey}` + } + const toolkit = new OpenApiToolkit(new JsonSpec(data), model, headers) + + return toolkit.tools + } +} + +module.exports = { nodeClass: OpenApiToolkit_Tools } diff --git a/packages/components/nodes/tools/OpenApiToolkit/openai.png b/packages/components/nodes/tools/OpenApiToolkit/openai.png new file mode 100644 index 00000000..de08a05b Binary files /dev/null and b/packages/components/nodes/tools/OpenApiToolkit/openai.png differ diff --git a/packages/components/package.json b/packages/components/package.json index 048f87fc..955cec01 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -20,6 +20,7 @@ "@huggingface/inference": "1", "@pinecone-database/pinecone": "^0.0.12", "@supabase/supabase-js": "^2.21.0", + "@types/js-yaml": "^4.0.5", "axios": "^0.27.2", "cheerio": "^1.0.0-rc.12", "chromadb": "^1.4.2",