-
-
Notifications
You must be signed in to change notification settings - Fork 356
Expand file tree
/
Copy pathvalidateNewDatabaseConnector.js
More file actions
124 lines (110 loc) · 3.64 KB
/
validateNewDatabaseConnector.js
File metadata and controls
124 lines (110 loc) · 3.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
const {
OrganizationConnection,
} = require("../../models/organizationConnection");
async function validateNewDatabaseConnector(organization, config) {
const { type, settings } = config;
if (!OrganizationConnection.supportedConnectors.includes(type))
return { connector: null, error: "Unsupported vector database type." };
var statusCheck = { valid: false, message: null };
if (type === "chroma") {
const { valid, message } = await validateChroma(settings);
statusCheck = { valid, message };
} else if (type === "pinecone") {
const { valid, message } = await validatePinecone(settings);
statusCheck = { valid, message };
} else if (type === "qdrant") {
const { valid, message } = await validateQDrant(settings);
statusCheck = { valid, message };
} else if (type === "weaviate") {
const { valid, message } = await validateWeaviate(settings);
statusCheck = { valid, message };
}
if (!statusCheck.valid)
return { connector: null, error: statusCheck.message };
const connector = await OrganizationConnection.create(
organization.id,
type,
settings
);
return { connector, error: null };
}
async function validateChroma({
instanceURL,
authToken = null,
authTokenHeader = null,
}) {
const { ChromaClient } = require("chromadb");
const options = { path: instanceURL };
if (!!authToken) {
if (!authTokenHeader)
return {
valid: false,
message: "Auth token set but no request header set - set a header!",
};
options.fetchOptions = {};
options.fetchOptions.headers = { [authTokenHeader]: authToken };
}
try {
const client = new ChromaClient(options);
await client.heartbeat(); // Will abort if no connection is possible.
return { valid: true, message: null };
} catch (e) {
return {
valid: false,
message:
e.message ||
"Could not connect to Chroma instance with those credentials.",
};
}
}
async function validatePinecone({ environment, index, apiKey }) {
const { Pinecone } = require("@pinecone-database/pinecone");
try {
const client = new Pinecone({ apiKey });
const { status } = await client.describeIndex({
indexName: index,
});
if (!status.ready) throw new Error("Pinecone::Index not ready or found.");
return { valid: true, message: null };
} catch (e) {
return { valid: false, message: e.message };
}
}
async function validateQDrant({ clusterUrl, apiKey }) {
const { QdrantClient } = require("@qdrant/js-client-rest");
try {
const client = new QdrantClient({
url: clusterUrl,
...(apiKey ? { apiKey } : {}),
});
const online = (await client.api("cluster")?.clusterStatus())?.ok || false;
if (!online) throw new Error("qDrant::Cluster not ready or found.");
return { valid: true, message: null };
} catch (e) {
return { valid: false, message: e.message };
}
}
async function validateWeaviate({ clusterUrl, apiKey }) {
const { default: weaviate } = require("weaviate-ts-client");
try {
const weaviateUrl = new URL(clusterUrl);
const options = {
scheme: weaviateUrl.protocol?.replace(":", "") || "http",
host: weaviateUrl?.host,
...(apiKey ? { apiKey: new weaviate.ApiKey(apiKey) } : {}),
};
const client = weaviate.client(options);
const clusterReady = await client.misc.liveChecker().do();
if (!clusterReady) throw new Error("Weaviate::Cluster not ready.");
return { valid: true, message: null };
} catch (e) {
return { valid: false, message: e.message };
}
}
module.exports = {
validateNewDatabaseConnector,
validateChroma,
validatePinecone,
validateQDrant,
validateWeaviate,
};