From 8e66472f77280c92fbaece8676efd20bfe2b2ad2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A8=E6=AC=A3?= Date: Fri, 23 Aug 2024 11:20:20 +0800 Subject: [PATCH] feat: Remove unused code for agent, models, and knowledge chunk pages --- web/pages/agent/index.tsx | 34 ---- web/pages/app/index.tsx | 114 ------------- web/pages/database/index.tsx | 233 -------------------------- web/pages/flow/canvas/index.tsx | 246 ---------------------------- web/pages/flow/index.tsx | 143 ---------------- web/pages/knowledge/chunk/index.tsx | 106 ------------ web/pages/knowledge/graph/index.tsx | 137 ---------------- web/pages/knowledge/index.tsx | 123 -------------- web/pages/models/index.tsx | 62 ------- web/pages/prompt/index.tsx | 181 -------------------- 10 files changed, 1379 deletions(-) delete mode 100644 web/pages/agent/index.tsx delete mode 100644 web/pages/app/index.tsx delete mode 100644 web/pages/database/index.tsx delete mode 100644 web/pages/flow/canvas/index.tsx delete mode 100644 web/pages/flow/index.tsx delete mode 100644 web/pages/knowledge/chunk/index.tsx delete mode 100644 web/pages/knowledge/graph/index.tsx delete mode 100644 web/pages/knowledge/index.tsx delete mode 100644 web/pages/models/index.tsx delete mode 100644 web/pages/prompt/index.tsx diff --git a/web/pages/agent/index.tsx b/web/pages/agent/index.tsx deleted file mode 100644 index eb1642663..000000000 --- a/web/pages/agent/index.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import MarketPlugins from '@/components/agent/market-plugins'; -import MyPlugins from '@/components/agent/my-plugins'; -import { Tabs } from 'antd'; -import { useMemo, useState } from 'react'; -import { useTranslation } from 'react-i18next'; - -function Agent() { - const { t } = useTranslation(); - const [activeKey, setActiveKey] = useState('market'); - - const items: Required[0]['items']> = useMemo( - () => [ - { - key: 'market', - label: t('Market_Plugins'), - children: , - }, - { - key: 'my', - label: t('My_Plugins'), - children: activeKey === 'market' ? null : , - }, - ], - [t, activeKey], - ); - - return ( -
- -
- ); -} - -export default Agent; diff --git a/web/pages/app/index.tsx b/web/pages/app/index.tsx deleted file mode 100644 index 48a15bed7..000000000 --- a/web/pages/app/index.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import AppModal from '@/components/app/app-modal'; -import AppCard from '@/components/app/app-card'; -import { Button, Spin, Tabs, TabsProps } from 'antd'; -import React, { useEffect, useState } from 'react'; -import { apiInterceptors, getAppList } from '@/client/api'; -import { IApp } from '@/types/app'; -import { PlusOutlined } from '@ant-design/icons'; -import { useTranslation } from 'react-i18next'; -import MyEmpty from '@/components/common/MyEmpty'; - -type TabKey = 'app' | 'collected'; - -type ModalType = 'edit' | 'add'; - -export default function App() { - const { t } = useTranslation(); - - const [open, setOpen] = useState(false); - const [spinning, setSpinning] = useState(false); - const [activeKey, setActiveKey] = useState('app'); - const [apps, setApps] = useState([]); - const [curApp, setCurApp] = useState(); - const [modalType, setModalType] = useState('add'); - - const handleCreate = () => { - setModalType('add'); - setOpen(true); - }; - - const handleCancel = () => { - setOpen(false); - }; - - const handleEdit = (app: any) => { - setModalType('edit'); - setCurApp(app); - setOpen(true); - }; - - const handleTabChange = (activeKey: string) => { - setActiveKey(activeKey as TabKey); - if (activeKey === 'collected') { - initData({ is_collected: true }); - } else { - initData(); - } - }; - - const initData = async (params = {}) => { - setSpinning(true); - const [error, data] = await apiInterceptors(getAppList(params)); - if (error) { - setSpinning(false); - return; - } - if (!data) return; - - setApps(data.app_list || []); - setSpinning(false); - }; - - useEffect(() => { - initData(); - }, []); - - const renderAppList = (data: { isCollected: boolean }) => { - const isNull = data.isCollected ? apps.every((item) => !item.is_collected) : apps.length === 0; - - return ( -
- {!data.isCollected && ( - - )} - {!isNull ? ( -
- {apps.map((app, index) => { - return ; - })} -
- ) : ( - - )} -
- ); - }; - - const items: TabsProps['items'] = [ - { - key: 'app', - label: t('App'), - children: renderAppList({ isCollected: false }), - }, - { - key: 'collected', - label: t('collected'), - children: renderAppList({ isCollected: true }), - }, - ]; - - return ( - <> - -
- - {open && ( - - )} -
-
- - ); -} diff --git a/web/pages/database/index.tsx b/web/pages/database/index.tsx deleted file mode 100644 index 625225cea..000000000 --- a/web/pages/database/index.tsx +++ /dev/null @@ -1,233 +0,0 @@ -import React, { useMemo, useState } from 'react'; -import { useAsyncEffect } from 'ahooks'; -import { Badge, Button, Card, Drawer, Empty, Modal, message, Spin } from 'antd'; -import FormDialog from '@/components/database/form-dialog'; -import { apiInterceptors, getDbList, getDbSupportType, postDbDelete, postDbRefresh } from '@/client/api'; -import { DeleteFilled, EditFilled, PlusOutlined, RedoOutlined } from '@ant-design/icons'; -import { DBOption, DBType, DbListResponse, DbSupportTypeResponse } from '@/types/db'; -import MuiLoading from '@/components/common/loading'; -import { dbMapper } from '@/utils'; -import GPTCard from '@/components/common/gpt-card'; -import { useTranslation } from 'react-i18next'; - -type DBItem = DbListResponse[0]; - -export function isFileDb(dbTypeList: DBOption[], dbType: DBType) { - return dbTypeList.find((item) => item.value === dbType)?.isFileDb; -} - -function Database() { - const { t } = useTranslation(); - - const [dbList, setDbList] = useState([]); - const [dbSupportList, setDbSupportList] = useState([]); - const [loading, setLoading] = useState(false); - const [modal, setModal] = useState<{ open: boolean; info?: DBItem; dbType?: DBType }>({ open: false }); - const [draw, setDraw] = useState<{ open: boolean; dbList?: DbListResponse; name?: string; type?: DBType }>({ open: false }); - const [refreshLoading, setRefreshLoading] = useState(false); - - const getDbSupportList = async () => { - const [, data] = await apiInterceptors(getDbSupportType()); - setDbSupportList(data ?? []); - }; - - const refreshDbList = async () => { - setLoading(true); - const [, data] = await apiInterceptors(getDbList()); - setDbList(data ?? []); - setLoading(false); - }; - - const dbTypeList = useMemo(() => { - const supportDbList = dbSupportList.map((item) => { - const { db_type, is_file_db } = item; - - return { ...dbMapper[db_type], value: db_type, isFileDb: is_file_db }; - }) as DBOption[]; - const unSupportDbList = Object.keys(dbMapper) - .filter((item) => !supportDbList.some((db) => db.value === item)) - .map((item) => ({ ...dbMapper[item], value: dbMapper[item].label, disabled: true })) as DBOption[]; - return [...supportDbList, ...unSupportDbList]; - }, [dbSupportList]); - - const onModify = (item: DBItem) => { - setModal({ open: true, info: item }); - }; - - const onDelete = (item: DBItem) => { - Modal.confirm({ - title: 'Tips', - content: `Do you Want to delete the ${item.db_name}?`, - onOk() { - return new Promise(async (resolve, reject) => { - try { - const [err] = await apiInterceptors(postDbDelete(item.db_name)); - if (err) { - message.error(err.message); - reject(); - return; - } - message.success('success'); - refreshDbList(); - resolve(); - } catch (e: any) { - reject(); - } - }); - }, - }); - }; - - const onRefresh = async (item: DBItem) => { - setRefreshLoading(true); - const [, res] = await apiInterceptors(postDbRefresh({ db_name: item.db_name, db_type: item.db_type })); - if (res) message.success(t('refreshSuccess')); - setRefreshLoading(false); - }; - - const dbListByType = useMemo(() => { - const mapper = dbTypeList.reduce((acc, item) => { - acc[item.value] = dbList.filter((dbConn) => dbConn.db_type === item.value); - return acc; - }, {} as Record); - return mapper; - }, [dbList, dbTypeList]); - - useAsyncEffect(async () => { - await refreshDbList(); - await getDbSupportList(); - }, []); - - const handleDbTypeClick = (info: DBOption) => { - const dbItems = dbList.filter((item) => item.db_type === info.value); - setDraw({ open: true, dbList: dbItems, name: info.label, type: info.value }); - }; - - return ( -
- -
- -
-
- {dbTypeList.map((item) => ( - - { - if (item.disabled) return; - handleDbTypeClick(item); - }} - /> - - ))} -
- item.db_name)} - onSuccess={() => { - setModal({ open: false }); - refreshDbList(); - }} - onClose={() => { - setModal({ open: false }); - }} - /> - { - setDraw({ open: false }); - }} - open={draw.open} - > - {draw.type && dbListByType[draw.type] && dbListByType[draw.type].length ? ( - - - {dbListByType[draw.type].map((item) => ( - - { - onRefresh(item); - }} - /> - { - onModify(item); - }} - /> - { - onDelete(item); - }} - /> -
- } - className="mb-4" - > - {item.db_path ? ( -

path: {item.db_path}

- ) : ( - <> -

host: {item.db_host}

-

username: {item.db_user}

-

port: {item.db_port}

- - )} -

remark: {item.comment}

- - ))} - - ) : ( - - - - )} - - - ); -} - -export default Database; diff --git a/web/pages/flow/canvas/index.tsx b/web/pages/flow/canvas/index.tsx deleted file mode 100644 index 61fe3a9a2..000000000 --- a/web/pages/flow/canvas/index.tsx +++ /dev/null @@ -1,246 +0,0 @@ -import { apiInterceptors, getFlowById, importFlow } from '@/client/api'; -import MuiLoading from '@/components/common/loading'; -import AddNodes from '@/components/flow/add-nodes'; -import ButtonEdge from '@/components/flow/button-edge'; -import CanvasNode from '@/components/flow/canvas-node'; -import { IFlowData, IFlowUpdateParam } from '@/types/flow'; -import { checkFlowDataRequied, getUniqueNodeId, mapUnderlineToHump } from '@/utils/flow'; -import { ExportOutlined, FrownOutlined, ImportOutlined, SaveOutlined } from '@ant-design/icons'; -import { Divider, Space, Tooltip, message, notification } from 'antd'; -import { useSearchParams } from 'next/navigation'; -import React, { DragEvent, useCallback, useEffect, useRef, useState } from 'react'; -import { useTranslation } from 'react-i18next'; -import ReactFlow, { Background, Connection, Controls, ReactFlowProvider, addEdge, useEdgesState, useNodesState, useReactFlow, Node } from 'reactflow'; -import 'reactflow/dist/style.css'; -import { SaveFlowModal, ExportFlowModal, ImportFlowModal } from '@/components/flow/canvas-modal'; - -interface Props { - // Define your component props here -} -const nodeTypes = { customNode: CanvasNode }; -const edgeTypes = { buttonedge: ButtonEdge }; - -const Canvas: React.FC = () => { - const { t } = useTranslation(); - - const searchParams = useSearchParams(); - const id = searchParams?.get('id') || ''; - const reactFlow = useReactFlow(); - - const [loading, setLoading] = useState(false); - const [nodes, setNodes, onNodesChange] = useNodesState([]); - const [edges, setEdges, onEdgesChange] = useEdgesState([]); - const reactFlowWrapper = useRef(null); - const [flowInfo, setFlowInfo] = useState(); - const [isSaveFlowModalOpen, setIsSaveFlowModalOpen] = useState(false); - const [isExportFlowModalOpen, setIsExportFlowModalOpen] = useState(false); - const [isImportModalOpen, setIsImportFlowModalOpen] = useState(false); - - async function getFlowData() { - setLoading(true); - const [_, data] = await apiInterceptors(getFlowById(id)); - if (data) { - const flowData = mapUnderlineToHump(data.flow_data); - setFlowInfo(data); - setNodes(flowData.nodes); - setEdges(flowData.edges); - } - setLoading(false); - } - - useEffect(() => { - id && getFlowData(); - }, [id]); - - useEffect(() => { - const handleBeforeUnload = (event: BeforeUnloadEvent) => { - event.returnValue = message; - }; - - window.addEventListener('beforeunload', handleBeforeUnload); - - return () => { - window.removeEventListener('beforeunload', handleBeforeUnload); - }; - }, []); - - function onNodesClick(event: any, clickedNode: Node) { - reactFlow.setNodes((nds) => - nds.map((node) => { - if (node.id === clickedNode.id) { - node.data = { - ...node.data, - selected: true, - }; - } else { - node.data = { - ...node.data, - selected: false, - }; - } - return node; - }), - ); - } - - function onConnect(connection: Connection) { - const newEdge = { - ...connection, - type: 'buttonedge', - id: `${connection.source}|${connection.target}`, - }; - setEdges((eds) => addEdge(newEdge, eds)); - } - - const onDrop = useCallback( - (event: DragEvent) => { - event.preventDefault(); - const reactFlowBounds = reactFlowWrapper.current!.getBoundingClientRect(); - let nodeStr = event.dataTransfer.getData('application/reactflow'); - if (!nodeStr || typeof nodeStr === 'undefined') { - return; - } - const nodeData = JSON.parse(nodeStr); - const position = reactFlow.screenToFlowPosition({ - x: event.clientX - reactFlowBounds.left, - y: event.clientY - reactFlowBounds.top, - }); - const nodeId = getUniqueNodeId(nodeData, reactFlow.getNodes()); - nodeData.id = nodeId; - const newNode = { - id: nodeId, - position, - type: 'customNode', - data: nodeData, - }; - setNodes((nds) => - nds.concat(newNode).map((node) => { - if (node.id === newNode.id) { - node.data = { - ...node.data, - selected: true, - }; - } else { - node.data = { - ...node.data, - selected: false, - }; - } - return node; - }), - ); - }, - [reactFlow], - ); - - const onDragOver = useCallback((event: DragEvent) => { - event.preventDefault(); - event.dataTransfer.dropEffect = 'move'; - }, []); - - function onSave() { - const flowData = reactFlow.toObject() as IFlowData; - const [check, node, message] = checkFlowDataRequied(flowData); - if (!check && message) { - setNodes((nds) => - nds.map((item) => { - if (item.id === node?.id) { - item.data = { - ...item.data, - invalid: true, - }; - } else { - item.data = { - ...item.data, - invalid: false, - }; - } - return item; - }), - ); - return notification.error({ message: 'Error', description: message, icon: }); - } - setIsSaveFlowModalOpen(true); - } - - function onExport() { - setIsExportFlowModalOpen(true); - } - - function onImport() { - setIsImportFlowModalOpen(true); - } - - return ( - <> - - - {[ - { title: 'import', icon: }, - { title: 'export', icon: }, - { title: 'save', icon: }, - ].map(({ title, icon }) => ( - - {icon} - - ))} - - - -
- - - - - -
- - - - - - - - ); -}; - -export default function CanvasWrapper() { - return ( - - - - ); -} diff --git a/web/pages/flow/index.tsx b/web/pages/flow/index.tsx deleted file mode 100644 index 986c1045d..000000000 --- a/web/pages/flow/index.tsx +++ /dev/null @@ -1,143 +0,0 @@ -import { apiInterceptors, getFlows, addFlow } from '@/client/api'; -import MyEmpty from '@/components/common/MyEmpty'; -import MuiLoading from '@/components/common/loading'; -import FlowCard from '@/components/flow/flow-card'; -import { IFlow, IFlowUpdateParam } from '@/types/flow'; -import { PlusOutlined } from '@ant-design/icons'; -import { Button, Checkbox, Form, Input, Modal, message, Pagination, PaginationProps } from 'antd'; -import Link from 'next/link'; -import React, { useEffect, useState, useRef } from 'react'; -import { useTranslation } from 'react-i18next'; - -function Flow() { - const { t } = useTranslation(); - - const [showModal, setShowModal] = useState(false); - const [loading, setLoading] = useState(false); - const [flowList, setFlowList] = useState>([]); - const [deploy, setDeploy] = useState(false); - const [page, setPage] = useState(1); - const [pageSize, setPageSize] = useState(10); - const [total, setTotal] = useState(0); - - const [messageApi, contextHolder] = message.useMessage(); - const [form] = Form.useForm>(); - const copyFlowTemp = useRef(); - - async function getFlowList() { - setLoading(true); - const [_, data] = await apiInterceptors(getFlows(page, pageSize)); - setTotal(data?.total_count ?? 0); - setLoading(false); - setFlowList(data?.items ?? []); - } - - useEffect(() => { - getFlowList(); - }, [page, pageSize]); - - function updateFlowList(uid: string) { - setFlowList((flows) => flows.filter((flow) => flow.uid !== uid)); - } - - const handleCopy = (flow: IFlow) => { - copyFlowTemp.current = flow; - form.setFieldValue('label', `${flow.label} Copy`); - form.setFieldValue('name', `${flow.name}_copy`); - setDeploy(false); - setShowModal(true); - }; - - const onFinish = async (val: { name: string; label: string }) => { - if (!copyFlowTemp.current) return; - const { source, uid, dag_id, gmt_created, gmt_modified, state, ...params } = copyFlowTemp.current; - const data: IFlowUpdateParam = { - ...params, - editable: true, - state: deploy ? 'deployed' : 'developing', - ...val, - }; - const [err] = await apiInterceptors(addFlow(data)); - if (!err) { - messageApi.success(t('save_flow_success')); - setShowModal(false); - getFlowList(); - } - }; - - const onPageChange: PaginationProps['onChange'] = (page: number, pageSize: number) => { - setPage(page); - setPageSize(pageSize); - }; - - return ( -
- {contextHolder} - - -
- - - -
- -
-
- {flowList.map((flow) => ( - - ))} - {flowList.length === 0 && } -
- -
- `Total ${total} items`} - onChange={onPageChange} - /> -
-
- - { - setShowModal(false); - }} - footer={false} - > -
- - - - - - - - { - const val = e.target.checked; - setDeploy(val); - }} - /> - -
- -
-
-
-
- ); -} - -export default Flow; diff --git a/web/pages/knowledge/chunk/index.tsx b/web/pages/knowledge/chunk/index.tsx deleted file mode 100644 index 399e0b1ea..000000000 --- a/web/pages/knowledge/chunk/index.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { useRouter } from 'next/router'; -import { Breadcrumb, Card, Empty, Pagination, Spin } from 'antd'; -import { useTranslation } from 'react-i18next'; -import { apiInterceptors, getChunkList } from '@/client/api'; -import DocIcon from '@/components/knowledge/doc-icon'; - -const DEDAULT_PAGE_SIZE = 10; - -function ChunkList() { - const router = useRouter(); - const { t } = useTranslation(); - const [chunkList, setChunkList] = useState([]); - const [total, setTotal] = useState(0); - const [loading, setLoading] = useState(false); - const { - query: { id, spaceName }, - } = useRouter(); - - const fetchChunks = async () => { - const [_, data] = await apiInterceptors( - getChunkList(spaceName as string, { - document_id: id as string, - page: 1, - page_size: DEDAULT_PAGE_SIZE, - }), - ); - - setChunkList(data?.data); - setTotal(data?.total!); - }; - - const loaderMore = async (page: number, page_size: number) => { - setLoading(true); - const [_, data] = await apiInterceptors( - getChunkList(spaceName as string, { - document_id: id as string, - page, - page_size, - }), - ); - setChunkList(data?.data || []); - setLoading(false); - }; - - useEffect(() => { - spaceName && id && fetchChunks(); - }, [id, spaceName]); - - return ( -
- - -
- {chunkList?.length > 0 ? ( - chunkList?.map((chunk: any) => { - return ( - - - {chunk.doc_name} - - } - > -

{t('Content')}:

-

{chunk?.content}

-

{t('Meta_Data')}:

-

{chunk?.meta_info}

-
- ); - }) - ) : ( - - )} -
-
- `Total ${total} items`} - onChange={loaderMore} - /> -
- ); -} - -export default ChunkList; diff --git a/web/pages/knowledge/graph/index.tsx b/web/pages/knowledge/graph/index.tsx deleted file mode 100644 index e832d03c1..000000000 --- a/web/pages/knowledge/graph/index.tsx +++ /dev/null @@ -1,137 +0,0 @@ -import React, { useEffect,useRef, useState } from 'react'; -import cytoscape from 'cytoscape'; -import euler from 'cytoscape-euler'; -import { Button } from 'antd'; -import { RollbackOutlined } from '@ant-design/icons'; -cytoscape.use(euler) -import { apiInterceptors,getGraphVis } from '@/client/api'; -import { useRouter } from 'next/router'; - -const LAYOUTCONFIG = { - name: 'euler', - springLength: 340, - fit: false, - springCoeff: 0.0008, - mass: 20, - dragCoeff: 1, - gravity: -20, - pull: 0.009, - randomize: false, - padding: 0, - maxIterations: 1000, - maxSimulationTime: 4000, -} - -function GraphVis() { - const myRef = useRef(null); - const LIMIT = 500 - const router = useRouter(); - const fetchGraphVis = async () => { - const [_, data] = await apiInterceptors(getGraphVis(spaceName as string,{limit:LIMIT})) - if(myRef.current && data){ - let processedData = processResult(data) - renderGraphVis(processedData) - } - } - const processResult = (data:{nodes:Array,edges:Array}) => { - let nodes:any[] = [] - let edges:any[] = [] - data.nodes.forEach((node:any)=>{ - let n = { - data:{ - id:node.vid, - displayName:node.vid, - } - } - nodes.push(n) - }) - data.edges.forEach((edge:any)=>{ - let e = { - data:{ - id:edge.src+'_'+edge.dst+'_'+edge.label, - source:edge.src, - target:edge.dst, - displayName:edge.label - } - } - edges.push(e) - }) - return { - nodes, - edges - } - } - const renderGraphVis = (data:any)=> { - let dom = myRef.current as HTMLDivElement - let cy = cytoscape( - { - container:myRef.current, - elements:data, - zoom:0.3, - pixelRatio: 'auto', - style:[ - { - selector: 'node', - style: { - width: 60, - height: 60, - color: '#fff', - 'text-outline-color': '#37D4BE', - 'text-outline-width': 2, - 'text-valign': 'center', - 'text-halign': 'center', - 'background-color': '#37D4BE', - 'label': 'data(displayName)' - } - }, - { - selector: 'edge', - style: { - 'width': 1, - color: '#fff', - 'label': 'data(displayName)', - 'line-color': '#66ADFF', - 'font-size': 14, - 'target-arrow-shape': 'vee', - 'control-point-step-size': 40, - 'curve-style': 'bezier', - 'text-background-opacity': 1, - 'text-background-color': '#66ADFF', - 'target-arrow-color': '#66ADFF', - 'text-background-shape': 'roundrectangle', - 'text-border-color': '#000', - 'text-wrap': 'wrap', - 'text-valign': 'top', - 'text-halign': 'center', - 'text-background-padding':'5', - } - } - ] - } - ) - cy.layout(LAYOUTCONFIG).run() - cy.pan({ - x: dom.clientWidth / 2, - y: dom.clientHeight / 2 - }) - } - const back = ()=>{ - router.push(`/knowledge`); - } - const { - query: { spaceName }, - } = useRouter(); - useEffect(()=>{ - spaceName && fetchGraphVis() - }) - return ( -
-
- -
-
-
- ); -} - -export default GraphVis; diff --git a/web/pages/knowledge/index.tsx b/web/pages/knowledge/index.tsx deleted file mode 100644 index 0d4902462..000000000 --- a/web/pages/knowledge/index.tsx +++ /dev/null @@ -1,123 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import { PlusOutlined } from '@ant-design/icons'; -import { Button, Modal, Steps } from 'antd'; -import SpaceCard from '@/components/knowledge/space-card'; -import { File, ISpace, StepChangeParams, IStorage, SpaceConfig } from '@/types/knowledge'; -import { apiInterceptors, getSpaceList, getSpaceConfig } from '@/client/api'; -import { useTranslation } from 'react-i18next'; -import DocUploadForm from '@/components/knowledge/doc-upload-form'; -import SpaceForm from '@/components/knowledge/space-form'; -import DocTypeForm from '@/components/knowledge/doc-type-form'; -import Segmentation from '@/components/knowledge/segmentation'; -import classNames from 'classnames'; - -const Knowledge = () => { - const [spaceList, setSpaceList] = useState | null>([]); - const [isAddShow, setIsAddShow] = useState(false); - const [activeStep, setActiveStep] = useState(0); - const [spaceName, setSpaceName] = useState(''); - const [files, setFiles] = useState>([]); - const [docType, setDocType] = useState(''); - const [spaceConfig, setSpaceConfig] = useState(null); - - const { t } = useTranslation(); - const addKnowledgeSteps = [ - { title: t('Knowledge_Space_Config') }, - { title: t('Choose_a_Datasource_type') }, - { title: t('Upload') }, - { title: t('Segmentation') }, - ]; - - async function getSpaces() { - const [_, data] = await apiInterceptors(getSpaceList()); - setSpaceList(data); - } - - async function getSpaceConfigs() { - const [_, data] = await apiInterceptors(getSpaceConfig()); - if (!data) return null; - setSpaceConfig(data.storage); - } - - useEffect(() => { - getSpaces(); - getSpaceConfigs(); - }, []); - - const handleStepChange = ({ label, spaceName, docType = '', files, pace = 1 }: StepChangeParams) => { - if (label === 'finish') { - setIsAddShow(false); - getSpaces(); - setSpaceName(''); - setDocType(''); - } else if (label === 'forward') { - activeStep === 0 && getSpaces(); - setActiveStep((step) => step + pace); - } else { - setActiveStep((step) => step - pace); - } - files && setFiles(files); - spaceName && setSpaceName(spaceName); - docType && setDocType(docType); - }; - - function onAddDoc(spaceName: string) { - const space = spaceList?.find((item) => item?.name === spaceName); - setSpaceName(spaceName); - setActiveStep(space?.domain_type === 'FinancialReport' ? 2 : 1); - setIsAddShow(true); - if (space?.domain_type === 'FinancialReport') { - setDocType('DOCUMENT'); - } - } - - return ( -
-
- -
- {spaceList?.map((space: ISpace) => ( - - ))} -
-
- { - setIsAddShow(false); - }} - width={1000} - afterClose={() => { - setActiveStep(0); - getSpaces(); - }} - footer={null} - > - - {activeStep === 0 && } - {activeStep === 1 && } - - {activeStep === 3 && } - -
- ); -}; - -export default Knowledge; diff --git a/web/pages/models/index.tsx b/web/pages/models/index.tsx deleted file mode 100644 index db053bb02..000000000 --- a/web/pages/models/index.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { apiInterceptors, getModelList } from '@/client/api'; -import ModelCard from '@/components/model/model-card'; -import ModelForm from '@/components/model/model-form'; -import { IModelData } from '@/types/model'; -import { Button, Modal } from 'antd'; -import { useEffect, useState } from 'react'; -import { useTranslation } from 'react-i18next'; - -function Models() { - const { t } = useTranslation(); - const [models, setModels] = useState>([]); - const [isModalOpen, setIsModalOpen] = useState(false); - - async function getModels() { - const [, res] = await apiInterceptors(getModelList()); - setModels(res ?? []); - } - - useEffect(() => { - getModels(); - }, []); - - return ( -
- -
- {models.map((item) => ( - - ))} -
- { - setIsModalOpen(false); - }} - footer={null} - > - { - setIsModalOpen(false); - }} - onSuccess={() => { - setIsModalOpen(false); - getModels(); - }} - /> - -
- ); -} - -export default Models; diff --git a/web/pages/prompt/index.tsx b/web/pages/prompt/index.tsx deleted file mode 100644 index 1bc6fa6ac..000000000 --- a/web/pages/prompt/index.tsx +++ /dev/null @@ -1,181 +0,0 @@ -import { useState, useEffect, useRef, Ref } from 'react'; -import type { ColumnsType } from 'antd/es/table'; -import type { FormInstance, MenuProps } from 'antd'; -import { Menu, Table, Button, Tooltip, Modal } from 'antd'; -import { PlusOutlined } from '@ant-design/icons'; -import GroupsIcon from '@mui/icons-material/Groups'; -import PersonIcon from '@mui/icons-material/Person'; -import { useTranslation } from 'react-i18next'; -import { addPrompt, apiInterceptors, getPromptList, postScenes, updatePrompt } from '@/client/api'; -import { IPrompt } from '@/types/prompt'; -import PromptForm from '@/components/prompt/prompt-form'; -import { TFunction } from 'i18next'; - -const getItems = (t: TFunction) => [ - { - label: t('Public') + ' Prompts', - key: 'common', - icon: , - }, - { - label: t('Private') + ' Prompts', - key: 'private', - icon: , - }, -]; - -const getColumns = (t: TFunction, handleEdit: (prompt: IPrompt) => void): ColumnsType => [ - { - title: t('Prompt_Info_Name'), - dataIndex: 'prompt_name', - key: 'prompt_name', - }, - { - title: t('Prompt_Info_Scene'), - dataIndex: 'chat_scene', - key: 'chat_scene', - }, - { - title: t('Prompt_Info_Sub_Scene'), - dataIndex: 'sub_chat_scene', - key: 'sub_chat_scene', - }, - { - title: t('Prompt_Info_Content'), - dataIndex: 'content', - key: 'content', - render: (content) => ( - - {content} - - ), - }, - { - title: t('Operation'), - dataIndex: 'operate', - key: 'operate', - render: (_, record) => ( - - ), - }, -]; - -type FormType = Ref> | undefined; - -const Prompt = () => { - const { t } = useTranslation(); - - const [promptType, setPromptType] = useState('common'); - const [promptList, setPromptList] = useState>(); - const [loading, setLoading] = useState(false); - const [prompt, setPrompt] = useState(); - const [showModal, setShowModal] = useState(false); - const [scenes, setScenes] = useState>>(); - const formRef = useRef(); - - const getPrompts = async () => { - setLoading(true); - const body = { - prompt_type: promptType, - current: 1, - pageSize: 1000, - hideOnSinglePage: true, - showQuickJumper: true, - }; - const [_, data] = await apiInterceptors(getPromptList(body)); - setPromptList(data!); - setLoading(false); - }; - - const getScenes = async () => { - const [, res] = await apiInterceptors(postScenes()); - setScenes(res?.map((scene) => ({ value: scene.chat_scene, label: scene.scene_name }))); - }; - - const onFinish = async (newPrompt: IPrompt) => { - if (prompt) { - await apiInterceptors(updatePrompt({ ...newPrompt, prompt_type: promptType })); - } else { - await apiInterceptors(addPrompt({ ...newPrompt, prompt_type: promptType })); - } - getPrompts(); - handleClose(); - }; - - const handleEditBtn = (prompt: IPrompt) => { - setPrompt(prompt); - setShowModal(true); - }; - - const handleAddBtn = () => { - setShowModal(true); - setPrompt(undefined); - }; - - const handleClose = () => { - setShowModal(false); - }; - - const handleMenuChange: MenuProps['onClick'] = (e) => { - const type = e.key; - setPromptType(type); - }; - - useEffect(() => { - getPrompts(); - }, [promptType]); - - useEffect(() => { - getScenes(); - }, []); - - return ( -
- -
-
- - {promptType === 'common' && ( - - )} -
- record.prompt_name} - scroll={{ y: 600 }} - /> - - { - // @ts-ignore - formRef.current?.submit(); - }} - > - - - - ); -}; - -export default Prompt;