diff --git a/web/app/components/base/chat/chat-with-history/chat-wrapper.tsx b/web/app/components/base/chat/chat-with-history/chat-wrapper.tsx index cbe4826c1..f3768e80c 100644 --- a/web/app/components/base/chat/chat-with-history/chat-wrapper.tsx +++ b/web/app/components/base/chat/chat-with-history/chat-wrapper.tsx @@ -23,6 +23,7 @@ import SuggestedQuestions from '@/app/components/base/chat/chat/answer/suggested import { Markdown } from '@/app/components/base/markdown' import cn from '@/utils/classnames' import type { FileEntity } from '../../file-uploader/types' +import Avatar from '../../avatar' const ChatWrapper = () => { const { @@ -48,6 +49,7 @@ const ChatWrapper = () => { setClearChatList, setIsResponding, allInputsHidden, + initUserVariables, } = useChatWithHistoryContext() const appConfig = useMemo(() => { const config = appParams || {} @@ -119,7 +121,6 @@ const ChatWrapper = () => { useEffect(() => { if (currentChatInstanceRef.current) currentChatInstanceRef.current.handleStop = handleStop - // eslint-disable-next-line react-hooks/exhaustive-deps }, []) useEffect(() => { @@ -238,7 +239,7 @@ const ChatWrapper = () => { className='h-full overflow-hidden bg-chatbot-bg' > { inputDisabled={inputDisabled} isMobile={isMobile} sidebarCollapseState={sidebarCollapseState} + questionIcon={ + initUserVariables?.avatar_url + ? : undefined + } /> ) diff --git a/web/app/components/base/chat/chat-with-history/context.tsx b/web/app/components/base/chat/chat-with-history/context.tsx index 3a5dc793d..03a039913 100644 --- a/web/app/components/base/chat/chat-with-history/context.tsx +++ b/web/app/components/base/chat/chat-with-history/context.tsx @@ -56,6 +56,10 @@ export type ChatWithHistoryContextValue = { currentConversationInputs: Record | null, setCurrentConversationInputs: (v: Record) => void, allInputsHidden: boolean, + initUserVariables?: { + name?: string + avatar_url?: string + } } export const ChatWithHistoryContext = createContext({ @@ -90,5 +94,6 @@ export const ChatWithHistoryContext = createContext currentConversationInputs: {}, setCurrentConversationInputs: noop, allInputsHidden: false, + initUserVariables: {}, }) export const useChatWithHistoryContext = () => useContext(ChatWithHistoryContext) diff --git a/web/app/components/base/chat/chat-with-history/hooks.tsx b/web/app/components/base/chat/chat-with-history/hooks.tsx index be935a70b..248c161e6 100644 --- a/web/app/components/base/chat/chat-with-history/hooks.tsx +++ b/web/app/components/base/chat/chat-with-history/hooks.tsx @@ -16,7 +16,7 @@ import type { Feedback, } from '../types' import { CONVERSATION_ID_INFO } from '../constants' -import { buildChatItemTree, getProcessedSystemVariablesFromUrlParams, getRawInputsFromUrlParams } from '../utils' +import { buildChatItemTree, getProcessedSystemVariablesFromUrlParams, getRawInputsFromUrlParams, getRawUserVariablesFromUrlParams } from '../utils' import { addFileInfos, sortAgentSorts } from '../../../tools/utils' import { getProcessedFilesFromResponse } from '@/app/components/base/file-uploader/utils' import { @@ -181,6 +181,7 @@ export const useChatWithHistory = (installedAppInfo?: InstalledApp) => { const newConversationInputsRef = useRef>({}) const [newConversationInputs, setNewConversationInputs] = useState>({}) const [initInputs, setInitInputs] = useState>({}) + const [initUserVariables, setInitUserVariables] = useState>({}) const handleNewConversationInputsChange = useCallback((newInputs: Record) => { newConversationInputsRef.current = newInputs setNewConversationInputs(newInputs) @@ -249,7 +250,9 @@ export const useChatWithHistory = (installedAppInfo?: InstalledApp) => { // init inputs from url params (async () => { const inputs = await getRawInputsFromUrlParams() + const userVariables = await getRawUserVariablesFromUrlParams() setInitInputs(inputs) + setInitUserVariables(userVariables) })() }, []) @@ -520,5 +523,6 @@ export const useChatWithHistory = (installedAppInfo?: InstalledApp) => { currentConversationInputs, setCurrentConversationInputs, allInputsHidden, + initUserVariables, } } diff --git a/web/app/components/base/chat/chat-with-history/index.tsx b/web/app/components/base/chat/chat-with-history/index.tsx index cceb21b29..cfde517a6 100644 --- a/web/app/components/base/chat/chat-with-history/index.tsx +++ b/web/app/components/base/chat/chat-with-history/index.tsx @@ -142,6 +142,7 @@ const ChatWithHistoryWrap: FC = ({ currentConversationInputs, setCurrentConversationInputs, allInputsHidden, + initUserVariables, } = useChatWithHistory(installedAppInfo) return ( @@ -184,6 +185,7 @@ const ChatWithHistoryWrap: FC = ({ currentConversationInputs, setCurrentConversationInputs, allInputsHidden, + initUserVariables, }}> diff --git a/web/app/components/base/chat/utils.ts b/web/app/components/base/chat/utils.ts index fb7ac93a4..1c478747c 100644 --- a/web/app/components/base/chat/utils.ts +++ b/web/app/components/base/chat/utils.ts @@ -20,7 +20,8 @@ async function getRawInputsFromUrlParams(): Promise> { const inputs: Record = {} const entriesArray = Array.from(urlParams.entries()) entriesArray.forEach(([key, value]) => { - if (!key.startsWith('sys.')) + const prefixArray = ['sys.', 'user.'] + if (!prefixArray.some(prefix => key.startsWith(prefix))) inputs[key] = decodeURIComponent(value) }) return inputs @@ -66,6 +67,17 @@ async function getProcessedUserVariablesFromUrlParams(): Promise> { + const urlParams = new URLSearchParams(window.location.search) + const userVariables: Record = {} + const entriesArray = Array.from(urlParams.entries()) + entriesArray.forEach(([key, value]) => { + if (key.startsWith('user.')) + userVariables[key.slice(5)] = decodeURIComponent(value) + }) + return userVariables +} + function isValidGeneratedAnswer(item?: ChatItem | ChatItemInTree): boolean { return !!item && item.isAnswer && !item.id.startsWith('answer-placeholder-') && !item.isOpeningStatement } @@ -213,6 +225,7 @@ export { getProcessedInputsFromUrlParams, getProcessedSystemVariablesFromUrlParams, getProcessedUserVariablesFromUrlParams, + getRawUserVariablesFromUrlParams, isValidGeneratedAnswer, getLastAnswer, buildChatItemTree,