Commit 4837ae49 authored by Joel's avatar Joel

feat: question add class

parent 6da9950b
...@@ -4,8 +4,9 @@ import type { FC } from 'react' ...@@ -4,8 +4,9 @@ import type { FC } from 'react'
import { memo } from 'react' import { memo } from 'react'
import Workflow from '@/app/components/workflow' import Workflow from '@/app/components/workflow'
import { BlockEnum } from '@/app/components/workflow/types' import { BlockEnum } from '@/app/components/workflow/types'
const nodes = [ const nodes = [
BlockEnum.Tool/* 10 */, BlockEnum.VariableAssigner/* 11 */, BlockEnum.Start/* 1 */, BlockEnum.DirectAnswer/* 2 */, BlockEnum.LLM/* 3 */, BlockEnum.KnowledgeRetrieval/* 4 */, BlockEnum.QuestionClassifier/* 5 */, BlockEnum.QuestionClassifier/* 5 */, BlockEnum.Tool/* 10 */, BlockEnum.VariableAssigner/* 11 */, BlockEnum.Start/* 1 */, BlockEnum.DirectAnswer/* 2 */, BlockEnum.LLM/* 3 */, BlockEnum.KnowledgeRetrieval/* 4 */,
BlockEnum.IfElse/* 6 */, BlockEnum.Code/* 7 */, BlockEnum.TemplateTransform/* 8 */, BlockEnum.HttpRequest/* 9 */, BlockEnum.IfElse/* 6 */, BlockEnum.Code/* 7 */, BlockEnum.TemplateTransform/* 8 */, BlockEnum.HttpRequest/* 9 */,
BlockEnum.End/* 12 */, BlockEnum.End/* 12 */,
].map((item, i) => ({ ].map((item, i) => ({
...@@ -13,6 +14,7 @@ const nodes = [ ...@@ -13,6 +14,7 @@ const nodes = [
type: 'custom', type: 'custom',
position: { x: 330, y: 30 + i * 300 }, position: { x: 330, y: 30 + i * 300 },
data: { type: item, name: item }, data: { type: item, name: item },
selected: i === 0, // for test: always select the first node
})) }))
const initialNodes = nodes const initialNodes = nodes
......
'use client'
import type { FC } from 'react'
import React, { useCallback } from 'react'
import produce from 'immer'
import TextEditor from '../../_base/components/editor/text-editor'
import AddButton from '../../_base/components/add-button'
import type { Topic } from '@/app/components/workflow/nodes/question-classifier/types'
type Props = {
list: Topic[]
onChange: (list: Topic[]) => void
}
const ClassList: FC<Props> = ({
list,
onChange,
}) => {
const handleTopicChange = useCallback((index: number) => {
return (value: string) => {
const newList = produce(list, (draft) => {
draft[index].topic = value
})
onChange(newList)
}
}, [list, onChange])
const handleAddTopic = useCallback(() => {
const newList = produce(list, (draft) => {
draft.push({ id: '', name: 'topic aaa', topic: 'aaa' })
})
onChange(newList)
}, [list, onChange])
// Todo Remove; edit topic name
return (
<div className='space-y-2'>
{
list.map((item, index) => {
return (
<TextEditor
title={<div>
{/* can edit */}
<div>{item.name}</div>
</div>}
key={index}
value={item.topic}
onChange={handleTopicChange(index)}
/>
)
})
}
<AddButton
onClick={handleAddTopic}
text='Add Class'
/>
</div>
)
}
export default React.memo(ClassList)
import type { FC } from 'react' import type { FC } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import VarReferencePicker from '../_base/components/variable/var-reference-picker'
import useConfig from './use-config' import useConfig from './use-config'
import { mockData } from './mock' import { mockData } from './mock'
import ClassList from './components/class-list'
import Field from '@/app/components/workflow/nodes/_base/components/field' import Field from '@/app/components/workflow/nodes/_base/components/field'
import ModelParameterModal from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal' import ModelParameterModal from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal'
const i18nPrefix = 'workflow.nodes.llm' const i18nPrefix = 'workflow.nodes.questionClassifiers'
const Panel: FC = () => { const Panel: FC = () => {
const { t } = useTranslation() const { t } = useTranslation()
// const readOnly = false const readOnly = false
const { const {
inputs, inputs,
handleModelChanged, handleModelChanged,
handleCompletionParamsChange, handleCompletionParamsChange,
handleQueryVarChange,
handleTopicsChange,
} = useConfig(mockData) } = useConfig(mockData)
const model = inputs.model const model = inputs.model
return ( return (
<div className='mt-2 px-4 space-y-4'> <div className='mt-2 px-4 space-y-4'>
<Field
title={t(`${i18nPrefix}.inputVars`)}
>
<VarReferencePicker
readonly={readOnly}
isShowNodeName
value={inputs.query_variable_selector}
onChange={handleQueryVarChange}
/>
</Field>
<Field <Field
title={t(`${i18nPrefix}.model`)} title={t(`${i18nPrefix}.model`)}
> >
...@@ -37,6 +50,18 @@ const Panel: FC = () => { ...@@ -37,6 +50,18 @@ const Panel: FC = () => {
debugWithMultipleModel={false} debugWithMultipleModel={false}
/> />
</Field> </Field>
<Field
title={t(`${i18nPrefix}.class`)}
>
<ClassList
list={inputs.topics}
onChange={handleTopicsChange} />
</Field>
<Field
title={t(`${i18nPrefix}.advancedSetting`)}
>
advancedSetting
</Field>
</div> </div>
) )
} }
......
import type { CommonNodeType, Memory, ModelConfig, ValueSelector } from '@/app/components/workflow/types' import type { CommonNodeType, Memory, ModelConfig, ValueSelector } from '@/app/components/workflow/types'
type Topic = { export type Topic = {
id: string id: string
name: string name: string
topic: string topic: string
......
import { useCallback, useState } from 'react' import { useCallback, useState } from 'react'
import produce from 'immer' import produce from 'immer'
import type { ValueSelector } from '../../types'
import type { QuestionClassifierNodeType } from './types' import type { QuestionClassifierNodeType } from './types'
const useConfig = (initInputs: QuestionClassifierNodeType) => { const useConfig = (initInputs: QuestionClassifierNodeType) => {
...@@ -22,10 +23,26 @@ const useConfig = (initInputs: QuestionClassifierNodeType) => { ...@@ -22,10 +23,26 @@ const useConfig = (initInputs: QuestionClassifierNodeType) => {
setInputs(newInputs) setInputs(newInputs)
}, [inputs, setInputs]) }, [inputs, setInputs])
const handleQueryVarChange = useCallback((newVar: ValueSelector) => {
const newInputs = produce(inputs, (draft) => {
draft.query_variable_selector = newVar
})
setInputs(newInputs)
}, [inputs, setInputs])
const handleTopicsChange = useCallback((newTopics: any) => {
const newInputs = produce(inputs, (draft) => {
draft.topics = newTopics
})
setInputs(newInputs)
}, [inputs, setInputs])
return { return {
inputs, inputs,
handleModelChanged, handleModelChanged,
handleCompletionParamsChange, handleCompletionParamsChange,
handleQueryVarChange,
handleTopicsChange,
} }
} }
......
...@@ -125,6 +125,12 @@ const translation = { ...@@ -125,6 +125,12 @@ const translation = {
toAuthorize: 'To authorize', toAuthorize: 'To authorize',
inputVars: 'Input Variables', inputVars: 'Input Variables',
}, },
questionClassifiers: {
model: 'model',
inputVars: 'Input Variables',
class: 'Class',
advancedSetting: 'Advanced Setting',
},
}, },
} }
......
...@@ -124,6 +124,12 @@ const translation = { ...@@ -124,6 +124,12 @@ const translation = {
toAuthorize: '授权', toAuthorize: '授权',
inputVars: '输入变量', inputVars: '输入变量',
}, },
questionClassifiers: {
model: '模型',
inputVars: '输入变量',
class: '类别',
advancedSetting: '高级设置',
},
}, },
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment