From 979e8d23c4618bf3b747c9ba6ca69fbab026b051 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Fri, 1 May 2026 15:02:53 -0500 Subject: [PATCH 1/4] refin knowledge base --- src/lib/helpers/enums.js | 18 +- src/lib/helpers/http.js | 44 ++-- src/lib/helpers/types/knowledgeTypes.js | 27 +-- src/lib/services/api-endpoints.js | 42 ++-- src/lib/services/knowledge-base-service.js | 226 ++++++++++++------ .../agent-knowledge-base.svelte | 10 +- .../[embed]/[embedType]/+page.svelte | 2 +- .../collection/collection-create-modal.svelte | 10 +- .../common/indexes/vector-index-modal.svelte | 8 +- .../vector-item-edit-modal.svelte | 8 +- .../common/vector-table/vector-item.svelte | 8 +- .../knowledge-base/dictionary/+page.svelte | 18 +- .../knowledge-base/documents/+page.svelte | 101 ++++---- ...ad.svelte => knowledge-file-upload.svelte} | 16 +- .../documents/knowledge-upload-modal.svelte | 4 +- .../question-answer/+page.svelte | 141 +++++------ .../knowledge-base/relationships/+page.svelte | 15 +- 17 files changed, 382 insertions(+), 316 deletions(-) rename src/routes/page/knowledge-base/documents/{knowledge-document-upload.svelte => knowledge-file-upload.svelte} (97%) diff --git a/src/lib/helpers/enums.js b/src/lib/helpers/enums.js index 5a1a526e..2f88a121 100644 --- a/src/lib/helpers/enums.js +++ b/src/lib/helpers/enums.js @@ -106,17 +106,21 @@ const agentTaskStatus = { export const AgentTaskStatus = Object.freeze(agentTaskStatus); -const knowledgeCollectionType = { +const knowledgeType = { QuestionAnswer: 'question-answer', - Document: 'document' + Document: 'document', + Taxonomy: 'taxonomy', + SemanticGraph: 'semantic-graph' }; -export const KnowledgeCollectionType = Object.freeze(knowledgeCollectionType); +export const KnowledgeBaseType = Object.freeze(knowledgeType); -const knowledgeCollectionDisplayType = { - [knowledgeCollectionType.QuestionAnswer]: "Q & A", - [knowledgeCollectionType.Document]: "Documents", +const knowledgeBaseDisplayType = { + [knowledgeType.QuestionAnswer]: "Q & A", + [knowledgeType.Document]: "Documents", + [knowledgeType.Taxonomy]: "Taxonomy", + [knowledgeType.SemanticGraph]: "Semantic Graph", }; -export const KnowledgeCollectionDisplayType = Object.freeze(knowledgeCollectionDisplayType); +export const KnowledgeBaseDisplayType = Object.freeze(knowledgeBaseDisplayType); const knowledgePayloadName = { Text: 'text', diff --git a/src/lib/helpers/http.js b/src/lib/helpers/http.js index 0071dfc9..f0dffe53 100644 --- a/src/lib/helpers/http.js +++ b/src/lib/helpers/http.js @@ -190,12 +190,12 @@ function skipLoader(config) { const postRegexes = [ new RegExp('http(s*)://(.*?)/conversation/(.*?)/(.*?)', 'g'), new RegExp('http(s*)://(.*?)/agent', 'g'), - new RegExp('http(s*)://(.*?)/knowledge/vector/(.*?)/page', 'g'), - new RegExp('http(s*)://(.*?)/knowledge/(.*?)/search', 'g'), - new RegExp('http(s*)://(.*?)/knowledge/vector/(.*?)/create', 'g'), - new RegExp('http(s*)://(.*?)/knowledge/document/(.*?)/page', 'g'), - new RegExp('http(s*)://(.*?)/knowledge/document/(.*?)/upload', 'g'), - new RegExp('http(s*)://(.*?)/knowledge/entity/analyze', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/data/page', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/search', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/file/page', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/file/upload', 'g'), + // new RegExp('http(s*)://(.*?)/knowledge/entity/analyze', 'g'), new RegExp('http(s*)://(.*?)/users', 'g'), new RegExp('http(s*)://(.*?)/instruct/(.*?)', 'g'), new RegExp('http(s*)://(.*?)/agent/(.*?)/code-scripts', 'g'), @@ -205,7 +205,7 @@ function skipLoader(config) { /** @type {RegExp[]} */ const putRegexes = [ - new RegExp('http(s*)://(.*?)/knowledge/vector/(.*?)/update', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/data', 'g'), new RegExp('http(s*)://(.*?)/conversation/(.*?)/update-message', 'g'), new RegExp('http(s*)://(.*?)/conversation/(.*?)/update-tags', 'g'), new RegExp('http(s*)://(.*?)/users', 'g'), @@ -213,9 +213,9 @@ function skipLoader(config) { /** @type {RegExp[]} */ const deleteRegexes = [ - new RegExp('http(s*)://(.*?)/knowledge/vector/(.*?)/delete-collection', 'g'), - new RegExp('http(s*)://(.*?)/knowledge/vector/(.*?)/data/(.*?)', 'g'), - new RegExp('http(s*)://(.*?)/knowledge/vector/(.*?)/data', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/data/(.*?)', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/data', 'g'), ]; /** @type {RegExp[]} */ @@ -239,8 +239,9 @@ function skipLoader(config) { new RegExp('http(s*)://(.*?)/conversation/(.*?)/files/(.*?)', 'g'), new RegExp('http(s*)://(.*?)/llm-configs', 'g'), new RegExp('http(s*)://(.*?)/llm-provider/(.*?)/models', 'g'), - new RegExp('http(s*)://(.*?)/knowledge/vector/collections', 'g'), - new RegExp('http(s*)://(.*?)/knowledge/vector/(.*?)/exist', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collections', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/exist', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/details', 'g'), new RegExp('http(s*)://(.*?)/knowledge/processors', 'g'), new RegExp('http(s*)://(.*?)/knowledge/entity/analyzers', 'g'), new RegExp('http(s*)://(.*?)/knowledge/entity/data-providers', 'g'), @@ -274,17 +275,18 @@ function skipLoader(config) { function skipGlobalError(config) { /** @type {RegExp[]} */ const postRegexes = [ - new RegExp('http(s*)://(.*?)/knowledge/vector/(.*?)/page', 'g'), - new RegExp('http(s*)://(.*?)/knowledge/(.*?)/search', 'g'), - new RegExp('http(s*)://(.*?)/knowledge/vector/(.*?)/create', 'g'), - new RegExp('http(s*)://(.*?)/knowledge/document/(.*?)/page', 'g'), - new RegExp('http(s*)://(.*?)/knowledge/vector/create-collection', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/data', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/data/page', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/search', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/file/page', 'g'), new RegExp('http(s*)://(.*?)/refresh-agents', 'g') ]; /** @type {RegExp[]} */ const putRegexes = [ - new RegExp('http(s*)://(.*?)/knowledge/vector/(.*?)/update', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/data', 'g'), new RegExp('http(s*)://(.*?)/role', 'g'), new RegExp('http(s*)://(.*?)/user', 'g'), new RegExp('http(s*)://(.*?)/conversation/(.*?)/update-message', 'g'), @@ -293,9 +295,9 @@ function skipGlobalError(config) { /** @type {RegExp[]} */ const deleteRegexes = [ - new RegExp('http(s*)://(.*?)/knowledge/vector/(.*?)/delete-collection', 'g'), - new RegExp('http(s*)://(.*?)/knowledge/vector/(.*?)/data/(.*?)', 'g'), - new RegExp('http(s*)://(.*?)/knowledge/vector/(.*?)/data', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/data/(.*?)', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/data', 'g'), ]; /** @type {RegExp[]} */ diff --git a/src/lib/helpers/types/knowledgeTypes.js b/src/lib/helpers/types/knowledgeTypes.js index 23cad223..a4fbceb6 100644 --- a/src/lib/helpers/types/knowledgeTypes.js +++ b/src/lib/helpers/types/knowledgeTypes.js @@ -1,8 +1,7 @@ // Knowledgebase /** * @typedef {Object} CreateVectorCollectionRequest - * @property {string} collection_name - The collection name. - * @property {string} collection_type - The collection type. + * @property {string} collectionName - The collection name. * @property {string} provider - The text embedding provider. * @property {string} model - The text embedding model. * @property {number} dimension - The text embedding dimension. @@ -14,25 +13,26 @@ * @property {string[]} [fields] - Data fields. * @property {number} [limit] - Data limit. * @property {number} [confidence] - Confidence. - * @property {boolean} [with_vector] - Include vector or not. - * @property {VectorFilterGroup[]} [filter_groups] - Search filter groups. - * @property {VectorSearchParam} [search_param] - Search params. + * @property {boolean} [withVector] - Include vector or not. + * @property {VectorFilterGroup[]} [filterGroups] - Search filter groups. + * @property {any} [searchParam] - Search params. + * @property {string[]?} [dataProviders] - Data providers */ /** * @typedef {Object} KnowledgeFilter * @property {string | null} [start_id] - The start id. * @property {number} size - Page size. - * @property {boolean} [with_vector] - Include vector or not. + * @property {boolean} [withVector] - Include vector or not. * @property {string[]} [fields] - Included payload fields. - * @property {VectorFilterGroup[]} [filter_groups] - Search filter groups. - * @property {VectorSort?} [order_by] - Sort by. + * @property {VectorFilterGroup[]} [filterGroups] - Search filter groups. + * @property {VectorSort?} [orderBy] - Sort by. */ -/** - * @typedef {Object} VectorSearchParam - * @property {boolean?} [exact_search] - Exact search or not. - */ +// /** +// * @typedef {Object} VectorSearchParam +// * @property {boolean?} [exact_search] - Exact search or not. +// */ /** * @typedef {Object} VectorFilterGroup @@ -83,6 +83,7 @@ * @typedef {Object} KnowledgeSearchViewModel * @property {string} id - The knowledge data id. * @property {any} payload - The knowledge payload. + * @property {any} data - The knowledge payload. * @property {number} [score] - The knowledge score. * @property {number[]} [vector] - The knowledge vector. * @property {number} [vector_dimension] - The vector dimension. @@ -143,8 +144,6 @@ /** * @typedef {Object} VectorCollectionDetails * @property {string} status - * @property {number} vectors_count - * @property {number} points_count * @property {PayloadSchemaDetail[]} payload_schema */ diff --git a/src/lib/services/api-endpoints.js b/src/lib/services/api-endpoints.js index b729cc85..2e018c9c 100644 --- a/src/lib/services/api-endpoints.js +++ b/src/lib/services/api-endpoints.js @@ -97,32 +97,32 @@ export const endpoints = { loggingStateLogUrl: `${host}/logger/conversation/{conversationId}/state-log`, // knowledge base - vectorCollectionExistUrl: `${host}/knowledge/vector/{collection}/exist`, - vectorCollectionsUrl: `${host}/knowledge/vector/collections`, - vectorCollectionDetailsUrl: `${host}/knowledge/vector/{collection}/details`, - vectorKnowledgePageListUrl: `${host}/knowledge/vector/{collection}/page`, - vectorKnowledgeSearchUrl: `${host}/knowledge/vector/{collection}/search`, - vectorKnowledgeCreateUrl: `${host}/knowledge/vector/{collection}/create`, - vectorKnowledgeUpdateUrl: `${host}/knowledge/vector/{collection}/update`, - vectorKnowledgeDeleteUrl: `${host}/knowledge/vector/{collection}/data/{id}`, - vectorKnowledgeDeleteAllUrl: `${host}/knowledge/vector/{collection}/data`, - vectorKnowledgeUploadUrl: `${host}/knowledge/vector/{collection}/upload`, - vectorCollectionCreateUrl: `${host}/knowledge/vector/create-collection`, - vectorCollectionDeleteUrl: `${host}/knowledge/vector/{collection}/delete-collection`, - vectorIndexesCreateUrl: `${host}/knowledge/vector/{collection}/payload/indexes`, - vectorIndexesDeleteUrl: `${host}/knowledge/vector/{collection}/payload/indexes`, + knowledgeCollectionExistUrl: `${host}/knowledge/collection/{collection}/exist`, + knowledgeCollectionDetailsUrl: `${host}/knowledge/collection/{collection}/details`, + knowledgeCollectionsUrl: `${host}/knowledge/collections`, + knowledgeCollectionCreateUrl: `${host}/knowledge/collection`, + knowledgeCollectionDeleteUrl: `${host}/knowledge/collection/{collection}`, + + knowledgeDataSearchUrl: `${host}/knowledge/collection/{collection}/search`, + knowledgeDataPageListUrl: `${host}/knowledge/collection/{collection}/data/page`, + knowledgeDataCreateUrl: `${host}/knowledge/collection/{collection}/data`, + knowledgeDataUpdateUrl: `${host}/knowledge/collection/{collection}/data`, + knowledgeDataDeleteUrl: `${host}/knowledge/collection/{collection}/data/{id}`, + knowledgeDataDeleteAllUrl: `${host}/knowledge/collection/{collection}/data`, - graphKnowledgeSearchUrl: `${host}/knowledge/graph/search`, + knowledgeIndexesCreateUrl: `${host}/knowledge/collection/{collection}/indexes`, + knowledgeIndexesDeleteUrl: `${host}/knowledge/collection/{collection}/indexes`, + + // graphKnowledgeSearchUrl: `${host}/knowledge/graph/search`, - knowledgeDocumentUploadUrl: `${host}/knowledge/document/{collection}/upload`, - knowledgeDocumentDeleteUrl: `${host}/knowledge/document/{collection}/delete/{fileId}`, - knowledgeDocumentDeleteAllUrl: `${host}/knowledge/document/{collection}/delete`, - knowledgeDocumentPageListUrl: `${host}/knowledge/document/{collection}/page`, + knowledgeFileUploadUrl: `${host}/knowledge/collection/{collection}/file/upload`, + knowledgeFileDeleteUrl: `${host}/knowledge/collection/{collection}/file/{fileId}`, + knowledgeFileDeleteAllUrl: `${host}/knowledge/collection/{collection}/file`, + knowledgeFilePageListUrl: `${host}/knowledge/collection/{collection}/file/page`, knowledgeProcessorsUrl: `${host}/knowledge/processors`, entityAnalyzersUrl: `${host}/knowledge/entity/analyzers`, - entityDataLoadersUrl: `${host}/knowledge/entity/data-providers`, - entityAnalyzeUrl: `${host}/knowledge/entity/analyze`, + entityDataProvidersUrl: `${host}/knowledge/entity/data-providers`, // chathub chatHubUrl: `${host}/chatHub`, diff --git a/src/lib/services/knowledge-base-service.js b/src/lib/services/knowledge-base-service.js index 84827911..e031f788 100644 --- a/src/lib/services/knowledge-base-service.js +++ b/src/lib/services/knowledge-base-service.js @@ -5,26 +5,55 @@ import axios from 'axios'; /** * @param {string} collection + * @param {string} knowledgeType + * @param {string?} dbProvider * @returns {Promise} */ -export async function existVectorCollection(collection) { - const url = replaceUrl(endpoints.vectorCollectionExistUrl, { +export async function existKnowledgeCollection(collection, knowledgeType, dbProvider = null) { + const url = replaceUrl(endpoints.knowledgeCollectionExistUrl, { collection: collection }); - const response = await axios.get(url); + const response = await axios.get(url, { + params: { + knowledgeType: knowledgeType, + dbProvider: dbProvider + } + }); return response.data; } /** - * @param {string?} type + * @param {string?} knowledgeType + * @param {string?} dbProvider * @returns {Promise} */ -export async function getVectorKnowledgeCollections(type = null) { - const url = endpoints.vectorCollectionsUrl; +export async function getKnowledgeCollections(knowledgeType = null, dbProvider = null) { + const url = endpoints.knowledgeCollectionsUrl; + const response = await axios.get(url, { + params: { + knowledgeType: knowledgeType, + dbProvider: dbProvider + } + }); + return response.data; +} + +/** + * @param {string} collection + * @param {string} knowledgeType + * @param {string?} dbProvider + * @returns {Promise} + */ +export async function getKnowledgeCollectionDetails(collection, knowledgeType, dbProvider = null) { + const url = replaceUrl(endpoints.knowledgeCollectionDetailsUrl, { + collection: collection + }); + const response = await axios.get(url, { params: { - type: type + knowledgeType: knowledgeType, + dbProvider: dbProvider } }); return response.data; @@ -33,28 +62,40 @@ export async function getVectorKnowledgeCollections(type = null) { /** * @param {string} collection * @param {import('$knowledgeTypes').SearchKnowledgeRequest} request + * @param {string} knowledgeType + * @param {string?} dbProvider * @returns {Promise} */ -export async function searchVectorKnowledge(collection, request) { - const url = replaceUrl(endpoints.vectorKnowledgeSearchUrl, { +export async function searchKnowledge(collection, request, knowledgeType, dbProvider = null) { + const url = replaceUrl(endpoints.knowledgeDataSearchUrl, { collection: collection }); - const response = await axios.post(url, { ...request }); + const response = await axios.post(url, { + ...request, + knowledgeType: knowledgeType, + dbProvider: dbProvider + }); return response.data; } /** * @param {string} collection * @param {import('$knowledgeTypes').KnowledgeFilter} filter + * @param {string} knowledgeType + * @param {string?} dbProvider * @returns {Promise} */ -export async function getVectorKnowledgePageList(collection, filter) { - const url = replaceUrl(endpoints.vectorKnowledgePageListUrl, { +export async function getKnowledgePageList(collection, filter, knowledgeType, dbProvider = null) { + const url = replaceUrl(endpoints.knowledgeDataPageListUrl, { collection: collection }); - const response = await axios.post(url, { ...filter }); + const response = await axios.post(url, { + ...filter, + knowledgeType: knowledgeType, + dbProvider: dbProvider + }); return response.data; } @@ -62,15 +103,19 @@ export async function getVectorKnowledgePageList(collection, filter) { * @param {string} collection * @param {string} text * @param {any} payload + * @param {string} knowledgeType + * @param {string?} dbProvider * @returns {Promise} */ -export async function createVectorKnowledgeData(collection, text, payload = null) { - const url = replaceUrl(endpoints.vectorKnowledgeCreateUrl, { +export async function createKnowledgeData(collection, text, payload, knowledgeType, dbProvider = null) { + const url = replaceUrl(endpoints.knowledgeDataCreateUrl, { collection: collection }); const request = { text: text, + knowledgeType: knowledgeType, + dbProvider: dbProvider, payload: { ...payload, } @@ -85,15 +130,19 @@ export async function createVectorKnowledgeData(collection, text, payload = null * @param {string} collection * @param {string} text * @param {any} payload + * @param {string} knowledgeType + * @param {string?} dbProvider * @returns {Promise} */ -export async function updateVectorKnowledgeData(id, collection, text, payload = null) { - const url = replaceUrl(endpoints.vectorKnowledgeUpdateUrl, { +export async function updateKnowledgeData(id, collection, text, payload, knowledgeType, dbProvider = null) { + const url = replaceUrl(endpoints.knowledgeDataUpdateUrl, { collection: collection }); const request = { id: id, + knowledgeType: knowledgeType, + dbProvider: dbProvider, text: text, payload: { ...payload @@ -106,45 +155,64 @@ export async function updateVectorKnowledgeData(id, collection, text, payload = /** - * @param {string} collection * @param {string} id + * @param {string} collection + * @param {string} knowledgeType + * @param {string?} dbProvider * @returns {Promise} */ -export async function deleteVectorKnowledgeData(collection, id) { - const url = replaceUrl(endpoints.vectorKnowledgeDeleteUrl, { +export async function deleteKnowledgeData(id, collection, knowledgeType, dbProvider = null) { + const url = replaceUrl(endpoints.knowledgeDataDeleteUrl, { collection: collection, id: id }); - const response = await axios.delete(url); + const response = await axios.delete(url, { + data: { + knowledgeType: knowledgeType, + dbProvider: dbProvider + } + }); return response.data; } /** * @param {string} collection + * @param {string} knowledgeType + * @param {string?} dbProvider * @returns {Promise} */ -export async function deleteAllVectorKnowledgeData(collection) { - const url = replaceUrl(endpoints.vectorKnowledgeDeleteAllUrl, { +export async function deleteAllKnowledgeData(collection, knowledgeType, dbProvider = null) { + const url = replaceUrl(endpoints.knowledgeDataDeleteAllUrl, { collection: collection }); - const response = await axios.delete(url); + const response = await axios.delete(url, { + data: { + knowledgeType: knowledgeType, + dbProvider: dbProvider + } + }); return response.data; } /** * @param {string} collection * @param {import('$knowledgeTypes').VectorKnowledgeUploadRequest} request + * @param {string?} dbProvider * @returns {Promise} */ -export async function uploadKnowledgeDocuments(collection, request) { - const url = replaceUrl(endpoints.knowledgeDocumentUploadUrl, { +export async function uploadKnowledgeFiles(collection, request, dbProvider = null) { + const url = replaceUrl(endpoints.knowledgeFileUploadUrl, { collection: collection }); const response = await axios.post(url, { - ...request + ...request, + options: { + ...request.options || {}, + dbProvider: dbProvider + } }); return response.data; } @@ -152,29 +220,40 @@ export async function uploadKnowledgeDocuments(collection, request) { /** * @param {string} collection * @param {string} fileId + * @param {string?} dbProvider * @returns {Promise} */ -export async function deleteKnowledgeDocument(collection, fileId) { - const url = replaceUrl(endpoints.knowledgeDocumentDeleteUrl, { +export async function deleteKnowledgeFile(collection, fileId, dbProvider = null) { + const url = replaceUrl(endpoints.knowledgeFileDeleteUrl, { collection: collection, fileId: fileId }); - const response = await axios.delete(url); + const response = await axios.delete(url, { + data: { + dbProvider: dbProvider + } + }); return response.data; } /** * @param {string} collection * @param {import('$knowledgeTypes').KnowledgeDocRequest} request + * @param {string?} dbProvider * @returns {Promise} */ -export async function deleteAllKnowledgeDocuments(collection, request) { - const url = replaceUrl(endpoints.knowledgeDocumentDeleteAllUrl, { +export async function deleteAllKnowledgeFiles(collection, request, dbProvider = null) { + const url = replaceUrl(endpoints.knowledgeFileDeleteAllUrl, { collection: collection }); - const response = await axios.delete(url, { data: { ...request } }); + const response = await axios.delete(url, { + data: { + ...request, + dbProvider: dbProvider + } + }); return response.data; } @@ -182,14 +261,18 @@ export async function deleteAllKnowledgeDocuments(collection, request) { /** * @param {string} collection * @param {import('$knowledgeTypes').KnowledgeDocRequest} request + * @param {string?} dbProvider * @returns {Promise} */ -export async function getKnowledgeDocumentPageList(collection, request) { - const url = replaceUrl(endpoints.knowledgeDocumentPageListUrl, { +export async function getKnowledgeFilePageList(collection, request, dbProvider = null) { + const url = replaceUrl(endpoints.knowledgeFilePageListUrl, { collection: collection }); - const response = await axios.post(url, { ...request }); + const response = await axios.post(url, { + ...request, + dbProvider: dbProvider + }); return response.data; } @@ -205,24 +288,37 @@ export async function getKnowledgeProcessors() { /** * @param {import('$knowledgeTypes').CreateVectorCollectionRequest} request + * @param {string} knowledgeType + * @param {string?} dbProvider * @returns {Promise} */ -export async function createVectorCollection(request) { - const url = endpoints.vectorCollectionCreateUrl; - const response = await axios.post(url, { ...request }); +export async function createKnowledgeCollection(request, knowledgeType, dbProvider = null) { + const url = endpoints.knowledgeCollectionCreateUrl; + const response = await axios.post(url, { + ...request, + knowledgeType: knowledgeType, + dbProvider: dbProvider + }); return response.data; } /** * @param {string} collection + * @param {string} knowledgeType + * @param {string?} dbProvider * @returns {Promise} */ -export async function deleteVectorCollection(collection) { - const url = replaceUrl(endpoints.vectorCollectionDeleteUrl, { +export async function deleteKnowledgeCollection(collection, knowledgeType, dbProvider = null) { + const url = replaceUrl(endpoints.knowledgeCollectionDeleteUrl, { collection: collection }); - const response = await axios.delete(url); + const response = await axios.delete(url, { + data: { + knowledgeType: knowledgeType, + dbProvider: dbProvider + } + }); return response.data; } @@ -233,35 +329,27 @@ export async function deleteVectorCollection(collection) { * @returns {Promise} */ export async function searchGraphKnowledge(text, method = "local") { - const url = endpoints.graphKnowledgeSearchUrl; + const url = endpoints.knowledgeDataSearchUrl; const response = await axios.post(url, { query: text, method: method }); return response.data; } -/** - * @param {string} collection - * @returns {Promise} - */ -export async function getVectorCollectionDetails(collection) { - const url = replaceUrl(endpoints.vectorCollectionDetailsUrl, { - collection: collection - }); - - const response = await axios.get(url); - return response.data; -} /** * @param {string} collection * @param {import('$knowledgeTypes').VectorCollectionIndexOptions[]} options + * @param {string} knowledgeType + * @param {string?} dbProvider * @returns {Promise} */ -export async function createVectorIndexes(collection, options) { - const url = replaceUrl(endpoints.vectorIndexesCreateUrl, { +export async function createKnowledgeIndexes(collection, options, knowledgeType, dbProvider = null) { + const url = replaceUrl(endpoints.knowledgeIndexesCreateUrl, { collection: collection }); const response = await axios.post(url, { + knowledgeType: knowledgeType, + dbProvider: dbProvider, options: options || [] }); return response.data; @@ -270,15 +358,19 @@ export async function createVectorIndexes(collection, options) { /** * @param {string} collection * @param {import('$knowledgeTypes').VectorCollectionIndexOptions[]} options + * @param {string} knowledgeType + * @param {string?} dbProvider * @returns {Promise} */ -export async function deleteVectorIndexes(collection, options) { - const url = replaceUrl(endpoints.vectorIndexesDeleteUrl, { +export async function deleteKnowledgeIndexes(collection, options, knowledgeType, dbProvider = null) { + const url = replaceUrl(endpoints.knowledgeIndexesDeleteUrl, { collection: collection }); const response = await axios.delete(url, { data: { + knowledgeType: knowledgeType, + dbProvider: dbProvider, options: options || [] } }); @@ -286,8 +378,6 @@ export async function deleteVectorIndexes(collection, options) { } - - /** * @returns {Promise} */ @@ -301,19 +391,7 @@ export async function getEntityAnalyzers() { * @returns {Promise} */ export async function getEntityDataLoaders() { - const url = endpoints.entityDataLoadersUrl; + const url = endpoints.entityDataProvidersUrl; const response = await axios.get(url); return response.data; -} - -/** - * @param {import('$knowledgeTypes').EntityAnalysisRequest} request - * @returns {Promise} - */ -export async function analyzeEntity(request) { - const url = endpoints.entityAnalyzeUrl; - const response = await axios.post(url, { - ...request - }); - return response.data; } \ No newline at end of file diff --git a/src/routes/page/agent/[agentId]/agent-components/knowledge-bases/agent-knowledge-base.svelte b/src/routes/page/agent/[agentId]/agent-components/knowledge-bases/agent-knowledge-base.svelte index c1bf188c..25f74a2e 100644 --- a/src/routes/page/agent/[agentId]/agent-components/knowledge-bases/agent-knowledge-base.svelte +++ b/src/routes/page/agent/[agentId]/agent-components/knowledge-bases/agent-knowledge-base.svelte @@ -1,7 +1,7 @@ diff --git a/src/routes/page/knowledge-base/common/collection/collection-create-modal.svelte b/src/routes/page/knowledge-base/common/collection/collection-create-modal.svelte index b479b02a..0e5960f0 100644 --- a/src/routes/page/knowledge-base/common/collection/collection-create-modal.svelte +++ b/src/routes/page/knowledge-base/common/collection/collection-create-modal.svelte @@ -2,7 +2,7 @@ import { onMount } from "svelte"; import { fade } from 'svelte/transition'; import _ from "lodash"; - import { existVectorCollection } from "$lib/services/knowledge-base-service"; + import { existKnowledgeCollection } from "$lib/services/knowledge-base-service"; let { /** @type {boolean} */ @@ -24,7 +24,9 @@ /** @type {(args0: any) => void} */ confirm = () => {}, /** @type {() => void} */ - cancel = () => {} + cancel = () => {}, + /** @type {string} */ + knowledgeType } = $props(); /** @type {string} */ @@ -68,7 +70,7 @@ /** @param {string} text */ function validateCollection(text) { return new Promise((resolve, reject) => { - existVectorCollection(text).then(res => { + existKnowledgeCollection(text, knowledgeType).then(res => { resolve(res); }).catch(err => { reject(err); @@ -91,7 +93,7 @@ isValidCollection = false; } else { confirm?.({ - collection_name: _.trim(collection), + collectionName: _.trim(collection), dimension: dimension, provider: _.trim(provider), model: _.trim(model) diff --git a/src/routes/page/knowledge-base/common/indexes/vector-index-modal.svelte b/src/routes/page/knowledge-base/common/indexes/vector-index-modal.svelte index 92b87be7..94f40dd6 100644 --- a/src/routes/page/knowledge-base/common/indexes/vector-index-modal.svelte +++ b/src/routes/page/knowledge-base/common/indexes/vector-index-modal.svelte @@ -2,7 +2,7 @@ import { onMount, tick } from "svelte"; import { fade } from 'svelte/transition'; // used in template transition directives import util from "lodash"; - import { getVectorCollectionDetails } from "$lib/services/knowledge-base-service"; + import { getKnowledgeCollectionDetails } from "$lib/services/knowledge-base-service"; import { VectorIndexSchemaType } from "$lib/helpers/enums"; import Select from "$lib/common/dropdowns/Select.svelte"; @@ -24,7 +24,9 @@ /** @type {(e: any) => void} */ confirm = () => {}, /** @type {() => void} */ - cancel = () => {} + cancel = () => {}, + /** @type {string} */ + knowledgeType } = $props(); const maxLength = 500; @@ -59,7 +61,7 @@ function getCollectionDetail() { return new Promise((resolve) => { - getVectorCollectionDetails(collection).then(res => { + getKnowledgeCollectionDetails(collection, knowledgeType).then(res => { indexesToAdd = res?.payload_schema?.map(x => ({ field_name: x.field_name, field_schema_type: x.field_data_type diff --git a/src/routes/page/knowledge-base/common/vector-table/vector-item-edit-modal.svelte b/src/routes/page/knowledge-base/common/vector-table/vector-item-edit-modal.svelte index 00180b7b..acec7590 100644 --- a/src/routes/page/knowledge-base/common/vector-table/vector-item-edit-modal.svelte +++ b/src/routes/page/knowledge-base/common/vector-table/vector-item-edit-modal.svelte @@ -2,7 +2,7 @@ import { onMount, tick } from "svelte"; import { fade } from 'svelte/transition'; import { - KnowledgeCollectionType, + KnowledgeBaseType, KnowledgePayloadName, VectorPayloadDataType } from "$lib/helpers/enums"; @@ -16,7 +16,7 @@ /** @type {string} */ collection = '', /** @type {string} */ - collectionType = '', + knowledgeType = '', /** @type {boolean} */ open = false, /** @type {string} */ @@ -47,8 +47,8 @@ value: v.name })); - let isQuestionAnswerCollection = $derived(collectionType === KnowledgeCollectionType.QuestionAnswer); - let isDocumentCollection = $derived(collectionType === KnowledgeCollectionType.Document); + let isQuestionAnswerCollection = $derived(knowledgeType === KnowledgeBaseType.QuestionAnswer); + let isDocumentCollection = $derived(knowledgeType === KnowledgeBaseType.Document); /** @type {{ uuid: string, key: string, value: any }[]} */ let innerPayloads = $state([]); diff --git a/src/routes/page/knowledge-base/common/vector-table/vector-item.svelte b/src/routes/page/knowledge-base/common/vector-table/vector-item.svelte index ba0fc158..24e5846e 100644 --- a/src/routes/page/knowledge-base/common/vector-table/vector-item.svelte +++ b/src/routes/page/knowledge-base/common/vector-table/vector-item.svelte @@ -2,7 +2,7 @@ import { fly } from 'svelte/transition'; import Swal from 'sweetalert2'; import Loader from "$lib/common/spinners/Loader.svelte"; - import { KnowledgeCollectionType, KnowledgePayloadName } from "$lib/helpers/enums"; + import { KnowledgeBaseType, KnowledgePayloadName } from "$lib/helpers/enums"; let { /** @type {import('$knowledgeTypes').KnowledgeSearchViewModel} */ @@ -10,7 +10,7 @@ /** @type {string} */ collection, /** @type {string} */ - collectionType, + knowledgeType, /** @type {boolean} */ open = false, /** @type {boolean} */ @@ -27,8 +27,8 @@ KnowledgePayloadName.Answer ]; - let isQuestionAnswerCollection = $derived(collectionType === KnowledgeCollectionType.QuestionAnswer); - let isDocumentCollection = $derived(collectionType === KnowledgeCollectionType.Document); + let isQuestionAnswerCollection = $derived(knowledgeType === KnowledgeBaseType.QuestionAnswer); + let isDocumentCollection = $derived(knowledgeType === KnowledgeBaseType.Document); let isLoading = $state(false); let loadMore = $state(false); diff --git a/src/routes/page/knowledge-base/dictionary/+page.svelte b/src/routes/page/knowledge-base/dictionary/+page.svelte index 02a6f54f..3482137f 100644 --- a/src/routes/page/knowledge-base/dictionary/+page.svelte +++ b/src/routes/page/knowledge-base/dictionary/+page.svelte @@ -6,7 +6,7 @@ import { getEntityAnalyzers, getEntityDataLoaders, - analyzeEntity + searchKnowledge } from '$lib/services/knowledge-base-service'; import Breadcrumb from '$lib/common/shared/Breadcrumb.svelte'; import HeadTitle from '$lib/common/shared/HeadTitle.svelte'; @@ -14,7 +14,9 @@ import LoadingToComplete from '$lib/common/spinners/LoadingToComplete.svelte'; import Select from '$lib/common/dropdowns/Select.svelte'; import TableItem from '../common/table/table-item.svelte'; + import { KnowledgeBaseType } from '$lib/helpers/enums'; + const knowledgeType = KnowledgeBaseType.Taxonomy; const maxLength = 4096; const columns = [ { @@ -39,7 +41,7 @@ /** @type {string[]} */ let selectedDataLoaders = $state([]); - /** @type {import('$knowledgeTypes').EntityAnalysisResult[]} */ + /** @type {import('$knowledgeTypes').KnowledgeSearchViewModel[]} */ let items = $state([]); /** @type {import('$commonTypes').LabelValuePair[]} */ @@ -155,16 +157,14 @@ function getAnalysisResult() { return new Promise((resolve, reject) => { + /** @type {import('$knowledgeTypes').SearchKnowledgeRequest} */ const request = { text: util.trim(text), - provider: selectedAnalyzer, - options: { - data_providers: selectedDataLoaders?.length > 0 ? selectedDataLoaders : null - } + dataProviders: selectedDataLoaders?.length > 0 ? selectedDataLoaders : null }; - analyzeEntity(request).then(res => { - items = res?.results || []; + searchKnowledge(knowledgeType, request, knowledgeType, selectedAnalyzer).then(res => { + items = res || []; totalDataCount = items.length; resolve(res); }).catch(err => { @@ -345,7 +345,7 @@ {#each items as item, idx (idx)} { if (selectedCollection) { Promise.all([ - getCollectionDetail(), getDocProcessors(), getData({ ...defaultParams, @@ -222,12 +217,12 @@ text: util.trim(text), limit: searchLimit, confidence: Number(validateConfidenceNumber(confidence)), - with_vector: enableVector, - filter_groups: innerSearchGroups, - search_param: { exact_search: isExactSearch } + withVector: enableVector, + filterGroups: innerSearchGroups, + searchParam: { exact_search: isExactSearch } }; - searchVectorKnowledge(selectedCollection, params).then(res => { + searchKnowledge(selectedCollection, params, knowledgeType).then(res => { items = res || []; totalDataCount = items.length; isFromSearch = true; @@ -346,7 +341,7 @@ // Knowledge list data function getCollections() { return new Promise((resolve, reject) => { - getVectorKnowledgeCollections(collectionType).then(res => { + getKnowledgeCollections(knowledgeType).then(res => { const retCollections = res?.map(x => ({ label: x.name, value: x.name })) || []; collections = [ ...retCollections ]; selectedCollection = collections[0]?.value; @@ -382,9 +377,10 @@ order_by: params.sort?.field ? params.sort : null }; - getVectorKnowledgePageList( + getKnowledgePageList( selectedCollection, - filter + filter, + knowledgeType ).then(res => { const newItems = res.items || []; if (params.isReset) { @@ -402,18 +398,6 @@ }); } - function getCollectionDetail() { - return new Promise((resolve) => { - getVectorCollectionDetails(selectedCollection).then(res => { - collectionDetails = res || null; - resolve(collectionDetails); - }).catch(() => { - collectionDetails = null; - resolve(collectionDetails); - }); - }); - } - /** * @param {{ * startId: string | null, @@ -491,7 +475,7 @@ function onKnowledgeDelete(e) { const id = e.id; isLoading = true; - deleteVectorKnowledgeData(selectedCollection, id).then(res => { + deleteKnowledgeData(id, selectedCollection, knowledgeType).then(res => { if (res) { isComplete = true; successText = "Knowledge has been deleted!"; @@ -543,7 +527,7 @@ }).then(async (result) => { if (result.value) { isLoading = true; - deleteAllVectorKnowledgeData(selectedCollection).then(res => { + deleteAllKnowledgeData(selectedCollection, knowledgeType).then(res => { if (res) { successText = "All data has been deleted!"; isComplete = true; @@ -587,11 +571,12 @@ }; if (editItem) { - updateVectorKnowledgeData( + updateKnowledgeData( e.id, editCollection, e.data?.text, - e.payload + e.payload, + knowledgeType ).then(res => { if (res) { isComplete = true; @@ -615,10 +600,11 @@ isLoading = false; }); } else { - createVectorKnowledgeData( + createKnowledgeData( editCollection, e.data?.text, - e.payload + e.payload, + knowledgeType ).then(res => { if (res) { isComplete = true; @@ -687,13 +673,12 @@ function confirmCollectionCreate(data) { isLoading = true; toggleCollectionCreate(); - createVectorCollection({ - collection_name: data.collection_name, - collection_type: collectionType, + createKnowledgeCollection({ + collectionName: data.collectionName, dimension: data.dimension, provider: data.provider, model: data.model - }).then(res => { + }, knowledgeType).then(res => { if (res) { successText = "Collection has been created!"; isComplete = true; @@ -727,7 +712,7 @@ }).then(async (result) => { if (result.value) { isLoading = true; - deleteVectorCollection(selectedCollection).then(res => { + deleteKnowledgeCollection(selectedCollection, knowledgeType).then(res => { if (res) { successText = "Collection has been deleted!"; isComplete = true; @@ -846,10 +831,10 @@ const { addIndexes, deleteIndexes } = e; try { if (addIndexes?.length > 0) { - await createVectorIndexes(selectedCollection, addIndexes); + await createKnowledgeIndexes(selectedCollection, addIndexes, knowledgeType); } if (deleteIndexes?.length > 0) { - await deleteVectorIndexes(selectedCollection, deleteIndexes); + await deleteKnowledgeIndexes(selectedCollection, deleteIndexes, knowledgeType); } successText = "Indexes have been updated!"; isComplete = true; @@ -893,7 +878,7 @@ title={editModalTitle} size={'lg'} collection={editCollection} - collectionType={collectionType} + knowledgeType={knowledgeType} item={editItem} open={isOpenEditKnowledge} allowPayload @@ -913,6 +898,7 @@ title={''} size={'xl'} collection={selectedCollection} + knowledgeType={knowledgeType} open={isOpenIndexModal} toggleModal={() => isOpenIndexModal = !isOpenIndexModal} confirm={(/** @type {any} */ e) => confirmIndex(e)} @@ -937,6 +923,7 @@ toggleCollectionCreate()} confirm={(/** @type {any} */ e) => confirmCollectionCreate(e)} @@ -1093,14 +1080,14 @@ - + /> --> {#if isSearching}
@@ -1116,7 +1103,7 @@ {/if} {#if selectedCollection} - onKnowledgeDelete(data)} diff --git a/src/routes/page/knowledge-base/documents/knowledge-document-upload.svelte b/src/routes/page/knowledge-base/documents/knowledge-file-upload.svelte similarity index 97% rename from src/routes/page/knowledge-base/documents/knowledge-document-upload.svelte rename to src/routes/page/knowledge-base/documents/knowledge-file-upload.svelte index d1361964..ffe581b4 100644 --- a/src/routes/page/knowledge-base/documents/knowledge-document-upload.svelte +++ b/src/routes/page/knowledge-base/documents/knowledge-file-upload.svelte @@ -15,10 +15,10 @@ import { KnowledgeDocSource } from '$lib/helpers/enums'; import { isHtml } from '$lib/helpers/utils/file'; import { - getKnowledgeDocumentPageList, - uploadKnowledgeDocuments, - deleteKnowledgeDocument, - deleteAllKnowledgeDocuments + getKnowledgeFilePageList, + uploadKnowledgeFiles, + deleteKnowledgeFile, + deleteAllKnowledgeFiles } from '$lib/services/knowledge-base-service'; import KnowledgeUploadResult from './knowledge-upload-result.svelte'; @@ -172,7 +172,7 @@ disabled = true; isLoading = true; - uploadKnowledgeDocuments(collection, + uploadKnowledgeFiles(collection, { files: files, options: { @@ -222,7 +222,7 @@ const page = docPage; return new Promise((resolve, reject) => { - getKnowledgeDocumentPageList( + getKnowledgeFilePageList( collection, { page: page, size: docPageSize } ).then(res => { @@ -265,7 +265,7 @@ }).then(async (result) => { if (result.value) { disabled = true; - deleteKnowledgeDocument(collection, found.file_id).then(res => { + deleteKnowledgeFile(collection, found.file_id).then(res => { if (res) { savedFiles = savedFiles.filter((_, idx) => idx !== index); docPage = startPage; @@ -296,7 +296,7 @@ }).then(async (result) => { if (result.value) { disabled = true; - deleteAllKnowledgeDocuments(collection, { page: 1, size: 10 }).then(res => { + deleteAllKnowledgeFiles(collection, { page: 1, size: 10 }).then(res => { if (res) { savedFiles = []; docPage = startPage; diff --git a/src/routes/page/knowledge-base/documents/knowledge-upload-modal.svelte b/src/routes/page/knowledge-base/documents/knowledge-upload-modal.svelte index 960f0456..c92bf45a 100644 --- a/src/routes/page/knowledge-base/documents/knowledge-upload-modal.svelte +++ b/src/routes/page/knowledge-base/documents/knowledge-upload-modal.svelte @@ -3,7 +3,7 @@ import Select from "$lib/common/dropdowns/Select.svelte"; import FileDropZone from '$lib/common/files/FileDropZone.svelte'; import FileGallery from '$lib/common/files/FileGallery.svelte'; - import { uploadKnowledgeDocuments } from "$lib/services/knowledge-base-service"; + import { uploadKnowledgeFiles } from "$lib/services/knowledge-base-service"; import { KnowledgeDocSource } from "$lib/helpers/enums"; import LoadingToComplete from '$lib/common/spinners/LoadingToComplete.svelte'; @@ -75,7 +75,7 @@ disabled = true; toggleModal?.(); - uploadKnowledgeDocuments(collection, + uploadKnowledgeFiles(collection, { files: files, options: { diff --git a/src/routes/page/knowledge-base/question-answer/+page.svelte b/src/routes/page/knowledge-base/question-answer/+page.svelte index 6919a1b8..a3132c2e 100644 --- a/src/routes/page/knowledge-base/question-answer/+page.svelte +++ b/src/routes/page/knowledge-base/question-answer/+page.svelte @@ -6,18 +6,17 @@ import Swal from 'sweetalert2'; import { v4 as uuidv4 } from 'uuid'; import { - getVectorKnowledgeCollections, - getVectorKnowledgePageList, - searchVectorKnowledge, - createVectorKnowledgeData, - updateVectorKnowledgeData, - deleteVectorCollection, - deleteVectorKnowledgeData, - deleteAllVectorKnowledgeData, - createVectorCollection, - getVectorCollectionDetails, - createVectorIndexes, - deleteVectorIndexes + getKnowledgeCollections, + getKnowledgePageList, + searchKnowledge, + createKnowledgeData, + updateKnowledgeData, + deleteKnowledgeCollection, + deleteKnowledgeData, + deleteAllKnowledgeData, + createKnowledgeCollection, + createKnowledgeIndexes, + deleteKnowledgeIndexes } from '$lib/services/knowledge-base-service'; import Breadcrumb from '$lib/common/shared/Breadcrumb.svelte'; import HeadTitle from '$lib/common/shared/HeadTitle.svelte'; @@ -27,7 +26,7 @@ import BotsharpTooltip from '$lib/common/tooltip/BotsharpTooltip.svelte'; import Select from '$lib/common/dropdowns/Select.svelte'; import { - KnowledgeCollectionType, + KnowledgeBaseType, KnowledgePayloadName, VectorDataSource, VectorPayloadDataType @@ -36,16 +35,16 @@ import VectorItem from '../common/vector-table/vector-item.svelte'; import VectorItemEditModal from '../common/vector-table/vector-item-edit-modal.svelte'; import CollectionCreateModal from '../common/collection/collection-create-modal.svelte'; - import AdvancedSearch from '../common/search/advanced-search.svelte'; import VectorIndexModal from '../common/indexes/vector-index-modal.svelte'; + // import AdvancedSearch from '../common/search/advanced-search.svelte'; - const pageSize = 8; + const knowledgeType = KnowledgeBaseType.QuestionAnswer; + const pageSize = 10; const duration = 2000; const maxLength = 4096; const step = 0.1; const searchLimit = 10; const enableVector = true; - const collectionType = KnowledgeCollectionType.QuestionAnswer; /** @type {string} */ let text = $state(""); @@ -57,9 +56,6 @@ /** @type {string} */ let selectedCollection = $state(''); - /** @type {import('$knowledgeTypes').VectorCollectionDetails | null} */ - let collectionDetails = $state(null); - /** @type {import('$knowledgeTypes').KnowledgeSearchViewModel[]} */ let items = $state([]); @@ -151,16 +147,13 @@ isLoading = true; getCollections().then(() => { if (selectedCollection) { - Promise.all([ - getCollectionDetail(), - getData({ - ...defaultParams, - isReset: true, - skipLoader: true, - filterGroups: innerSearchGroups, - sort: null - }) - ]).finally(() => isLoading = false); + getData({ + ...defaultParams, + isReset: true, + skipLoader: true, + filterGroups: innerSearchGroups, + sort: null + }).finally(() => isLoading = false); } }).finally(() => { isLoading = false; @@ -209,12 +202,12 @@ text: util.trim(text), limit: searchLimit, confidence: Number(validateConfidenceNumber(confidence)), - with_vector: enableVector, - filter_groups: innerSearchGroups, - search_param: { exact_search: isExactSearch } + withVector: enableVector, + filterGroups: innerSearchGroups, + searchParam: { exact_search: isExactSearch } }; - searchVectorKnowledge(selectedCollection, params).then(res => { + searchKnowledge(selectedCollection, params, knowledgeType).then(res => { items = res || []; totalDataCount = items.length; isFromSearch = true; @@ -244,17 +237,14 @@ /** @param {boolean} skipLoader */ function reset(skipLoader = false) { resetStates(); - Promise.all([ - getCollectionDetail(), - getData({ - ...defaultParams, - startId: null, - isReset: true, - skipLoader: skipLoader, - filterGroups: innerSearchGroups, - sort: innerSort - }) - ]); + getData({ + ...defaultParams, + startId: null, + isReset: true, + skipLoader: skipLoader, + filterGroups: innerSearchGroups, + sort: innerSort + }); } function initPage() { @@ -334,7 +324,7 @@ // Knowledge list data function getCollections() { return new Promise((resolve, reject) => { - getVectorKnowledgeCollections(collectionType).then(res => { + getKnowledgeCollections(knowledgeType).then(res => { const retCollections = res?.map(x => ({ label: x.name, value: x.name })) || []; collections = [ ...retCollections ]; selectedCollection = collections[0]?.value; @@ -361,18 +351,20 @@ sort: null }) { return new Promise((resolve, reject) => { + /** @type {import('$knowledgeTypes').KnowledgeFilter} */ const filter = { size: pageSize, start_id: params.startId, - with_vector: enableVector, + withVector: enableVector, fields: [], - filter_groups: params.filterGroups, - order_by: params.sort?.field ? params.sort : null + filterGroups: params.filterGroups, + orderBy: params.sort?.field ? params.sort : null }; - getVectorKnowledgePageList( + getKnowledgePageList( selectedCollection, - filter + filter, + knowledgeType ).then(res => { const newItems = res.items || []; if (params.isReset) { @@ -390,18 +382,6 @@ }); } - function getCollectionDetail() { - return new Promise((resolve) => { - getVectorCollectionDetails(selectedCollection).then(res => { - collectionDetails = res || null; - resolve(collectionDetails); - }).catch(() => { - collectionDetails = null; - resolve(collectionDetails); - }); - }); - } - /** * @param {{ * startId: string | null, @@ -466,7 +446,7 @@ function onKnowledgeDelete(e) { const id = e.id; isLoading = true; - deleteVectorKnowledgeData(selectedCollection, id).then(res => { + deleteKnowledgeData(id, selectedCollection, knowledgeType).then(res => { if (res) { isComplete = true; successText = "Knowledge has been deleted!"; @@ -518,7 +498,7 @@ }).then(async (result) => { if (result.value) { isLoading = true; - deleteAllVectorKnowledgeData(selectedCollection).then(res => { + deleteAllKnowledgeData(selectedCollection, knowledgeType).then(res => { if (res) { successText = "All data has been deleted!"; isComplete = true; @@ -566,11 +546,12 @@ }; if (editItem) { - updateVectorKnowledgeData( + updateKnowledgeData( e.id, editCollection, e.data?.text, - e.payload + e.payload, + knowledgeType ).then(res => { if (res) { isComplete = true; @@ -594,10 +575,11 @@ isLoading = false; }); } else { - createVectorKnowledgeData( + createKnowledgeData( editCollection, e.data?.text, - e.payload + e.payload, + knowledgeType ).then(res => { if (res) { isComplete = true; @@ -670,13 +652,12 @@ function confirmCollectionCreate(data) { isLoading = true; toggleCollectionCreate(); - createVectorCollection({ - collection_name: data.collection_name, - collection_type: collectionType, + createKnowledgeCollection({ + collectionName: data.collectionName, dimension: data.dimension, provider: data.provider, model: data.model - }).then(res => { + }, knowledgeType).then(res => { if (res) { successText = "Collection has been created!"; isComplete = true; @@ -710,7 +691,7 @@ }).then(async (result) => { if (result.value) { isLoading = true; - deleteVectorCollection(selectedCollection).then(res => { + deleteKnowledgeCollection(selectedCollection, knowledgeType).then(res => { if (res) { successText = "Collection has been deleted!"; isComplete = true; @@ -790,10 +771,10 @@ const { addIndexes, deleteIndexes } = e; try { if (addIndexes?.length > 0) { - await createVectorIndexes(selectedCollection, addIndexes); + await createKnowledgeIndexes(selectedCollection, addIndexes, knowledgeType); } if (deleteIndexes?.length > 0) { - await deleteVectorIndexes(selectedCollection, deleteIndexes); + await deleteKnowledgeIndexes(selectedCollection, deleteIndexes, knowledgeType); } successText = "Indexes have been updated!"; isComplete = true; @@ -833,7 +814,7 @@ title={editModalTitle} size={'lg'} collection={editCollection} - collectionType={collectionType} + knowledgeType={knowledgeType} item={editItem} open={isOpenEditKnowledge} allowPayload @@ -855,6 +836,7 @@ title={''} size={'xl'} collection={selectedCollection} + knowledgeType={knowledgeType} open={isOpenIndexModal} toggleModal={() => isOpenIndexModal = !isOpenIndexModal} confirm={(/** @type {any} */ e) => confirmIndex(e)} @@ -864,6 +846,7 @@ toggleCollectionCreate()} confirm={(/** @type {any} */ e) => confirmCollectionCreate(e)} @@ -1020,14 +1003,14 @@
- + /> --> {#if isSearching}
@@ -1164,7 +1147,7 @@ {#each items as item, idx (idx)} onKnowledgeDelete(data)} diff --git a/src/routes/page/knowledge-base/relationships/+page.svelte b/src/routes/page/knowledge-base/relationships/+page.svelte index c2bcb919..2d1244ea 100644 --- a/src/routes/page/knowledge-base/relationships/+page.svelte +++ b/src/routes/page/knowledge-base/relationships/+page.svelte @@ -6,8 +6,10 @@ import LoadingDots from '$lib/common/spinners/LoadingDots.svelte'; import HeadTitle from '$lib/common/shared/HeadTitle.svelte'; import Breadcrumb from '$lib/common/shared/Breadcrumb.svelte'; - import { searchGraphKnowledge } from '$lib/services/knowledge-base-service'; + import { searchKnowledge } from '$lib/services/knowledge-base-service'; + import { KnowledgeBaseType } from '$lib/helpers/enums'; + const knowledgeType = KnowledgeBaseType.SemanticGraph; const maxLength = 4096; /** @type {boolean} */ @@ -28,8 +30,15 @@ function search() { searchDone = false; isSearching = true; - searchGraphKnowledge(util.trim(text)).then(res => { - result = res.result || ''; + + /** @type {import('$knowledgeTypes').SearchKnowledgeRequest} */ + const request = { + text: util.trim(text) + }; + + searchKnowledge(knowledgeType, request, knowledgeType).then(res => { + const results = res || []; + result = JSON.stringify(results); }).catch(() => { result = 'Error!'; }).finally(() => { From 73d49d762c3ba058e48802789e727ddf372aaa25 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Fri, 1 May 2026 15:33:40 -0500 Subject: [PATCH 2/4] clean code --- src/lib/services/api-endpoints.js | 2 -- src/lib/services/knowledge-base-service.js | 12 ------------ 2 files changed, 14 deletions(-) diff --git a/src/lib/services/api-endpoints.js b/src/lib/services/api-endpoints.js index 2e018c9c..6ac3e31a 100644 --- a/src/lib/services/api-endpoints.js +++ b/src/lib/services/api-endpoints.js @@ -112,8 +112,6 @@ export const endpoints = { knowledgeIndexesCreateUrl: `${host}/knowledge/collection/{collection}/indexes`, knowledgeIndexesDeleteUrl: `${host}/knowledge/collection/{collection}/indexes`, - - // graphKnowledgeSearchUrl: `${host}/knowledge/graph/search`, knowledgeFileUploadUrl: `${host}/knowledge/collection/{collection}/file/upload`, knowledgeFileDeleteUrl: `${host}/knowledge/collection/{collection}/file/{fileId}`, diff --git a/src/lib/services/knowledge-base-service.js b/src/lib/services/knowledge-base-service.js index e031f788..ca02cb7f 100644 --- a/src/lib/services/knowledge-base-service.js +++ b/src/lib/services/knowledge-base-service.js @@ -323,18 +323,6 @@ export async function deleteKnowledgeCollection(collection, knowledgeType, dbPro } -/** - * @param {string} text - * @param {string } method - * @returns {Promise} - */ -export async function searchGraphKnowledge(text, method = "local") { - const url = endpoints.knowledgeDataSearchUrl; - const response = await axios.post(url, { query: text, method: method }); - return response.data; -} - - /** * @param {string} collection * @param {import('$knowledgeTypes').VectorCollectionIndexOptions[]} options From b740033105ed1521c9f66aa52d0d135bd466b8db Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Fri, 1 May 2026 19:09:06 -0500 Subject: [PATCH 3/4] rename knowledge search --- src/lib/helpers/http.js | 4 ++-- src/lib/helpers/types/knowledgeTypes.js | 6 +++--- src/lib/services/api-endpoints.js | 2 +- src/lib/services/knowledge-base-service.js | 8 ++++---- .../common/vector-table/vector-item-edit-modal.svelte | 2 +- .../common/vector-table/vector-item.svelte | 2 +- src/routes/page/knowledge-base/dictionary/+page.svelte | 8 ++++---- src/routes/page/knowledge-base/documents/+page.svelte | 10 +++++----- .../page/knowledge-base/question-answer/+page.svelte | 10 +++++----- .../page/knowledge-base/relationships/+page.svelte | 6 +++--- 10 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/lib/helpers/http.js b/src/lib/helpers/http.js index f0dffe53..a89e8778 100644 --- a/src/lib/helpers/http.js +++ b/src/lib/helpers/http.js @@ -191,7 +191,7 @@ function skipLoader(config) { new RegExp('http(s*)://(.*?)/conversation/(.*?)/(.*?)', 'g'), new RegExp('http(s*)://(.*?)/agent', 'g'), new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/data/page', 'g'), - new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/search', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/query', 'g'), new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)', 'g'), new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/file/page', 'g'), new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/file/upload', 'g'), @@ -277,7 +277,7 @@ function skipGlobalError(config) { const postRegexes = [ new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/data', 'g'), new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/data/page', 'g'), - new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/search', 'g'), + new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/query', 'g'), new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)', 'g'), new RegExp('http(s*)://(.*?)/knowledge/collection', 'g'), new RegExp('http(s*)://(.*?)/knowledge/collection/(.*?)/file/page', 'g'), diff --git a/src/lib/helpers/types/knowledgeTypes.js b/src/lib/helpers/types/knowledgeTypes.js index a4fbceb6..cae1314d 100644 --- a/src/lib/helpers/types/knowledgeTypes.js +++ b/src/lib/helpers/types/knowledgeTypes.js @@ -8,7 +8,7 @@ */ /** - * @typedef {Object} SearchKnowledgeRequest + * @typedef {Object} KnowledgeQueryRequest * @property {string} text - The text. * @property {string[]} [fields] - Data fields. * @property {number} [limit] - Data limit. @@ -80,7 +80,7 @@ */ /** - * @typedef {Object} KnowledgeSearchViewModel + * @typedef {Object} KnowledgeQueryViewModel * @property {string} id - The knowledge data id. * @property {any} payload - The knowledge payload. * @property {any} data - The knowledge payload. @@ -92,7 +92,7 @@ /** * @typedef {Object} KnowledgeSearchPageResult * @property {number} count - The total data count. - * @property {KnowledgeSearchViewModel[]} items - The data items. + * @property {KnowledgeQueryViewModel[]} items - The data items. * @property {string} [next_id] - The next id. */ diff --git a/src/lib/services/api-endpoints.js b/src/lib/services/api-endpoints.js index 6ac3e31a..5bfb7750 100644 --- a/src/lib/services/api-endpoints.js +++ b/src/lib/services/api-endpoints.js @@ -103,7 +103,7 @@ export const endpoints = { knowledgeCollectionCreateUrl: `${host}/knowledge/collection`, knowledgeCollectionDeleteUrl: `${host}/knowledge/collection/{collection}`, - knowledgeDataSearchUrl: `${host}/knowledge/collection/{collection}/search`, + knowledgeDataQueryUrl: `${host}/knowledge/collection/{collection}/query`, knowledgeDataPageListUrl: `${host}/knowledge/collection/{collection}/data/page`, knowledgeDataCreateUrl: `${host}/knowledge/collection/{collection}/data`, knowledgeDataUpdateUrl: `${host}/knowledge/collection/{collection}/data`, diff --git a/src/lib/services/knowledge-base-service.js b/src/lib/services/knowledge-base-service.js index ca02cb7f..1a287805 100644 --- a/src/lib/services/knowledge-base-service.js +++ b/src/lib/services/knowledge-base-service.js @@ -61,13 +61,13 @@ export async function getKnowledgeCollectionDetails(collection, knowledgeType, d /** * @param {string} collection - * @param {import('$knowledgeTypes').SearchKnowledgeRequest} request + * @param {import('$knowledgeTypes').KnowledgeQueryRequest} request * @param {string} knowledgeType * @param {string?} dbProvider - * @returns {Promise} + * @returns {Promise} */ -export async function searchKnowledge(collection, request, knowledgeType, dbProvider = null) { - const url = replaceUrl(endpoints.knowledgeDataSearchUrl, { +export async function executeKnowledgeQuery(collection, request, knowledgeType, dbProvider = null) { + const url = replaceUrl(endpoints.knowledgeDataQueryUrl, { collection: collection }); diff --git a/src/routes/page/knowledge-base/common/vector-table/vector-item-edit-modal.svelte b/src/routes/page/knowledge-base/common/vector-table/vector-item-edit-modal.svelte index acec7590..15bbfab9 100644 --- a/src/routes/page/knowledge-base/common/vector-table/vector-item-edit-modal.svelte +++ b/src/routes/page/knowledge-base/common/vector-table/vector-item-edit-modal.svelte @@ -11,7 +11,7 @@ import Select from "$lib/common/dropdowns/Select.svelte"; let { - /** @type {import('$knowledgeTypes').KnowledgeSearchViewModel | null} */ + /** @type {import('$knowledgeTypes').KnowledgeQueryViewModel | null} */ item = null, /** @type {string} */ collection = '', diff --git a/src/routes/page/knowledge-base/common/vector-table/vector-item.svelte b/src/routes/page/knowledge-base/common/vector-table/vector-item.svelte index 24e5846e..11b0d865 100644 --- a/src/routes/page/knowledge-base/common/vector-table/vector-item.svelte +++ b/src/routes/page/knowledge-base/common/vector-table/vector-item.svelte @@ -5,7 +5,7 @@ import { KnowledgeBaseType, KnowledgePayloadName } from "$lib/helpers/enums"; let { - /** @type {import('$knowledgeTypes').KnowledgeSearchViewModel} */ + /** @type {import('$knowledgeTypes').KnowledgeQueryViewModel} */ item, /** @type {string} */ collection, diff --git a/src/routes/page/knowledge-base/dictionary/+page.svelte b/src/routes/page/knowledge-base/dictionary/+page.svelte index 3482137f..29efd43a 100644 --- a/src/routes/page/knowledge-base/dictionary/+page.svelte +++ b/src/routes/page/knowledge-base/dictionary/+page.svelte @@ -6,7 +6,7 @@ import { getEntityAnalyzers, getEntityDataLoaders, - searchKnowledge + executeKnowledgeQuery } from '$lib/services/knowledge-base-service'; import Breadcrumb from '$lib/common/shared/Breadcrumb.svelte'; import HeadTitle from '$lib/common/shared/HeadTitle.svelte'; @@ -41,7 +41,7 @@ /** @type {string[]} */ let selectedDataLoaders = $state([]); - /** @type {import('$knowledgeTypes').KnowledgeSearchViewModel[]} */ + /** @type {import('$knowledgeTypes').KnowledgeQueryViewModel[]} */ let items = $state([]); /** @type {import('$commonTypes').LabelValuePair[]} */ @@ -157,13 +157,13 @@ function getAnalysisResult() { return new Promise((resolve, reject) => { - /** @type {import('$knowledgeTypes').SearchKnowledgeRequest} */ + /** @type {import('$knowledgeTypes').KnowledgeQueryRequest} */ const request = { text: util.trim(text), dataProviders: selectedDataLoaders?.length > 0 ? selectedDataLoaders : null }; - searchKnowledge(knowledgeType, request, knowledgeType, selectedAnalyzer).then(res => { + executeKnowledgeQuery(knowledgeType, request, knowledgeType, selectedAnalyzer).then(res => { items = res || []; totalDataCount = items.length; resolve(res); diff --git a/src/routes/page/knowledge-base/documents/+page.svelte b/src/routes/page/knowledge-base/documents/+page.svelte index c63bbc74..340a0e2c 100644 --- a/src/routes/page/knowledge-base/documents/+page.svelte +++ b/src/routes/page/knowledge-base/documents/+page.svelte @@ -8,7 +8,7 @@ import { getKnowledgeCollections, getKnowledgePageList, - searchKnowledge, + executeKnowledgeQuery, createKnowledgeData, updateKnowledgeData, deleteKnowledgeCollection, @@ -59,7 +59,7 @@ /** @type {string} */ let selectedCollection = $state(''); - /** @type {import('$knowledgeTypes').KnowledgeSearchViewModel[]} */ + /** @type {import('$knowledgeTypes').KnowledgeQueryViewModel[]} */ let items = $state([]); /** @type {import('$commonTypes').LabelValuePair[]} */ @@ -74,7 +74,7 @@ /** @type {string} */ let editCollection = $state(''); - /** @type {import('$knowledgeTypes').KnowledgeSearchViewModel | null} */ + /** @type {import('$knowledgeTypes').KnowledgeQueryViewModel | null} */ let editItem = $state(null); /** @type {string} */ @@ -212,7 +212,7 @@ elapsedTime = `${(gap / 1000).toFixed(3)}s`; }); } else { - /** @type {import('$knowledgeTypes').SearchKnowledgeRequest} */ + /** @type {import('$knowledgeTypes').KnowledgeQueryRequest} */ const params = { text: util.trim(text), limit: searchLimit, @@ -222,7 +222,7 @@ searchParam: { exact_search: isExactSearch } }; - searchKnowledge(selectedCollection, params, knowledgeType).then(res => { + executeKnowledgeQuery(selectedCollection, params, knowledgeType).then(res => { items = res || []; totalDataCount = items.length; isFromSearch = true; diff --git a/src/routes/page/knowledge-base/question-answer/+page.svelte b/src/routes/page/knowledge-base/question-answer/+page.svelte index a3132c2e..f4432563 100644 --- a/src/routes/page/knowledge-base/question-answer/+page.svelte +++ b/src/routes/page/knowledge-base/question-answer/+page.svelte @@ -8,7 +8,7 @@ import { getKnowledgeCollections, getKnowledgePageList, - searchKnowledge, + executeKnowledgeQuery, createKnowledgeData, updateKnowledgeData, deleteKnowledgeCollection, @@ -56,7 +56,7 @@ /** @type {string} */ let selectedCollection = $state(''); - /** @type {import('$knowledgeTypes').KnowledgeSearchViewModel[]} */ + /** @type {import('$knowledgeTypes').KnowledgeQueryViewModel[]} */ let items = $state([]); /** @type {import('$commonTypes').LabelValuePair[]} */ @@ -71,7 +71,7 @@ /** @type {string} */ let editCollection = $state(''); - /** @type {import('$knowledgeTypes').KnowledgeSearchViewModel | null} */ + /** @type {import('$knowledgeTypes').KnowledgeQueryViewModel | null} */ let editItem = $state(null); /** @type {string} */ @@ -197,7 +197,7 @@ elapsedTime = `${(gap / 1000).toFixed(3)}s`; }); } else { - /** @type {import('$knowledgeTypes').SearchKnowledgeRequest} */ + /** @type {import('$knowledgeTypes').KnowledgeQueryRequest} */ const params = { text: util.trim(text), limit: searchLimit, @@ -207,7 +207,7 @@ searchParam: { exact_search: isExactSearch } }; - searchKnowledge(selectedCollection, params, knowledgeType).then(res => { + executeKnowledgeQuery(selectedCollection, params, knowledgeType).then(res => { items = res || []; totalDataCount = items.length; isFromSearch = true; diff --git a/src/routes/page/knowledge-base/relationships/+page.svelte b/src/routes/page/knowledge-base/relationships/+page.svelte index 2d1244ea..35ac78ea 100644 --- a/src/routes/page/knowledge-base/relationships/+page.svelte +++ b/src/routes/page/knowledge-base/relationships/+page.svelte @@ -6,7 +6,7 @@ import LoadingDots from '$lib/common/spinners/LoadingDots.svelte'; import HeadTitle from '$lib/common/shared/HeadTitle.svelte'; import Breadcrumb from '$lib/common/shared/Breadcrumb.svelte'; - import { searchKnowledge } from '$lib/services/knowledge-base-service'; + import { executeKnowledgeQuery } from '$lib/services/knowledge-base-service'; import { KnowledgeBaseType } from '$lib/helpers/enums'; const knowledgeType = KnowledgeBaseType.SemanticGraph; @@ -31,12 +31,12 @@ searchDone = false; isSearching = true; - /** @type {import('$knowledgeTypes').SearchKnowledgeRequest} */ + /** @type {import('$knowledgeTypes').KnowledgeQueryRequest} */ const request = { text: util.trim(text) }; - searchKnowledge(knowledgeType, request, knowledgeType).then(res => { + executeKnowledgeQuery(knowledgeType, request, knowledgeType).then(res => { const results = res || []; result = JSON.stringify(results); }).catch(() => { From 7d3ead62a2125a473ff0f2f27760a17e580749ca Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Fri, 1 May 2026 19:48:03 -0500 Subject: [PATCH 4/4] fix dictionary display --- .../common/table/table-item.svelte | 36 ++++++++----------- .../knowledge-base/dictionary/+page.svelte | 1 - 2 files changed, 15 insertions(+), 22 deletions(-) diff --git a/src/routes/page/knowledge-base/common/table/table-item.svelte b/src/routes/page/knowledge-base/common/table/table-item.svelte index d3c4772d..30f6beb7 100644 --- a/src/routes/page/knowledge-base/common/table/table-item.svelte +++ b/src/routes/page/knowledge-base/common/table/table-item.svelte @@ -8,7 +8,6 @@ * @type {{ * item: any, * columns: import('$commonTypes').TableItemConfig[], - * detailKey?: string | null, * useJsonDisplay?: boolean, * open?: boolean * }} @@ -16,7 +15,6 @@ let { item, columns, - detailKey = null, useJsonDisplay = false, open = $bindable(false) } = $props(); @@ -49,7 +47,6 @@ {/if}
    - {#if detailKey}
  • - {/if}
@@ -94,23 +90,21 @@ in:fly={{ y: -5, duration: 300 }} out:fly={{ y: -5, duration: 200 }} > - {#if detailKey && item[detailKey]} - {#if useJsonDisplay} - - {:else} - {#each Object.keys(item[detailKey]) as key, idx (idx)} -
  • - {splitTextByCase(key)}: - {item[detailKey][key]} -
  • - {/each} - {/if} + {#if useJsonDisplay} + + {:else} + {#each Object.keys(item).filter(key => !columns.some(col => col.dataName === key)) as key, idx (idx)} +
  • + {splitTextByCase(key)}: + {item[key]} +
  • + {/each} {/if} {/if} diff --git a/src/routes/page/knowledge-base/dictionary/+page.svelte b/src/routes/page/knowledge-base/dictionary/+page.svelte index 29efd43a..eb5537ee 100644 --- a/src/routes/page/knowledge-base/dictionary/+page.svelte +++ b/src/routes/page/knowledge-base/dictionary/+page.svelte @@ -347,7 +347,6 @@ {/each}