diff --git a/web/src/app/home/knowledge/components/kb-card/KBCard.module.css b/web/src/app/home/knowledge/components/kb-card/KBCard.module.css
new file mode 100644
index 00000000..2ecbd44a
--- /dev/null
+++ b/web/src/app/home/knowledge/components/kb-card/KBCard.module.css
@@ -0,0 +1,107 @@
+.cardContainer {
+ width: 100%;
+ height: 10rem;
+ background-color: #fff;
+ border-radius: 10px;
+ box-shadow: 0px 2px 2px 0 rgba(0, 0, 0, 0.2);
+ padding: 1.2rem;
+ cursor: pointer;
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ gap: 0.5rem;
+}
+
+.cardContainer:hover {
+ box-shadow: 0px 2px 8px 0 rgba(0, 0, 0, 0.1);
+}
+
+.basicInfoContainer {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ gap: 0.4rem;
+ min-width: 0;
+}
+
+.basicInfoNameContainer {
+ display: flex;
+ flex-direction: column;
+ gap: 0.2rem;
+}
+
+.basicInfoNameText {
+ font-size: 1.4rem;
+ font-weight: 500;
+}
+
+.basicInfoDescriptionText {
+ font-size: 0.9rem;
+ font-weight: 400;
+ display: -webkit-box;
+ -webkit-line-clamp: 3;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ color: #b1b1b1;
+}
+
+.basicInfoLastUpdatedTimeContainer {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.basicInfoUpdateTimeIcon {
+ width: 1.2rem;
+ height: 1.2rem;
+}
+
+.basicInfoUpdateTimeText {
+ font-size: 1rem;
+ font-weight: 400;
+}
+
+.operationContainer {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ justify-content: space-between;
+ gap: 0.5rem;
+ width: 8rem;
+}
+
+.operationDefaultBadge {
+ display: flex;
+ flex-direction: row;
+ gap: 0.5rem;
+}
+
+.operationDefaultBadgeIcon {
+ width: 1.2rem;
+ height: 1.2rem;
+ color: #ffcd27;
+}
+
+.operationDefaultBadgeText {
+ font-size: 1rem;
+ font-weight: 400;
+ color: #ffcd27;
+}
+
+.bigText {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ font-size: 1.4rem;
+ font-weight: bold;
+ max-width: 100%;
+}
+
+.debugButtonIcon {
+ width: 1.2rem;
+ height: 1.2rem;
+}
diff --git a/web/src/app/home/knowledge/components/kb-card/KBCard.tsx b/web/src/app/home/knowledge/components/kb-card/KBCard.tsx
new file mode 100644
index 00000000..5d49e738
--- /dev/null
+++ b/web/src/app/home/knowledge/components/kb-card/KBCard.tsx
@@ -0,0 +1,36 @@
+import { KnowledgeBaseVO } from '@/app/home/knowledge/components/kb-card/KBCardVO';
+import { useTranslation } from 'react-i18next';
+import styles from './KBCard.module.css';
+
+export default function KBCard({ kbCardVO }: { kbCardVO: KnowledgeBaseVO }) {
+ const { t } = useTranslation();
+ return (
+
+
+
+
+ {kbCardVO.name}
+
+
+ {kbCardVO.description}
+
+
+
+
+
+
+ {t('knowledge.bases.updateTime')}
+ {kbCardVO.lastUpdatedTimeAgo}
+
+
+
+
+ );
+}
diff --git a/web/src/app/home/knowledge/components/kb-card/KBCardVO.ts b/web/src/app/home/knowledge/components/kb-card/KBCardVO.ts
new file mode 100644
index 00000000..bfbc2adb
--- /dev/null
+++ b/web/src/app/home/knowledge/components/kb-card/KBCardVO.ts
@@ -0,0 +1,23 @@
+export interface IKnowledgeBaseVO {
+ id: string;
+ name: string;
+ description: string;
+ embeddingModelUUID: string;
+ lastUpdatedTimeAgo: string;
+}
+
+export class KnowledgeBaseVO implements IKnowledgeBaseVO {
+ id: string;
+ name: string;
+ description: string;
+ embeddingModelUUID: string;
+ lastUpdatedTimeAgo: string;
+
+ constructor(props: IKnowledgeBaseVO) {
+ this.id = props.id;
+ this.name = props.name;
+ this.description = props.description;
+ this.embeddingModelUUID = props.embeddingModelUUID;
+ this.lastUpdatedTimeAgo = props.lastUpdatedTimeAgo;
+ }
+}
diff --git a/web/src/app/home/knowledge/page.tsx b/web/src/app/home/knowledge/page.tsx
index 7c9fd048..7ee25eac 100644
--- a/web/src/app/home/knowledge/page.tsx
+++ b/web/src/app/home/knowledge/page.tsx
@@ -2,8 +2,22 @@
import CreateCardComponent from '@/app/infra/basic-component/create-card-component/CreateCardComponent';
import styles from './knowledgeBase.module.css';
+import { useTranslation } from 'react-i18next';
+import { useState } from 'react';
+import { KnowledgeBaseVO } from '@/app/home/knowledge/components/kb-card/KBCardVO';
+import KBCard from '@/app/home/knowledge/components/kb-card/KBCard';
export default function KnowledgePage() {
+ const { t } = useTranslation();
+ const [knowledgeBaseList, setKnowledgeBaseList] = useState(
+ [],
+ );
+
+ const handleKBCardClick = (kbId: string) => {
+ // setIsEditForm(false);
+ // setModalOpen(true);
+ };
+
return (
@@ -16,6 +30,14 @@ export default function KnowledgePage() {
// setModalOpen(true);
}}
/>
+
+ {knowledgeBaseList.map((kb) => {
+ return (
+
handleKBCardClick(kb.id)}>
+
+
+ );
+ })}
);
diff --git a/web/src/app/infra/entities/api/index.ts b/web/src/app/infra/entities/api/index.ts
index 53ddf1dd..a44b1991 100644
--- a/web/src/app/infra/entities/api/index.ts
+++ b/web/src/app/infra/entities/api/index.ts
@@ -133,6 +133,23 @@ export interface Bot {
updated_at?: string;
}
+export interface ApiRespKnowledgeBases {
+ bases: KnowledgeBase[];
+}
+
+export interface ApiRespKnowledgeBase {
+ base: KnowledgeBase;
+}
+
+export interface KnowledgeBase {
+ uuid?: string;
+ name: string;
+ description: string;
+ embedding_model_uuid: string;
+ created_at?: string;
+ updated_at?: string;
+}
+
// plugins
export interface ApiRespPlugins {
plugins: Plugin[];
diff --git a/web/src/app/infra/http/HttpClient.ts b/web/src/app/infra/http/HttpClient.ts
index 1fd335d9..5c6e0abd 100644
--- a/web/src/app/infra/http/HttpClient.ts
+++ b/web/src/app/infra/http/HttpClient.ts
@@ -34,6 +34,9 @@ import {
AsyncTask,
ApiRespWebChatMessage,
ApiRespWebChatMessages,
+ ApiRespKnowledgeBases,
+ ApiRespKnowledgeBase,
+ KnowledgeBase,
} from '@/app/infra/entities/api';
import { GetBotLogsRequest } from '@/app/infra/http/requestParam/bots/GetBotLogsRequest';
import { GetBotLogsResponse } from '@/app/infra/http/requestParam/bots/GetBotLogsResponse';
@@ -427,6 +430,19 @@ class HttpClient {
return this.post(`/api/v1/platform/bots/${botId}/logs`, request);
}
+ // ============ Knowledge Base API ============
+ public getKnowledgeBases(): Promise {
+ return this.get('/api/v1/knowledge/bases');
+ }
+
+ public getKnowledgeBase(uuid: string): Promise {
+ return this.get(`/api/v1/knowledge/bases/${uuid}`);
+ }
+
+ public createKnowledgeBase(base: KnowledgeBase): Promise<{ uuid: string }> {
+ return this.post('/api/v1/knowledge/bases', base);
+ }
+
// ============ Plugins API ============
public getPlugins(): Promise {
return this.get('/api/v1/plugins');