@banumeow/n8n-nodes-oracle-cloud 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/LICENSE.md +27 -0
  2. package/README.md +36 -0
  3. package/dist/credentials/OciApi.credentials.d.ts +11 -0
  4. package/dist/credentials/OciApi.credentials.js +74 -0
  5. package/dist/credentials/OciApi.credentials.js.map +1 -0
  6. package/dist/credentials/OracleDatabaseApi.credentials.d.ts +11 -0
  7. package/dist/credentials/OracleDatabaseApi.credentials.js +57 -0
  8. package/dist/credentials/OracleDatabaseApi.credentials.js.map +1 -0
  9. package/dist/credentials/icons/oracle.svg +3 -0
  10. package/dist/nodes/OCI/AISpeech/oracle.svg +3 -0
  11. package/dist/nodes/OCI/GenerativeAI/EmbeddingsOciGenerativeAi.node.d.ts +10 -0
  12. package/dist/nodes/OCI/GenerativeAI/EmbeddingsOciGenerativeAi.node.js +105 -0
  13. package/dist/nodes/OCI/GenerativeAI/EmbeddingsOciGenerativeAi.node.js.map +1 -0
  14. package/dist/nodes/OCI/GenerativeAI/LmChatOciGenerativeAi.node.d.ts +10 -0
  15. package/dist/nodes/OCI/GenerativeAI/LmChatOciGenerativeAi.node.js +169 -0
  16. package/dist/nodes/OCI/GenerativeAI/LmChatOciGenerativeAi.node.js.map +1 -0
  17. package/dist/nodes/OCI/GenerativeAI/langchain/ChatOci.d.ts +40 -0
  18. package/dist/nodes/OCI/GenerativeAI/langchain/ChatOci.js +377 -0
  19. package/dist/nodes/OCI/GenerativeAI/langchain/ChatOci.js.map +1 -0
  20. package/dist/nodes/OCI/GenerativeAI/langchain/OciEmbedings.d.ts +21 -0
  21. package/dist/nodes/OCI/GenerativeAI/langchain/OciEmbedings.js +84 -0
  22. package/dist/nodes/OCI/GenerativeAI/langchain/OciEmbedings.js.map +1 -0
  23. package/dist/nodes/OCI/GenerativeAI/oracle.svg +3 -0
  24. package/dist/nodes/OCI/Loaders/SimpleLoaders.d.ts +12 -0
  25. package/dist/nodes/OCI/Loaders/SimpleLoaders.js +58 -0
  26. package/dist/nodes/OCI/Loaders/SimpleLoaders.js.map +1 -0
  27. package/dist/nodes/OCI/N8nBinaryLoader.d.ts +18 -0
  28. package/dist/nodes/OCI/N8nBinaryLoader.js +168 -0
  29. package/dist/nodes/OCI/N8nBinaryLoader.js.map +1 -0
  30. package/dist/nodes/OCI/N8nJsonLoader.d.ts +11 -0
  31. package/dist/nodes/OCI/N8nJsonLoader.js +76 -0
  32. package/dist/nodes/OCI/N8nJsonLoader.js.map +1 -0
  33. package/dist/nodes/OCI/N8nLlmTracing.d.ts +46 -0
  34. package/dist/nodes/OCI/N8nLlmTracing.js +169 -0
  35. package/dist/nodes/OCI/N8nLlmTracing.js.map +1 -0
  36. package/dist/nodes/OCI/SpeechTranscriptionOci/SpeechTranscriptionOci.node.d.ts +5 -0
  37. package/dist/nodes/OCI/SpeechTranscriptionOci/SpeechTranscriptionOci.node.js +416 -0
  38. package/dist/nodes/OCI/SpeechTranscriptionOci/SpeechTranscriptionOci.node.js.map +1 -0
  39. package/dist/nodes/OCI/SpeechTranscriptionOci/oracle.svg +3 -0
  40. package/dist/nodes/OCI/VectorStore/VectorStoreOracle.node.d.ts +5 -0
  41. package/dist/nodes/OCI/VectorStore/VectorStoreOracle.node.js +113 -0
  42. package/dist/nodes/OCI/VectorStore/VectorStoreOracle.node.js.map +1 -0
  43. package/dist/nodes/OCI/VectorStore/VectorStoreOracleInsert.node.d.ts +5 -0
  44. package/dist/nodes/OCI/VectorStore/VectorStoreOracleInsert.node.js +100 -0
  45. package/dist/nodes/OCI/VectorStore/VectorStoreOracleInsert.node.js.map +1 -0
  46. package/dist/nodes/OCI/VectorStore/VectorStoreOracleTool.node.d.ts +6 -0
  47. package/dist/nodes/OCI/VectorStore/VectorStoreOracleTool.node.js +253 -0
  48. package/dist/nodes/OCI/VectorStore/VectorStoreOracleTool.node.js.map +1 -0
  49. package/dist/nodes/OCI/VectorStore/langchain/OracleDbVectorStore.d.ts +45 -0
  50. package/dist/nodes/OCI/VectorStore/langchain/OracleDbVectorStore.js +239 -0
  51. package/dist/nodes/OCI/VectorStore/langchain/OracleDbVectorStore.js.map +1 -0
  52. package/dist/nodes/OCI/VectorStore/oracle.svg +3 -0
  53. package/dist/nodes/OCI/logWrapper.d.ts +21 -0
  54. package/dist/nodes/OCI/logWrapper.js +152 -0
  55. package/dist/nodes/OCI/logWrapper.js.map +1 -0
  56. package/dist/nodes/OCI/n8nDefaultFailedAttemptHandler.d.ts +1 -0
  57. package/dist/nodes/OCI/n8nDefaultFailedAttemptHandler.js +31 -0
  58. package/dist/nodes/OCI/n8nDefaultFailedAttemptHandler.js.map +1 -0
  59. package/dist/nodes/OCI/n8nLlmFailedAttemptHandler.d.ts +3 -0
  60. package/dist/nodes/OCI/n8nLlmFailedAttemptHandler.js +28 -0
  61. package/dist/nodes/OCI/n8nLlmFailedAttemptHandler.js.map +1 -0
  62. package/dist/nodes/OCI/processDocuments.d.ts +25 -0
  63. package/dist/nodes/OCI/processDocuments.js +30 -0
  64. package/dist/nodes/OCI/processDocuments.js.map +1 -0
  65. package/dist/nodes/OCI/utils.d.ts +1 -0
  66. package/dist/nodes/OCI/utils.js +25 -0
  67. package/dist/nodes/OCI/utils.js.map +1 -0
  68. package/dist/package.json +85 -0
  69. package/dist/tsconfig.tsbuildinfo +1 -0
  70. package/package.json +85 -0
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.VectorStoreOracleInsert = void 0;
7
+ const n8n_workflow_1 = require("n8n-workflow");
8
+ const oracledb_1 = __importDefault(require("oracledb"));
9
+ const processDocuments_1 = require("../processDocuments");
10
+ const OracleDbVectorStore_1 = require("./langchain/OracleDbVectorStore");
11
+ class VectorStoreOracleInsert {
12
+ constructor() {
13
+ this.description = {
14
+ displayName: 'Oracle Database Vector Store: Insert',
15
+ name: 'vectorStoreOracleInsert',
16
+ description: 'Oracle Database Vector Store',
17
+ icon: { light: 'file:oracle.svg', dark: 'file:oracle.svg' },
18
+ group: ['transform'],
19
+ defaults: {
20
+ name: 'Oracle Database Vector Store: Insert',
21
+ },
22
+ credentials: [
23
+ {
24
+ name: 'oracleDatabaseApi',
25
+ required: true,
26
+ },
27
+ ],
28
+ version: [1, 1.1, 1.2, 1.3, 2],
29
+ codex: {
30
+ categories: ['AI'],
31
+ subcategories: {
32
+ AI: ['Vector Stores', 'Tools', 'Root Nodes'],
33
+ 'Vector Stores': ['Other Vector Stores'],
34
+ Tools: ['Other Tools'],
35
+ },
36
+ },
37
+ inputs: [
38
+ n8n_workflow_1.NodeConnectionTypes.Main,
39
+ {
40
+ displayName: 'Document',
41
+ maxConnections: 1,
42
+ type: n8n_workflow_1.NodeConnectionTypes.AiDocument,
43
+ required: true,
44
+ },
45
+ {
46
+ displayName: 'Embedding',
47
+ maxConnections: 1,
48
+ type: n8n_workflow_1.NodeConnectionTypes.AiEmbedding,
49
+ required: true,
50
+ },
51
+ ],
52
+ outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
53
+ properties: [
54
+ {
55
+ displayName: 'Table Name',
56
+ name: 'tableName',
57
+ type: 'string',
58
+ default: '',
59
+ required: true,
60
+ },
61
+ {
62
+ displayName: 'Clear Table',
63
+ name: 'clearTable',
64
+ type: 'boolean',
65
+ default: false,
66
+ description: 'Whether to clear the table before inserting new data',
67
+ }
68
+ ],
69
+ };
70
+ }
71
+ async execute() {
72
+ const items = this.getInputData(0);
73
+ const documentInput = (await this.getInputConnectionData(n8n_workflow_1.NodeConnectionTypes.AiDocument, 0));
74
+ const embeddings = (await this.getInputConnectionData(n8n_workflow_1.NodeConnectionTypes.AiEmbedding, 0));
75
+ const credentials = await this.getCredentials('oracleDatabaseApi');
76
+ const protocol = credentials.isAutonomous ? 'tcps://' : 'tcp://';
77
+ const host = credentials.host;
78
+ const port = credentials.port;
79
+ const serviceName = credentials.serviceName;
80
+ const connectString = `${protocol}${host}:${port}/${serviceName}`;
81
+ const dbClient = await oracledb_1.default.getConnection({
82
+ user: credentials.user,
83
+ password: credentials.password,
84
+ connectString,
85
+ });
86
+ const tableName = this.getNodeParameter('tableName', 0);
87
+ const clearTable = this.getNodeParameter('clearTable', 0);
88
+ const vectorStore = new OracleDbVectorStore_1.OracleDbVectorStore({
89
+ client: dbClient,
90
+ tableName,
91
+ embeddings: embeddings,
92
+ });
93
+ await vectorStore.init();
94
+ const { processedDocuments, serializedDocuments } = await (0, processDocuments_1.processDocuments)(documentInput, items);
95
+ await vectorStore.addDocuments(processedDocuments, { clearTable });
96
+ return [serializedDocuments];
97
+ }
98
+ }
99
+ exports.VectorStoreOracleInsert = VectorStoreOracleInsert;
100
+ //# sourceMappingURL=VectorStoreOracleInsert.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorStoreOracleInsert.node.js","sourceRoot":"","sources":["../../../../nodes/OCI/VectorStore/VectorStoreOracleInsert.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type INodeTypeDescription, type SupplyData, type ISupplyDataFunctions, type INodeType, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
2
+ export declare class VectorStoreOracleTool implements INodeType {
3
+ description: INodeTypeDescription;
4
+ supplyData(this: ISupplyDataFunctions, itemIndex: number): Promise<SupplyData>;
5
+ execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
6
+ }
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.VectorStoreOracleTool = void 0;
7
+ const n8n_workflow_1 = require("n8n-workflow");
8
+ const oracledb_1 = __importDefault(require("oracledb"));
9
+ const tools_1 = require("@langchain/core/tools");
10
+ const logWrapper_1 = require("../logWrapper");
11
+ const OracleDbVectorStore_1 = require("./langchain/OracleDbVectorStore");
12
+ function getMetadataFiltersValues(ctx, itemIndex) {
13
+ const options = ctx.getNodeParameter('options', itemIndex, {});
14
+ if (options.metadata) {
15
+ const { metadataValues: metadata } = options.metadata;
16
+ if (metadata.length > 0) {
17
+ return metadata.reduce((acc, { name, value }) => ({ ...acc, [name]: value }), {});
18
+ }
19
+ }
20
+ if (options.searchFilterJson) {
21
+ return ctx.getNodeParameter('options.searchFilterJson', itemIndex, '', {
22
+ ensureType: 'object',
23
+ });
24
+ }
25
+ return undefined;
26
+ }
27
+ async function handleRetrieveAsToolExecuteOperation(context, vectorStore, embeddings, itemIndex) {
28
+ const filter = getMetadataFiltersValues(context, itemIndex);
29
+ const inputData = context.getInputData();
30
+ const item = inputData[itemIndex];
31
+ const query = typeof item.json.input === 'string' ? item.json.input : undefined;
32
+ if (!query || typeof query !== 'string') {
33
+ throw new Error('Input data must contain a "input" field with the search query');
34
+ }
35
+ const topK = context.getNodeParameter('topK', itemIndex, 4);
36
+ (0, n8n_workflow_1.assertParamIsNumber)('topK', topK, context.getNode());
37
+ const useReranker = context.getNodeParameter('useReranker', itemIndex, false);
38
+ (0, n8n_workflow_1.assertParamIsBoolean)('useReranker', useReranker, context.getNode());
39
+ const includeDocumentMetadata = context.getNodeParameter('includeDocumentMetadata', itemIndex, true);
40
+ (0, n8n_workflow_1.assertParamIsBoolean)('includeDocumentMetadata', includeDocumentMetadata, context.getNode());
41
+ const embeddedQuery = await embeddings.embedQuery(query);
42
+ let docs = await vectorStore.similaritySearchVectorWithScore(embeddedQuery, topK, filter);
43
+ if (useReranker && docs.length > 0) {
44
+ const reranker = (await context.getInputConnectionData(n8n_workflow_1.NodeConnectionTypes.AiReranker, 0));
45
+ const documents = docs.map(([doc]) => doc);
46
+ const rerankedDocuments = await reranker.compressDocuments(documents, query);
47
+ docs = rerankedDocuments.map((doc) => {
48
+ const { relevanceScore, ...metadata } = doc.metadata || {};
49
+ return [{ ...doc, metadata }, relevanceScore !== null && relevanceScore !== void 0 ? relevanceScore : 0];
50
+ });
51
+ }
52
+ const serializedDocs = docs.map(([doc]) => {
53
+ if (includeDocumentMetadata) {
54
+ return {
55
+ type: 'text',
56
+ text: JSON.stringify({ ...doc }),
57
+ };
58
+ }
59
+ else {
60
+ return {
61
+ type: 'text',
62
+ pageContent: JSON.stringify({ pageContent: doc.pageContent }),
63
+ };
64
+ }
65
+ });
66
+ (0, logWrapper_1.logAiEvent)(context, 'ai-vector-store-searched', { input: query });
67
+ return [
68
+ {
69
+ json: {
70
+ response: serializedDocs,
71
+ },
72
+ pairedItem: {
73
+ item: itemIndex,
74
+ },
75
+ },
76
+ ];
77
+ }
78
+ class VectorStoreOracleTool {
79
+ constructor() {
80
+ this.description = {
81
+ displayName: 'Oracle Database Vector Store: Tool',
82
+ name: 'vectorStoreOracleTool',
83
+ description: 'Oracle Database Vector Tool Search',
84
+ icon: { light: 'file:oracle.svg', dark: 'file:oracle.svg' },
85
+ group: ['transform'],
86
+ defaults: {
87
+ name: 'Oracle Database Vector Store: Tool',
88
+ },
89
+ credentials: [
90
+ {
91
+ name: 'oracleDatabaseApi',
92
+ required: true,
93
+ },
94
+ ],
95
+ version: [1, 1.1, 1.2, 1.3, 2],
96
+ codex: {
97
+ categories: ['AI'],
98
+ subcategories: {
99
+ AI: ['Vector Stores', 'Tools', 'Root Nodes'],
100
+ 'Vector Stores': ['Other Vector Stores'],
101
+ Tools: ['Other Tools'],
102
+ },
103
+ },
104
+ inputs: [
105
+ {
106
+ displayName: "Embedding",
107
+ type: n8n_workflow_1.NodeConnectionTypes.AiEmbedding,
108
+ required: true,
109
+ maxConnections: 1
110
+ },
111
+ ],
112
+ outputs: [
113
+ {
114
+ displayName: "Tool",
115
+ type: n8n_workflow_1.NodeConnectionTypes.AiTool
116
+ },
117
+ ],
118
+ properties: [
119
+ {
120
+ displayName: 'Name',
121
+ name: 'toolName',
122
+ type: 'string',
123
+ default: '',
124
+ required: true,
125
+ description: 'Name of the vector store',
126
+ placeholder: 'e.g. company_knowledge_base',
127
+ validateType: 'string-alphanumeric',
128
+ },
129
+ {
130
+ displayName: 'Description',
131
+ name: 'toolDescription',
132
+ type: 'string',
133
+ default: '',
134
+ required: true,
135
+ typeOptions: { rows: 2 },
136
+ description: 'Explain to the LLM what this tool does, a good, specific description would allow LLMs to produce expected results much more often',
137
+ },
138
+ {
139
+ displayName: 'Table Name',
140
+ name: 'tableName',
141
+ type: 'string',
142
+ default: '',
143
+ required: true,
144
+ },
145
+ {
146
+ displayName: 'Limit',
147
+ name: 'topK',
148
+ type: 'number',
149
+ default: 4,
150
+ description: 'Number of top results to fetch from vector store',
151
+ },
152
+ {
153
+ displayName: 'Include Metadata',
154
+ name: 'includeDocumentMetadata',
155
+ type: 'boolean',
156
+ default: true,
157
+ description: 'Whether or not to include document metadata',
158
+ },
159
+ {
160
+ displayName: 'Distance Strategy',
161
+ name: 'distanceStrategy',
162
+ type: 'options',
163
+ options: Object.values(OracleDbVectorStore_1.DistanceStrategy).map((strategy) => ({
164
+ name: strategy,
165
+ value: strategy
166
+ })),
167
+ default: '',
168
+ description: 'How similarity between vectors is measured',
169
+ }
170
+ ],
171
+ };
172
+ }
173
+ async supplyData(itemIndex) {
174
+ const toolDescription = this.getNodeParameter('toolDescription', itemIndex);
175
+ const toolName = this.getNodeParameter('toolName', itemIndex);
176
+ const topK = this.getNodeParameter('topK', itemIndex, 4);
177
+ const includeDocumentMetadata = this.getNodeParameter('includeDocumentMetadata', itemIndex, true);
178
+ const credentials = await this.getCredentials('oracleDatabaseApi');
179
+ const protocol = credentials.isAutonomous ? 'tcps://' : 'tcp://';
180
+ const host = credentials.host;
181
+ const port = credentials.port;
182
+ const serviceName = credentials.serviceName;
183
+ const connectString = `${protocol}${host}:${port}/${serviceName}`;
184
+ const dbClient = await oracledb_1.default.getConnection({
185
+ user: credentials.user,
186
+ password: credentials.password,
187
+ connectString,
188
+ });
189
+ const tableName = this.getNodeParameter('tableName', itemIndex);
190
+ const distanceStrategy = this.getNodeParameter('distanceStrategy', itemIndex);
191
+ const embeddings = (await this.getInputConnectionData(n8n_workflow_1.NodeConnectionTypes.AiEmbedding, 0));
192
+ const vectorStoreTool = new tools_1.DynamicTool({
193
+ name: toolName,
194
+ description: toolDescription,
195
+ func: async (input) => {
196
+ const vectorStore = new OracleDbVectorStore_1.OracleDbVectorStore({
197
+ client: dbClient,
198
+ tableName,
199
+ embeddings: embeddings,
200
+ distanceStrategy
201
+ });
202
+ await vectorStore.init();
203
+ const embeddedPrompt = await embeddings.embedQuery(input);
204
+ const documents = await vectorStore.similaritySearchVectorWithScore(embeddedPrompt, topK, {});
205
+ return documents
206
+ .map((document) => {
207
+ if (includeDocumentMetadata) {
208
+ return { type: 'text', text: JSON.stringify(document[0]) };
209
+ }
210
+ return {
211
+ type: 'text',
212
+ text: JSON.stringify({ pageContent: document[0].pageContent }),
213
+ };
214
+ })
215
+ .filter((document) => !!document);
216
+ },
217
+ });
218
+ return {
219
+ response: (0, logWrapper_1.logWrapper)(vectorStoreTool, this)
220
+ };
221
+ }
222
+ async execute() {
223
+ const embeddings = (await this.getInputConnectionData(n8n_workflow_1.NodeConnectionTypes.AiEmbedding, 0));
224
+ const credentials = await this.getCredentials('oracleDatabaseApi');
225
+ const protocol = credentials.isAutonomous ? 'tcps://' : 'tcp://';
226
+ const host = credentials.host;
227
+ const port = credentials.port;
228
+ const serviceName = credentials.serviceName;
229
+ const connectString = `${protocol}${host}:${port}/${serviceName}`;
230
+ const dbClient = await oracledb_1.default.getConnection({
231
+ user: credentials.user,
232
+ password: credentials.password,
233
+ connectString,
234
+ });
235
+ const items = this.getInputData(0);
236
+ const resultData = [];
237
+ for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {
238
+ const tableName = this.getNodeParameter('tableName', itemIndex);
239
+ const distanceStrategy = this.getNodeParameter('distanceStrategy', itemIndex);
240
+ const vectorStore = new OracleDbVectorStore_1.OracleDbVectorStore({
241
+ client: dbClient,
242
+ tableName,
243
+ embeddings: embeddings,
244
+ distanceStrategy
245
+ });
246
+ const docs = await handleRetrieveAsToolExecuteOperation(this, vectorStore, embeddings, itemIndex);
247
+ resultData.push(...docs);
248
+ }
249
+ return [resultData];
250
+ }
251
+ }
252
+ exports.VectorStoreOracleTool = VectorStoreOracleTool;
253
+ //# sourceMappingURL=VectorStoreOracleTool.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorStoreOracleTool.node.js","sourceRoot":"","sources":["../../../../nodes/OCI/VectorStore/VectorStoreOracleTool.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { DocumentInterface } from '@langchain/core/documents';
2
+ import type { Callbacks } from '@langchain/core/callbacks/manager';
3
+ import { VectorStore } from '@langchain/core/vectorstores';
4
+ import { Embeddings } from '@langchain/core/embeddings';
5
+ import oracledb from 'oracledb';
6
+ export declare enum DistanceStrategy {
7
+ EUCLIDEAN_DISTANCE = "EUCLIDEAN_DISTANCE",
8
+ DOT_PRODUCT = "DOT_PRODUCT",
9
+ COSINE = "COSINE"
10
+ }
11
+ export interface VectorStoreOracleInput {
12
+ client: any;
13
+ tableName: string;
14
+ embeddings: Embeddings;
15
+ query?: string;
16
+ distanceStrategy?: DistanceStrategy;
17
+ filter?: Record<string, any> | undefined;
18
+ }
19
+ export declare class OracleDbVectorStore extends VectorStore {
20
+ FilterType: Record<string, any>;
21
+ client: any;
22
+ tableName: string;
23
+ embeddings: Embeddings;
24
+ query: any;
25
+ distanceStrategy: DistanceStrategy;
26
+ filter?: Record<string, any> | undefined;
27
+ connection: oracledb.Connection | null;
28
+ constructor(fields: VectorStoreOracleInput);
29
+ init(): Promise<void>;
30
+ get_embedding_dimension(): Promise<number>;
31
+ _embed_documents(texts: string[]): Promise<number[][]>;
32
+ _embed_query(query: string): Promise<number[]>;
33
+ _vectorstoreType(): string;
34
+ addTexts(texts: string[], metadatas?: Record<string, any>[], ids?: (string[] | null), options?: {
35
+ [x: string]: any;
36
+ }): Promise<string[] | void>;
37
+ addVectors(vectors: number[][], documents: DocumentInterface[], options?: {
38
+ [x: string]: any;
39
+ }): Promise<string[] | void>;
40
+ addDocuments(documents: DocumentInterface[], options?: {
41
+ [x: string]: any;
42
+ }): Promise<string[] | void>;
43
+ similaritySearch(query: string, k?: number, filter?: this["FilterType"] | undefined, _callbacks?: Callbacks | undefined): Promise<DocumentInterface[]>;
44
+ similaritySearchVectorWithScore(query: number[], k: number, filter?: this['FilterType'] | undefined): Promise<[DocumentInterface, number][]>;
45
+ }
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OracleDbVectorStore = exports.DistanceStrategy = void 0;
7
+ const vectorstores_1 = require("@langchain/core/vectorstores");
8
+ const oracledb_1 = __importDefault(require("oracledb"));
9
+ const crypto_1 = require("crypto");
10
+ var DistanceStrategy;
11
+ (function (DistanceStrategy) {
12
+ DistanceStrategy["EUCLIDEAN_DISTANCE"] = "EUCLIDEAN_DISTANCE";
13
+ DistanceStrategy["DOT_PRODUCT"] = "DOT_PRODUCT";
14
+ DistanceStrategy["COSINE"] = "COSINE";
15
+ })(DistanceStrategy || (exports.DistanceStrategy = DistanceStrategy = {}));
16
+ const _get_connection = async (client) => {
17
+ if (client && typeof client.execute === 'function') {
18
+ return client;
19
+ }
20
+ else if (client && typeof client.getConnection === 'function') {
21
+ return await client.getConnection();
22
+ }
23
+ else {
24
+ throw new Error("Invalid client type");
25
+ }
26
+ };
27
+ const _table_exists = async (connection, tableName) => {
28
+ try {
29
+ await connection.execute(`SELECT COUNT(*) FROM "${tableName}"`);
30
+ return true;
31
+ }
32
+ catch (error) {
33
+ if (error && error.errorNum === 942) {
34
+ return false;
35
+ }
36
+ console.error("Error checking if table exists:", error);
37
+ throw error;
38
+ }
39
+ };
40
+ const _create_table = async (connection, tableName, embeddingDim) => {
41
+ if (!connection) {
42
+ throw new Error('Invalid connection');
43
+ }
44
+ await connection.execute(`
45
+ CREATE TABLE "${tableName}" (
46
+ id RAW(16) DEFAULT SYS_GUID() PRIMARY KEY,
47
+ text CLOB,
48
+ metadata JSON,
49
+ embedding VECTOR(${embeddingDim}, FLOAT32)
50
+ )
51
+ `);
52
+ };
53
+ const _get_distance_function = (distanceStrategy) => {
54
+ const distanceStrategy2Function = {
55
+ [DistanceStrategy.EUCLIDEAN_DISTANCE]: "EUCLIDEAN",
56
+ [DistanceStrategy.DOT_PRODUCT]: "DOT",
57
+ [DistanceStrategy.COSINE]: "COSINE",
58
+ };
59
+ if (distanceStrategy in distanceStrategy2Function) {
60
+ return distanceStrategy2Function[distanceStrategy];
61
+ }
62
+ throw new Error(`Unsupported distance strategy: ${distanceStrategy}`);
63
+ };
64
+ function _mergeArraysToObject(ids, texts, metadatas, embeddings) {
65
+ return ids.map((key, index) => ({
66
+ id: key,
67
+ text: texts[index],
68
+ metadata: metadatas[index],
69
+ embedding: embeddings[index]
70
+ }));
71
+ }
72
+ class OracleDbVectorStore extends vectorstores_1.VectorStore {
73
+ constructor(fields) {
74
+ super(fields.embeddings, {});
75
+ this.FilterType = {};
76
+ this.connection = null;
77
+ this.client = fields.client;
78
+ this.embeddings = fields.embeddings;
79
+ this.query = fields.query;
80
+ this.tableName = fields.tableName;
81
+ this.distanceStrategy = fields.distanceStrategy || DistanceStrategy.EUCLIDEAN_DISTANCE;
82
+ this.filter = fields.filter;
83
+ this.connection = null;
84
+ }
85
+ async init() {
86
+ try {
87
+ this.connection = await _get_connection(this.client);
88
+ if (!this.connection) {
89
+ throw new Error('Invalid connection');
90
+ }
91
+ const tableExists = await _table_exists(this.connection, this.tableName);
92
+ if (!tableExists) {
93
+ const embeddingDim = await this.get_embedding_dimension();
94
+ await _create_table(this.connection, this.tableName, embeddingDim);
95
+ }
96
+ }
97
+ catch (error) {
98
+ console.log(error);
99
+ }
100
+ }
101
+ async get_embedding_dimension() {
102
+ const embeddedQuery = await this._embed_query(this.query ? this.query : "test");
103
+ return embeddedQuery.length;
104
+ }
105
+ async _embed_documents(texts) {
106
+ if (this.embeddings && typeof this.embeddings.embedDocuments === 'function') {
107
+ return await this.embeddings.embedDocuments(texts);
108
+ }
109
+ else {
110
+ throw new TypeError("The embeddingFunction is neither an Embeddings instance nor a callable function.");
111
+ }
112
+ }
113
+ async _embed_query(query) {
114
+ if (this.embeddings && typeof this.embeddings.embedQuery === 'function') {
115
+ return await this.embeddings.embedQuery(query);
116
+ }
117
+ else {
118
+ throw new TypeError("The embeddingFunction is neither an Embeddings instance nor a callable function.");
119
+ }
120
+ }
121
+ _vectorstoreType() {
122
+ return 'oracle_db';
123
+ }
124
+ async addTexts(texts, metadatas, ids, options) {
125
+ let processed_ids = [];
126
+ if (ids && ids.length > 0) {
127
+ processed_ids = ids.map(_id => (0, crypto_1.createHash)('sha256').update(_id).digest('hex').substring(0, 16).toUpperCase());
128
+ }
129
+ else if (metadatas && metadatas.every(metadata => "id" in metadata)) {
130
+ processed_ids = metadatas.map(metadata => (0, crypto_1.createHash)('sha256').update(metadata.id).digest('hex').substring(0, 16).toUpperCase());
131
+ }
132
+ else {
133
+ const generated_ids = texts.map(() => (0, crypto_1.randomUUID)());
134
+ processed_ids = generated_ids.map(_id => (0, crypto_1.createHash)('sha256').update(_id).digest('hex').substring(0, 16).toUpperCase());
135
+ }
136
+ if (!metadatas) {
137
+ metadatas = texts.map(() => ({}));
138
+ }
139
+ const embeddings = await this.embeddings.embedDocuments(texts);
140
+ const records = _mergeArraysToObject(processed_ids, texts, metadatas, embeddings);
141
+ const connection = await _get_connection(this.client);
142
+ const sql = `
143
+ INSERT INTO
144
+ "${this.tableName}" (id, text, metadata, embedding)
145
+ VALUES
146
+ (:id, :text, :metadata, :embedding)
147
+ `;
148
+ const binds = records.map((record) => ({
149
+ id: Buffer.from(record.id, 'hex'),
150
+ text: record.text,
151
+ metadata: JSON.stringify(record.metadata),
152
+ embedding: new Float32Array(record.embedding)
153
+ }));
154
+ const batchOptions = {
155
+ autoCommit: true,
156
+ batchErrors: true,
157
+ bindDefs: {
158
+ id: { type: oracledb_1.default.DB_TYPE_RAW, maxSize: 16 },
159
+ text: { type: oracledb_1.default.CLOB },
160
+ metadata: { type: oracledb_1.default.DB_TYPE_JSON },
161
+ embedding: { type: oracledb_1.default.DB_TYPE_VECTOR }
162
+ }
163
+ };
164
+ const results = await connection.executeMany(sql, binds, batchOptions);
165
+ console.log(results, results.batchErrors);
166
+ }
167
+ addVectors(vectors, documents, options) {
168
+ throw new Error('Method not implemented.');
169
+ }
170
+ async addDocuments(documents, options) {
171
+ if (options === null || options === void 0 ? void 0 : options.clearTable) {
172
+ const connection = await _get_connection(this.client);
173
+ if (!connection) {
174
+ throw new Error('Invalid connection');
175
+ }
176
+ await connection.execute(`TRUNCATE TABLE "${this.tableName}"`);
177
+ }
178
+ const texts = documents.map((document) => document.pageContent);
179
+ const metadatas = documents.map((document) => document.metadata);
180
+ return this.addTexts(texts, metadatas, null, options);
181
+ }
182
+ async similaritySearch(query, k, filter, _callbacks) {
183
+ oracledb_1.default.fetchAsString = [oracledb_1.default.CLOB];
184
+ if (!query) {
185
+ return [];
186
+ }
187
+ const queryEmbedding = new Float32Array(await this.embeddings.embedQuery(query));
188
+ const sqlQuery = `
189
+ SELECT
190
+ id,
191
+ text,
192
+ metadata,
193
+ vector_distance(embedding, :embedding, ${_get_distance_function(this.distanceStrategy)}) as distance
194
+ FROM
195
+ "${this.tableName}"
196
+ ORDER BY
197
+ distance
198
+ FETCH APPROX FIRST ${k} ROWS ONLY
199
+ `;
200
+ const connection = await _get_connection(this.client);
201
+ const result = await connection.execute(sqlQuery, { embedding: { type: oracledb_1.default.DB_TYPE_VECTOR, val: queryEmbedding } }, { outFormat: oracledb_1.default.OUT_FORMAT_OBJECT });
202
+ const rows = (result.rows || []);
203
+ return rows.map(row => {
204
+ const doc = {
205
+ pageContent: row.TEXT,
206
+ metadata: row.METADATA ? JSON.parse(row.METADATA) : {},
207
+ };
208
+ return doc;
209
+ });
210
+ }
211
+ async similaritySearchVectorWithScore(query, k, filter) {
212
+ oracledb_1.default.fetchAsString = [oracledb_1.default.CLOB];
213
+ const sqlQuery = `
214
+ SELECT
215
+ id,
216
+ text,
217
+ metadata,
218
+ vector_distance(embedding, :embedding, ${_get_distance_function(this.distanceStrategy)}) as distance
219
+ FROM
220
+ "${this.tableName}"
221
+ ORDER BY
222
+ distance
223
+ FETCH APPROX FIRST ${k} ROWS ONLY
224
+ `;
225
+ const connection = await _get_connection(this.client);
226
+ const vector = new Float32Array(query);
227
+ const result = await connection.execute(sqlQuery, { embedding: { type: oracledb_1.default.DB_TYPE_VECTOR, val: vector } }, { outFormat: oracledb_1.default.OUT_FORMAT_OBJECT });
228
+ const rows = (result.rows || []);
229
+ return rows.map(row => {
230
+ const doc = {
231
+ pageContent: row.TEXT,
232
+ metadata: row.METADATA ? JSON.parse(row.METADATA) : {},
233
+ };
234
+ return [doc, row.DISTANCE];
235
+ });
236
+ }
237
+ }
238
+ exports.OracleDbVectorStore = OracleDbVectorStore;
239
+ //# sourceMappingURL=OracleDbVectorStore.js.map