chore: direct answer to answer

This commit is contained in:
Joel 2024-03-14 19:58:17 +08:00
parent 3a857c83e6
commit 64e44d1709
24 changed files with 55 additions and 54 deletions

View File

@ -1,5 +1,5 @@
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="icons/direct-answer">
<g id="icons/answer">
<path id="Vector (Stroke)" fill-rule="evenodd" clip-rule="evenodd" d="M3.50114 1.67701L10.5011 1.677C11.5079 1.677 12.3241 2.49311 12.3241 3.49992V9.35414C12.3241 10.3609 11.5079 11.177 10.5012 11.1771H8.9954L7.41734 12.4845C7.17339 12.6866 6.81987 12.6856 6.57708 12.4821L5.02026 11.1771H3.50114C2.49436 11.1771 1.67822 10.3608 1.67822 9.35414V3.49993C1.67822 2.49316 2.49437 1.67701 3.50114 1.67701ZM10.5011 2.9895L3.50114 2.98951C3.21924 2.98951 2.99072 3.21803 2.99072 3.49993V9.35414C2.99072 9.63601 3.21926 9.86455 3.50114 9.86455H5.04675C5.33794 9.86455 5.61984 9.96705 5.84302 10.1541L7.00112 11.1249L8.17831 10.1496C8.40069 9.96537 8.68041 9.86455 8.96916 9.86455H10.5011C10.5011 9.86455 10.5011 9.86455 10.5011 9.86455C10.783 9.8645 11.0116 9.63592 11.0116 9.35414V3.49992C11.0116 3.21806 10.7831 2.9895 10.5011 2.9895ZM9.06809 4.93171C9.32437 5.18799 9.32437 5.60351 9.06809 5.85979L7.02642 7.90146C6.77014 8.15774 6.35464 8.15774 6.09835 7.90146L5.22333 7.02646C4.96704 6.77019 4.96704 6.35467 5.22332 6.09839C5.4796 5.8421 5.89511 5.8421 6.15139 6.09837L6.56238 6.50935L8.14001 4.93171C8.3963 4.67543 8.81181 4.67543 9.06809 4.93171Z" fill="white"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -15,7 +15,7 @@
"type": "element",
"name": "g",
"attributes": {
"id": "icons/direct-answer"
"id": "icons/answer"
},
"children": [
{
@ -34,5 +34,5 @@
}
]
},
"name": "DirectAnswer"
"name": "Answer"
}

View File

@ -2,7 +2,7 @@
// DON NOT EDIT IT MANUALLY
import * as React from 'react'
import data from './DirectAnswer.json'
import data from './Answer.json'
import IconBase from '@/app/components/base/icons/IconBase'
import type { IconBaseProps, IconData } from '@/app/components/base/icons/IconBase'
@ -11,6 +11,6 @@ const Icon = React.forwardRef<React.MutableRefObject<SVGElement>, Omit<IconBaseP
ref,
) => <IconBase {...props} ref={ref} data={data as IconData} />)
Icon.displayName = 'DirectAnswer'
Icon.displayName = 'Answer'
export default Icon

View File

@ -1,5 +1,5 @@
export { default as Code } from './Code'
export { default as DirectAnswer } from './DirectAnswer'
export { default as Answer } from './Answer'
export { default as End } from './End'
export { default as Home } from './Home'
export { default as Http } from './Http'

View File

@ -3,8 +3,8 @@ import { memo } from 'react'
import { BlockEnum } from './types'
import { useStore } from './store'
import {
Answer,
Code,
DirectAnswer,
End,
Home,
Http,
@ -35,7 +35,7 @@ const getIcon = (type: BlockEnum, className: string) => {
[BlockEnum.End]: <End className={className} />,
[BlockEnum.IfElse]: <IfElse className={className} />,
[BlockEnum.HttpRequest]: <Http className={className} />,
[BlockEnum.DirectAnswer]: <DirectAnswer className={className} />,
[BlockEnum.Answer]: <Answer className={className} />,
[BlockEnum.KnowledgeRetrieval]: <KnowledgeRetrieval className={className} />,
[BlockEnum.QuestionClassifier]: <QuestionClassifier className={className} />,
[BlockEnum.TemplateTransform]: <TemplatingTransform className={className} />,
@ -50,7 +50,7 @@ const ICON_CONTAINER_BG_COLOR_MAP: Record<string, string> = {
[BlockEnum.End]: 'bg-[#F79009]',
[BlockEnum.IfElse]: 'bg-[#06AED4]',
[BlockEnum.HttpRequest]: 'bg-[#875BF7]',
[BlockEnum.DirectAnswer]: 'bg-[#F79009]',
[BlockEnum.Answer]: 'bg-[#F79009]',
[BlockEnum.KnowledgeRetrieval]: 'bg-[#16B364]',
[BlockEnum.QuestionClassifier]: 'bg-[#16B364]',
[BlockEnum.TemplateTransform]: 'bg-[#2E90FA]',

View File

@ -32,7 +32,7 @@ const Blocks = ({
const groups = useMemo(() => {
return BLOCK_CLASSIFICATIONS.reduce((acc, classification) => {
const list = groupBy(blocks, 'classification')[classification].filter((block) => {
if (block.type === BlockEnum.DirectAnswer && !isChatMode)
if (block.type === BlockEnum.Answer && !isChatMode)
return false
return block.title.toLowerCase().includes(searchText.toLowerCase())

View File

@ -21,7 +21,7 @@ export const BLOCKS: Block[] = [
},
{
classification: BlockClassificationEnum.Default,
type: BlockEnum.DirectAnswer,
type: BlockEnum.Answer,
title: 'Direct Answer',
},
{

View File

@ -1,7 +1,7 @@
import type { Var } from './types'
import { BlockEnum, VarType } from './types'
import StartNodeDefault from './nodes/start/default'
import DirectAnswerDefault from './nodes/direct-answer/default'
import AnswerDefault from './nodes/answer/default'
import LLMDefault from './nodes/llm/default'
import KnowledgeRetrievalDefault from './nodes/knowledge-retrieval/default'
import QuestionClassifierDefault from './nodes/question-classifier/default'
@ -22,7 +22,7 @@ export const NODES_EXTRA_DATA = {
author: 'Dify',
about: '',
},
[BlockEnum.DirectAnswer]: {
[BlockEnum.Answer]: {
author: 'Dify',
about: '',
},
@ -77,11 +77,11 @@ export const NODES_INITIAL_DATA = {
desc: '',
...EndNodeDefault.defaultValue,
},
[BlockEnum.DirectAnswer]: {
type: BlockEnum.DirectAnswer,
[BlockEnum.Answer]: {
type: BlockEnum.Answer,
title: '',
desc: '',
...DirectAnswerDefault.defaultValue,
...AnswerDefault.defaultValue,
},
[BlockEnum.LLM]: {
type: BlockEnum.LLM,

View File

@ -12,9 +12,9 @@ function useVarList<T>({
setInputs,
varKey = 'variables',
}: Params<T>) {
const handleVarListChange = useCallback((newList: Variable[]) => {
const handleVarListChange = useCallback((newList: Variable[] | string) => {
const newInputs = produce(inputs, (draft: any) => {
draft[varKey] = newList
draft[varKey] = newList as Variable[]
})
setInputs(newInputs)
}, [inputs, setInputs, varKey])

View File

@ -1,7 +1,7 @@
import type { NodeDefault } from '../../types'
import type { DirectAnswerNodeType } from './types'
import type { AnswerNodeType } from './types'
const nodeDefault: NodeDefault<DirectAnswerNodeType> = {
const nodeDefault: NodeDefault<AnswerNodeType> = {
defaultValue: {
variables: [],
answer: '',

View File

@ -2,17 +2,17 @@ import type { FC } from 'react'
import React from 'react'
import { useTranslation } from 'react-i18next'
import InfoPanel from '../_base/components/info-panel'
import type { DirectAnswerNodeType } from './types'
import type { AnswerNodeType } from './types'
import type { NodeProps } from '@/app/components/workflow/types'
const Node: FC<NodeProps<DirectAnswerNodeType>> = ({
const Node: FC<NodeProps<AnswerNodeType>> = ({
data,
}) => {
const { t } = useTranslation()
return (
<div className='px-3'>
<InfoPanel title={t('workflow.nodes.directAnswer.answer')} content={data.answer} />
<InfoPanel title={t('workflow.nodes.answer.answer')} content={data.answer} />
</div>
)
}

View File

@ -2,7 +2,7 @@ import type { FC } from 'react'
import React from 'react'
import { useTranslation } from 'react-i18next'
import useConfig from './use-config'
import type { DirectAnswerNodeType } from './types'
import type { AnswerNodeType } from './types'
import VarList from '@/app/components/workflow/nodes/_base/components/variable/var-list'
import Field from '@/app/components/workflow/nodes/_base/components/field'
import AddButton from '@/app/components/base/button/add-button'
@ -10,9 +10,9 @@ import Split from '@/app/components/workflow/nodes/_base/components/split'
import Editor from '@/app/components/workflow/nodes/_base/components/prompt/editor'
import type { NodePanelProps } from '@/app/components/workflow/types'
const i18nPrefix = 'workflow.nodes.directAnswer'
const i18nPrefix = 'workflow.nodes.answer'
const Panel: FC<NodePanelProps<DirectAnswerNodeType>> = ({
const Panel: FC<NodePanelProps<AnswerNodeType>> = ({
id,
data,
}) => {
@ -29,12 +29,13 @@ const Panel: FC<NodePanelProps<DirectAnswerNodeType>> = ({
return (
<div className='mt-2 px-4 space-y-4'>
<Field
title={t(`${i18nPrefix}.inputVars`)}
title={t(`${i18nPrefix}.outputVars`)}
operations={
<AddButton onClick={handleAddVariable} />
}
>
<VarList
nodeId={id}
readonly={readOnly}
list={inputs.variables}
onChange={handleVarListChange}

View File

@ -1,6 +1,6 @@
import type { CommonNodeType, Variable } from '@/app/components/workflow/types'
export type DirectAnswerNodeType = CommonNodeType & {
export type AnswerNodeType = CommonNodeType & {
variables: Variable[]
answer: string
}

View File

@ -1,13 +1,13 @@
import { useCallback } from 'react'
import produce from 'immer'
import useVarList from '../_base/hooks/use-var-list'
import type { DirectAnswerNodeType } from './types'
import type { AnswerNodeType } from './types'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
const useConfig = (id: string, payload: DirectAnswerNodeType) => {
const { inputs, setInputs } = useNodeCrud<DirectAnswerNodeType>(id, payload)
const useConfig = (id: string, payload: AnswerNodeType) => {
const { inputs, setInputs } = useNodeCrud<AnswerNodeType>(id, payload)
// variables
const { handleVarListChange, handleAddVariable } = useVarList<DirectAnswerNodeType>({
const { handleVarListChange, handleAddVariable } = useVarList<AnswerNodeType>({
inputs,
setInputs,
})

View File

@ -0,0 +1,5 @@
import type { AnswerNodeType } from './types'
export const checkNodeValid = (payload: AnswerNodeType) => {
return true
}

View File

@ -4,8 +4,8 @@ import StartNode from './start/node'
import StartPanel from './start/panel'
import EndNode from './end/node'
import EndPanel from './end/panel'
import DirectAnswerNode from './direct-answer/node'
import DirectAnswerPanel from './direct-answer/panel'
import AnswerNode from './answer/node'
import AnswerPanel from './answer/panel'
import LLMNode from './llm/node'
import LLMPanel from './llm/panel'
import KnowledgeRetrievalNode from './knowledge-retrieval/node'
@ -28,7 +28,7 @@ import VariableAssignerPanel from './variable-assigner/panel'
export const NodeComponentMap: Record<string, ComponentType<any>> = {
[BlockEnum.Start]: StartNode,
[BlockEnum.End]: EndNode,
[BlockEnum.DirectAnswer]: DirectAnswerNode,
[BlockEnum.Answer]: AnswerNode,
[BlockEnum.LLM]: LLMNode,
[BlockEnum.KnowledgeRetrieval]: KnowledgeRetrievalNode,
[BlockEnum.QuestionClassifier]: QuestionClassifierNode,
@ -43,7 +43,7 @@ export const NodeComponentMap: Record<string, ComponentType<any>> = {
export const PanelComponentMap: Record<string, ComponentType> = {
[BlockEnum.Start]: StartPanel,
[BlockEnum.End]: EndPanel,
[BlockEnum.DirectAnswer]: DirectAnswerPanel,
[BlockEnum.Answer]: AnswerPanel,
[BlockEnum.LLM]: LLMPanel,
[BlockEnum.KnowledgeRetrieval]: KnowledgeRetrievalPanel,
[BlockEnum.QuestionClassifier]: QuestionClassifierPanel,

View File

@ -1,5 +0,0 @@
import type { DirectAnswerNodeType } from './types'
export const checkNodeValid = (payload: DirectAnswerNodeType) => {
return true
}

View File

@ -8,7 +8,7 @@ import type { VarType as VarKindType } from '@/app/components/workflow/nodes/too
export enum BlockEnum {
Start = 'start',
End = 'end',
DirectAnswer = 'direct-answer',
Answer = 'answer',
LLM = 'llm',
KnowledgeRetrieval = 'knowledge-retrieval',
QuestionClassifier = 'question-classifier',

View File

@ -44,7 +44,7 @@ const translation = {
blocks: {
'start': 'Start',
'end': 'End',
'direct-answer': 'Direct Answer',
'answer': 'Answer',
'llm': 'LLM',
'knowledge-retrieval': 'Knowledge Retrieval',
'question-classifier': 'Question Classifier',
@ -57,7 +57,7 @@ const translation = {
blocksAbout: {
'start': 'Define the initial parameters for launching a workflow',
'end': 'Define the end and result type of a workflow',
'direct-answer': 'Specify a custom text reply',
'answer': 'Define the reply content of a chat conversation',
'llm': 'Invoking large language models to answer questions or process natural language',
'knowledge-retrieval': 'Allows you to query text content related to user questions from the Knowledge',
'question-classifier': 'Define the classification conditions of user questions, LLM can define how the conversation progresses based on the classification description',
@ -129,9 +129,9 @@ const translation = {
'structured': 'Structured',
},
},
directAnswer: {
answer: {
answer: 'Answer',
inputVars: 'Input Variables',
outputVars: 'Output Variables',
},
llm: {
model: 'model',

View File

@ -26,7 +26,7 @@ const translation = {
'structured': 'Structured',
},
},
directAnswer: {
answer: {
answer: 'Answer',
inputVars: 'Input Variables',
},

View File

@ -25,7 +25,7 @@ const translation = {
'structured': '结构化',
},
},
directAnswer: {
answer: {
answer: '回复',
inputVars: '输入变量',
},

View File

@ -26,7 +26,7 @@ const translation = {
'structured': 'Structured',
},
},
directAnswer: {
answer: {
answer: 'Answer',
inputVars: 'Input Variables',
},

View File

@ -26,7 +26,7 @@ const translation = {
'structured': 'Structured',
},
},
directAnswer: {
answer: {
answer: 'Answer',
inputVars: 'Input Variables',
},

View File

@ -44,7 +44,7 @@ const translation = {
blocks: {
'start': '开始',
'end': '结束',
'direct-answer': '直接回复',
'answer': '直接回复',
'llm': 'LLM',
'knowledge-retrieval': '知识检索',
'question-classifier': '问题分类器',
@ -57,7 +57,7 @@ const translation = {
blocksAbout: {
'start': '定义一个 workflow 流程启动的初始参数',
'end': '定义一个 workflow 流程的结束和结果类型',
'direct-answer': '指定一段自定义的文本回复',
'answer': '定义一个聊天对话的回复内容',
'llm': '调用大语言模型回答问题或者对自然语言进行处理',
'knowledge-retrieval': '允许你从知识库中查询与用户问题相关的文本内容',
'question-classifier': '定义用户问题的分类条件LLM 能够根据分类描述定义对话的进展方式',
@ -129,9 +129,9 @@ const translation = {
'structured': '结构化',
},
},
directAnswer: {
answer: {
answer: '回复',
inputVars: '输入变量',
outputVars: '输出变量',
},
llm: {
model: '模型',