Commit 3c6e5a6e by Archer Committed by GitHub

4.8 test (#1394)

* fix: chat variable sync

* feat: chat save variable config

* fix: target handle hidden

* adapt v1 chat init

* adapt v1 chat init

* adapt v1 chat init

* adapt v1 chat init
parent 7b75a99b
...@@ -105,7 +105,7 @@ export const appWorkflow2Form = ({ nodes }: { nodes: StoreNodeItemType[] }) => { ...@@ -105,7 +105,7 @@ export const appWorkflow2Form = ({ nodes }: { nodes: StoreNodeItemType[] }) => {
} else if (node.flowNodeType === FlowNodeTypeEnum.systemConfig) { } else if (node.flowNodeType === FlowNodeTypeEnum.systemConfig) {
const { const {
welcomeText, welcomeText,
variableModules, variableNodes,
questionGuide, questionGuide,
ttsConfig, ttsConfig,
whisperConfig, whisperConfig,
...@@ -114,7 +114,7 @@ export const appWorkflow2Form = ({ nodes }: { nodes: StoreNodeItemType[] }) => { ...@@ -114,7 +114,7 @@ export const appWorkflow2Form = ({ nodes }: { nodes: StoreNodeItemType[] }) => {
defaultAppForm.userGuide = { defaultAppForm.userGuide = {
welcomeText: welcomeText, welcomeText: welcomeText,
variables: variableModules, variables: variableNodes,
questionGuide: questionGuide, questionGuide: questionGuide,
tts: ttsConfig, tts: ttsConfig,
whisper: whisperConfig, whisper: whisperConfig,
......
...@@ -10,7 +10,7 @@ import { ...@@ -10,7 +10,7 @@ import {
import { FlowNodeTypeEnum } from '../workflow/node/constant'; import { FlowNodeTypeEnum } from '../workflow/node/constant';
import { NodeOutputKeyEnum } from '../workflow/constants'; import { NodeOutputKeyEnum } from '../workflow/constants';
import { DispatchNodeResponseKeyEnum } from '../workflow/runtime/constants'; import { DispatchNodeResponseKeyEnum } from '../workflow/runtime/constants';
import { AppSchema } from '../app/type'; import { AppSchema, VariableItemType } from '../app/type';
import type { AppSchema as AppType } from '@fastgpt/global/core/app/type.d'; import type { AppSchema as AppType } from '@fastgpt/global/core/app/type.d';
import { DatasetSearchModeEnum } from '../dataset/constants'; import { DatasetSearchModeEnum } from '../dataset/constants';
import { ChatBoxInputType } from '../../../../projects/app/src/components/ChatBox/type'; import { ChatBoxInputType } from '../../../../projects/app/src/components/ChatBox/type';
...@@ -27,11 +27,13 @@ export type ChatSchema = { ...@@ -27,11 +27,13 @@ export type ChatSchema = {
title: string; title: string;
customTitle: string; customTitle: string;
top: boolean; top: boolean;
variables: Record<string, any>;
source: `${ChatSourceEnum}`; source: `${ChatSourceEnum}`;
shareId?: string; shareId?: string;
outLinkUid?: string; outLinkUid?: string;
content: ChatItemType[];
variableList?: VariableItemType[];
welcomeText?: string;
variables: Record<string, any>;
metadata?: Record<string, any>; metadata?: Record<string, any>;
}; };
......
...@@ -36,13 +36,17 @@ export const checkInputIsReference = (input: FlowNodeInputItemType) => { ...@@ -36,13 +36,17 @@ export const checkInputIsReference = (input: FlowNodeInputItemType) => {
/* node */ /* node */
export const getGuideModule = (modules: StoreNodeItemType[]) => export const getGuideModule = (modules: StoreNodeItemType[]) =>
modules.find((item) => item.flowNodeType === FlowNodeTypeEnum.systemConfig); modules.find(
(item) =>
item.flowNodeType === FlowNodeTypeEnum.systemConfig ||
// @ts-ignore (adapt v1)
item.flowType === FlowNodeTypeEnum.systemConfig
);
export const splitGuideModule = (guideModules?: StoreNodeItemType) => { export const splitGuideModule = (guideModules?: StoreNodeItemType) => {
const welcomeText: string = const welcomeText: string =
guideModules?.inputs?.find((item) => item.key === NodeInputKeyEnum.welcomeText)?.value || ''; guideModules?.inputs?.find((item) => item.key === NodeInputKeyEnum.welcomeText)?.value || '';
const variableModules: VariableItemType[] = const variableNodes: VariableItemType[] =
guideModules?.inputs.find((item) => item.key === NodeInputKeyEnum.variables)?.value || []; guideModules?.inputs.find((item) => item.key === NodeInputKeyEnum.variables)?.value || [];
const questionGuide: boolean = const questionGuide: boolean =
...@@ -63,13 +67,43 @@ export const splitGuideModule = (guideModules?: StoreNodeItemType) => { ...@@ -63,13 +67,43 @@ export const splitGuideModule = (guideModules?: StoreNodeItemType) => {
return { return {
welcomeText, welcomeText,
variableModules, variableNodes,
questionGuide, questionGuide,
ttsConfig, ttsConfig,
whisperConfig, whisperConfig,
scheduledTriggerConfig scheduledTriggerConfig
}; };
}; };
export const replaceAppChatConfig = ({
node,
variableList,
welcomeText
}: {
node?: StoreNodeItemType;
variableList?: VariableItemType[];
welcomeText?: string;
}): StoreNodeItemType | undefined => {
if (!node) return;
return {
...node,
inputs: node.inputs.map((input) => {
if (input.key === NodeInputKeyEnum.variables && variableList) {
return {
...input,
value: variableList
};
}
if (input.key === NodeInputKeyEnum.welcomeText && welcomeText) {
return {
...input,
value: welcomeText
};
}
return input;
})
};
};
export const getOrInitModuleInputValue = (input: FlowNodeInputItemType) => { export const getOrInitModuleInputValue = (input: FlowNodeInputItemType) => {
if (input.value !== undefined || !input.valueType) return input.value; if (input.value !== undefined || !input.valueType) return input.value;
......
...@@ -41,6 +41,10 @@ export function reRankRecall({ ...@@ -41,6 +41,10 @@ export function reRankRecall({
.then((data) => { .then((data) => {
addLog.info('ReRank finish:', { time: Date.now() - start }); addLog.info('ReRank finish:', { time: Date.now() - start });
if (!data?.results || data?.results?.length === 0) {
addLog.error('ReRank error, empty result', data);
}
return data?.results?.map((item) => ({ return data?.results?.map((item) => ({
id: documents[item.index].id, id: documents[item.index].id,
score: item.relevance_score score: item.relevance_score
......
...@@ -61,7 +61,15 @@ const ChatSchema = new Schema({ ...@@ -61,7 +61,15 @@ const ChatSchema = new Schema({
outLinkUid: { outLinkUid: {
type: String type: String
}, },
variableList: {
type: Array
},
welcomeText: {
type: String
},
variables: { variables: {
// variable value
type: Object, type: Object,
default: {} default: {}
}, },
......
...@@ -12,7 +12,7 @@ import { ChatSiteItemType } from '@fastgpt/global/core/chat/type'; ...@@ -12,7 +12,7 @@ import { ChatSiteItemType } from '@fastgpt/global/core/chat/type';
type useChatStoreType = OutLinkChatAuthProps & { type useChatStoreType = OutLinkChatAuthProps & {
welcomeText: string; welcomeText: string;
variableModules: VariableItemType[]; variableNodes: VariableItemType[];
questionGuide: boolean; questionGuide: boolean;
ttsConfig: AppTTSConfigType; ttsConfig: AppTTSConfigType;
whisperConfig: AppWhisperConfigType; whisperConfig: AppWhisperConfigType;
...@@ -41,7 +41,7 @@ type useChatStoreType = OutLinkChatAuthProps & { ...@@ -41,7 +41,7 @@ type useChatStoreType = OutLinkChatAuthProps & {
}; };
const StateContext = createContext<useChatStoreType>({ const StateContext = createContext<useChatStoreType>({
welcomeText: '', welcomeText: '',
variableModules: [], variableNodes: [],
questionGuide: false, questionGuide: false,
ttsConfig: { ttsConfig: {
type: 'none', type: 'none',
...@@ -110,7 +110,7 @@ const Provider = ({ ...@@ -110,7 +110,7 @@ const Provider = ({
}: ChatProviderProps) => { }: ChatProviderProps) => {
const [chatHistories, setChatHistories] = useState<ChatSiteItemType[]>([]); const [chatHistories, setChatHistories] = useState<ChatSiteItemType[]>([]);
const { welcomeText, variableModules, questionGuide, ttsConfig, whisperConfig } = useMemo( const { welcomeText, variableNodes, questionGuide, ttsConfig, whisperConfig } = useMemo(
() => splitGuideModule(userGuideModule), () => splitGuideModule(userGuideModule),
[userGuideModule] [userGuideModule]
); );
...@@ -150,7 +150,7 @@ const Provider = ({ ...@@ -150,7 +150,7 @@ const Provider = ({
teamId, teamId,
teamToken, teamToken,
welcomeText, welcomeText,
variableModules, variableNodes,
questionGuide, questionGuide,
ttsConfig, ttsConfig,
whisperConfig, whisperConfig,
......
import { VariableItemType } from '@fastgpt/global/core/app/type.d'; import { VariableItemType } from '@fastgpt/global/core/app/type.d';
import React, { useEffect, useState } from 'react'; import React from 'react';
import { UseFormReturn } from 'react-hook-form'; import { UseFormReturn } from 'react-hook-form';
import { useTranslation } from 'next-i18next'; import { useTranslation } from 'next-i18next';
import { Box, Button, Card, Input, Textarea } from '@chakra-ui/react'; import { Box, Button, Card, Input, Textarea } from '@chakra-ui/react';
...@@ -12,34 +12,19 @@ import { ChatBoxInputFormType } from '../type.d'; ...@@ -12,34 +12,19 @@ import { ChatBoxInputFormType } from '../type.d';
const VariableInput = ({ const VariableInput = ({
appAvatar, appAvatar,
variableModules, variableNodes,
variableIsFinish,
chatForm, chatForm,
onSubmitVariables onSubmitVariables
}: { }: {
appAvatar?: string; appAvatar?: string;
variableModules: VariableItemType[]; variableNodes: VariableItemType[];
variableIsFinish: boolean;
onSubmitVariables: (e: Record<string, any>) => void; onSubmitVariables: (e: Record<string, any>) => void;
chatForm: UseFormReturn<ChatBoxInputFormType>; chatForm: UseFormReturn<ChatBoxInputFormType>;
}) => { }) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { register, unregister, setValue, handleSubmit: handleSubmitChat, watch } = chatForm; const { register, setValue, handleSubmit: handleSubmitChat, watch } = chatForm;
const variables = watch('variables'); const variables = watch('variables');
const chatStarted = watch('chatStarted');
useEffect(() => {
// 重新注册所有字段
variableModules.forEach((item) => {
register(`variables.${item.key}`, { required: item.required });
});
return () => {
// 组件卸载时注销所有字段
variableModules.forEach((item) => {
unregister(`variables.${item.key}`);
});
};
}, [register, unregister, variableModules]);
return ( return (
<Box py={3}> <Box py={3}>
...@@ -55,7 +40,7 @@ const VariableInput = ({ ...@@ -55,7 +40,7 @@ const VariableInput = ({
bg={'white'} bg={'white'}
boxShadow={'0 0 8px rgba(0,0,0,0.15)'} boxShadow={'0 0 8px rgba(0,0,0,0.15)'}
> >
{variableModules.map((item) => ( {variableNodes.map((item) => (
<Box key={item.id} mb={4}> <Box key={item.id} mb={4}>
<Box as={'label'} display={'inline-block'} position={'relative'} mb={1}> <Box as={'label'} display={'inline-block'} position={'relative'} mb={1}>
{item.label} {item.label}
...@@ -73,7 +58,6 @@ const VariableInput = ({ ...@@ -73,7 +58,6 @@ const VariableInput = ({
</Box> </Box>
{item.type === VariableInputEnum.input && ( {item.type === VariableInputEnum.input && (
<Input <Input
isDisabled={variableIsFinish}
bg={'myWhite.400'} bg={'myWhite.400'}
{...register(`variables.${item.key}`, { {...register(`variables.${item.key}`, {
required: item.required required: item.required
...@@ -82,7 +66,6 @@ const VariableInput = ({ ...@@ -82,7 +66,6 @@ const VariableInput = ({
)} )}
{item.type === VariableInputEnum.textarea && ( {item.type === VariableInputEnum.textarea && (
<Textarea <Textarea
isDisabled={variableIsFinish}
bg={'myWhite.400'} bg={'myWhite.400'}
{...register(`variables.${item.key}`, { {...register(`variables.${item.key}`, {
required: item.required required: item.required
...@@ -94,7 +77,6 @@ const VariableInput = ({ ...@@ -94,7 +77,6 @@ const VariableInput = ({
{item.type === VariableInputEnum.select && ( {item.type === VariableInputEnum.select && (
<MySelect <MySelect
width={'100%'} width={'100%'}
isDisabled={variableIsFinish}
list={(item.enums || []).map((item) => ({ list={(item.enums || []).map((item) => ({
label: item.value, label: item.value,
value: item.value value: item.value
...@@ -110,7 +92,7 @@ const VariableInput = ({ ...@@ -110,7 +92,7 @@ const VariableInput = ({
)} )}
</Box> </Box>
))} ))}
{!variableIsFinish && ( {!chatStarted && (
<Button <Button
leftIcon={<MyIcon name={'core/chat/chatFill'} w={'16px'} />} leftIcon={<MyIcon name={'core/chat/chatFill'} w={'16px'} />}
size={'sm'} size={'sm'}
......
...@@ -34,11 +34,13 @@ export type ChatTestComponentRef = { ...@@ -34,11 +34,13 @@ export type ChatTestComponentRef = {
const ChatTest = ( const ChatTest = (
{ {
app, app,
isOpen,
nodes = [], nodes = [],
edges = [], edges = [],
onClose onClose
}: { }: {
app: AppSchema; app: AppSchema;
isOpen: boolean;
nodes?: StoreNodeItemType[]; nodes?: StoreNodeItemType[];
edges?: StoreEdgeItemType[]; edges?: StoreEdgeItemType[];
onClose: () => void; onClose: () => void;
...@@ -48,7 +50,6 @@ const ChatTest = ( ...@@ -48,7 +50,6 @@ const ChatTest = (
const { t } = useTranslation(); const { t } = useTranslation();
const ChatBoxRef = useRef<ComponentRef>(null); const ChatBoxRef = useRef<ComponentRef>(null);
const { userInfo } = useUserStore(); const { userInfo } = useUserStore();
const isOpen = useMemo(() => nodes && nodes.length > 0, [nodes]);
const startChat = useCallback( const startChat = useCallback(
async ({ chatList, controller, generatingMessage, variables }: StartChatFnProps) => { async ({ chatList, controller, generatingMessage, variables }: StartChatFnProps) => {
......
...@@ -28,7 +28,7 @@ export const ToolTargetHandle = ({ nodeId }: ToolHandleProps) => { ...@@ -28,7 +28,7 @@ export const ToolTargetHandle = ({ nodeId }: ToolHandleProps) => {
edges.some((edge) => edge.targetHandle === getHandleId(nodeId, 'target', 'top'))); edges.some((edge) => edge.targetHandle === getHandleId(nodeId, 'target', 'top')));
const Render = useMemo(() => { const Render = useMemo(() => {
return ( return hidden ? null : (
<MyTooltip label={t('core.workflow.tool.Handle')} shouldWrapChildren={false}> <MyTooltip label={t('core.workflow.tool.Handle')} shouldWrapChildren={false}>
<Handle <Handle
style={{ style={{
...@@ -49,7 +49,7 @@ export const ToolTargetHandle = ({ nodeId }: ToolHandleProps) => { ...@@ -49,7 +49,7 @@ export const ToolTargetHandle = ({ nodeId }: ToolHandleProps) => {
border={'4px solid #8774EE'} border={'4px solid #8774EE'}
transform={'translate(0,-30%) rotate(45deg)'} transform={'translate(0,-30%) rotate(45deg)'}
pointerEvents={'none'} pointerEvents={'none'}
visibility={hidden ? 'hidden' : 'visible'} visibility={'visible'}
/> />
</Handle> </Handle>
</MyTooltip> </MyTooltip>
......
...@@ -200,14 +200,19 @@ const MyTargetHandle = React.memo(function MyTargetHandle({ ...@@ -200,14 +200,19 @@ const MyTargetHandle = React.memo(function MyTargetHandle({
) { ) {
return false; return false;
} }
if (connectingEdge?.handleId && !connectingEdge.handleId?.includes('source')) return false; if (connectingEdge?.handleId && !connectingEdge.handleId?.includes('source')) return false;
// Same source node // From same source node
if (connectedEdges.some((item) => item.target === nodeId && item.targetHandle !== handleId)) if (
connectedEdges.some(
(item) => item.source === connectingEdge?.nodeId && item.target === nodeId
)
)
return false; return false;
return true; return true;
}, [connectedEdges, connectingEdge?.handleId, edges, handleId, node, nodeId]); }, [connectedEdges, connectingEdge?.handleId, connectingEdge?.nodeId, edges, node, nodeId]);
const RenderHandle = useMemo(() => { const RenderHandle = useMemo(() => {
return ( return (
......
...@@ -2,7 +2,7 @@ import type { NextApiRequest, NextApiResponse } from 'next'; ...@@ -2,7 +2,7 @@ import type { NextApiRequest, NextApiResponse } from 'next';
import { jsonRes } from '@fastgpt/service/common/response'; import { jsonRes } from '@fastgpt/service/common/response';
import { connectToDatabase } from '@/service/mongo'; import { connectToDatabase } from '@/service/mongo';
import { authApp } from '@fastgpt/service/support/permission/auth/app'; import { authApp } from '@fastgpt/service/support/permission/auth/app';
import { getGuideModule } from '@fastgpt/global/core/workflow/utils'; import { getGuideModule, replaceAppChatConfig } from '@fastgpt/global/core/workflow/utils';
import { getChatModelNameListByModules } from '@/service/core/app/workflow'; import { getChatModelNameListByModules } from '@/service/core/app/workflow';
import type { InitChatProps, InitChatResponse } from '@/global/core/chat/api.d'; import type { InitChatProps, InitChatResponse } from '@/global/core/chat/api.d';
import { MongoChat } from '@fastgpt/service/core/chat/chatSchema'; import { MongoChat } from '@fastgpt/service/core/chat/chatSchema';
...@@ -62,7 +62,11 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) ...@@ -62,7 +62,11 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
variables: chat?.variables || {}, variables: chat?.variables || {},
history, history,
app: { app: {
userGuideModule: getGuideModule(nodes), userGuideModule: replaceAppChatConfig({
node: getGuideModule(nodes),
variableList: chat?.variableList,
welcomeText: chat?.welcomeText
}),
chatModels: getChatModelNameListByModules(nodes), chatModels: getChatModelNameListByModules(nodes),
name: app.name, name: app.name,
avatar: app.avatar, avatar: app.avatar,
......
...@@ -2,7 +2,7 @@ import type { NextApiRequest, NextApiResponse } from 'next'; ...@@ -2,7 +2,7 @@ import type { NextApiRequest, NextApiResponse } from 'next';
import { jsonRes } from '@fastgpt/service/common/response'; import { jsonRes } from '@fastgpt/service/common/response';
import { connectToDatabase } from '@/service/mongo'; import { connectToDatabase } from '@/service/mongo';
import type { InitChatResponse, InitOutLinkChatProps } from '@/global/core/chat/api.d'; import type { InitChatResponse, InitOutLinkChatProps } from '@/global/core/chat/api.d';
import { getGuideModule } from '@fastgpt/global/core/workflow/utils'; import { getGuideModule, replaceAppChatConfig } from '@fastgpt/global/core/workflow/utils';
import { getChatModelNameListByModules } from '@/service/core/app/workflow'; import { getChatModelNameListByModules } from '@/service/core/app/workflow';
import { DispatchNodeResponseKeyEnum } from '@fastgpt/global/core/workflow/runtime/constants'; import { DispatchNodeResponseKeyEnum } from '@fastgpt/global/core/workflow/runtime/constants';
import { getChatItems } from '@fastgpt/service/core/chat/controller'; import { getChatItems } from '@fastgpt/service/core/chat/controller';
...@@ -72,7 +72,11 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) ...@@ -72,7 +72,11 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
variables: chat?.variables || {}, variables: chat?.variables || {},
history, history,
app: { app: {
userGuideModule: getGuideModule(nodes), userGuideModule: replaceAppChatConfig({
node: getGuideModule(nodes),
variableList: chat?.variableList,
welcomeText: chat?.welcomeText
}),
chatModels: getChatModelNameListByModules(nodes), chatModels: getChatModelNameListByModules(nodes),
name: app.name, name: app.name,
avatar: app.avatar, avatar: app.avatar,
......
import type { NextApiRequest, NextApiResponse } from 'next'; import type { NextApiRequest, NextApiResponse } from 'next';
import { jsonRes } from '@fastgpt/service/common/response'; import { jsonRes } from '@fastgpt/service/common/response';
import { connectToDatabase } from '@/service/mongo'; import { connectToDatabase } from '@/service/mongo';
import { getGuideModule } from '@fastgpt/global/core/workflow/utils'; import { getGuideModule, replaceAppChatConfig } from '@fastgpt/global/core/workflow/utils';
import { getChatModelNameListByModules } from '@/service/core/app/workflow'; import { getChatModelNameListByModules } from '@/service/core/app/workflow';
import { DispatchNodeResponseKeyEnum } from '@fastgpt/global/core/workflow/runtime/constants'; import { DispatchNodeResponseKeyEnum } from '@fastgpt/global/core/workflow/runtime/constants';
import type { InitChatResponse, InitTeamChatProps } from '@/global/core/chat/api.d'; import type { InitChatResponse, InitTeamChatProps } from '@/global/core/chat/api.d';
...@@ -73,7 +73,11 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) ...@@ -73,7 +73,11 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
variables: chat?.variables || {}, variables: chat?.variables || {},
history, history,
app: { app: {
userGuideModule: getGuideModule(nodes), userGuideModule: replaceAppChatConfig({
node: getGuideModule(nodes),
variableList: chat?.variableList,
welcomeText: chat?.welcomeText
}),
chatModels: getChatModelNameListByModules(nodes), chatModels: getChatModelNameListByModules(nodes),
name: app.name, name: app.name,
avatar: app.avatar, avatar: app.avatar,
......
...@@ -246,6 +246,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { ...@@ -246,6 +246,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
appId: app._id, appId: app._id,
teamId, teamId,
tmbId: tmbId, tmbId: tmbId,
nodes,
variables: newVariables, variables: newVariables,
isUpdateUseTime: isOwnerUse && source === ChatSourceEnum.online, // owner update use time isUpdateUseTime: isOwnerUse && source === ChatSourceEnum.online, // owner update use time
shareId, shareId,
......
import React, { useCallback, useMemo, useRef, useState } from 'react'; import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { Box, Flex, IconButton, useTheme, useDisclosure, Button } from '@chakra-ui/react'; import { Box, Flex, IconButton, useTheme, useDisclosure, Button } from '@chakra-ui/react';
import { StoreNodeItemType } from '@fastgpt/global/core/workflow/type/index.d'; import { StoreNodeItemType } from '@fastgpt/global/core/workflow/type/index.d';
import { AppSchema } from '@fastgpt/global/core/app/type.d'; import { AppSchema } from '@fastgpt/global/core/app/type.d';
...@@ -25,7 +25,7 @@ import MyTooltip from '@fastgpt/web/components/common/MyTooltip'; ...@@ -25,7 +25,7 @@ import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import { formatTime2HM } from '@fastgpt/global/common/string/time'; import { formatTime2HM } from '@fastgpt/global/common/string/time';
import { useContextSelector } from 'use-context-selector'; import { useContextSelector } from 'use-context-selector';
import { WorkflowContext, getWorkflowStore } from '@/components/core/workflow/context'; import { WorkflowContext, getWorkflowStore } from '@/components/core/workflow/context';
import { useInterval } from 'ahooks'; import { useInterval, useUpdateEffect } from 'ahooks';
const ImportSettings = dynamic(() => import('@/components/core/workflow/Flow/ImportSettings')); const ImportSettings = dynamic(() => import('@/components/core/workflow/Flow/ImportSettings'));
const PublishHistories = dynamic( const PublishHistories = dynamic(
...@@ -341,6 +341,11 @@ const Header = (props: Props) => { ...@@ -341,6 +341,11 @@ const Header = (props: Props) => {
nodes: StoreNodeItemType[]; nodes: StoreNodeItemType[];
edges: StoreEdgeItemType[]; edges: StoreEdgeItemType[];
}>(); }>();
const { isOpen: isOpenTest, onOpen: onOpenTest, onClose: onCloseTest } = useDisclosure();
useUpdateEffect(() => {
onOpenTest();
}, [workflowTestData]);
return ( return (
<> <>
...@@ -351,9 +356,10 @@ const Header = (props: Props) => { ...@@ -351,9 +356,10 @@ const Header = (props: Props) => {
/> />
<ChatTest <ChatTest
ref={ChatTestRef} ref={ChatTestRef}
isOpen={isOpenTest}
{...workflowTestData} {...workflowTestData}
app={app} app={app}
onClose={() => setWorkflowTestData(undefined)} onClose={onCloseTest}
/> />
</> </>
); );
......
...@@ -99,6 +99,7 @@ const EditForm = ({ ...@@ -99,6 +99,7 @@ const EditForm = ({
const selectLLMModel = watch('aiSettings.model'); const selectLLMModel = watch('aiSettings.model');
const datasetSearchSetting = watch('dataset'); const datasetSearchSetting = watch('dataset');
const variables = watch('userGuide.variables'); const variables = watch('userGuide.variables');
const formatVariables = useMemo( const formatVariables = useMemo(
() => formatEditorVariablePickerIcon([...getSystemVariables(t), ...variables]), () => formatEditorVariablePickerIcon([...getSystemVariables(t), ...variables]),
[t, variables] [t, variables]
......
...@@ -12,6 +12,7 @@ import ChatTest from './ChatTest'; ...@@ -12,6 +12,7 @@ import ChatTest from './ChatTest';
import AppCard from './AppCard'; import AppCard from './AppCard';
import EditForm from './EditForm'; import EditForm from './EditForm';
import { AppSimpleEditFormType } from '@fastgpt/global/core/app/type'; import { AppSimpleEditFormType } from '@fastgpt/global/core/app/type';
import { v1Workflow2V2 } from '@/web/core/workflow/adapt';
const SimpleEdit = ({ appId }: { appId: string }) => { const SimpleEdit = ({ appId }: { appId: string }) => {
const { isPc } = useSystemStore(); const { isPc } = useSystemStore();
...@@ -28,6 +29,14 @@ const SimpleEdit = ({ appId }: { appId: string }) => { ...@@ -28,6 +29,14 @@ const SimpleEdit = ({ appId }: { appId: string }) => {
// show selected dataset // show selected dataset
useMount(() => { useMount(() => {
loadAllDatasets(); loadAllDatasets();
if (appDetail.version !== 'v2') {
editForm.reset(
appWorkflow2Form({
nodes: v1Workflow2V2((appDetail.modules || []) as any)?.nodes
})
);
}
}); });
return ( return (
......
import type { import type { AIChatItemType, UserChatItemType } from '@fastgpt/global/core/chat/type.d';
AIChatItemType,
ChatItemType,
UserChatItemType
} from '@fastgpt/global/core/chat/type.d';
import { MongoApp } from '@fastgpt/service/core/app/schema'; import { MongoApp } from '@fastgpt/service/core/app/schema';
import { ChatSourceEnum } from '@fastgpt/global/core/chat/constants'; import { ChatSourceEnum } from '@fastgpt/global/core/chat/constants';
import { MongoChatItem } from '@fastgpt/service/core/chat/chatItemSchema'; import { MongoChatItem } from '@fastgpt/service/core/chat/chatItemSchema';
...@@ -10,12 +6,15 @@ import { MongoChat } from '@fastgpt/service/core/chat/chatSchema'; ...@@ -10,12 +6,15 @@ import { MongoChat } from '@fastgpt/service/core/chat/chatSchema';
import { addLog } from '@fastgpt/service/common/system/log'; import { addLog } from '@fastgpt/service/common/system/log';
import { getChatTitleFromChatMessage } from '@fastgpt/global/core/chat/utils'; import { getChatTitleFromChatMessage } from '@fastgpt/global/core/chat/utils';
import { mongoSessionRun } from '@fastgpt/service/common/mongo/sessionRun'; import { mongoSessionRun } from '@fastgpt/service/common/mongo/sessionRun';
import { StoreNodeItemType } from '@fastgpt/global/core/workflow/type';
import { getGuideModule, splitGuideModule } from '@fastgpt/global/core/workflow/utils';
type Props = { type Props = {
chatId: string; chatId: string;
appId: string; appId: string;
teamId: string; teamId: string;
tmbId: string; tmbId: string;
nodes: StoreNodeItemType[];
variables?: Record<string, any>; variables?: Record<string, any>;
isUpdateUseTime: boolean; isUpdateUseTime: boolean;
source: `${ChatSourceEnum}`; source: `${ChatSourceEnum}`;
...@@ -30,6 +29,7 @@ export async function saveChat({ ...@@ -30,6 +29,7 @@ export async function saveChat({
appId, appId,
teamId, teamId,
tmbId, tmbId,
nodes,
variables, variables,
isUpdateUseTime, isUpdateUseTime,
source, source,
...@@ -72,6 +72,8 @@ export async function saveChat({ ...@@ -72,6 +72,8 @@ export async function saveChat({
chat.variables = variables || {}; chat.variables = variables || {};
await chat.save({ session }); await chat.save({ session });
} else { } else {
const { welcomeText, variableNodes } = splitGuideModule(getGuideModule(nodes));
await MongoChat.create( await MongoChat.create(
[ [
{ {
...@@ -79,6 +81,8 @@ export async function saveChat({ ...@@ -79,6 +81,8 @@ export async function saveChat({
teamId, teamId,
tmbId, tmbId,
appId, appId,
variableList: variableNodes,
welcomeText,
variables, variables,
title, title,
source, source,
......
...@@ -288,7 +288,7 @@ export const getWorkflowGlobalVariables = ( ...@@ -288,7 +288,7 @@ export const getWorkflowGlobalVariables = (
t: TFunction t: TFunction
): EditorVariablePickerType[] => { ): EditorVariablePickerType[] => {
const globalVariables = formatEditorVariablePickerIcon( const globalVariables = formatEditorVariablePickerIcon(
splitGuideModule(getGuideModule(nodes))?.variableModules || [] splitGuideModule(getGuideModule(nodes))?.variableNodes || []
).map((item) => ({ ).map((item) => ({
...item, ...item,
valueType: WorkflowIOValueTypeEnum.any valueType: WorkflowIOValueTypeEnum.any
......
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 sign in to comment