From 25a11c5bb7d700b3e4cb00991cf7b409e29733ad Mon Sep 17 00:00:00 2001 From: Joel Date: Wed, 13 Mar 2024 15:43:03 +0800 Subject: [PATCH] feat: question classify output --- web/app/components/workflow/constants.ts | 150 +++++++++++------- .../nodes/_base/components/variable/utils.ts | 20 ++- .../variable/var-reference-picker.tsx | 9 +- 3 files changed, 115 insertions(+), 64 deletions(-) diff --git a/web/app/components/workflow/constants.ts b/web/app/components/workflow/constants.ts index 623def49e8..691c987d71 100644 --- a/web/app/components/workflow/constants.ts +++ b/web/app/components/workflow/constants.ts @@ -185,69 +185,70 @@ export const SUPPORT_OUTPUT_VARS_NODE = [ BlockEnum.QuestionClassifier, BlockEnum.HttpRequest, BlockEnum.Tool, BlockEnum.VariableAssigner, ] +const USAGE = { + variable: 'usage', + type: VarType.object, + children: [ + { + variable: 'prompt_tokens', + type: VarType.number, + }, + { + variable: 'prompt_unit_price', + type: VarType.number, + }, + { + variable: 'prompt_price_unit', + type: VarType.number, + }, + { + variable: 'prompt_price', + type: VarType.number, + }, + { + variable: 'completion_tokens', + type: VarType.number, + }, + { + variable: 'completion_unit_price', + type: VarType.number, + }, + { + variable: 'completion_price_unit', + type: VarType.number, + }, + { + variable: 'completion_unit_price', + type: VarType.number, + }, + { + variable: 'completion_price', + type: VarType.number, + }, + { + variable: 'total_tokens', + type: VarType.number, + }, + { + variable: 'total_price', + type: VarType.number, + }, + { + variable: 'currency', + type: VarType.string, + }, + { + variable: 'latency', + type: VarType.number, + }, + ], +} export const LLM_OUTPUT_STRUCT: Var[] = [ { variable: 'text', type: VarType.string, }, - { - variable: 'usage', - type: VarType.object, - children: [ - { - variable: 'prompt_tokens', - type: VarType.number, - }, - { - variable: 'prompt_unit_price', - type: VarType.number, - }, - { - variable: 'prompt_price_unit', - type: VarType.number, - }, - { - variable: 'prompt_price', - type: VarType.number, - }, - { - variable: 'completion_tokens', - type: VarType.number, - }, - { - variable: 'completion_unit_price', - type: VarType.number, - }, - { - variable: 'completion_price_unit', - type: VarType.number, - }, - { - variable: 'completion_unit_price', - type: VarType.number, - }, - { - variable: 'completion_price', - type: VarType.number, - }, - { - variable: 'total_tokens', - type: VarType.number, - }, - { - variable: 'total_price', - type: VarType.number, - }, - { - variable: 'currency', - type: VarType.string, - }, - { - variable: 'latency', - type: VarType.number, - }, - ], - }, + ] export const KNOWLEDGE_RETRIEVAL_OUTPUT_STRUCT: Var[] = [ @@ -255,6 +256,7 @@ export const KNOWLEDGE_RETRIEVAL_OUTPUT_STRUCT: Var[] = [ variable: 'result', type: VarType.arrayObject, }, + USAGE, ] export const TEMPLATE_TRANSFORM_OUTPUT_STRUCT: Var[] = [ @@ -263,3 +265,35 @@ export const TEMPLATE_TRANSFORM_OUTPUT_STRUCT: Var[] = [ type: VarType.string, }, ] + +const QUESTION_CLASSIFIER_OUTPUT_STRUCT_COMMON: Var[] = [ + USAGE, + { + variable: 'topic', + type: VarType.string, + }, +] + +export const CHAT_QUESTION_CLASSIFIER_OUTPUT_STRUCT = [ + { + variable: 'model_mode', + type: VarType.string, + }, + { + variable: 'messages', + type: VarType.arrayObject, + }, + ...QUESTION_CLASSIFIER_OUTPUT_STRUCT_COMMON, +] + +export const COMPLETION_QUESTION_CLASSIFIER_OUTPUT_STRUCT = [ + { + variable: 'model_mode', + type: VarType.string, + }, + { + variable: 'text', + type: VarType.string, + }, + ...QUESTION_CLASSIFIER_OUTPUT_STRUCT_COMMON, +] diff --git a/web/app/components/workflow/nodes/_base/components/variable/utils.ts b/web/app/components/workflow/nodes/_base/components/variable/utils.ts index cc6f73e539..4963570ada 100644 --- a/web/app/components/workflow/nodes/_base/components/variable/utils.ts +++ b/web/app/components/workflow/nodes/_base/components/variable/utils.ts @@ -2,7 +2,14 @@ import type { CodeNodeType } from '../../../code/types' import { BlockEnum, InputVarType, VarType } from '@/app/components/workflow/types' import type { StartNodeType } from '@/app/components/workflow/nodes/start/types' import type { NodeOutPutVar } from '@/app/components/workflow/types' -import { KNOWLEDGE_RETRIEVAL_OUTPUT_STRUCT, LLM_OUTPUT_STRUCT, SUPPORT_OUTPUT_VARS_NODE, TEMPLATE_TRANSFORM_OUTPUT_STRUCT } from '@/app/components/workflow/constants' +import { + CHAT_QUESTION_CLASSIFIER_OUTPUT_STRUCT, + COMPLETION_QUESTION_CLASSIFIER_OUTPUT_STRUCT, + KNOWLEDGE_RETRIEVAL_OUTPUT_STRUCT, + LLM_OUTPUT_STRUCT, + SUPPORT_OUTPUT_VARS_NODE, + TEMPLATE_TRANSFORM_OUTPUT_STRUCT, +} from '@/app/components/workflow/constants' const inputVarTypeToVarType = (type: InputVarType): VarType => { if (type === InputVarType.number) @@ -11,7 +18,7 @@ const inputVarTypeToVarType = (type: InputVarType): VarType => { return VarType.string } -const formatItem = (item: any): NodeOutPutVar => { +const formatItem = (item: any, isChatMode: boolean): NodeOutPutVar => { const { id, data } = item const res: NodeOutPutVar = { nodeId: id, @@ -59,10 +66,15 @@ const formatItem = (item: any): NodeOutPutVar => { res.vars = TEMPLATE_TRANSFORM_OUTPUT_STRUCT break } + + case BlockEnum.QuestionClassifier: { + res.vars = isChatMode ? CHAT_QUESTION_CLASSIFIER_OUTPUT_STRUCT : COMPLETION_QUESTION_CLASSIFIER_OUTPUT_STRUCT + break + } } return res } -export const toNodeOutputVars = (nodes: any[]): NodeOutPutVar[] => { - return nodes.filter(node => SUPPORT_OUTPUT_VARS_NODE.includes(node.data.type)).map(formatItem) +export const toNodeOutputVars = (nodes: any[], isChatMode: boolean): NodeOutPutVar[] => { + return nodes.filter(node => SUPPORT_OUTPUT_VARS_NODE.includes(node.data.type)).map(node => formatItem(node, isChatMode)) } diff --git a/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx b/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx index d0b3030f0e..be4cefa8c5 100644 --- a/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx +++ b/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx @@ -14,7 +14,10 @@ import { PortalToFollowElemContent, PortalToFollowElemTrigger, } from '@/app/components/base/portal-to-follow-elem' -import { useWorkflow } from '@/app/components/workflow/hooks' +import { + useIsChatMode, + useWorkflow, +} from '@/app/components/workflow/hooks' type Props = { className?: string @@ -37,9 +40,11 @@ const VarReferencePicker: FC = ({ value, onChange, }) => { + const isChatMode = useIsChatMode() + const { getTreeLeafNodes, getBeforeNodesInSameBranch } = useWorkflow() const availableNodes = getBeforeNodesInSameBranch(nodeId) - const outputVars = toNodeOutputVars(availableNodes) + const outputVars = toNodeOutputVars(availableNodes, isChatMode) const [open, setOpen] = useState(false) const hasValue = value.length > 0 const outputVarNodeId = hasValue ? value[0] : ''