96 lines
3.3 KiB
TypeScript
96 lines
3.3 KiB
TypeScript
import { ICommonObject, IDatabaseEntity, INode, INodeData, INodeOptionsValue, INodeOutputsValue, INodeParams } from '../../../src/Interface'
|
|
import { DataSource } from 'typeorm'
|
|
import { Document } from '@langchain/core/documents'
|
|
|
|
class DocStore_DocumentLoaders implements INode {
|
|
label: string
|
|
name: string
|
|
version: number
|
|
description: string
|
|
type: string
|
|
icon: string
|
|
category: string
|
|
baseClasses: string[]
|
|
inputs: INodeParams[]
|
|
outputs: INodeOutputsValue[]
|
|
badge: string
|
|
|
|
constructor() {
|
|
this.label = 'Document Store'
|
|
this.name = 'documentStore'
|
|
this.version = 1.0
|
|
this.type = 'Document'
|
|
this.icon = 'dstore.svg'
|
|
this.badge = 'NEW'
|
|
this.category = 'Document Loaders'
|
|
this.description = `Load data from pre-configured document stores`
|
|
this.baseClasses = [this.type]
|
|
this.inputs = [
|
|
{
|
|
label: 'Select Store',
|
|
name: 'selectedStore',
|
|
type: 'asyncOptions',
|
|
loadMethod: 'listStores'
|
|
}
|
|
]
|
|
this.outputs = [
|
|
{
|
|
label: 'Document',
|
|
name: 'document',
|
|
description: 'Array of document objects containing metadata and pageContent',
|
|
baseClasses: [...this.baseClasses, 'json']
|
|
},
|
|
{
|
|
label: 'Text',
|
|
name: 'text',
|
|
description: 'Concatenated string from pageContent of documents',
|
|
baseClasses: ['string', 'json']
|
|
}
|
|
]
|
|
}
|
|
|
|
//@ts-ignore
|
|
loadMethods = {
|
|
async listStores(_: INodeData, options: ICommonObject): Promise<INodeOptionsValue[]> {
|
|
const returnData: INodeOptionsValue[] = []
|
|
|
|
const appDataSource = options.appDataSource as DataSource
|
|
const databaseEntities = options.databaseEntities as IDatabaseEntity
|
|
|
|
if (appDataSource === undefined || !appDataSource) {
|
|
return returnData
|
|
}
|
|
|
|
const stores = await appDataSource.getRepository(databaseEntities['DocumentStore']).find()
|
|
for (const store of stores) {
|
|
if (store.status === 'SYNC') {
|
|
const obj = {
|
|
name: store.id,
|
|
label: store.name,
|
|
description: store.description
|
|
}
|
|
returnData.push(obj)
|
|
}
|
|
}
|
|
return returnData
|
|
}
|
|
}
|
|
|
|
async init(nodeData: INodeData, _: string, options: ICommonObject): Promise<any> {
|
|
const selectedStore = nodeData.inputs?.selectedStore as string
|
|
const appDataSource = options.appDataSource as DataSource
|
|
const databaseEntities = options.databaseEntities as IDatabaseEntity
|
|
const chunks = await appDataSource
|
|
.getRepository(databaseEntities['DocumentStoreFileChunk'])
|
|
.find({ where: { storeId: selectedStore } })
|
|
|
|
const finalDocs = []
|
|
for (const chunk of chunks) {
|
|
finalDocs.push(new Document({ pageContent: chunk.pageContent, metadata: JSON.parse(chunk.metadata) }))
|
|
}
|
|
return finalDocs
|
|
}
|
|
}
|
|
|
|
module.exports = { nodeClass: DocStore_DocumentLoaders }
|