Skip to content

Commit

Permalink
Bugfix/Get value with nested metadata filter (#3695)
Browse files Browse the repository at this point in the history
add ability to get value with nested metadata filter
  • Loading branch information
HenryHengZJ authored Dec 12, 2024
1 parent bfd6770 commit 85abd15
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 10 deletions.
12 changes: 2 additions & 10 deletions packages/components/nodes/tools/RetrieverTool/RetrieverTool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@ import { CallbackManager, CallbackManagerForToolRun, Callbacks, parseCallbackCon
import { BaseDynamicToolInput, DynamicTool, StructuredTool, ToolInputParsingException } from '@langchain/core/tools'
import { BaseRetriever } from '@langchain/core/retrievers'
import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface'
import { getBaseClasses } from '../../../src/utils'
import { getBaseClasses, resolveFlowObjValue } from '../../../src/utils'
import { SOURCE_DOCUMENTS_PREFIX } from '../../../src/agents'
import { RunnableConfig } from '@langchain/core/runnables'
import { customGet } from '../../sequentialagents/commonUtils'
import { VectorStoreRetriever } from '@langchain/core/vectorstores'

const howToUse = `Add additional filters to vector store. You can also filter with flow config, including the current "state":
Expand Down Expand Up @@ -199,14 +198,7 @@ class Retriever_Tools implements INode {

const metadatafilter =
typeof retrieverToolMetadataFilter === 'object' ? retrieverToolMetadataFilter : JSON.parse(retrieverToolMetadataFilter)
const newMetadataFilter: any = {}
for (const key in metadatafilter) {
let value = metadatafilter[key]
if (value.startsWith('$flow')) {
value = customGet(flowObj, value)
}
newMetadataFilter[key] = value
}
const newMetadataFilter = resolveFlowObjValue(metadatafilter, flowObj)

const vectorStore = (retriever as VectorStoreRetriever<any>).vectorStore
vectorStore.filter = newMetadataFilter
Expand Down
22 changes: 22 additions & 0 deletions packages/components/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { ICommonObject, IDatabaseEntity, IDocument, IMessage, INodeData, IVariab
import { AES, enc } from 'crypto-js'
import { AIMessage, HumanMessage, BaseMessage } from '@langchain/core/messages'
import { getFileFromStorage } from './storageUtils'
import { customGet } from '../nodes/sequentialagents/commonUtils'

export const numberOrExpressionRegex = '^(\\d+\\.?\\d*|{{.*}})$' //return true if string consists only numbers OR expression {{}}
export const notEmptyRegex = '(.|\\s)*\\S(.|\\s)*' //return true if string is not empty or blank
Expand Down Expand Up @@ -999,3 +1000,24 @@ export const mapMimeTypeToExt = (mimeType: string) => {
export const removeInvalidImageMarkdown = (output: string): string => {
return typeof output === 'string' ? output.replace(/!\[.*?\]\((?!https?:\/\/).*?\)/g, '') : output
}

/**
* Loop through the object and replace the key with the value
* @param {any} obj
* @param {any} sourceObj
* @returns {any}
*/
export const resolveFlowObjValue = (obj: any, sourceObj: any): any => {
if (typeof obj === 'object' && obj !== null) {
const resolved: any = Array.isArray(obj) ? [] : {}
for (const key in obj) {
const value = obj[key]
resolved[key] = resolveFlowObjValue(value, sourceObj)
}
return resolved
} else if (typeof obj === 'string' && obj.startsWith('$flow')) {
return customGet(sourceObj, obj)
} else {
return obj
}
}

0 comments on commit 85abd15

Please sign in to comment.