From ff2330d3ec8274804596ac9880f500958ee413eb Mon Sep 17 00:00:00 2001 From: bill Date: Thu, 30 May 2024 16:16:50 +0800 Subject: [PATCH 1/8] feat: add BeginForm --- web/src/components/knowledge-base-item.tsx | 37 ++++++++++++++++ web/src/components/top-n-item.tsx | 23 ++++++++++ web/src/interfaces/database/flow.ts | 8 ++-- .../assistant-setting.tsx | 36 +++------------- .../prompt-engine.tsx | 17 +------- web/src/pages/flow/begin-form/index.tsx | 43 +++++++++++++++++++ web/src/pages/flow/canvas/index.less | 4 ++ web/src/pages/flow/canvas/index.tsx | 22 +++++++--- web/src/pages/flow/cite-form/index.tsx | 5 +++ web/src/pages/flow/constant.ts | 6 +++ web/src/pages/flow/flow-drawer/index.tsx | 31 +++++++++++-- web/src/pages/flow/generate-form/index.tsx | 5 +++ web/src/pages/flow/hooks.ts | 12 +++++- web/src/pages/flow/index.tsx | 2 +- web/src/pages/flow/retrieval-form/index.tsx | 38 ++++++++++++++++ 15 files changed, 228 insertions(+), 61 deletions(-) create mode 100644 web/src/components/knowledge-base-item.tsx create mode 100644 web/src/components/top-n-item.tsx create mode 100644 web/src/pages/flow/begin-form/index.tsx create mode 100644 web/src/pages/flow/canvas/index.less create mode 100644 web/src/pages/flow/cite-form/index.tsx create mode 100644 web/src/pages/flow/constant.ts create mode 100644 web/src/pages/flow/generate-form/index.tsx create mode 100644 web/src/pages/flow/retrieval-form/index.tsx diff --git a/web/src/components/knowledge-base-item.tsx b/web/src/components/knowledge-base-item.tsx new file mode 100644 index 00000000000..01cecee9a03 --- /dev/null +++ b/web/src/components/knowledge-base-item.tsx @@ -0,0 +1,37 @@ +import { useTranslate } from '@/hooks/commonHooks'; +import { useFetchKnowledgeList } from '@/hooks/knowledgeHook'; +import { Form, Select } from 'antd'; + +const KnowledgeBaseItem = () => { + const { t } = useTranslate('chat'); + + const { list: knowledgeList } = useFetchKnowledgeList(true); + + const knowledgeOptions = knowledgeList.map((x) => ({ + label: x.name, + value: x.id, + })); + + return ( + + + + ); +}; + +export default KnowledgeBaseItem; diff --git a/web/src/components/top-n-item.tsx b/web/src/components/top-n-item.tsx new file mode 100644 index 00000000000..2a83b8c440f --- /dev/null +++ b/web/src/components/top-n-item.tsx @@ -0,0 +1,23 @@ +import { useTranslate } from '@/hooks/commonHooks'; +import { Form, Slider } from 'antd'; + +type FieldType = { + top_n?: number; +}; + +const TopNItem = () => { + const { t } = useTranslate('chat'); + + return ( + + label={t('topN')} + name={'top_n'} + initialValue={8} + tooltip={t('topNTip')} + > + + + ); +}; + +export default TopNItem; diff --git a/web/src/interfaces/database/flow.ts b/web/src/interfaces/database/flow.ts index 00f17cf78ef..80d24eba603 100644 --- a/web/src/interfaces/database/flow.ts +++ b/web/src/interfaces/database/flow.ts @@ -1,4 +1,4 @@ -export type DSLComponents = Record; +export type DSLComponents = Record; export interface DSL { components: DSLComponents; @@ -7,13 +7,13 @@ export interface DSL { answer: any[]; } -export interface Operator { - obj: OperatorNode; +export interface IOperator { + obj: IOperatorNode; downstream: string[]; upstream: string[]; } -export interface OperatorNode { +export interface IOperatorNode { component_name: string; params: Record; } diff --git a/web/src/pages/chat/chat-configuration-modal/assistant-setting.tsx b/web/src/pages/chat/chat-configuration-modal/assistant-setting.tsx index 97d998f5c90..158cb4c908d 100644 --- a/web/src/pages/chat/chat-configuration-modal/assistant-setting.tsx +++ b/web/src/pages/chat/chat-configuration-modal/assistant-setting.tsx @@ -1,18 +1,13 @@ -import { useFetchKnowledgeList } from '@/hooks/knowledgeHook'; import { PlusOutlined } from '@ant-design/icons'; import { Form, Input, Select, Switch, Upload } from 'antd'; import classNames from 'classnames'; import { ISegmentedContentProps } from '../interface'; +import KnowledgeBaseItem from '@/components/knowledge-base-item'; import { useTranslate } from '@/hooks/commonHooks'; import styles from './index.less'; const AssistantSetting = ({ show }: ISegmentedContentProps) => { - const { list: knowledgeList } = useFetchKnowledgeList(true); - const knowledgeOptions = knowledgeList.map((x) => ({ - label: x.name, - value: x.id, - })); const { t } = useTranslate('chat'); const normFile = (e: any) => { @@ -24,12 +19,10 @@ const AssistantSetting = ({ show }: ISegmentedContentProps) => { const uploadButtion = ( - ) + +
{t('upload', { keyPrefix: 'common' })}
+ + ); return (
{ > - - - +
); }; diff --git a/web/src/pages/chat/chat-configuration-modal/prompt-engine.tsx b/web/src/pages/chat/chat-configuration-modal/prompt-engine.tsx index f49faa4bf78..e988f851740 100644 --- a/web/src/pages/chat/chat-configuration-modal/prompt-engine.tsx +++ b/web/src/pages/chat/chat-configuration-modal/prompt-engine.tsx @@ -7,7 +7,6 @@ import { Form, Input, Row, - Slider, Switch, Table, TableProps, @@ -30,16 +29,11 @@ import { import { EditableCell, EditableRow } from './editable-cell'; import Rerank from '@/components/rerank'; +import TopNItem from '@/components/top-n-item'; import { useTranslate } from '@/hooks/commonHooks'; import { useSelectPromptConfigParameters } from '../hooks'; import styles from './index.less'; -type FieldType = { - similarity_threshold?: number; - vector_similarity_weight?: number; - top_n?: number; -}; - const PromptEngine = ( { show }: ISegmentedContentProps, ref: ForwardedRef>, @@ -165,14 +159,7 @@ const PromptEngine = ( - - label={t('topN')} - name={'top_n'} - initialValue={8} - tooltip={t('topNTip')} - > - - +
diff --git a/web/src/pages/flow/begin-form/index.tsx b/web/src/pages/flow/begin-form/index.tsx new file mode 100644 index 00000000000..745347e573f --- /dev/null +++ b/web/src/pages/flow/begin-form/index.tsx @@ -0,0 +1,43 @@ +import { useTranslate } from '@/hooks/commonHooks'; +import type { FormProps } from 'antd'; +import { Form, Input } from 'antd'; + +type FieldType = { + prologue?: string; +}; + +const onFinish: FormProps['onFinish'] = (values) => { + console.log('Success:', values); +}; + +const onFinishFailed: FormProps['onFinishFailed'] = (errorInfo) => { + console.log('Failed:', errorInfo); +}; + +const BeginForm = () => { + const { t } = useTranslate('chat'); + + return ( +
+ + name={'prologue'} + label={t('setAnOpener')} + tooltip={t('setAnOpenerTip')} + initialValue={t('setAnOpenerInitial')} + > + + + + ); +}; + +export default BeginForm; diff --git a/web/src/pages/flow/canvas/index.less b/web/src/pages/flow/canvas/index.less new file mode 100644 index 00000000000..3f3245a1c4b --- /dev/null +++ b/web/src/pages/flow/canvas/index.less @@ -0,0 +1,4 @@ +.canvasWrapper { + position: relative; + height: 100%; +} diff --git a/web/src/pages/flow/canvas/index.tsx b/web/src/pages/flow/canvas/index.tsx index 6db3c81bc2f..84bd9e17bd2 100644 --- a/web/src/pages/flow/canvas/index.tsx +++ b/web/src/pages/flow/canvas/index.tsx @@ -26,6 +26,8 @@ import { import { dsl } from '../mock'; import { TextUpdaterNode } from './node'; +import styles from './index.less'; + const nodeTypes = { textUpdater: TextUpdaterNode }; interface IProps { @@ -40,7 +42,8 @@ function FlowCanvas({ sideWidth }: IProps) { const { ref, menu, onNodeContextMenu, onPaneClick } = useHandleNodeContextMenu(sideWidth); - const { drawerVisible, hideDrawer, showDrawer } = useShowDrawer(); + const { drawerVisible, hideDrawer, showDrawer, clickedNode } = + useShowDrawer(); const onNodesChange: OnNodesChange = useCallback( (changes) => setNodes((nds) => applyNodeChanges(changes, nds)), @@ -56,9 +59,12 @@ function FlowCanvas({ sideWidth }: IProps) { [], ); - const onNodeClick: NodeMouseHandler = useCallback(() => { - showDrawer(); - }, [showDrawer]); + const onNodeClick: NodeMouseHandler = useCallback( + (e, node) => { + showDrawer(node); + }, + [showDrawer], + ); const { onDrop, onDragOver, setReactFlowInstance } = useHandleDrop(setNodes); @@ -70,7 +76,7 @@ function FlowCanvas({ sideWidth }: IProps) { }, [nodes, edges]); return ( -
+
)} - +
); } diff --git a/web/src/pages/flow/cite-form/index.tsx b/web/src/pages/flow/cite-form/index.tsx new file mode 100644 index 00000000000..66c17e64810 --- /dev/null +++ b/web/src/pages/flow/cite-form/index.tsx @@ -0,0 +1,5 @@ +const CiteForm = () => { + return
CiteForm
; +}; + +export default CiteForm; diff --git a/web/src/pages/flow/constant.ts b/web/src/pages/flow/constant.ts new file mode 100644 index 00000000000..1470995f702 --- /dev/null +++ b/web/src/pages/flow/constant.ts @@ -0,0 +1,6 @@ +export enum Operator { + Begin = 'Begin', + Retrieval = 'Retrieval', + Generate = 'Generate', + Cite = 'Cite', +} diff --git a/web/src/pages/flow/flow-drawer/index.tsx b/web/src/pages/flow/flow-drawer/index.tsx index 7e395b2574b..71a744cd14c 100644 --- a/web/src/pages/flow/flow-drawer/index.tsx +++ b/web/src/pages/flow/flow-drawer/index.tsx @@ -1,18 +1,41 @@ import { IModalProps } from '@/interfaces/common'; import { Drawer } from 'antd'; +import { Node } from 'reactflow'; +import BeginForm from '../begin-form'; +import CiteForm from '../cite-form'; +import { Operator } from '../constant'; +import GenerateForm from '../generate-form'; +import RetrievalForm from '../retrieval-form'; -const FlowDrawer = ({ visible, hideModal }: IModalProps) => { +interface IProps { + node?: Node; +} + +const FormMap = { + [Operator.Begin]: BeginForm, + [Operator.Retrieval]: RetrievalForm, + [Operator.Generate]: GenerateForm, + [Operator.Cite]: CiteForm, +}; + +const FlowDrawer = ({ + visible, + hideModal, + node, +}: IModalProps & IProps) => { + const operatorName: Operator = node?.data.label; + const OperatorForm = FormMap[operatorName]; return ( -

Some contents...

+
); }; diff --git a/web/src/pages/flow/generate-form/index.tsx b/web/src/pages/flow/generate-form/index.tsx new file mode 100644 index 00000000000..e4de5e6baae --- /dev/null +++ b/web/src/pages/flow/generate-form/index.tsx @@ -0,0 +1,5 @@ +const GenerateForm = () => { + return
; +}; + +export default GenerateForm; diff --git a/web/src/pages/flow/hooks.ts b/web/src/pages/flow/hooks.ts index 23e5216bcba..217adeaa2bd 100644 --- a/web/src/pages/flow/hooks.ts +++ b/web/src/pages/flow/hooks.ts @@ -75,16 +75,26 @@ export const useHandleDrop = (setNodes: Dispatch>) => { }; export const useShowDrawer = () => { + const [clickedNode, setClickedNode] = useState(); const { visible: drawerVisible, hideModal: hideDrawer, showModal: showDrawer, } = useSetModalState(); + const handleShow = useCallback( + (node: Node) => { + setClickedNode(node); + showDrawer(); + }, + [showDrawer], + ); + return { drawerVisible, hideDrawer, - showDrawer, + showDrawer: handleShow, + clickedNode, }; }; diff --git a/web/src/pages/flow/index.tsx b/web/src/pages/flow/index.tsx index b1775b526bf..38bca2671f8 100644 --- a/web/src/pages/flow/index.tsx +++ b/web/src/pages/flow/index.tsx @@ -16,7 +16,7 @@ function RagFlow() { - + diff --git a/web/src/pages/flow/retrieval-form/index.tsx b/web/src/pages/flow/retrieval-form/index.tsx new file mode 100644 index 00000000000..48c61bacfa0 --- /dev/null +++ b/web/src/pages/flow/retrieval-form/index.tsx @@ -0,0 +1,38 @@ +import KnowledgeBaseItem from '@/components/knowledge-base-item'; +import Rerank from '@/components/rerank'; +import SimilaritySlider from '@/components/similarity-slider'; +import TopNItem from '@/components/top-n-item'; +import type { FormProps } from 'antd'; +import { Form } from 'antd'; + +type FieldType = { + top_n?: number; +}; + +const onFinish: FormProps['onFinish'] = (values) => { + console.log('Success:', values); +}; + +const onFinishFailed: FormProps['onFinishFailed'] = (errorInfo) => { + console.log('Failed:', errorInfo); +}; + +const RetrievalForm = () => { + return ( +
+ + + + +
+ ); +}; + +export default RetrievalForm; From f46f71b0bd60f4371894399f8fe8682701aa1334 Mon Sep 17 00:00:00 2001 From: bill Date: Thu, 30 May 2024 18:28:48 +0800 Subject: [PATCH 2/8] feat: add LlmSettingItems --- .../components/llm-setting-items/index.less | 6 + .../components/llm-setting-items/index.tsx | 252 ++++++++++++++++++ web/src/locales/en.ts | 1 + web/src/pages/flow/flow-drawer/index.tsx | 2 +- web/src/pages/flow/generate-form/index.tsx | 40 ++- web/src/pages/flow/index.tsx | 3 + web/src/pages/flow/mock.tsx | 22 +- 7 files changed, 313 insertions(+), 13 deletions(-) create mode 100644 web/src/components/llm-setting-items/index.less create mode 100644 web/src/components/llm-setting-items/index.tsx diff --git a/web/src/components/llm-setting-items/index.less b/web/src/components/llm-setting-items/index.less new file mode 100644 index 00000000000..03928e740a8 --- /dev/null +++ b/web/src/components/llm-setting-items/index.less @@ -0,0 +1,6 @@ +.sliderInputNumber { + width: 80px; +} +.variableSlider { + width: 100%; +} diff --git a/web/src/components/llm-setting-items/index.tsx b/web/src/components/llm-setting-items/index.tsx new file mode 100644 index 00000000000..22b6262a2ef --- /dev/null +++ b/web/src/components/llm-setting-items/index.tsx @@ -0,0 +1,252 @@ +import { + LlmModelType, + ModelVariableType, + settledModelVariableMap, +} from '@/constants/knowledge'; +import { Divider, Flex, Form, InputNumber, Select, Slider, Switch } from 'antd'; +import camelCase from 'lodash/camelCase'; + +import { useTranslate } from '@/hooks/commonHooks'; +import { useSelectLlmOptionsByModelType } from '@/hooks/llmHooks'; +import styles from './index.less'; + +const LlmSettingItems = () => { + const form = Form.useFormInstance(); + const { t } = useTranslate('chat'); + const parameterOptions = Object.values(ModelVariableType).map((x) => ({ + label: t(camelCase(x)), + value: x, + })); + + const modelOptions = useSelectLlmOptionsByModelType(); + + const handleParametersChange = (value: ModelVariableType) => { + const variable = settledModelVariableMap[value]; + form.setFieldsValue({ llm_setting: variable }); + }; + + return ( + <> + +