plugin-knowledge-base 1.0.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/README.md +24 -0
- package/client.d.ts +2 -0
- package/client.js +1 -0
- package/dist/client/index.js +10 -0
- package/dist/externalVersion.js +22 -0
- package/dist/index.js +48 -0
- package/dist/locale/en-US.json +44 -0
- package/dist/locale/vi-VN.json +44 -0
- package/dist/node_modules/@langchain/textsplitters/LICENSE +21 -0
- package/dist/node_modules/@langchain/textsplitters/dist/_virtual/rolldown_runtime.cjs +25 -0
- package/dist/node_modules/@langchain/textsplitters/dist/index.cjs +7 -0
- package/dist/node_modules/@langchain/textsplitters/dist/index.d.cts +2 -0
- package/dist/node_modules/@langchain/textsplitters/dist/index.d.ts +2 -0
- package/dist/node_modules/@langchain/textsplitters/dist/index.js +3 -0
- package/dist/node_modules/@langchain/textsplitters/dist/text_splitter.cjs +539 -0
- package/dist/node_modules/@langchain/textsplitters/dist/text_splitter.d.cts +84 -0
- package/dist/node_modules/@langchain/textsplitters/dist/text_splitter.d.ts +84 -0
- package/dist/node_modules/@langchain/textsplitters/dist/text_splitter.js +532 -0
- package/dist/node_modules/@langchain/textsplitters/package.json +1 -0
- package/dist/server/collections/ai-knowledge-base-documents.js +88 -0
- package/dist/server/collections/ai-knowledge-bases.js +105 -0
- package/dist/server/collections/ai-vector-databases.js +63 -0
- package/dist/server/collections/ai-vector-stores.js +72 -0
- package/dist/server/features/knowledge-base-impl.js +94 -0
- package/dist/server/features/vector-database-impl.js +75 -0
- package/dist/server/features/vector-database-provider-impl.js +63 -0
- package/dist/server/features/vector-store-provider-impl.js +141 -0
- package/dist/server/index.js +49 -0
- package/dist/server/pipeline/text-splitter.js +69 -0
- package/dist/server/pipeline/vectorization.js +144 -0
- package/dist/server/plugin.js +131 -0
- package/dist/server/providers/pgvector.js +134 -0
- package/dist/server/resources/ai-knowledge-base-documents.js +134 -0
- package/dist/server/resources/ai-knowledge-base.js +168 -0
- package/dist/server/resources/ai-vector-databases.js +122 -0
- package/dist/server/resources/ai-vector-stores.js +95 -0
- package/package.json +40 -0
- package/server.d.ts +2 -0
- package/server.js +1 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
13
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
+
var __export = (target, all) => {
|
|
15
|
+
for (var name in all)
|
|
16
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
17
|
+
};
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
+
for (let key of __getOwnPropNames(from))
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
+
}
|
|
24
|
+
return to;
|
|
25
|
+
};
|
|
26
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
27
|
+
var ai_knowledge_bases_exports = {};
|
|
28
|
+
__export(ai_knowledge_bases_exports, {
|
|
29
|
+
default: () => ai_knowledge_bases_default
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(ai_knowledge_bases_exports);
|
|
32
|
+
var import_database = require("@nocobase/database");
|
|
33
|
+
var ai_knowledge_bases_default = (0, import_database.defineCollection)({
|
|
34
|
+
name: "aiKnowledgeBases",
|
|
35
|
+
fields: [
|
|
36
|
+
{
|
|
37
|
+
type: "uid",
|
|
38
|
+
name: "id",
|
|
39
|
+
primaryKey: true
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
type: "string",
|
|
43
|
+
name: "name",
|
|
44
|
+
length: 255
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
type: "text",
|
|
48
|
+
name: "description"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
// LOCAL | READONLY | EXTERNAL
|
|
52
|
+
type: "string",
|
|
53
|
+
name: "type",
|
|
54
|
+
defaultValue: "LOCAL"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
// Reference to plugin-file-manager storage
|
|
58
|
+
type: "string",
|
|
59
|
+
name: "fileStorage"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
type: "belongsTo",
|
|
63
|
+
name: "vectorStore",
|
|
64
|
+
target: "aiVectorStores",
|
|
65
|
+
foreignKey: "vectorStoreId"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
type: "boolean",
|
|
69
|
+
name: "enabled",
|
|
70
|
+
defaultValue: true
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
// BASIC (per-user) | SHARED (role-based) | PUBLIC (system-wide)
|
|
74
|
+
type: "string",
|
|
75
|
+
name: "accessLevel",
|
|
76
|
+
defaultValue: "PUBLIC"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
// Owner userId (for BASIC KBs — only this user can access)
|
|
80
|
+
type: "bigInt",
|
|
81
|
+
name: "ownerId"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
// Roles allowed to query/view (for SHARED KBs)
|
|
85
|
+
type: "array",
|
|
86
|
+
name: "allowedRoles"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
// Roles allowed to upload documents (for SHARED KBs)
|
|
90
|
+
type: "array",
|
|
91
|
+
name: "uploadRoles"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
// Extra configuration per knowledge base type
|
|
95
|
+
type: "json",
|
|
96
|
+
name: "options"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
type: "hasMany",
|
|
100
|
+
name: "documents",
|
|
101
|
+
target: "aiKnowledgeBaseDocuments",
|
|
102
|
+
foreignKey: "knowledgeBaseId"
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
13
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
+
var __export = (target, all) => {
|
|
15
|
+
for (var name in all)
|
|
16
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
17
|
+
};
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
+
for (let key of __getOwnPropNames(from))
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
+
}
|
|
24
|
+
return to;
|
|
25
|
+
};
|
|
26
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
27
|
+
var ai_vector_databases_exports = {};
|
|
28
|
+
__export(ai_vector_databases_exports, {
|
|
29
|
+
default: () => ai_vector_databases_default
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(ai_vector_databases_exports);
|
|
32
|
+
var import_database = require("@nocobase/database");
|
|
33
|
+
var ai_vector_databases_default = (0, import_database.defineCollection)({
|
|
34
|
+
name: "aiVectorDatabases",
|
|
35
|
+
fields: [
|
|
36
|
+
{
|
|
37
|
+
type: "uid",
|
|
38
|
+
name: "id",
|
|
39
|
+
primaryKey: true
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
type: "string",
|
|
43
|
+
name: "name",
|
|
44
|
+
length: 255
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
// Provider type: pgvector (extensible)
|
|
48
|
+
type: "string",
|
|
49
|
+
name: "provider",
|
|
50
|
+
defaultValue: "pgvector"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
// Connection parameters: { host, port, username, password, database, tableName }
|
|
54
|
+
type: "json",
|
|
55
|
+
name: "connectParams"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
type: "boolean",
|
|
59
|
+
name: "enabled",
|
|
60
|
+
defaultValue: true
|
|
61
|
+
}
|
|
62
|
+
]
|
|
63
|
+
});
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
13
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
+
var __export = (target, all) => {
|
|
15
|
+
for (var name in all)
|
|
16
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
17
|
+
};
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
+
for (let key of __getOwnPropNames(from))
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
+
}
|
|
24
|
+
return to;
|
|
25
|
+
};
|
|
26
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
27
|
+
var ai_vector_stores_exports = {};
|
|
28
|
+
__export(ai_vector_stores_exports, {
|
|
29
|
+
default: () => ai_vector_stores_default
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(ai_vector_stores_exports);
|
|
32
|
+
var import_database = require("@nocobase/database");
|
|
33
|
+
var ai_vector_stores_default = (0, import_database.defineCollection)({
|
|
34
|
+
name: "aiVectorStores",
|
|
35
|
+
fields: [
|
|
36
|
+
{
|
|
37
|
+
type: "uid",
|
|
38
|
+
name: "id",
|
|
39
|
+
primaryKey: true
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
type: "string",
|
|
43
|
+
name: "name",
|
|
44
|
+
length: 255
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
type: "belongsTo",
|
|
48
|
+
name: "vectorDatabase",
|
|
49
|
+
target: "aiVectorDatabases",
|
|
50
|
+
foreignKey: "vectorDatabaseId"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
// LLM service name (references llmServices collection)
|
|
54
|
+
type: "string",
|
|
55
|
+
name: "llmService"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
// Embedding model name, e.g. text-embedding-3-small
|
|
59
|
+
type: "string",
|
|
60
|
+
name: "embeddingModel"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
type: "json",
|
|
64
|
+
name: "options"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
type: "boolean",
|
|
68
|
+
name: "enabled",
|
|
69
|
+
defaultValue: true
|
|
70
|
+
}
|
|
71
|
+
]
|
|
72
|
+
});
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
13
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
+
var __export = (target, all) => {
|
|
15
|
+
for (var name in all)
|
|
16
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
17
|
+
};
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
+
for (let key of __getOwnPropNames(from))
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
+
}
|
|
24
|
+
return to;
|
|
25
|
+
};
|
|
26
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
27
|
+
var knowledge_base_impl_exports = {};
|
|
28
|
+
__export(knowledge_base_impl_exports, {
|
|
29
|
+
KnowledgeBaseFeatureImpl: () => KnowledgeBaseFeatureImpl
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(knowledge_base_impl_exports);
|
|
32
|
+
class KnowledgeBaseFeatureImpl {
|
|
33
|
+
constructor(plugin) {
|
|
34
|
+
this.plugin = plugin;
|
|
35
|
+
}
|
|
36
|
+
async getKnowledgeBaseGroup(knowledgeBaseIds) {
|
|
37
|
+
var _a, _b;
|
|
38
|
+
if (!knowledgeBaseIds || knowledgeBaseIds.length === 0) {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
const repo = this.plugin.db.getRepository("aiKnowledgeBases");
|
|
42
|
+
const knowledgeBases = await repo.find({
|
|
43
|
+
filter: {
|
|
44
|
+
id: { $in: knowledgeBaseIds },
|
|
45
|
+
enabled: true
|
|
46
|
+
},
|
|
47
|
+
appends: ["vectorStore", "vectorStore.vectorDatabase"]
|
|
48
|
+
});
|
|
49
|
+
const groups = /* @__PURE__ */ new Map();
|
|
50
|
+
for (const kb of knowledgeBases) {
|
|
51
|
+
const kbData = kb.toJSON();
|
|
52
|
+
const vectorStore = kbData.vectorStore;
|
|
53
|
+
if (!vectorStore) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const vectorStoreConfigId = vectorStore.id;
|
|
57
|
+
const vectorStoreProvider = ((_a = vectorStore.vectorDatabase) == null ? void 0 : _a.provider) ?? "pgvector";
|
|
58
|
+
const groupKey = `${vectorStoreProvider}:${vectorStoreConfigId}`;
|
|
59
|
+
if (!groups.has(groupKey)) {
|
|
60
|
+
groups.set(groupKey, {
|
|
61
|
+
vectorStoreConfig: {
|
|
62
|
+
vectorStoreProvider,
|
|
63
|
+
vectorStoreConfigId
|
|
64
|
+
},
|
|
65
|
+
knowledgeBaseType: kbData.type ?? "LOCAL",
|
|
66
|
+
knowledgeBaseList: []
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
const group = groups.get(groupKey);
|
|
70
|
+
const kbEntry = {
|
|
71
|
+
knowledgeBaseType: kbData.type ?? "LOCAL",
|
|
72
|
+
knowledgeBaseOuterId: kbData.id,
|
|
73
|
+
name: kbData.name,
|
|
74
|
+
description: kbData.description ?? "",
|
|
75
|
+
vectorStoreProvider,
|
|
76
|
+
vectorStoreConfigId,
|
|
77
|
+
vectorStoreProps: [
|
|
78
|
+
...((_b = kbData.options) == null ? void 0 : _b.vectorStoreProps) ?? [],
|
|
79
|
+
// Pass accessLevel for downstream vector filtering (Fix #2)
|
|
80
|
+
{ key: "accessLevel", value: kbData.accessLevel ?? "PUBLIC" },
|
|
81
|
+
// Pass ownerId for BASIC KB per-user vector filtering
|
|
82
|
+
...kbData.accessLevel === "BASIC" && kbData.ownerId ? [{ key: "ownerId", value: String(kbData.ownerId) }] : []
|
|
83
|
+
],
|
|
84
|
+
enabled: kbData.enabled
|
|
85
|
+
};
|
|
86
|
+
group.knowledgeBaseList.push(kbEntry);
|
|
87
|
+
}
|
|
88
|
+
return Array.from(groups.values());
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
92
|
+
0 && (module.exports = {
|
|
93
|
+
KnowledgeBaseFeatureImpl
|
|
94
|
+
});
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
13
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
+
var __export = (target, all) => {
|
|
15
|
+
for (var name in all)
|
|
16
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
17
|
+
};
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
+
for (let key of __getOwnPropNames(from))
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
+
}
|
|
24
|
+
return to;
|
|
25
|
+
};
|
|
26
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
27
|
+
var vector_database_impl_exports = {};
|
|
28
|
+
__export(vector_database_impl_exports, {
|
|
29
|
+
VectorDatabaseFeatureImpl: () => VectorDatabaseFeatureImpl
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(vector_database_impl_exports);
|
|
32
|
+
class VectorDatabaseFeatureImpl {
|
|
33
|
+
constructor(plugin) {
|
|
34
|
+
this.plugin = plugin;
|
|
35
|
+
}
|
|
36
|
+
async getVectorDatabaseInfo(id) {
|
|
37
|
+
const repo = this.plugin.db.getRepository("aiVectorDatabases");
|
|
38
|
+
const record = await repo.findOne({
|
|
39
|
+
filter: { id }
|
|
40
|
+
});
|
|
41
|
+
if (!record) {
|
|
42
|
+
throw new Error(`Vector database with id "${id}" not found`);
|
|
43
|
+
}
|
|
44
|
+
const data = record.toJSON();
|
|
45
|
+
return {
|
|
46
|
+
id: data.id,
|
|
47
|
+
name: data.name,
|
|
48
|
+
databaseSpec: data.provider,
|
|
49
|
+
provider: data.provider,
|
|
50
|
+
connectProps: data.connectParams,
|
|
51
|
+
enabled: data.enabled
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async listVectorDatabasesInfo() {
|
|
55
|
+
const repo = this.plugin.db.getRepository("aiVectorDatabases");
|
|
56
|
+
const records = await repo.find({
|
|
57
|
+
filter: { enabled: true }
|
|
58
|
+
});
|
|
59
|
+
return records.map((record) => {
|
|
60
|
+
const data = record.toJSON();
|
|
61
|
+
return {
|
|
62
|
+
id: data.id,
|
|
63
|
+
name: data.name,
|
|
64
|
+
databaseSpec: data.provider,
|
|
65
|
+
provider: data.provider,
|
|
66
|
+
connectProps: data.connectParams,
|
|
67
|
+
enabled: data.enabled
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
73
|
+
0 && (module.exports = {
|
|
74
|
+
VectorDatabaseFeatureImpl
|
|
75
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
13
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
+
var __export = (target, all) => {
|
|
15
|
+
for (var name in all)
|
|
16
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
17
|
+
};
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
+
for (let key of __getOwnPropNames(from))
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
+
}
|
|
24
|
+
return to;
|
|
25
|
+
};
|
|
26
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
27
|
+
var vector_database_provider_impl_exports = {};
|
|
28
|
+
__export(vector_database_provider_impl_exports, {
|
|
29
|
+
VectorDatabaseProviderImpl: () => VectorDatabaseProviderImpl
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(vector_database_provider_impl_exports);
|
|
32
|
+
class VectorDatabaseProviderImpl {
|
|
33
|
+
providers = /* @__PURE__ */ new Map();
|
|
34
|
+
register(providerInfo) {
|
|
35
|
+
this.providers.set(providerInfo.name, providerInfo);
|
|
36
|
+
}
|
|
37
|
+
validateConnectParams(providerName, connectParams) {
|
|
38
|
+
const providerInfo = this.getProvider(providerName);
|
|
39
|
+
providerInfo.provider.validateConnectParams(connectParams);
|
|
40
|
+
}
|
|
41
|
+
async testConnection(providerName, connectParams) {
|
|
42
|
+
const providerInfo = this.getProvider(providerName);
|
|
43
|
+
return providerInfo.provider.testConnection(connectParams);
|
|
44
|
+
}
|
|
45
|
+
async createVectorStore(providerName, embeddings, connectParams) {
|
|
46
|
+
const providerInfo = this.getProvider(providerName);
|
|
47
|
+
return providerInfo.provider.createVectorStore(embeddings, connectParams);
|
|
48
|
+
}
|
|
49
|
+
listProviders() {
|
|
50
|
+
return Array.from(this.providers.values());
|
|
51
|
+
}
|
|
52
|
+
getProvider(name) {
|
|
53
|
+
const providerInfo = this.providers.get(name);
|
|
54
|
+
if (!providerInfo) {
|
|
55
|
+
throw new Error(`Vector database provider "${name}" is not registered`);
|
|
56
|
+
}
|
|
57
|
+
return providerInfo;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
61
|
+
0 && (module.exports = {
|
|
62
|
+
VectorDatabaseProviderImpl
|
|
63
|
+
});
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
13
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
+
var __export = (target, all) => {
|
|
15
|
+
for (var name in all)
|
|
16
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
17
|
+
};
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
+
for (let key of __getOwnPropNames(from))
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
+
}
|
|
24
|
+
return to;
|
|
25
|
+
};
|
|
26
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
27
|
+
var vector_store_provider_impl_exports = {};
|
|
28
|
+
__export(vector_store_provider_impl_exports, {
|
|
29
|
+
VectorStoreProviderImpl: () => VectorStoreProviderImpl
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(vector_store_provider_impl_exports);
|
|
32
|
+
class VectorStoreProviderImpl {
|
|
33
|
+
constructor(plugin, aiPlugin) {
|
|
34
|
+
this.plugin = plugin;
|
|
35
|
+
this.aiPlugin = aiPlugin;
|
|
36
|
+
}
|
|
37
|
+
providers = /* @__PURE__ */ new Map();
|
|
38
|
+
register(vsp) {
|
|
39
|
+
this.providers.set(vsp.providerName, vsp);
|
|
40
|
+
}
|
|
41
|
+
async createVectorStoreService(providerName, vectorStoreProps) {
|
|
42
|
+
const provider = this.providers.get(providerName);
|
|
43
|
+
if (provider) {
|
|
44
|
+
return provider.createVectorStoreService(vectorStoreProps);
|
|
45
|
+
}
|
|
46
|
+
return this.createDefaultVectorStoreService(vectorStoreProps);
|
|
47
|
+
}
|
|
48
|
+
async createDefaultVectorStoreService(vectorStoreProps) {
|
|
49
|
+
const propsMap = new Map(
|
|
50
|
+
(vectorStoreProps ?? []).map((p) => [p.key, p.value])
|
|
51
|
+
);
|
|
52
|
+
const vectorStoreConfigId = propsMap.get("vectorStoreConfigId");
|
|
53
|
+
if (!vectorStoreConfigId) {
|
|
54
|
+
throw new Error("vectorStoreConfigId is required");
|
|
55
|
+
}
|
|
56
|
+
const vectorStoreRecord = await this.plugin.db.getRepository("aiVectorStores").findOne({
|
|
57
|
+
filter: { id: vectorStoreConfigId },
|
|
58
|
+
appends: ["vectorDatabase"]
|
|
59
|
+
});
|
|
60
|
+
if (!vectorStoreRecord) {
|
|
61
|
+
throw new Error(`Vector store "${vectorStoreConfigId}" not found`);
|
|
62
|
+
}
|
|
63
|
+
const vectorStoreConfig = vectorStoreRecord.toJSON();
|
|
64
|
+
const vectorDatabase = vectorStoreConfig.vectorDatabase;
|
|
65
|
+
if (!vectorDatabase) {
|
|
66
|
+
throw new Error("Vector store has no associated vector database");
|
|
67
|
+
}
|
|
68
|
+
const embeddings = await this.createEmbeddings(
|
|
69
|
+
vectorStoreConfig.llmService,
|
|
70
|
+
vectorStoreConfig.embeddingModel
|
|
71
|
+
);
|
|
72
|
+
const vdbProviderFeature = this.aiPlugin.features.vectorDatabaseProvider;
|
|
73
|
+
const vectorStore = await vdbProviderFeature.createVectorStore(
|
|
74
|
+
vectorDatabase.provider,
|
|
75
|
+
embeddings,
|
|
76
|
+
vectorDatabase.connectParams
|
|
77
|
+
);
|
|
78
|
+
const accessLevel = propsMap.get("accessLevel");
|
|
79
|
+
const ownerId = propsMap.get("ownerId");
|
|
80
|
+
return new DefaultVectorStoreService(vectorStore, { accessLevel, ownerId });
|
|
81
|
+
}
|
|
82
|
+
async createEmbeddings(llmServiceName, embeddingModel) {
|
|
83
|
+
const llmServiceRecord = await this.plugin.db.getRepository("llmServices").findOne({
|
|
84
|
+
filter: { name: llmServiceName }
|
|
85
|
+
});
|
|
86
|
+
if (!llmServiceRecord) {
|
|
87
|
+
throw new Error(`LLM service "${llmServiceName}" not found`);
|
|
88
|
+
}
|
|
89
|
+
const llmService = llmServiceRecord.toJSON();
|
|
90
|
+
const providerMeta = this.aiPlugin.aiManager.llmProviders.get(llmService.provider);
|
|
91
|
+
if (!(providerMeta == null ? void 0 : providerMeta.embedding)) {
|
|
92
|
+
throw new Error(
|
|
93
|
+
`LLM provider "${llmService.provider}" does not support embedding`
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
const embeddingProvider = new providerMeta.embedding({
|
|
97
|
+
app: this.plugin.app,
|
|
98
|
+
serviceOptions: llmService.options,
|
|
99
|
+
modelOptions: { model: embeddingModel }
|
|
100
|
+
});
|
|
101
|
+
return embeddingProvider.createEmbedding();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
class DefaultVectorStoreService {
|
|
105
|
+
constructor(vectorStore, accessContext = {}) {
|
|
106
|
+
this.vectorStore = vectorStore;
|
|
107
|
+
this.accessContext = accessContext;
|
|
108
|
+
}
|
|
109
|
+
async getVectorStore() {
|
|
110
|
+
return this.vectorStore;
|
|
111
|
+
}
|
|
112
|
+
async search(query, options) {
|
|
113
|
+
const { topK = 3, score, filter } = options ?? {};
|
|
114
|
+
let mergedFilter = filter;
|
|
115
|
+
if (this.accessContext.accessLevel === "BASIC" && this.accessContext.ownerId) {
|
|
116
|
+
mergedFilter = {
|
|
117
|
+
...filter,
|
|
118
|
+
userId: this.accessContext.ownerId
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
const results = await this.vectorStore.similaritySearchWithScore(
|
|
122
|
+
query,
|
|
123
|
+
topK,
|
|
124
|
+
mergedFilter
|
|
125
|
+
);
|
|
126
|
+
const scoreThreshold = score ? parseFloat(score) : 0;
|
|
127
|
+
return results.filter(([, resultScore]) => resultScore >= scoreThreshold).map(([doc, resultScore]) => {
|
|
128
|
+
var _a;
|
|
129
|
+
return {
|
|
130
|
+
content: doc.pageContent,
|
|
131
|
+
metadata: doc.metadata || {},
|
|
132
|
+
id: (_a = doc.metadata) == null ? void 0 : _a.id,
|
|
133
|
+
score: resultScore
|
|
134
|
+
};
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
139
|
+
0 && (module.exports = {
|
|
140
|
+
VectorStoreProviderImpl
|
|
141
|
+
});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var __create = Object.create;
|
|
11
|
+
var __defProp = Object.defineProperty;
|
|
12
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
13
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
14
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
15
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
16
|
+
var __export = (target, all) => {
|
|
17
|
+
for (var name2 in all)
|
|
18
|
+
__defProp(target, name2, { get: all[name2], enumerable: true });
|
|
19
|
+
};
|
|
20
|
+
var __copyProps = (to, from, except, desc) => {
|
|
21
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
22
|
+
for (let key of __getOwnPropNames(from))
|
|
23
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
24
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
25
|
+
}
|
|
26
|
+
return to;
|
|
27
|
+
};
|
|
28
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
29
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
30
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
31
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
32
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
33
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
34
|
+
mod
|
|
35
|
+
));
|
|
36
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
37
|
+
var server_exports = {};
|
|
38
|
+
__export(server_exports, {
|
|
39
|
+
default: () => import_plugin.default,
|
|
40
|
+
namespace: () => namespace
|
|
41
|
+
});
|
|
42
|
+
module.exports = __toCommonJS(server_exports);
|
|
43
|
+
var import_package = require("../../package.json");
|
|
44
|
+
var import_plugin = __toESM(require("./plugin"));
|
|
45
|
+
const namespace = import_package.name;
|
|
46
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
47
|
+
0 && (module.exports = {
|
|
48
|
+
namespace
|
|
49
|
+
});
|