@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.
- package/LICENSE.md +27 -0
- package/README.md +36 -0
- package/dist/credentials/OciApi.credentials.d.ts +11 -0
- package/dist/credentials/OciApi.credentials.js +74 -0
- package/dist/credentials/OciApi.credentials.js.map +1 -0
- package/dist/credentials/OracleDatabaseApi.credentials.d.ts +11 -0
- package/dist/credentials/OracleDatabaseApi.credentials.js +57 -0
- package/dist/credentials/OracleDatabaseApi.credentials.js.map +1 -0
- package/dist/credentials/icons/oracle.svg +3 -0
- package/dist/nodes/OCI/AISpeech/oracle.svg +3 -0
- package/dist/nodes/OCI/GenerativeAI/EmbeddingsOciGenerativeAi.node.d.ts +10 -0
- package/dist/nodes/OCI/GenerativeAI/EmbeddingsOciGenerativeAi.node.js +105 -0
- package/dist/nodes/OCI/GenerativeAI/EmbeddingsOciGenerativeAi.node.js.map +1 -0
- package/dist/nodes/OCI/GenerativeAI/LmChatOciGenerativeAi.node.d.ts +10 -0
- package/dist/nodes/OCI/GenerativeAI/LmChatOciGenerativeAi.node.js +169 -0
- package/dist/nodes/OCI/GenerativeAI/LmChatOciGenerativeAi.node.js.map +1 -0
- package/dist/nodes/OCI/GenerativeAI/langchain/ChatOci.d.ts +40 -0
- package/dist/nodes/OCI/GenerativeAI/langchain/ChatOci.js +377 -0
- package/dist/nodes/OCI/GenerativeAI/langchain/ChatOci.js.map +1 -0
- package/dist/nodes/OCI/GenerativeAI/langchain/OciEmbedings.d.ts +21 -0
- package/dist/nodes/OCI/GenerativeAI/langchain/OciEmbedings.js +84 -0
- package/dist/nodes/OCI/GenerativeAI/langchain/OciEmbedings.js.map +1 -0
- package/dist/nodes/OCI/GenerativeAI/oracle.svg +3 -0
- package/dist/nodes/OCI/Loaders/SimpleLoaders.d.ts +12 -0
- package/dist/nodes/OCI/Loaders/SimpleLoaders.js +58 -0
- package/dist/nodes/OCI/Loaders/SimpleLoaders.js.map +1 -0
- package/dist/nodes/OCI/N8nBinaryLoader.d.ts +18 -0
- package/dist/nodes/OCI/N8nBinaryLoader.js +168 -0
- package/dist/nodes/OCI/N8nBinaryLoader.js.map +1 -0
- package/dist/nodes/OCI/N8nJsonLoader.d.ts +11 -0
- package/dist/nodes/OCI/N8nJsonLoader.js +76 -0
- package/dist/nodes/OCI/N8nJsonLoader.js.map +1 -0
- package/dist/nodes/OCI/N8nLlmTracing.d.ts +46 -0
- package/dist/nodes/OCI/N8nLlmTracing.js +169 -0
- package/dist/nodes/OCI/N8nLlmTracing.js.map +1 -0
- package/dist/nodes/OCI/SpeechTranscriptionOci/SpeechTranscriptionOci.node.d.ts +5 -0
- package/dist/nodes/OCI/SpeechTranscriptionOci/SpeechTranscriptionOci.node.js +416 -0
- package/dist/nodes/OCI/SpeechTranscriptionOci/SpeechTranscriptionOci.node.js.map +1 -0
- package/dist/nodes/OCI/SpeechTranscriptionOci/oracle.svg +3 -0
- package/dist/nodes/OCI/VectorStore/VectorStoreOracle.node.d.ts +5 -0
- package/dist/nodes/OCI/VectorStore/VectorStoreOracle.node.js +113 -0
- package/dist/nodes/OCI/VectorStore/VectorStoreOracle.node.js.map +1 -0
- package/dist/nodes/OCI/VectorStore/VectorStoreOracleInsert.node.d.ts +5 -0
- package/dist/nodes/OCI/VectorStore/VectorStoreOracleInsert.node.js +100 -0
- package/dist/nodes/OCI/VectorStore/VectorStoreOracleInsert.node.js.map +1 -0
- package/dist/nodes/OCI/VectorStore/VectorStoreOracleTool.node.d.ts +6 -0
- package/dist/nodes/OCI/VectorStore/VectorStoreOracleTool.node.js +253 -0
- package/dist/nodes/OCI/VectorStore/VectorStoreOracleTool.node.js.map +1 -0
- package/dist/nodes/OCI/VectorStore/langchain/OracleDbVectorStore.d.ts +45 -0
- package/dist/nodes/OCI/VectorStore/langchain/OracleDbVectorStore.js +239 -0
- package/dist/nodes/OCI/VectorStore/langchain/OracleDbVectorStore.js.map +1 -0
- package/dist/nodes/OCI/VectorStore/oracle.svg +3 -0
- package/dist/nodes/OCI/logWrapper.d.ts +21 -0
- package/dist/nodes/OCI/logWrapper.js +152 -0
- package/dist/nodes/OCI/logWrapper.js.map +1 -0
- package/dist/nodes/OCI/n8nDefaultFailedAttemptHandler.d.ts +1 -0
- package/dist/nodes/OCI/n8nDefaultFailedAttemptHandler.js +31 -0
- package/dist/nodes/OCI/n8nDefaultFailedAttemptHandler.js.map +1 -0
- package/dist/nodes/OCI/n8nLlmFailedAttemptHandler.d.ts +3 -0
- package/dist/nodes/OCI/n8nLlmFailedAttemptHandler.js +28 -0
- package/dist/nodes/OCI/n8nLlmFailedAttemptHandler.js.map +1 -0
- package/dist/nodes/OCI/processDocuments.d.ts +25 -0
- package/dist/nodes/OCI/processDocuments.js +30 -0
- package/dist/nodes/OCI/processDocuments.js.map +1 -0
- package/dist/nodes/OCI/utils.d.ts +1 -0
- package/dist/nodes/OCI/utils.js +25 -0
- package/dist/nodes/OCI/utils.js.map +1 -0
- package/dist/package.json +85 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- 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
|