2024-02-21 05:59:37 -08:00
import { NodeConnectionType , type IExecuteFunctions , NodeOperationError } from 'n8n-workflow' ;
2024-02-05 07:09:23 -08:00
import { BaseChatModel } from 'langchain/chat_models/base' ;
import { BaseChatModel as BaseChatModelCore } from '@langchain/core/language_models/chat_models' ;
2024-02-21 05:59:37 -08:00
import type { BaseOutputParser } from '@langchain/core/output_parsers' ;
2023-11-29 03:13:55 -08:00
export function getMetadataFiltersValues (
ctx : IExecuteFunctions ,
itemIndex : number ,
) : Record < string , never > | undefined {
const metadata = ctx . getNodeParameter ( 'options.metadata.metadataValues' , itemIndex , [ ] ) as Array < {
name : string ;
value : string ;
} > ;
if ( metadata . length > 0 ) {
return metadata . reduce ( ( acc , { name , value } ) = > ( { . . . acc , [ name ] : value } ) , { } ) ;
}
return undefined ;
}
2024-02-05 07:09:23 -08:00
// TODO: Remove this function once langchain package is updated to 0.1.x
2024-02-21 05:59:37 -08:00
// eslint-disable-next-line @typescript-eslint/no-duplicate-type-constituents
2024-02-05 07:09:23 -08:00
export function isChatInstance ( model : any ) : model is BaseChatModel | BaseChatModelCore {
return model instanceof BaseChatModel || model instanceof BaseChatModelCore ;
}
2024-02-21 05:59:37 -08:00
export async function getOptionalOutputParsers (
ctx : IExecuteFunctions ,
) : Promise < Array < BaseOutputParser < unknown > >> {
let outputParsers : BaseOutputParser [ ] = [ ] ;
if ( ctx . getNodeParameter ( 'hasOutputParser' , 0 , true ) === true ) {
outputParsers = ( await ctx . getInputConnectionData (
NodeConnectionType . AiOutputParser ,
0 ,
) ) as BaseOutputParser [ ] ;
}
return outputParsers ;
}
export function getPromptInputByType ( options : {
ctx : IExecuteFunctions ;
i : number ;
promptTypeKey : string ;
inputKey : string ;
} ) {
const { ctx , i , promptTypeKey , inputKey } = options ;
const prompt = ctx . getNodeParameter ( promptTypeKey , i ) as string ;
let input ;
if ( prompt === 'auto' ) {
input = ctx . evaluateExpression ( '{{ $json["chatInput"] }}' , i ) as string ;
} else {
input = ctx . getNodeParameter ( inputKey , i ) as string ;
}
if ( input === undefined ) {
throw new NodeOperationError ( ctx . getNode ( ) , 'No prompt specified' , {
description :
"Expected to find the prompt in an input field called 'chatInput' (this is what the chat trigger node outputs). To use something else, change the 'Prompt' parameter" ,
} ) ;
}
return input ;
}