Feature/seq agents (#2798)

* update build functions

* sequential agents

* update langchain to 0.2, added sequential agent nodes

* add marketplace templates

* update howto wordings

* Merge branch 'main' into feature/Seq-Agents

# Conflicts:
#	pnpm-lock.yaml

* update deprecated functions and add new sequential nodes

* add marketplace templates

* update marketplace templates, add structured output to llm node

* add multi agents template

* update llm node with bindmodels

* update cypress version

* update templates sticky note wordings

* update tool node to include human in loop action

* update structured outputs error from models

* update cohere package to resolve google genai pipeThrough bug

* update mistral package version, added message reconstruction before invoke seq agent

* add HITL to agent

* update state messages restructuring

* update load and split methods for s3 directory
This commit is contained in:
Henry Heng
2024-07-22 17:46:14 +01:00
committed by GitHub
parent 34d0e4302c
commit bca4de0c63
152 changed files with 55307 additions and 35236 deletions
@@ -123,7 +123,8 @@ class API_DocumentLoaders implements INode {
let docs: IDocument[] = []
if (textSplitter) {
docs = await loader.loadAndSplit(textSplitter)
docs = await loader.load()
docs = await textSplitter.splitDocuments(docs)
} else {
docs = await loader.load()
}
@@ -153,7 +153,8 @@ class Airtable_DocumentLoaders implements INode {
let docs: IDocument[] = []
if (textSplitter) {
docs = await loader.loadAndSplit(textSplitter)
docs = await loader.load()
docs = await textSplitter.splitDocuments(docs)
} else {
docs = await loader.load()
}
@@ -2,7 +2,7 @@ import { omit } from 'lodash'
import { INode, INodeData, INodeParams, ICommonObject } from '../../../src/Interface'
import { getCredentialData, getCredentialParam } from '../../../src/utils'
import { TextSplitter } from 'langchain/text_splitter'
import { ApifyDatasetLoader } from 'langchain/document_loaders/web/apify_dataset'
import { ApifyDatasetLoader } from '@langchain/community/document_loaders/web/apify_dataset'
import { Document } from '@langchain/core/documents'
class ApifyWebsiteContentCrawler_DocumentLoaders implements INode {
@@ -165,7 +165,8 @@ class ApifyWebsiteContentCrawler_DocumentLoaders implements INode {
let docs = []
if (textSplitter) {
docs = await loader.loadAndSplit(textSplitter)
docs = await loader.load()
docs = await textSplitter.splitDocuments(docs)
} else {
docs = await loader.load()
}
@@ -1,6 +1,6 @@
import { TextSplitter } from 'langchain/text_splitter'
import { omit } from 'lodash'
import { CheerioWebBaseLoader, WebBaseLoaderParams } from 'langchain/document_loaders/web/cheerio'
import { CheerioWebBaseLoader, WebBaseLoaderParams } from '@langchain/community/document_loaders/web/cheerio'
import { test } from 'linkifyjs'
import { parse } from 'css-what'
import { webCrawl, xmlScrape } from '../../../src'
@@ -138,7 +138,8 @@ class Cheerio_DocumentLoaders implements INode {
}
const loader = new CheerioWebBaseLoader(url, params)
if (textSplitter) {
docs = await loader.loadAndSplit(textSplitter)
docs = await loader.load()
docs = await textSplitter.splitDocuments(docs)
} else {
docs = await loader.load()
}
@@ -1,7 +1,7 @@
import { omit } from 'lodash'
import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface'
import { TextSplitter } from 'langchain/text_splitter'
import { ConfluencePagesLoader, ConfluencePagesLoaderParams } from 'langchain/document_loaders/web/confluence'
import { ConfluencePagesLoader, ConfluencePagesLoaderParams } from '@langchain/community/document_loaders/web/confluence'
import { getCredentialData, getCredentialParam } from '../../../src'
class Confluence_DocumentLoaders implements INode {
@@ -119,7 +119,8 @@ class Confluence_DocumentLoaders implements INode {
let docs = []
if (textSplitter) {
docs = await loader.loadAndSplit(textSplitter)
docs = await loader.load()
docs = await textSplitter.splitDocuments(docs)
} else {
docs = await loader.load()
}
@@ -1,7 +1,7 @@
import { omit } from 'lodash'
import { ICommonObject, IDocument, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface'
import { TextSplitter } from 'langchain/text_splitter'
import { CSVLoader } from 'langchain/document_loaders/fs/csv'
import { CSVLoader } from '@langchain/community/document_loaders/fs/csv'
import { getFileFromStorage, handleEscapeCharacters } from '../../../src'
class Csv_DocumentLoaders implements INode {
@@ -113,7 +113,8 @@ class Csv_DocumentLoaders implements INode {
const loader = new CSVLoader(blob, columnName.trim().length === 0 ? undefined : columnName.trim())
if (textSplitter) {
docs.push(...(await loader.loadAndSplit(textSplitter)))
docs = await loader.load()
docs = await textSplitter.splitDocuments(docs)
} else {
docs.push(...(await loader.load()))
}
@@ -133,7 +134,8 @@ class Csv_DocumentLoaders implements INode {
const loader = new CSVLoader(blob, columnName.trim().length === 0 ? undefined : columnName.trim())
if (textSplitter) {
docs.push(...(await loader.loadAndSplit(textSplitter)))
docs = await loader.load()
docs = await textSplitter.splitDocuments(docs)
} else {
docs.push(...(await loader.load()))
}
@@ -1,7 +1,7 @@
import { omit } from 'lodash'
import { ICommonObject, IDocument, INode, INodeData, INodeParams } from '../../../src/Interface'
import { TextSplitter } from 'langchain/text_splitter'
import { DocxLoader } from 'langchain/document_loaders/fs/docx'
import { DocxLoader } from '@langchain/community/document_loaders/fs/docx'
import { getFileFromStorage } from '../../../src'
class Docx_DocumentLoaders implements INode {
@@ -88,7 +88,9 @@ class Docx_DocumentLoaders implements INode {
const loader = new DocxLoader(blob)
if (textSplitter) {
docs.push(...(await loader.loadAndSplit(textSplitter)))
let splittedDocs = await loader.load()
splittedDocs = await textSplitter.splitDocuments(splittedDocs)
docs.push(...splittedDocs)
} else {
docs.push(...(await loader.load()))
}
@@ -108,7 +110,9 @@ class Docx_DocumentLoaders implements INode {
const loader = new DocxLoader(blob)
if (textSplitter) {
docs.push(...(await loader.loadAndSplit(textSplitter)))
let splittedDocs = await loader.load()
splittedDocs = await textSplitter.splitDocuments(splittedDocs)
docs.push(...splittedDocs)
} else {
docs.push(...(await loader.load()))
}
@@ -1,7 +1,7 @@
import { omit } from 'lodash'
import { getCredentialData, getCredentialParam } from '../../../src'
import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface'
import { FigmaFileLoader, FigmaLoaderParams } from 'langchain/document_loaders/web/figma'
import { ICommonObject, IDocument, INode, INodeData, INodeParams } from '../../../src/Interface'
import { FigmaFileLoader, FigmaLoaderParams } from '@langchain/community/document_loaders/web/figma'
import { TextSplitter } from 'langchain/text_splitter'
class Figma_DocumentLoaders implements INode {
@@ -105,7 +105,14 @@ class Figma_DocumentLoaders implements INode {
const loader = new FigmaFileLoader(figmaOptions)
let docs = textSplitter ? await loader.loadAndSplit() : await loader.load()
let docs: IDocument[] = []
if (textSplitter) {
docs = await loader.load()
docs = await textSplitter.splitDocuments(docs)
} else {
docs = await loader.load()
}
if (metadata) {
const parsedMetadata = typeof metadata === 'object' ? metadata : JSON.parse(metadata)
@@ -4,9 +4,9 @@ import { TextSplitter } from 'langchain/text_splitter'
import { TextLoader } from 'langchain/document_loaders/fs/text'
import { DirectoryLoader } from 'langchain/document_loaders/fs/directory'
import { JSONLoader } from 'langchain/document_loaders/fs/json'
import { CSVLoader } from 'langchain/document_loaders/fs/csv'
import { PDFLoader } from 'langchain/document_loaders/fs/pdf'
import { DocxLoader } from 'langchain/document_loaders/fs/docx'
import { CSVLoader } from '@langchain/community/document_loaders/fs/csv'
import { PDFLoader } from '@langchain/community/document_loaders/fs/pdf'
import { DocxLoader } from '@langchain/community/document_loaders/fs/docx'
class Folder_DocumentLoaders implements INode {
label: string
@@ -153,7 +153,8 @@ class Folder_DocumentLoaders implements INode {
let docs = []
if (textSplitter) {
docs = await loader.loadAndSplit(textSplitter)
docs = await loader.load()
docs = await textSplitter.splitDocuments(docs)
} else {
docs = await loader.load()
}
@@ -1,7 +1,7 @@
import { omit } from 'lodash'
import { INode, INodeData, INodeParams } from '../../../src/Interface'
import { IDocument, INode, INodeData, INodeParams } from '../../../src/Interface'
import { TextSplitter } from 'langchain/text_splitter'
import { GitbookLoader } from 'langchain/document_loaders/web/gitbook'
import { GitbookLoader } from '@langchain/community/document_loaders/web/gitbook'
class Gitbook_DocumentLoaders implements INode {
label: string
@@ -79,7 +79,14 @@ class Gitbook_DocumentLoaders implements INode {
const loader = shouldLoadAllPaths ? new GitbookLoader(webPath, { shouldLoadAllPaths }) : new GitbookLoader(webPath)
let docs = textSplitter ? await loader.loadAndSplit() : await loader.load()
let docs: IDocument[] = []
if (textSplitter) {
docs = await loader.load()
docs = await textSplitter.splitDocuments(docs)
} else {
docs = await loader.load()
}
if (metadata) {
const parsedMetadata = typeof metadata === 'object' ? metadata : JSON.parse(metadata)
@@ -1,7 +1,7 @@
import { omit } from 'lodash'
import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface'
import { ICommonObject, IDocument, INode, INodeData, INodeParams } from '../../../src/Interface'
import { TextSplitter } from 'langchain/text_splitter'
import { GithubRepoLoader, GithubRepoLoaderParams } from 'langchain/document_loaders/web/github'
import { GithubRepoLoader, GithubRepoLoaderParams } from '@langchain/community/document_loaders/web/github'
import { getCredentialData, getCredentialParam } from '../../../src'
class Github_DocumentLoaders implements INode {
@@ -139,7 +139,15 @@ class Github_DocumentLoaders implements INode {
if (ignorePath) githubOptions.ignorePaths = JSON.parse(ignorePath)
const loader = new GithubRepoLoader(repoLink, githubOptions)
let docs = textSplitter ? await loader.loadAndSplit(textSplitter) : await loader.load()
let docs: IDocument[] = []
if (textSplitter) {
docs = await loader.load()
docs = await textSplitter.splitDocuments(docs)
} else {
docs = await loader.load()
}
if (metadata) {
const parsedMetadata = typeof metadata === 'object' ? metadata : JSON.parse(metadata)
@@ -104,7 +104,9 @@ class Json_DocumentLoaders implements INode {
const loader = new JSONLoader(blob, pointers.length != 0 ? pointers : undefined)
if (textSplitter) {
docs.push(...(await loader.loadAndSplit(textSplitter)))
let splittedDocs = await loader.load()
splittedDocs = await textSplitter.splitDocuments(splittedDocs)
docs.push(...splittedDocs)
} else {
docs.push(...(await loader.load()))
}
@@ -124,7 +126,9 @@ class Json_DocumentLoaders implements INode {
const loader = new JSONLoader(blob, pointers.length != 0 ? pointers : undefined)
if (textSplitter) {
docs.push(...(await loader.loadAndSplit(textSplitter)))
let splittedDocs = await loader.load()
splittedDocs = await textSplitter.splitDocuments(splittedDocs)
docs.push(...splittedDocs)
} else {
docs.push(...(await loader.load()))
}
@@ -98,7 +98,9 @@ class Jsonlines_DocumentLoaders implements INode {
const loader = new JSONLinesLoader(blob, pointer)
if (textSplitter) {
docs.push(...(await loader.loadAndSplit(textSplitter)))
let splittedDocs = await loader.load()
splittedDocs = await textSplitter.splitDocuments(splittedDocs)
docs.push(...splittedDocs)
} else {
docs.push(...(await loader.load()))
}
@@ -118,7 +120,9 @@ class Jsonlines_DocumentLoaders implements INode {
const loader = new JSONLinesLoader(blob, pointer)
if (textSplitter) {
docs.push(...(await loader.loadAndSplit(textSplitter)))
let splittedDocs = await loader.load()
splittedDocs = await textSplitter.splitDocuments(splittedDocs)
docs.push(...splittedDocs)
} else {
docs.push(...(await loader.load()))
}
@@ -1,7 +1,7 @@
import { omit } from 'lodash'
import { ICommonObject, IDocument, INode, INodeData, INodeParams } from '../../../src/Interface'
import { TextSplitter } from 'langchain/text_splitter'
import { NotionAPILoader, NotionAPILoaderOptions } from 'langchain/document_loaders/web/notionapi'
import { NotionAPILoader, NotionAPILoaderOptions } from '@langchain/community/document_loaders/web/notionapi'
import { getCredentialData, getCredentialParam } from '../../../src'
class NotionDB_DocumentLoaders implements INode {
@@ -95,7 +95,8 @@ class NotionDB_DocumentLoaders implements INode {
let docs: IDocument[] = []
if (textSplitter) {
docs = await loader.loadAndSplit(textSplitter)
docs = await loader.load()
docs = await textSplitter.splitDocuments(docs)
} else {
docs = await loader.load()
}
@@ -1,7 +1,7 @@
import { omit } from 'lodash'
import { IDocument, INode, INodeData, INodeParams } from '../../../src/Interface'
import { TextSplitter } from 'langchain/text_splitter'
import { NotionLoader } from 'langchain/document_loaders/fs/notion'
import { NotionLoader } from '@langchain/community/document_loaders/fs/notion'
class NotionFolder_DocumentLoaders implements INode {
label: string
@@ -74,7 +74,8 @@ class NotionFolder_DocumentLoaders implements INode {
let docs: IDocument[] = []
if (textSplitter) {
docs = await loader.loadAndSplit(textSplitter)
docs = await loader.load()
docs = await textSplitter.splitDocuments(docs)
} else {
docs = await loader.load()
}
@@ -1,7 +1,7 @@
import { omit } from 'lodash'
import { ICommonObject, IDocument, INode, INodeData, INodeParams } from '../../../src/Interface'
import { TextSplitter } from 'langchain/text_splitter'
import { NotionAPILoader, NotionAPILoaderOptions } from 'langchain/document_loaders/web/notionapi'
import { NotionAPILoader, NotionAPILoaderOptions } from '@langchain/community/document_loaders/web/notionapi'
import { getCredentialData, getCredentialParam } from '../../../src'
class NotionPage_DocumentLoaders implements INode {
@@ -92,7 +92,8 @@ class NotionPage_DocumentLoaders implements INode {
let docs: IDocument[] = []
if (textSplitter) {
docs = await loader.loadAndSplit(textSplitter)
docs = await loader.load()
docs = await textSplitter.splitDocuments(docs)
} else {
docs = await loader.load()
}
@@ -1,7 +1,7 @@
import { omit } from 'lodash'
import { IDocument, ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface'
import { TextSplitter } from 'langchain/text_splitter'
import { PDFLoader } from 'langchain/document_loaders/fs/pdf'
import { PDFLoader } from '@langchain/community/document_loaders/fs/pdf'
import { getFileFromStorage } from '../../../src'
class Pdf_DocumentLoaders implements INode {
@@ -172,7 +172,9 @@ class Pdf_DocumentLoaders implements INode {
legacyBuild ? import('pdfjs-dist/legacy/build/pdf.js') : import('pdf-parse/lib/pdf.js/v1.10.100/build/pdf.js')
})
if (textSplitter) {
docs.push(...(await loader.loadAndSplit(textSplitter)))
let splittedDocs = await loader.load()
splittedDocs = await textSplitter.splitDocuments(splittedDocs)
docs.push(...splittedDocs)
} else {
docs.push(...(await loader.load()))
}
@@ -183,7 +185,9 @@ class Pdf_DocumentLoaders implements INode {
legacyBuild ? import('pdfjs-dist/legacy/build/pdf.js') : import('pdf-parse/lib/pdf.js/v1.10.100/build/pdf.js')
})
if (textSplitter) {
docs.push(...(await loader.loadAndSplit(textSplitter)))
let splittedDocs = await loader.load()
splittedDocs = await textSplitter.splitDocuments(splittedDocs)
docs.push(...splittedDocs)
} else {
docs.push(...(await loader.load()))
}
@@ -1,7 +1,12 @@
import { omit } from 'lodash'
import { ICommonObject, IDocument, INode, INodeData, INodeParams } from '../../../src/Interface'
import { TextSplitter } from 'langchain/text_splitter'
import { Browser, Page, PlaywrightWebBaseLoader, PlaywrightWebBaseLoaderOptions } from 'langchain/document_loaders/web/playwright'
import {
Browser,
Page,
PlaywrightWebBaseLoader,
PlaywrightWebBaseLoaderOptions
} from '@langchain/community/document_loaders/web/playwright'
import { test } from 'linkifyjs'
import { webCrawl, xmlScrape } from '../../../src'
@@ -174,7 +179,8 @@ class Playwright_DocumentLoaders implements INode {
}
const loader = new PlaywrightWebBaseLoader(url, config)
if (textSplitter) {
docs = await loader.loadAndSplit(textSplitter)
docs = await loader.load()
docs = await textSplitter.splitDocuments(docs)
} else {
docs = await loader.load()
}
@@ -1,7 +1,7 @@
import { omit } from 'lodash'
import { ICommonObject, IDocument, INode, INodeData, INodeParams } from '../../../src/Interface'
import { TextSplitter } from 'langchain/text_splitter'
import { Browser, Page, PuppeteerWebBaseLoader, PuppeteerWebBaseLoaderOptions } from 'langchain/document_loaders/web/puppeteer'
import { Browser, Page, PuppeteerWebBaseLoader, PuppeteerWebBaseLoaderOptions } from '@langchain/community/document_loaders/web/puppeteer'
import { test } from 'linkifyjs'
import { webCrawl, xmlScrape } from '../../../src'
import { PuppeteerLifeCycleEvent } from 'puppeteer'
@@ -175,7 +175,8 @@ class Puppeteer_DocumentLoaders implements INode {
}
const loader = new PuppeteerWebBaseLoader(url, config)
if (textSplitter) {
docs = await loader.loadAndSplit(textSplitter)
docs = await loader.load()
docs = await textSplitter.splitDocuments(docs)
} else {
docs = await loader.load()
}
@@ -271,7 +271,9 @@ class S3_DocumentLoaders implements INode {
let docs = []
if (textSplitter) {
docs = await loader.loadAndSplit(textSplitter)
let splittedDocs = await loader.load()
splittedDocs = await textSplitter.splitDocuments(splittedDocs)
docs.push(...splittedDocs)
} else {
docs = await loader.load()
}
@@ -1,13 +1,13 @@
import { omit } from 'lodash'
import { ICommonObject, INode, INodeData, INodeOptionsValue, INodeParams } from '../../../src/Interface'
import { S3Loader } from 'langchain/document_loaders/web/s3'
import { S3Loader } from '@langchain/community/document_loaders/web/s3'
import {
UnstructuredLoader,
UnstructuredLoaderOptions,
UnstructuredLoaderStrategy,
SkipInferTableTypes,
HiResModelName
} from 'langchain/document_loaders/fs/unstructured'
} from '@langchain/community/document_loaders/fs/unstructured'
import { getCredentialData, getCredentialParam } from '../../../src/utils'
import { S3Client, GetObjectCommand, S3ClientConfig } from '@aws-sdk/client-s3'
import { getRegions, MODEL_TYPE } from '../../../src/modelLoader'
@@ -1,7 +1,7 @@
import { omit } from 'lodash'
import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface'
import { ICommonObject, IDocument, INode, INodeData, INodeParams } from '../../../src/Interface'
import { TextSplitter } from 'langchain/text_splitter'
import { SearchApiLoader } from 'langchain/document_loaders/web/searchapi'
import { SearchApiLoader } from '@langchain/community/document_loaders/web/searchapi'
import { getCredentialData, getCredentialParam } from '../../../src'
// Provides access to multiple search engines using the SearchApi.
@@ -106,7 +106,13 @@ class SearchAPI_DocumentLoaders implements INode {
const loader = new SearchApiLoader(loaderConfig)
// Fetch documents, split if a text splitter is provided
let docs = textSplitter ? await loader.loadAndSplit() : await loader.load()
let docs: IDocument[] = []
if (textSplitter) {
docs = await loader.load()
docs = await textSplitter.splitDocuments(docs)
} else {
docs = await loader.load()
}
if (metadata) {
const parsedMetadata = typeof metadata === 'object' ? metadata : JSON.parse(metadata)
@@ -1,7 +1,7 @@
import { omit } from 'lodash'
import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface'
import { ICommonObject, IDocument, INode, INodeData, INodeParams } from '../../../src/Interface'
import { TextSplitter } from 'langchain/text_splitter'
import { SerpAPILoader } from 'langchain/document_loaders/web/serpapi'
import { SerpAPILoader } from '@langchain/community/document_loaders/web/serpapi'
import { getCredentialData, getCredentialParam } from '../../../src'
class SerpAPI_DocumentLoaders implements INode {
@@ -80,7 +80,14 @@ class SerpAPI_DocumentLoaders implements INode {
const credentialData = await getCredentialData(nodeData.credential ?? '', options)
const serpApiKey = getCredentialParam('serpApiKey', credentialData, nodeData)
const loader = new SerpAPILoader({ q: query, apiKey: serpApiKey })
let docs = textSplitter ? await loader.loadAndSplit() : await loader.load()
let docs: IDocument[] = []
if (textSplitter) {
docs = await loader.load()
docs = await textSplitter.splitDocuments(docs)
} else {
docs = await loader.load()
}
if (metadata) {
const parsedMetadata = typeof metadata === 'object' ? metadata : JSON.parse(metadata)
@@ -106,7 +106,9 @@ class Text_DocumentLoaders implements INode {
const loader = new TextLoader(blob)
if (textSplitter) {
docs.push(...(await loader.loadAndSplit(textSplitter)))
let splittedDocs = await loader.load()
splittedDocs = await textSplitter.splitDocuments(splittedDocs)
docs.push(...splittedDocs)
} else {
docs.push(...(await loader.load()))
}
@@ -126,7 +128,9 @@ class Text_DocumentLoaders implements INode {
const loader = new TextLoader(blob)
if (textSplitter) {
docs.push(...(await loader.loadAndSplit(textSplitter)))
let splittedDocs = await loader.load()
splittedDocs = await textSplitter.splitDocuments(splittedDocs)
docs.push(...splittedDocs)
} else {
docs.push(...(await loader.load()))
}
@@ -3,7 +3,7 @@ import {
SkipInferTableTypes,
UnstructuredLoaderOptions,
UnstructuredLoaderStrategy
} from 'langchain/document_loaders/fs/unstructured'
} from '@langchain/community/document_loaders/fs/unstructured'
import { BaseDocumentLoader } from 'langchain/document_loaders/base'
import { StringWithAutocomplete } from 'langchain/dist/util/types'
import { Document } from '@langchain/core/documents'
@@ -6,7 +6,7 @@ import {
SkipInferTableTypes,
HiResModelName,
UnstructuredLoader as LCUnstructuredLoader
} from 'langchain/document_loaders/fs/unstructured'
} from '@langchain/community/document_loaders/fs/unstructured'
import { getCredentialData, getCredentialParam } from '../../../src/utils'
import { getFileFromStorage } from '../../../src'
import { UnstructuredLoader } from './Unstructured'
@@ -6,7 +6,7 @@ import {
UnstructuredLoaderStrategy,
SkipInferTableTypes,
HiResModelName
} from 'langchain/document_loaders/fs/unstructured'
} from '@langchain/community/document_loaders/fs/unstructured'
import { getCredentialData, getCredentialParam } from '../../../src/utils'
class UnstructuredFolder_DocumentLoaders implements INode {