feat: option to hide workflow steps (#5436)

This commit is contained in:
crazywoola
2024-06-21 12:51:10 +08:00
committed by GitHub
parent 1336b844fd
commit 92ddb410cd
29 changed files with 165 additions and 9 deletions

View File

@@ -34,6 +34,7 @@ export type ConfigParams = {
custom_disclaimer: string
icon: string
icon_background: string
show_workflow_steps: boolean
}
const prefixSettings = 'appOverview.overview.appInfo.settings'
@@ -47,8 +48,8 @@ const SettingsModal: FC<ISettingsModalProps> = ({
const { notify } = useToastContext()
const [isShowMore, setIsShowMore] = useState(false)
const { icon, icon_background } = appInfo
const { title, description, copyright, privacy_policy, custom_disclaimer, default_language } = appInfo.site
const [inputInfo, setInputInfo] = useState({ title, desc: description, copyright, privacyPolicy: privacy_policy, customDisclaimer: custom_disclaimer })
const { title, description, copyright, privacy_policy, custom_disclaimer, default_language, show_workflow_steps } = appInfo.site
const [inputInfo, setInputInfo] = useState({ title, desc: description, copyright, privacyPolicy: privacy_policy, customDisclaimer: custom_disclaimer, show_workflow_steps })
const [language, setLanguage] = useState(default_language)
const [saveLoading, setSaveLoading] = useState(false)
const { t } = useTranslation()
@@ -57,7 +58,7 @@ const SettingsModal: FC<ISettingsModalProps> = ({
const [emoji, setEmoji] = useState({ icon, icon_background })
useEffect(() => {
setInputInfo({ title, desc: description, copyright, privacyPolicy: privacy_policy, customDisclaimer: custom_disclaimer })
setInputInfo({ title, desc: description, copyright, privacyPolicy: privacy_policy, customDisclaimer: custom_disclaimer, show_workflow_steps })
setLanguage(default_language)
setEmoji({ icon, icon_background })
}, [appInfo])
@@ -85,6 +86,7 @@ const SettingsModal: FC<ISettingsModalProps> = ({
custom_disclaimer: inputInfo.customDisclaimer,
icon: emoji.icon,
icon_background: emoji.icon_background,
show_workflow_steps: inputInfo.show_workflow_steps,
}
await onSave?.(params)
setSaveLoading(false)
@@ -134,6 +136,14 @@ const SettingsModal: FC<ISettingsModalProps> = ({
defaultValue={language}
onSelect={item => setLanguage(item.value as Language)}
/>
{(appInfo.mode === 'workflow' || appInfo.mode === 'advanced-chat') && <>
<div className={`mt-6 mb-2 font-medium ${s.settingTitle} text-gray-900 `}>{t(`${prefixSettings}.workflow.title`)}</div>
<SimpleSelect
items={[{ name: t(`${prefixSettings}.workflow.show`), value: 'true' }, { name: t(`${prefixSettings}.workflow.hide`), value: 'false' }]}
defaultValue={inputInfo.show_workflow_steps ? 'true' : 'false'}
onSelect={item => setInputInfo({ ...inputInfo, show_workflow_steps: item.value === 'true' })}
/>
</>}
{!isShowMore && <div className='w-full cursor-pointer mt-8' onClick={() => setIsShowMore(true)}>
<div className='flex justify-between'>
<div className={`font-medium ${s.settingTitle} flex-grow text-gray-900`}>{t(`${prefixSettings}.more.entry`)}</div>

View File

@@ -28,6 +28,7 @@ import EditReplyModal from '@/app/components/app/annotation/edit-annotation-moda
import { useStore as useAppStore } from '@/app/components/app/store'
import WorkflowProcessItem from '@/app/components/base/chat/chat/answer/workflow-process'
import type { WorkflowProcess } from '@/app/components/base/chat/types'
import type { SiteInfo } from '@/models/share'
const MAX_DEPTH = 3
@@ -62,6 +63,7 @@ export type IGenerationItemProps = {
contentClassName?: string
footerClassName?: string
hideProcessDetail?: boolean
siteInfo: SiteInfo | null
}
export const SimpleBtn = ({ className, isDisabled, onClick, children }: {
@@ -113,6 +115,7 @@ const GenerationItem: FC<IGenerationItemProps> = ({
innerClassName,
contentClassName,
hideProcessDetail,
siteInfo,
}) => {
const { t } = useTranslation()
const params = useParams()
@@ -152,6 +155,7 @@ const GenerationItem: FC<IGenerationItemProps> = ({
installedAppId,
controlClearMoreLikeThis,
isWorkflow,
siteInfo,
}
const handleMoreLikeThis = async () => {
@@ -297,7 +301,7 @@ const GenerationItem: FC<IGenerationItemProps> = ({
}
<div className={`flex ${contentClassName}`}>
<div className='grow w-0'>
{workflowProcessData && (
{siteInfo && siteInfo.show_workflow_steps && workflowProcessData && (
<WorkflowProcessItem grayBg hideInfo data={workflowProcessData} expand={workflowProcessData.expand} hideProcessDetail={hideProcessDetail} />
)}
{workflowProcessData && !isError && (

View File

@@ -29,6 +29,7 @@ const ChatWrapper = () => {
appMeta,
handleFeedback,
currentChatInstanceRef,
appData,
} = useChatWithHistoryContext()
const appConfig = useMemo(() => {
const config = appParams || {}
@@ -128,6 +129,7 @@ const ChatWrapper = () => {
return (
<Chat
appData={appData}
config={appConfig}
chatList={chatList}
isResponding={isResponding}

View File

@@ -47,7 +47,14 @@ export const useChatWithHistory = (installedAppInfo?: InstalledApp) => {
const { id, app } = installedAppInfo!
return {
app_id: id,
site: { title: app.name, icon: app.icon, icon_background: app.icon_background, prompt_public: false, copyright: '' },
site: {
title: app.name,
icon: app.icon,
icon_background: app.icon_background,
prompt_public: false,
copyright: '',
show_workflow_steps: true,
},
plan: 'basic',
} as AppData
}

View File

@@ -20,6 +20,7 @@ import LoadingAnim from '@/app/components/app/chat/loading-anim'
import Citation from '@/app/components/app/chat/citation'
import { EditTitle } from '@/app/components/app/annotation/edit-annotation-modal/edit-item'
import type { Emoji } from '@/app/components/tools/types'
import type { AppData } from '@/models/share'
type AnswerProps = {
item: ChatItem
@@ -32,6 +33,7 @@ type AnswerProps = {
showPromptLog?: boolean
chatAnswerContainerInner?: string
hideProcessDetail?: boolean
appData?: AppData
}
const Answer: FC<AnswerProps> = ({
item,
@@ -44,6 +46,7 @@ const Answer: FC<AnswerProps> = ({
showPromptLog,
chatAnswerContainerInner,
hideProcessDetail,
appData,
}) => {
const { t } = useTranslation()
const {
@@ -129,8 +132,20 @@ const Answer: FC<AnswerProps> = ({
/>
)
}
{/** Render the normal steps */}
{
workflowProcess && (
workflowProcess && !hideProcessDetail && (
<WorkflowProcess
data={workflowProcess}
item={item}
hideInfo
hideProcessDetail={hideProcessDetail}
/>
)
}
{/** Hide workflow steps by it's settings in siteInfo */}
{
workflowProcess && hideProcessDetail && appData && appData.site.show_workflow_steps && (
<WorkflowProcess
data={workflowProcess}
item={item}

View File

@@ -30,8 +30,10 @@ import { StopCircle } from '@/app/components/base/icons/src/vender/solid/mediaAn
import AgentLogModal from '@/app/components/base/agent-log-modal'
import PromptLogModal from '@/app/components/base/prompt-log-modal'
import { useStore as useAppStore } from '@/app/components/app/store'
import type { AppData } from '@/models/share'
export type ChatProps = {
appData?: AppData
chatList: ChatItem[]
config?: ChatConfig
isResponding?: boolean
@@ -57,6 +59,7 @@ export type ChatProps = {
hideProcessDetail?: boolean
}
const Chat: FC<ChatProps> = ({
appData,
config,
onSend,
chatList,
@@ -196,6 +199,7 @@ const Chat: FC<ChatProps> = ({
const isLast = item.id === chatList[chatList.length - 1]?.id
return (
<Answer
appData={appData}
key={item.id}
item={item}
question={chatList[index - 1]?.content}

View File

@@ -18,6 +18,7 @@ import LogoAvatar from '@/app/components/base/logo/logo-embeded-chat-avatar'
const ChatWrapper = () => {
const {
appData,
appParams,
appPrevChatList,
currentConversationId,
@@ -114,6 +115,7 @@ const ChatWrapper = () => {
return (
<Chat
appData={appData}
config={appConfig}
chatList={chatList}
isResponding={isResponding}

View File

@@ -442,6 +442,7 @@ const TextGeneration: FC<IMainProps> = ({
visionConfig={visionConfig}
completionFiles={completionFiles}
isShowTextToSpeech={!!textToSpeechConfig?.enabled}
siteInfo={siteInfo}
/>)
const renderBatchRes = () => {

View File

@@ -18,6 +18,7 @@ import { TransferMethod, type VisionFile, type VisionSettings } from '@/types/ap
import { NodeRunningStatus, WorkflowRunningStatus } from '@/app/components/workflow/types'
import type { WorkflowProcess } from '@/app/components/base/chat/types'
import { sleep } from '@/utils'
import type { SiteInfo } from '@/models/share'
export type IResultProps = {
isWorkflow: boolean
@@ -42,6 +43,7 @@ export type IResultProps = {
moderationService?: (text: string) => ReturnType<ModerationService>
visionConfig: VisionSettings
completionFiles: VisionFile[]
siteInfo: SiteInfo | null
}
const Result: FC<IResultProps> = ({
@@ -65,6 +67,7 @@ const Result: FC<IResultProps> = ({
onCompleted,
visionConfig,
completionFiles,
siteInfo,
}) => {
const [isResponding, { setTrue: setRespondingTrue, setFalse: setRespondingFalse }] = useBoolean(false)
useEffect(() => {
@@ -375,6 +378,7 @@ const Result: FC<IResultProps> = ({
controlClearMoreLikeThis={controlClearMoreLikeThis}
isShowTextToSpeech={isShowTextToSpeech}
hideProcessDetail
siteInfo={siteInfo}
/>
)