diff --git a/packages/components/nodes/prompts/PromptLangfuse/PromptLangfuse.ts b/packages/components/nodes/prompts/PromptLangfuse/PromptLangfuse.ts new file mode 100644 index 000000000..63dbe9530 --- /dev/null +++ b/packages/components/nodes/prompts/PromptLangfuse/PromptLangfuse.ts @@ -0,0 +1,96 @@ +import { ICommonObject, INode, INodeData, INodeParams, PromptTemplate } from '../../../src/Interface' +import { getBaseClasses, getCredentialData, getCredentialParam, getInputVariables } from '../../../src/utils' +import { PromptTemplateInput } from '@langchain/core/prompts' +import { Langfuse } from 'langfuse' + +class PromptLangfuse_Prompts implements INode { + label: string + name: string + version: number + description: string + type: string + icon: string + category: string + author: string + baseClasses: string[] + credential: INodeParams + inputs: INodeParams[] + + constructor() { + this.label = 'LangFuse Prompt Template' + this.name = 'promptLangFuse' + this.version = 1.0 + this.type = 'PromptTemplate' + this.icon = 'prompt.svg' + this.category = 'Prompts' + this.author = 'Lucas Cruz' + this.description = 'Fetch schema from LangFuse to represent a prompt for an LLM' + this.baseClasses = [...getBaseClasses(PromptTemplate)] + this.credential = { + label: 'Langfuse Credential', + name: 'credential', + type: 'credential', + credentialNames: ['langfuseApi'] + } + this.inputs = [ + { + label: 'Prompt Name', + name: 'template', + type: 'string', + placeholder: `Name of the template` + }, + { + label: 'Format Prompt Values', + name: 'promptValues', + type: 'json', + optional: true, + acceptVariable: true, + list: true + } + ] + } + + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const langFuseSecretKey = getCredentialParam('langFuseSecretKey', credentialData, nodeData) + const langFusePublicKey = getCredentialParam('langFusePublicKey', credentialData, nodeData) + const langFuseEndpoint = getCredentialParam('langFuseEndpoint', credentialData, nodeData) + + const langfuse = new Langfuse({ + secretKey: langFuseSecretKey, + publicKey: langFusePublicKey, + baseUrl: langFuseEndpoint ?? 'https://cloud.langfuse.com', + sdkIntegration: 'Flowise' + }) + + const langfusePrompt = await langfuse.getPrompt(nodeData.inputs?.template as string) + const template = langfusePrompt.getLangchainPrompt() + + const promptValuesStr = nodeData.inputs?.promptValues + + let promptValues: ICommonObject = {} + if (promptValuesStr) { + try { + promptValues = typeof promptValuesStr === 'object' ? promptValuesStr : JSON.parse(promptValuesStr) + } catch (exception) { + throw new Error("Invalid JSON in the PromptTemplate's promptValues: " + exception) + } + } + + const inputVariables = getInputVariables(template) + + try { + const options: PromptTemplateInput = { + template, + inputVariables + } + const prompt = new PromptTemplate(options) + prompt.promptValues = promptValues + return prompt + } catch (e) { + throw new Error(e) + } + } +} + +module.exports = { nodeClass: PromptLangfuse_Prompts } diff --git a/packages/components/nodes/prompts/PromptLangfuse/prompt.svg b/packages/components/nodes/prompts/PromptLangfuse/prompt.svg new file mode 100644 index 000000000..e3a0c868d --- /dev/null +++ b/packages/components/nodes/prompts/PromptLangfuse/prompt.svg @@ -0,0 +1,5 @@ + + + + +