diff --git a/packages/components/nodes/documentloaders/NotionDB/NotionDB.ts b/packages/components/nodes/documentloaders/NotionDB/NotionDB.ts new file mode 100644 index 00000000..71e5e507 --- /dev/null +++ b/packages/components/nodes/documentloaders/NotionDB/NotionDB.ts @@ -0,0 +1,101 @@ +import { INode, INodeData, INodeParams } from '../../../src/Interface' +import { TextSplitter } from 'langchain/text_splitter' +import { NotionDBLoader, NotionDBLoaderParams } from 'langchain/document_loaders/web/notiondb' + +class NotionDB_DocumentLoaders implements INode { + label: string + name: string + description: string + type: string + icon: string + category: string + baseClasses: string[] + inputs: INodeParams[] + + constructor() { + this.label = 'Notion Database' + this.name = 'notionDB' + this.type = 'Document' + this.icon = 'notion.png' + this.category = 'Document Loaders' + this.description = 'Load data from Notion Database ID' + this.baseClasses = [this.type] + this.inputs = [ + { + label: 'Text Splitter', + name: 'textSplitter', + type: 'TextSplitter', + optional: true + }, + { + label: 'Notion Database Id', + name: 'databaseId', + type: 'string', + description: + 'If your URL looks like - https://www.notion.so/?v=, then is the database ID' + }, + { + label: 'Notion Integration Token', + name: 'notionIntegrationToken', + type: 'password', + description: + 'You can find integration token here' + }, + { + label: 'Page Size Limit', + name: 'pageSizeLimit', + type: 'number', + default: 10 + }, + { + label: 'Metadata', + name: 'metadata', + type: 'json', + optional: true, + additionalParams: true + } + ] + } + + async init(nodeData: INodeData): Promise { + const textSplitter = nodeData.inputs?.textSplitter as TextSplitter + const databaseId = nodeData.inputs?.databaseId as string + const notionIntegrationToken = nodeData.inputs?.notionIntegrationToken as string + const pageSizeLimit = nodeData.inputs?.pageSizeLimit as string + const metadata = nodeData.inputs?.metadata + + const obj: NotionDBLoaderParams = { + pageSizeLimit: pageSizeLimit ? parseInt(pageSizeLimit, 10) : 10, + databaseId, + notionIntegrationToken + } + const loader = new NotionDBLoader(obj) + + let docs = [] + if (textSplitter) { + docs = await loader.loadAndSplit(textSplitter) + } else { + docs = await loader.load() + } + + if (metadata) { + const parsedMetadata = typeof metadata === 'object' ? metadata : JSON.parse(metadata) + let finaldocs = [] + for (const doc of docs) { + const newdoc = { + ...doc, + metadata: { + ...doc.metadata, + ...parsedMetadata + } + } + finaldocs.push(newdoc) + } + return finaldocs + } + + return docs + } +} + +module.exports = { nodeClass: NotionDB_DocumentLoaders } diff --git a/packages/components/nodes/documentloaders/Notion/notion.png b/packages/components/nodes/documentloaders/NotionDB/notion.png similarity index 100% rename from packages/components/nodes/documentloaders/Notion/notion.png rename to packages/components/nodes/documentloaders/NotionDB/notion.png diff --git a/packages/components/nodes/documentloaders/Notion/Notion.ts b/packages/components/nodes/documentloaders/NotionFolder/NotionFolder.ts similarity index 91% rename from packages/components/nodes/documentloaders/Notion/Notion.ts rename to packages/components/nodes/documentloaders/NotionFolder/NotionFolder.ts index f5bfcb2a..11b8165b 100644 --- a/packages/components/nodes/documentloaders/Notion/Notion.ts +++ b/packages/components/nodes/documentloaders/NotionFolder/NotionFolder.ts @@ -2,7 +2,7 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { TextSplitter } from 'langchain/text_splitter' import { NotionLoader } from 'langchain/document_loaders/fs/notion' -class Notion_DocumentLoaders implements INode { +class NotionFolder_DocumentLoaders implements INode { label: string name: string description: string @@ -18,7 +18,7 @@ class Notion_DocumentLoaders implements INode { this.type = 'Document' this.icon = 'notion.png' this.category = 'Document Loaders' - this.description = `Load data from Notion folder` + this.description = 'Load data from the exported and unzipped Notion folder' this.baseClasses = [this.type] this.inputs = [ { @@ -78,4 +78,4 @@ class Notion_DocumentLoaders implements INode { } } -module.exports = { nodeClass: Notion_DocumentLoaders } +module.exports = { nodeClass: NotionFolder_DocumentLoaders } diff --git a/packages/components/nodes/documentloaders/NotionFolder/notion.png b/packages/components/nodes/documentloaders/NotionFolder/notion.png new file mode 100644 index 00000000..39105167 Binary files /dev/null and b/packages/components/nodes/documentloaders/NotionFolder/notion.png differ diff --git a/packages/components/package.json b/packages/components/package.json index 8f8e68bc..762af123 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -30,7 +30,7 @@ "express": "^4.17.3", "form-data": "^4.0.0", "graphql": "^16.6.0", - "langchain": "^0.0.82", + "langchain": "^0.0.84", "linkifyjs": "^4.1.1", "mammoth": "^1.5.1", "moment": "^2.29.3",