UNPKG

@langchain/community

Version:
1 lines • 6.49 kB
{"version":3,"file":"xata.cjs","names":["VectorStore","embeddings: EmbeddingsInterface","args: XataClientArgs<XataClient>","documents: Document[]","options?: { ids?: string[] }","vectors: number[][]","params: { ids: string[] }","query: number[]","k: number","filter?: XataFilter | undefined","record: any","Document"],"sources":["../../src/vectorstores/xata.ts"],"sourcesContent":["import { BaseClient } from \"@xata.io/client\";\nimport type { EmbeddingsInterface } from \"@langchain/core/embeddings\";\nimport { VectorStore } from \"@langchain/core/vectorstores\";\nimport { Document } from \"@langchain/core/documents\";\n\n/**\n * Interface for the arguments required to create a XataClient. Includes\n * the client instance and the table name.\n */\nexport interface XataClientArgs<XataClient> {\n readonly client: XataClient;\n readonly table: string;\n}\n\n/**\n * Type for the filter object used in Xata database queries.\n */\ntype XataFilter = object;\n\n/**\n * Class for interacting with a Xata database as a VectorStore. Provides\n * methods to add documents and vectors to the database, delete entries,\n * and perform similarity searches.\n */\nexport class XataVectorSearch<\n XataClient extends BaseClient,\n> extends VectorStore {\n declare FilterType: XataFilter;\n\n private readonly client: XataClient;\n\n private readonly table: string;\n\n _vectorstoreType(): string {\n return \"xata\";\n }\n\n constructor(\n embeddings: EmbeddingsInterface,\n args: XataClientArgs<XataClient>\n ) {\n super(embeddings, args);\n\n this.client = args.client;\n this.table = args.table;\n }\n\n /**\n * Method to add documents to the Xata database. Maps the page content of\n * each document, embeds the documents using the embeddings, and adds the\n * vectors to the database.\n * @param documents Array of documents to be added.\n * @param options Optional object containing an array of ids.\n * @returns Promise resolving to an array of ids of the added documents.\n */\n async addDocuments(documents: Document[], options?: { ids?: string[] }) {\n const texts = documents.map(({ pageContent }) => pageContent);\n return this.addVectors(\n await this.embeddings.embedDocuments(texts),\n documents,\n options\n );\n }\n\n /**\n * Method to add vectors to the Xata database. Maps each vector to a row\n * with the document's content, embedding, and metadata. Creates or\n * replaces these rows in the Xata database.\n * @param vectors Array of vectors to be added.\n * @param documents Array of documents corresponding to the vectors.\n * @param options Optional object containing an array of ids.\n * @returns Promise resolving to an array of ids of the added vectors.\n */\n async addVectors(\n vectors: number[][],\n documents: Document[],\n options?: { ids?: string[] }\n ) {\n const rows = vectors\n .map((embedding, idx) => ({\n content: documents[idx].pageContent,\n embedding,\n ...documents[idx].metadata,\n }))\n .map((row, idx) => {\n if (options?.ids) {\n return { id: options.ids[idx], ...row };\n }\n return row;\n });\n\n const res = await this.client.db[this.table].createOrReplace(rows);\n // Since we have an untyped BaseClient, it doesn't know the\n // actual return type of the overload.\n const results = res as unknown as { id: string }[];\n const returnedIds = results.map((row) => row.id);\n return returnedIds;\n }\n\n /**\n * Method to delete entries from the Xata database. Deletes the entries\n * with the provided ids.\n * @param params Object containing an array of ids of the entries to be deleted.\n * @returns Promise resolving to void.\n */\n async delete(params: { ids: string[] }): Promise<void> {\n const { ids } = params;\n await this.client.db[this.table].delete(ids);\n }\n\n /**\n * Method to perform a similarity search in the Xata database. Returns the\n * k most similar documents along with their scores.\n * @param query Query vector for the similarity search.\n * @param k Number of most similar documents to return.\n * @param filter Optional filter for the search.\n * @returns Promise resolving to an array of tuples, each containing a Document and its score.\n */\n async similaritySearchVectorWithScore(\n query: number[],\n k: number,\n filter?: XataFilter | undefined\n ): Promise<[Document, number][]> {\n const { records } = await this.client.db[this.table].vectorSearch(\n \"embedding\",\n query,\n {\n size: k,\n filter,\n }\n );\n\n return (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n records?.map((record: any) => [\n new Document({\n pageContent: record.content,\n metadata: Object.fromEntries(\n Object.entries(record).filter(\n ([key]) =>\n key !== \"content\" &&\n key !== \"embedding\" &&\n key !== \"xata\" &&\n key !== \"id\"\n )\n ),\n }),\n record.xata ? record.xata.score : record.xata_score,\n ]) ?? []\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;AAwBA,IAAa,mBAAb,cAEUA,0CAAY;CAGpB,AAAiB;CAEjB,AAAiB;CAEjB,mBAA2B;AACzB,SAAO;CACR;CAED,YACEC,YACAC,MACA;EACA,MAAM,YAAY,KAAK;EAEvB,KAAK,SAAS,KAAK;EACnB,KAAK,QAAQ,KAAK;CACnB;;;;;;;;;CAUD,MAAM,aAAaC,WAAuBC,SAA8B;EACtE,MAAM,QAAQ,UAAU,IAAI,CAAC,EAAE,aAAa,KAAK,YAAY;AAC7D,SAAO,KAAK,WACV,MAAM,KAAK,WAAW,eAAe,MAAM,EAC3C,WACA,QACD;CACF;;;;;;;;;;CAWD,MAAM,WACJC,SACAF,WACAC,SACA;EACA,MAAM,OAAO,QACV,IAAI,CAAC,WAAW,SAAS;GACxB,SAAS,UAAU,KAAK;GACxB;GACA,GAAG,UAAU,KAAK;EACnB,GAAE,CACF,IAAI,CAAC,KAAK,QAAQ;AACjB,OAAI,SAAS,IACX,QAAO;IAAE,IAAI,QAAQ,IAAI;IAAM,GAAG;GAAK;AAEzC,UAAO;EACR,EAAC;EAEJ,MAAM,MAAM,MAAM,KAAK,OAAO,GAAG,KAAK,OAAO,gBAAgB,KAAK;EAGlE,MAAM,UAAU;EAChB,MAAM,cAAc,QAAQ,IAAI,CAAC,QAAQ,IAAI,GAAG;AAChD,SAAO;CACR;;;;;;;CAQD,MAAM,OAAOE,QAA0C;EACrD,MAAM,EAAE,KAAK,GAAG;EAChB,MAAM,KAAK,OAAO,GAAG,KAAK,OAAO,OAAO,IAAI;CAC7C;;;;;;;;;CAUD,MAAM,gCACJC,OACAC,GACAC,QAC+B;EAC/B,MAAM,EAAE,SAAS,GAAG,MAAM,KAAK,OAAO,GAAG,KAAK,OAAO,aACnD,aACA,OACA;GACE,MAAM;GACN;EACD,EACF;AAED,SAEE,SAAS,IAAI,CAACC,WAAgB,CAC5B,IAAIC,oCAAS;GACX,aAAa,OAAO;GACpB,UAAU,OAAO,YACf,OAAO,QAAQ,OAAO,CAAC,OACrB,CAAC,CAAC,IAAI,KACJ,QAAQ,aACR,QAAQ,eACR,QAAQ,UACR,QAAQ,KACX,CACF;EACF,IACD,OAAO,OAAO,OAAO,KAAK,QAAQ,OAAO,UAC1C,EAAC,IAAI,CAAE;CAEX;AACF"}