Files
2023-09-28 17:42:05 -07:00

144 lines
4.5 KiB
JavaScript

const { Queue } = require('../../../backend/models/queue');
const {
Chroma,
} = require('../../../backend/utils/vectordatabases/providers/chroma');
const {
QDrant,
} = require('../../../backend/utils/vectordatabases/providers/qdrant');
const {
Weaviate,
} = require('../../../backend/utils/vectordatabases/providers/weaviate');
const { InngestClient } = require('../../utils/inngest');
const newWorkspaceCreated = InngestClient.createFunction(
{ name: 'New Namespace or Collection' },
{ event: 'workspace/new' },
async ({ event, step: _step, logger }) => {
var result = {};
const { workspace, connector, jobId } = event.data;
if (!['chroma', 'qdrant', 'weaviate'].includes(connector.type)) {
result = {
message: `Connector type does not support empty collection creation - nothing to do.`,
};
await Queue.updateJob(jobId, Queue.status.complete, result);
return { result };
}
if (connector.type === 'chroma') {
try {
const chromaClient = new Chroma(connector);
const { client } = await chromaClient.connect();
const collection = await client.createCollection({
name: workspace.fname,
});
if (!collection) {
result = {
message: `No collection could be created with name ${workspace.fname} - nothing to do.`,
};
await Queue.updateJob(jobId, Queue.status.failed, result);
return { result };
}
result = {
message: `Collection ${workspace.fname} created in Chroma.`,
};
await Queue.updateJob(jobId, Queue.status.complete, result);
return { result };
} catch (e) {
const result = {
message: `Job failed with error`,
error: e.message,
details: e,
};
await Queue.updateJob(jobId, Queue.status.failed, result);
return { result };
}
}
if (connector.type === 'qdrant') {
try {
const qdrantClient = new QDrant(connector);
const { client } = await qdrantClient.connect();
const collectionCreated = await client.createCollection(
workspace.fname,
{
vectors: {
size: 1536, // TODO: Fixed to OpenAI models - when other embeddings exist make variable.
distance: 'Cosine',
},
}
);
if (!collectionCreated) {
result = {
message: `No collection could be created with name ${workspace.fname} - nothing to do.`,
};
await Queue.updateJob(jobId, Queue.status.failed, result);
return { result };
}
result = {
message: `Collection ${workspace.fname} created in QDrant.`,
};
await Queue.updateJob(jobId, Queue.status.complete, result);
return { result };
} catch (e) {
const result = {
message: `Job failed with error`,
error: e.message,
details: e,
};
await Queue.updateJob(jobId, Queue.status.failed, result);
return { result };
}
}
if (connector.type === 'weaviate') {
try {
const weaviateClient = new Weaviate(connector);
const className = weaviateClient.camelCase(workspace.fname);
const { client } = await weaviateClient.connect();
const collectionCreated = await client.schema
.classCreator()
.withClass({
class: className,
description: `Class created by VectorAdmin named ${className}`,
vectorizer: 'none',
})
.do();
if (!collectionCreated?.class) {
result = {
message: `No collection could be created with name ${workspace.fname} - nothing to do.`,
};
await Queue.updateJob(jobId, Queue.status.failed, result);
return { result };
}
result = {
message: `Collection ${workspace.fname} (class ${className}) created in Weaviate.`,
};
await Queue.updateJob(jobId, Queue.status.complete, result);
return { result };
} catch (e) {
const result = {
message: `Job failed with error`,
error: e.message,
details: e,
};
await Queue.updateJob(jobId, Queue.status.failed, result);
return { result };
}
}
result = { message: `Nothing to do.` };
await Queue.updateJob(jobId, Queue.status.complete, result);
return { result };
}
);
module.exports = {
newWorkspaceCreated,
};