Feature/Add Text Key to Pinecone (#2681)

* add source tag to pinecone

* update pinecone

* add text key to pinecone

* update pinecone version, and singleton
This commit is contained in:
Henry Heng
2024-06-19 21:10:09 +01:00
committed by GitHub
parent 1849637af8
commit b662dd79c6
3 changed files with 61 additions and 47 deletions
@@ -1,5 +1,5 @@
import { flatten } from 'lodash'
import { Pinecone } from '@pinecone-database/pinecone'
import { flatten, isEqual } from 'lodash'
import { Pinecone, PineconeConfiguration } from '@pinecone-database/pinecone'
import { PineconeStoreParams, PineconeStore } from '@langchain/pinecone'
import { Embeddings } from '@langchain/core/embeddings'
import { Document } from '@langchain/core/documents'
@@ -8,6 +8,23 @@ import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../
import { addMMRInputParams, resolveVectorStoreOrRetriever } from '../VectorStoreUtils'
import { index } from '../../../src/indexing'
let pineconeClientSingleton: Pinecone
let pineconeClientOption: PineconeConfiguration
const getPineconeClient = (option: PineconeConfiguration) => {
if (!pineconeClientSingleton) {
// if client doesn't exists
pineconeClientSingleton = new Pinecone(option)
pineconeClientOption = option
return pineconeClientSingleton
} else if (pineconeClientSingleton && !isEqual(option, pineconeClientOption)) {
// if client exists but option changed
pineconeClientSingleton = new Pinecone(option)
return pineconeClientSingleton
}
return pineconeClientSingleton
}
class Pinecone_VectorStores implements INode {
label: string
name: string
@@ -25,7 +42,7 @@ class Pinecone_VectorStores implements INode {
constructor() {
this.label = 'Pinecone'
this.name = 'pinecone'
this.version = 3.0
this.version = 4.0
this.type = 'Pinecone'
this.icon = 'pinecone.svg'
this.category = 'Vector Stores'
@@ -71,6 +88,15 @@ class Pinecone_VectorStores implements INode {
additionalParams: true,
optional: true
},
{
label: 'Pinecone Text Key',
name: 'pineconeTextKey',
description: 'The key in the metadata for storing text. Default to `text`',
type: 'string',
placeholder: 'text',
additionalParams: true,
optional: true
},
{
label: 'Pinecone Metadata Filter',
name: 'pineconeMetadataFilter',
@@ -111,13 +137,12 @@ class Pinecone_VectorStores implements INode {
const docs = nodeData.inputs?.document as Document[]
const embeddings = nodeData.inputs?.embeddings as Embeddings
const recordManager = nodeData.inputs?.recordManager
const pineconeTextKey = nodeData.inputs?.pineconeTextKey as string
const credentialData = await getCredentialData(nodeData.credential ?? '', options)
const pineconeApiKey = getCredentialParam('pineconeApiKey', credentialData, nodeData)
const client = new Pinecone({
apiKey: pineconeApiKey
})
const client = getPineconeClient({ apiKey: pineconeApiKey })
const pineconeIndex = client.Index(_index)
@@ -130,7 +155,8 @@ class Pinecone_VectorStores implements INode {
}
const obj: PineconeStoreParams = {
pineconeIndex
pineconeIndex,
textKey: pineconeTextKey ?? 'text'
}
if (pineconeNamespace) obj.namespace = pineconeNamespace
@@ -166,20 +192,18 @@ class Pinecone_VectorStores implements INode {
const pineconeNamespace = nodeData.inputs?.pineconeNamespace as string
const pineconeMetadataFilter = nodeData.inputs?.pineconeMetadataFilter
const embeddings = nodeData.inputs?.embeddings as Embeddings
const pineconeTextKey = nodeData.inputs?.pineconeTextKey as string
const credentialData = await getCredentialData(nodeData.credential ?? '', options)
const pineconeApiKey = getCredentialParam('pineconeApiKey', credentialData, nodeData)
const client = new Pinecone({
apiKey: pineconeApiKey
})
await client.describeIndex(index)
const client = getPineconeClient({ apiKey: pineconeApiKey })
const pineconeIndex = client.Index(index)
const obj: PineconeStoreParams = {
pineconeIndex
pineconeIndex,
textKey: pineconeTextKey ?? 'text'
}
if (pineconeNamespace) obj.namespace = pineconeNamespace