diff --git a/packages/components/nodes/documentloaders/SerpApi/SerpAPI.ts b/packages/components/nodes/documentloaders/SerpApi/SerpAPI.ts new file mode 100644 index 00000000..fd482710 --- /dev/null +++ b/packages/components/nodes/documentloaders/SerpApi/SerpAPI.ts @@ -0,0 +1,83 @@ +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { TextSplitter } from 'langchain/text_splitter' +import { SerpAPILoader } from 'langchain/document_loaders/web/serpapi' +import { getCredentialData, getCredentialParam } from '../../../src' + +class SerpAPI_DocumentLoaders implements INode { + label: string + name: string + version: number + description: string + type: string + icon: string + category: string + baseClasses: string[] + credential: INodeParams + inputs: INodeParams[] + + constructor() { + this.label = 'SerpApi For Web Search' + this.name = 'serpApi' + this.version = 1.0 + this.type = 'Document' + this.icon = 'serp.png' + this.category = 'Document Loaders' + this.description = 'Load and process data from web search results' + this.baseClasses = [this.type] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + optional: false, + credentialNames: ['serpApi'] + } + this.inputs = [ + { + label: 'Query', + name: 'query', + type: 'string' + }, + { + label: 'Text Splitter', + name: 'textSplitter', + type: 'TextSplitter', + optional: true + }, + { + label: 'Metadata', + name: 'metadata', + type: 'json', + optional: true, + additionalParams: true + } + ] + } + + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { + const textSplitter = nodeData.inputs?.textSplitter as TextSplitter + const query = nodeData.inputs?.query as string + const metadata = nodeData.inputs?.metadata + + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const serpApiKey = getCredentialParam('serpApiKey', credentialData, nodeData) + const loader = new SerpAPILoader({ q: query, apiKey: serpApiKey }) + const docs = textSplitter ? await loader.loadAndSplit() : await loader.load() + + if (metadata) { + const parsedMetadata = typeof metadata === 'object' ? metadata : JSON.parse(metadata) + return docs.map((doc) => { + return { + ...doc, + metadata: { + ...doc.metadata, + ...parsedMetadata + } + } + }) + } + + return docs + } +} + +module.exports = { nodeClass: SerpAPI_DocumentLoaders } diff --git a/packages/components/nodes/documentloaders/SerpApi/serp.png b/packages/components/nodes/documentloaders/SerpApi/serp.png new file mode 100644 index 00000000..338aeaea Binary files /dev/null and b/packages/components/nodes/documentloaders/SerpApi/serp.png differ