From d727338816f2b3c6da01f8816da76da3792ca950 Mon Sep 17 00:00:00 2001 From: Jacob Lee Date: Fri, 10 Jan 2025 13:43:30 -0800 Subject: [PATCH] fix(langchain,core): Add metadata to pulled hub prompts (#7497) --- langchain-core/src/prompts/base.ts | 15 ++++++++++++++- langchain/src/hub.ts | 19 +++++++++++++++++-- langchain/src/tests/hub.int.test.ts | 8 ++++---- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/langchain-core/src/prompts/base.ts b/langchain-core/src/prompts/base.ts index f9e02387e261..ad5d61b32ffd 100644 --- a/langchain-core/src/prompts/base.ts +++ b/langchain-core/src/prompts/base.ts @@ -74,6 +74,14 @@ export abstract class BasePromptTemplate< partialVariables: PartialValues; + /** + * Metadata to be used for tracing. + */ + metadata?: Record; + + /** Tags to be used for tracing. */ + tags?: string[]; + constructor(input: BasePromptTemplateInput) { super(input); const { inputVariables } = input; @@ -127,10 +135,15 @@ export abstract class BasePromptTemplate< input: RunInput, options?: BaseCallbackConfig ): Promise { + const metadata = { + ...this.metadata, + ...options?.metadata, + }; + const tags = [...(this.tags ?? []), ...(options?.tags ?? [])]; return this._callWithConfig( (input: RunInput) => this.formatPromptValue(input), input, - { ...options, runType: "prompt" } + { ...options, tags, metadata, runType: "prompt" } ); } diff --git a/langchain/src/hub.ts b/langchain/src/hub.ts index 53abe8e8c1fc..1ad631030778 100644 --- a/langchain/src/hub.ts +++ b/langchain/src/hub.ts @@ -50,8 +50,23 @@ export async function pull( options?: { apiKey?: string; apiUrl?: string; includeModel?: boolean } ) { const client = new Client(options); - const result = await client._pullPrompt(ownerRepoCommit, { + + const promptObject = await client.pullPromptCommit(ownerRepoCommit, { includeModel: options?.includeModel, }); - return load(result); + + if (promptObject.manifest.kwargs?.metadata === undefined) { + promptObject.manifest.kwargs = { + ...promptObject.manifest.kwargs, + metadata: {}, + }; + } + + promptObject.manifest.kwargs.metadata = { + ...promptObject.manifest.kwargs.metadata, + lc_hub_owner: promptObject.owner, + lc_hub_repo: promptObject.repo, + lc_hub_commit_hash: promptObject.commit_hash, + }; + return load(JSON.stringify(promptObject.manifest)); } diff --git a/langchain/src/tests/hub.int.test.ts b/langchain/src/tests/hub.int.test.ts index 43b87f699d25..442520289705 100644 --- a/langchain/src/tests/hub.int.test.ts +++ b/langchain/src/tests/hub.int.test.ts @@ -1,10 +1,10 @@ /* eslint-disable no-process-env */ -import { PromptTemplate } from "@langchain/core/prompts"; +import { ChatPromptTemplate } from "@langchain/core/prompts"; import * as hub from "../hub.js"; test("Test LangChain Hub client pushing a new repo", async () => { - const prompt = PromptTemplate.fromTemplate( + const prompt = ChatPromptTemplate.fromTemplate( `You are a parrot. The current date is ${new Date().toISOString()}\n{input}` ); const repoName = `${ @@ -14,7 +14,7 @@ test("Test LangChain Hub client pushing a new repo", async () => { newRepoIsPublic: false, }); const pulledPrompt = await hub.pull(repoName); - expect(prompt.invoke({ input: "testing" })).toEqual( - pulledPrompt.invoke({ input: "testing" }) + expect(await prompt.invoke({ input: "testing" })).toEqual( + await pulledPrompt.invoke({ input: "testing" }) ); });