diff --git a/app/agents/layout.tsx b/app/agents/layout.tsx
deleted file mode 100644
index 8c94ab3..0000000
--- a/app/agents/layout.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import { Box } from '@/lib/mui';
-
-export default function RootLayout({
- children,
-}: {
- children: React.ReactNode
-}) {
- return (
- <>
- {children}
- >
- )
-}
diff --git a/app/agents/page.tsx b/app/agents/page.tsx
deleted file mode 100644
index 3dcd846..0000000
--- a/app/agents/page.tsx
+++ /dev/null
@@ -1,214 +0,0 @@
-"use client"
-import ChatBoxComp from '@/components/chatBox';
-import { Chart, LineAdvance, Interval, Tooltip, getTheme } from 'bizcharts';
-import { Card, CardContent, Typography, Grid, styled, Sheet } from '@/lib/mui';
-import { Stack } from '@mui/material';
-import useAgentChat from '@/hooks/useAgentChat';
-
-
-const Item = styled(Sheet)(({ theme }) => ({
- ...theme.typography.body2,
- padding: theme.spacing(1),
- textAlign: 'center',
- borderRadius: 4,
- color: theme.vars.palette.text.secondary,
-}));
-
-const Agents = () => {
- const { handleChatSubmit, history } = useAgentChat({
- queryAgentURL: `/v1/chat/completions`,
- });
-
- const data = [
- {
- month: "Jan",
- city: "Tokyo",
- temperature: 7
- },
- {
- month: "Feb",
- city: "Tokyo",
- temperature: 13
- },
- {
- month: "Mar",
- city: "Tokyo",
- temperature: 16.5
- },
- {
- month: "Apr",
- city: "Tokyo",
- temperature: 14.5
- },
- {
- month: "May",
- city: "Tokyo",
- temperature: 10
- },
- {
- month: "Jun",
- city: "Tokyo",
- temperature: 7.5
- },
- {
- month: "Jul",
- city: "Tokyo",
- temperature: 9.2
- },
- {
- month: "Aug",
- city: "Tokyo",
- temperature: 14.5
- },
- {
- month: "Sep",
- city: "Tokyo",
- temperature: 9.3
- },
- {
- month: "Oct",
- city: "Tokyo",
- temperature: 8.3
- },
- {
- month: "Nov",
- city: "Tokyo",
- temperature: 8.9
- },
- {
- month: "Dec",
- city: "Tokyo",
- temperature: 5.6
- },
- ];
-
- const d1 = [
- { year: '1951 年', sales: 0 },
- { year: '1952 年', sales: 52 },
- { year: '1956 年', sales: 61 },
- { year: '1957 年', sales: 45 },
- { year: '1958 年', sales: 48 },
- { year: '1959 年', sales: 38 },
- { year: '1960 年', sales: 38 },
- { year: '1962 年', sales: 38 },
- ];
-
- const topCard = [{
- label: 'Revenue Won',
- value: '$7,811,851'
- }, {
- label: 'Close %',
- value: '37.7%'
- }, {
- label: 'AVG Days to Close',
- value: '121'
- }, {
- label: 'Opportunities Won',
- value: '526'
- }];
-
- return (
-
-
-
-
-
- -
-
- {topCard.map((item) => (
-
-
-
-
- {item.label}
-
-
- {item.value}
-
-
-
-
- ))}
-
-
- -
-
-
-
- Revenue Won by Month
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
- Close % by Month
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Close % by Month
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Close % by Month
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- )
-}
-
-export default Agents;
\ No newline at end of file
diff --git a/app/chat/page.tsx b/app/chat/page.tsx
index 529b56e..3a9e1c4 100644
--- a/app/chat/page.tsx
+++ b/app/chat/page.tsx
@@ -1,4 +1,7 @@
"use client"
+import { useEffect, useMemo, useState } from 'react';
+import { Chart, LineAdvance, Interval, Tooltip, getTheme } from "bizcharts";
+import { Card, CardContent, Typography, Grid, Table, Skeleton, AspectRatio, Box, aspectRatioClasses } from "@/lib/mui";
import { useRequest } from 'ahooks';
import { sendGetRequest, sendPostRequest } from '@/utils/request';
import useAgentChat from '@/hooks/useAgentChat';
@@ -6,13 +9,44 @@ import ChatBoxComp from '@/components/chatBoxTemp';
import { useDialogueContext } from '@/app/context/dialogue';
import { useSearchParams } from 'next/navigation';
+import lodash from 'lodash';
+
+const ChartSkeleton = () => {
+ return (
+
+
+
+
+
+
+
+ )
+};
+
const AgentPage = () => {
+ const [chartsData, setChartsData] = useState();
const searchParams = useSearchParams();
const { refreshDialogList } = useDialogueContext();
const id = searchParams.get('id');
const scene = searchParams.get('scene');
- const { data: historyList } = useRequest(async () => await sendGetRequest('/v1/chat/dialogue/messages/history', {
+ const { data: historyList, run: runHistoryList } = useRequest(async () => await sendGetRequest('/v1/chat/dialogue/messages/history', {
con_uid: id
}), {
ready: !!id,
@@ -30,20 +64,245 @@ const AgentPage = () => {
conv_uid: id,
chat_mode: scene || 'chat_normal',
},
- initHistory: historyList?.data
+ initHistory: historyList?.data,
+ runHistoryList
});
+ useEffect(() => {
+ try {
+ const contextTemp = history?.[history.length - 1]?.context;
+ const contextObj = JSON.parse(contextTemp);
+ setChartsData(contextObj?.template_name === 'report' ? contextObj?.charts : undefined);
+ } catch (e) {
+ setChartsData(undefined);
+ }
+ }, [history]);
+
+ const chartRows = useMemo(() => {
+ if (chartsData) {
+ let res = [];
+ // 若是有类型为 IndicatorValue 的,提出去,独占一行
+ const chartCalc = chartsData?.filter(
+ (item) => item.chart_type === "IndicatorValue"
+ );
+ if (chartCalc.length > 0) {
+ res.push({
+ rowIndex: res.length,
+ cols: chartCalc,
+ type: "IndicatorValue",
+ });
+ }
+ let otherCharts = chartsData?.filter(
+ (item) => item.chart_type !== "IndicatorValue"
+ );
+ let otherLength = otherCharts.length;
+ let curIndex = 0;
+ // charts 数量 3~8个,暂定每行排序
+ let chartLengthMap = [
+ [0],
+ [1],
+ [2],
+ [1, 2],
+ [1, 3],
+ [2, 1, 2],
+ [2, 1, 3],
+ [3, 1, 3],
+ [3, 2, 3],
+ ];
+ let currentRowsSort = chartLengthMap[otherLength];
+ currentRowsSort.forEach((item) => {
+ if (item > 0) {
+ const rowsItem = otherCharts.slice(curIndex, curIndex + item);
+ curIndex = curIndex + item;
+ res.push({
+ rowIndex: res.length,
+ cols: rowsItem,
+ });
+ }
+ });
+ return res;
+ }
+ return undefined;
+ }, [chartsData]);
+
return (
- <>
- {
- await refreshDialogList();
- }}
- messages={history || []}
- onSubmit={handleChatSubmit}
- paramsList={paramsList?.data}
- />
- >
+
+ {chartsData && (
+
+
+ {chartRows?.map((chartRow) => (
+
+ {chartRow.cols.map((col) => {
+ if (col.chart_type === "IndicatorValue") {
+ return (
+
+ {col.values.map((item) => (
+
+
+
+
+ {item.name}
+
+ {item.value}
+
+
+
+ ))}
+
+ );
+ } else if (col.chart_type === "LineChart") {
+ return (
+
+
+
+
+ {col.chart_name}
+
+
+ {col.chart_desc}
+
+
+
+
+
+
+
+
+
+ );
+ } else if (col.chart_type === "BarChart") {
+ return (
+
+
+
+
+ {col.chart_name}
+
+
+ {col.chart_desc}
+
+
+
+
+
+
+
+
+
+
+ );
+ } else if (col.chart_type === 'Table') {
+ const data = lodash.groupBy(col.values, 'type');
+ return (
+
+
+
+
+ {col.chart_name}
+
+
+ {col.chart_desc}
+
+
+
+
+
+ {Object.keys(data).map(key => (
+ {key} |
+ ))}
+
+
+
+ {Object.values(data)?.[0]?.map((value, i) => (
+
+ {Object.keys(data)?.map(k => (
+ {data?.[k]?.[i].value || ''} |
+ ))}
+
+ ))}
+
+
+
+
+
+
+ )
+ }
+ })}
+
+ ))}
+
+
+ )}
+ {!chartsData && scene === 'chat_dashboard' && (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )}
+
+
+ {
+ await refreshDialogList();
+ }}
+ isChartChat={scene === 'chat_dashboard'}
+ messages={history || []}
+ onSubmit={handleChatSubmit}
+ paramsList={paramsList?.data}
+ setChartsData={setChartsData}
+ />
+
+
+
+
)
}
diff --git a/app/datastores/documents/page.tsx b/app/datastores/documents/page.tsx
index 3749145..acf10be 100644
--- a/app/datastores/documents/page.tsx
+++ b/app/datastores/documents/page.tsx
@@ -1,38 +1,34 @@
'use client'
-import { useRouter, useSearchParams } from 'next/navigation'
+import { useRouter } from 'next/navigation'
import React, { useState, useEffect } from 'react'
+import { InboxOutlined } from '@ant-design/icons'
+import CheckCircleOutlinedIcon from '@mui/icons-material/CheckCircleOutlined'
+import ContentPasteSearchOutlinedIcon from '@mui/icons-material/ContentPasteSearchOutlined'
+import type { UploadProps } from 'antd'
+import { message, Upload } from 'antd'
import {
useColorScheme,
+ Modal,
Button,
- Table,
Sheet,
- Modal,
- Box,
Stack,
+ Box,
Input,
Textarea,
- Chip,
Switch,
Typography,
- Breadcrumbs,
- Link,
styled
} from '@/lib/mui'
-import moment from 'moment'
-import { InboxOutlined } from '@ant-design/icons'
-import CheckCircleOutlinedIcon from '@mui/icons-material/CheckCircleOutlined'
-import CachedIcon from '@mui/icons-material/Cached'
-import type { UploadProps } from 'antd'
-import { Upload, Pagination, Popover, message } from 'antd'
import {
sendSpacePostRequest,
sendSpaceUploadPostRequest
} from '@/utils/request'
const { Dragger } = Upload
+
const Item = styled(Sheet)(({ theme }) => ({
- width: '50%',
+ width: '33%',
backgroundColor:
theme.palette.mode === 'dark' ? theme.palette.background.level1 : '#fff',
...theme.typography.body2,
@@ -41,7 +37,9 @@ const Item = styled(Sheet)(({ theme }) => ({
borderRadius: 4,
color: theme.vars.palette.text.secondary
}))
-const stepsOfAddingDocument = [
+
+const stepsOfAddingSpace = [
+ 'Knowledge Space Config',
'Choose a Datasource type',
'Setup the Datasource'
]
@@ -63,24 +61,22 @@ const documentTypeList = [
'Upload a document, document type can be PDF, CSV, Text, PowerPoint, Word, Markdown'
}
]
-const page_size = 20
-const Documents = () => {
+const Index = () => {
const router = useRouter()
- const spaceName = useSearchParams().get('name')
- const { mode } = useColorScheme()
- const [isAddDocumentModalShow, setIsAddDocumentModalShow] =
- useState(false)
const [activeStep, setActiveStep] = useState(0)
const [documentType, setDocumentType] = useState('')
- const [documents, setDocuments] = useState([])
+ const [knowledgeSpaceList, setKnowledgeSpaceList] = useState([])
+ const [isAddKnowledgeSpaceModalShow, setIsAddKnowledgeSpaceModalShow] =
+ useState(false)
+ const [knowledgeSpaceName, setKnowledgeSpaceName] = useState('')
+ const [owner, setOwner] = useState('')
+ const [description, setDescription] = useState('')
const [webPageUrl, setWebPageUrl] = useState('')
const [documentName, setDocumentName] = useState('')
const [textSource, setTextSource] = useState('')
const [text, setText] = useState('')
const [originFileObj, setOriginFileObj] = useState(null)
- const [total, setTotal] = useState(0)
- const [current, setCurrent] = useState(0)
const [synchChecked, setSynchChecked] = useState(true)
const props: UploadProps = {
name: 'file',
@@ -97,217 +93,193 @@ const Documents = () => {
}
}
useEffect(() => {
- async function fetchDocuments() {
- const data = await sendSpacePostRequest(
- `/knowledge/${spaceName}/document/list`,
- {
- page: 1,
- page_size
- }
- )
+ async function fetchData() {
+ const data = await sendSpacePostRequest('/knowledge/space/list', {})
if (data.success) {
- setDocuments(data.data.data)
- setTotal(data.data.total)
- setCurrent(data.data.page)
+ setKnowledgeSpaceList(data.data)
}
}
- fetchDocuments()
+ fetchData()
}, [])
return (
-
-
+
-
- {
- router.push('/datastores')
- }}
- key="Knowledge Space"
- underline="hover"
- color="neutral"
- fontSize="inherit"
- >
- Knowledge Space
-
- Documents
-
-
-
- {documents.length ? (
- <>
-
setIsAddKnowledgeSpaceModalShow(true)}
+ className="bg-[#E9EBEE] dark:bg-[#484848]"
>
-
-
- Name |
- Type |
- Size |
- Last Synch |
- Status |
- Result |
- Operation |
-
-
-
- {documents.map((row: any) => (
-
- {row.doc_name} |
-
-
- {row.doc_type}
-
- |
- {row.chunk_size} chunks |
- {moment(row.last_sync).format('YYYY-MM-DD HH:MM:SS')} |
-
-
- {row.status}
-
- |
-
- {(function () {
- if (row.status === 'TODO' || row.status === 'RUNNING') {
- return ''
- } else if (row.status === 'FINISHED') {
- return (
-
-
- SUCCESS
-
-
- )
- } else {
- return (
-
-
- FAILED
-
-
- )
- }
- })()}
- |
-
- {
- <>
-
-
- >
- }
- |
-
- ))}
-
-
-
- {
- const data = await sendSpacePostRequest(
- `/knowledge/${spaceName}/document/list`,
- {
- page,
- page_size
- }
- )
- if (data.success) {
- setDocuments(data.data.data)
- setTotal(data.data.total)
- setCurrent(data.data.page)
+
+ +
+
+
+ space
+
+
+ {knowledgeSpaceList.map((item: any, index: number) => (
+
-
- >
- ) : (
- <>>
- )}
+ onClick={() => {
+ router.push(`/datastores/documents?name=${item.name}`)
+ }}
+ className="bg-[#FFFFFF] dark:bg-[#484848]"
+ >
+
+
+ {item.name}
+
+
+
+
+ {item.vector_type}
+
+ Vector
+
+
+
+ {item.owner}
+
+ Owner
+
+
+
+ {item.docs || 0}
+
+ Docs
+
+
+
+ ))}
+
+
+
+
+
+
+
{
alignItems: 'center',
'z-index': 1000
}}
- open={isAddDocumentModalShow}
- onClose={() => setIsAddDocumentModalShow(false)}
+ open={isAddKnowledgeSpaceModalShow}
+ onClose={() => setIsAddKnowledgeSpaceModalShow(false)}
>
{
>
- {stepsOfAddingDocument.map((item: any, index: number) => (
+ {stepsOfAddingSpace.map((item: any, index: number) => (
- {
{activeStep === 0 ? (
+ <>
+
+ Knowledge Space Name:
+ setKnowledgeSpaceName(e.target.value)}
+ sx={{ marginBottom: '20px' }}
+ />
+ Owner:
+ setOwner(e.target.value)}
+ sx={{ marginBottom: '20px' }}
+ />
+ Description:
+ setDescription(e.target.value)}
+ sx={{ marginBottom: '20px' }}
+ />
+
+
+ >
+ ) : activeStep === 1 ? (
<>
{documentTypeList.map((item: any) => (
@@ -367,7 +403,7 @@ const Documents = () => {
}}
onClick={() => {
setDocumentType(item.type)
- setActiveStep(1)
+ setActiveStep(2)
}}
>
@@ -456,7 +492,7 @@ const Documents = () => {
@@ -473,36 +509,23 @@ const Documents = () => {
return
}
const data = await sendSpacePostRequest(
- `/knowledge/${spaceName}/document/add`,
+ `/knowledge/${knowledgeSpaceName}/document/add`,
{
doc_name: documentName,
content: webPageUrl,
doc_type: 'URL'
}
)
- data.success &&
- synchChecked &&
- sendSpacePostRequest(
- `/knowledge/${spaceName}/document/sync`,
- {
- doc_ids: [data.data]
- }
- )
if (data.success) {
message.success('success')
- setIsAddDocumentModalShow(false)
- const data = await sendSpacePostRequest(
- `/knowledge/${spaceName}/document/list`,
- {
- page: current,
- page_size
- }
- )
- if (data.success) {
- setDocuments(data.data.data)
- setTotal(data.data.total)
- setCurrent(data.data.page)
- }
+ setIsAddKnowledgeSpaceModalShow(false)
+ synchChecked &&
+ sendSpacePostRequest(
+ `/knowledge/${knowledgeSpaceName}/document/sync`,
+ {
+ doc_ids: [data.data]
+ }
+ )
} else {
message.error(data.err_msg || 'failed')
}
@@ -515,33 +538,21 @@ const Documents = () => {
formData.append('doc_name', documentName)
formData.append('doc_file', originFileObj)
formData.append('doc_type', 'DOCUMENT')
+
const data = await sendSpaceUploadPostRequest(
- `/knowledge/${spaceName}/document/upload`,
+ `/knowledge/${knowledgeSpaceName}/document/upload`,
formData
)
- data.success &&
- synchChecked &&
- sendSpacePostRequest(
- `/knowledge/${spaceName}/document/sync`,
- {
- doc_ids: [data.data]
- }
- )
if (data.success) {
message.success('success')
- setIsAddDocumentModalShow(false)
- const data = await sendSpacePostRequest(
- `/knowledge/${spaceName}/document/list`,
- {
- page: current,
- page_size
- }
- )
- if (data.success) {
- setDocuments(data.data.data)
- setTotal(data.data.total)
- setCurrent(data.data.page)
- }
+ setIsAddKnowledgeSpaceModalShow(false)
+ synchChecked &&
+ sendSpacePostRequest(
+ `/knowledge/${knowledgeSpaceName}/document/sync`,
+ {
+ doc_ids: [data.data]
+ }
+ )
} else {
message.error(data.err_msg || 'failed')
}
@@ -551,7 +562,7 @@ const Documents = () => {
return
}
const data = await sendSpacePostRequest(
- `/knowledge/${spaceName}/document/add`,
+ `/knowledge/${knowledgeSpaceName}/document/add`,
{
doc_name: documentName,
source: textSource,
@@ -559,29 +570,16 @@ const Documents = () => {
doc_type: 'TEXT'
}
)
- data.success &&
- synchChecked &&
- sendSpacePostRequest(
- `/knowledge/${spaceName}/document/sync`,
- {
- doc_ids: [data.data]
- }
- )
if (data.success) {
message.success('success')
- setIsAddDocumentModalShow(false)
- const data = await sendSpacePostRequest(
- `/knowledge/${spaceName}/document/list`,
- {
- page: current,
- page_size
- }
- )
- if (data.success) {
- setDocuments(data.data.data)
- setTotal(data.data.total)
- setCurrent(data.data.page)
- }
+ setIsAddKnowledgeSpaceModalShow(false)
+ synchChecked &&
+ sendSpacePostRequest(
+ `/knowledge/${knowledgeSpaceName}/document/sync`,
+ {
+ doc_ids: [data.data]
+ }
+ )
} else {
message.error(data.err_msg || 'failed')
}
@@ -595,8 +593,8 @@ const Documents = () => {
)}
-
+
)
}
-export default Documents
+export default Index
diff --git a/app/datastores/page.tsx b/app/datastores/page.tsx
index 3abf025..acf10be 100644
--- a/app/datastores/page.tsx
+++ b/app/datastores/page.tsx
@@ -64,7 +64,6 @@ const documentTypeList = [
const Index = () => {
const router = useRouter()
- const { mode } = useColorScheme()
const [activeStep, setActiveStep] = useState(0)
const [documentType, setDocumentType] = useState('')
const [knowledgeSpaceList, setKnowledgeSpaceList] = useState([])
diff --git a/app/page.tsx b/app/page.tsx
index 7d3801e..17eb0e9 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -58,12 +58,22 @@ export default function Home() {
'&: hover': {
backgroundColor: 'var(--joy-palette-primary-solidHoverBg)',
}
+ },
+ [`& .${buttonClasses.disabled}`]: {
+ cursor: 'not-allowed',
+ pointerEvents: 'unset',
+ color: 'var(--joy-palette-primary-plainColor)',
+ backgroundColor: 'var(--joy-palette-primary-softDisabledBg)',
+ '&: hover': {
+ backgroundColor: 'var(--joy-palette-primary-softDisabledBg)',
+ }
}
}}
>
- {scenesList?.data?.map(scene => (
+ {scenesList?.data?.map((scene) => (