diff --git a/packages/components/nodes/tools/ChainTool/ChainTool.ts b/packages/components/nodes/tools/ChainTool/ChainTool.ts index 32e414af..669b5947 100644 --- a/packages/components/nodes/tools/ChainTool/ChainTool.ts +++ b/packages/components/nodes/tools/ChainTool/ChainTool.ts @@ -1,7 +1,7 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' -import { ChainTool } from 'langchain/tools' import { BaseChain } from 'langchain/chains' +import { ChainTool } from './core' class ChainTool_Tools implements INode { label: string diff --git a/packages/components/nodes/tools/ChainTool/core.ts b/packages/components/nodes/tools/ChainTool/core.ts new file mode 100644 index 00000000..6c3dba55 --- /dev/null +++ b/packages/components/nodes/tools/ChainTool/core.ts @@ -0,0 +1,25 @@ +import { DynamicTool, DynamicToolInput } from 'langchain/tools' +import { BaseChain } from 'langchain/chains' + +export interface ChainToolInput extends Omit { + chain: BaseChain +} + +export class ChainTool extends DynamicTool { + chain: BaseChain + + constructor({ chain, ...rest }: ChainToolInput) { + super({ + ...rest, + func: async (input, runManager) => { + // To enable LLM Chain which has promptValues + if ((chain as any).prompt && (chain as any).prompt.promptValues) { + const values = await chain.call((chain as any).prompt.promptValues, runManager?.getChild()) + return values?.text + } + return chain.run(input, runManager?.getChild()) + } + }) + this.chain = chain + } +}