From cb49cd30c45dc1c8d4f0b18e0de815693f3db98e Mon Sep 17 00:00:00 2001 From: balibabu Date: Fri, 13 Mar 2026 19:06:18 +0800 Subject: [PATCH] Feat: Add the `user_id` field to the agent log table and the embedded page. (#13596) ### What problem does this PR solve? Feat: Add the `user_id` field to the agent log table and the embedded page. ### Type of change - [x] New Feature (non-breaking change which adds functionality) --- web/.eslintrc.cjs | 3 -- web/src/components/embed-dialog/index.tsx | 29 ++++++++++++------- web/src/locales/en.ts | 2 +- .../agent/chat/use-send-agent-message.ts | 13 +++++++-- .../agent/hooks/use-send-shared-message.ts | 10 +++++-- web/src/pages/agents/agent-log-page.tsx | 29 ++++++++++++++++--- 6 files changed, 63 insertions(+), 23 deletions(-) diff --git a/web/.eslintrc.cjs b/web/.eslintrc.cjs index c30c88fe2a..689dec1fc3 100644 --- a/web/.eslintrc.cjs +++ b/web/.eslintrc.cjs @@ -14,9 +14,6 @@ module.exports = { jsx: true, }, }, - includes: [ - './src', - ], settings: { react: { version: 'detect', diff --git a/web/src/components/embed-dialog/index.tsx b/web/src/components/embed-dialog/index.tsx index 3d2f8caff4..e84f5e1bff 100644 --- a/web/src/components/embed-dialog/index.tsx +++ b/web/src/components/embed-dialog/index.tsx @@ -24,20 +24,23 @@ import { LanguageAbbreviationMap, ThemeEnum, } from '@/constants/common'; -import { useTranslate } from '@/hooks/common-hooks'; import { IModalProps } from '@/interfaces/common'; import { Routes } from '@/routes'; import { zodResolver } from '@hookform/resolvers/zod'; +import { isEmpty, trim } from 'lodash'; import { ExternalLink } from 'lucide-react'; import { memo, useCallback, useMemo } from 'react'; import { useForm, useWatch } from 'react-hook-form'; +import { useTranslation } from 'react-i18next'; import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'; import { oneDark, oneLight, } from 'react-syntax-highlighter/dist/esm/styles/prism'; import { z } from 'zod'; +import { RAGFlowFormItem } from '../ragflow-form'; import { useIsDarkTheme } from '../theme-provider'; +import { Input } from '../ui/input'; const FormSchema = z.object({ visibleAvatar: z.boolean(), @@ -46,6 +49,7 @@ const FormSchema = z.object({ embedType: z.enum(['fullscreen', 'widget']), enableStreaming: z.boolean(), theme: z.enum([ThemeEnum.Light, ThemeEnum.Dark]), + userId: z.string().optional(), }); type IProps = IModalProps & { @@ -63,7 +67,7 @@ function EmbedDialog({ isAgent, visible, }: IProps) { - const { t } = useTranslate('chat'); + const { t } = useTranslation(); const isDarkTheme = useIsDarkTheme(); const form = useForm>({ @@ -95,6 +99,7 @@ function EmbedDialog({ embedType, enableStreaming, theme, + userId, } = values; const baseRoute = embedType === 'widget' @@ -124,6 +129,9 @@ function EmbedDialog({ if (theme && embedType === 'fullscreen') { src.searchParams.append('theme', theme); } + if (!isEmpty(trim(userId))) { + src.searchParams.append('userId', userId!); + } return src.toString(); }, [beta, from, token, values]); @@ -175,9 +183,7 @@ window.addEventListener('message',e=>{ - - {t('embedIntoSite', { keyPrefix: 'common' })} - + {t('common.embedIntoSite')}
@@ -253,7 +259,7 @@ window.addEventListener('message',e=>{ name="visibleAvatar" render={({ field }) => ( - {t('avatarHidden')} + {t('chat.avatarHidden')} { name="locale" render={({ field }) => ( - {t('locale')} + {t('chat.locale')} { )} /> + + +
- {t('embedCode', { keyPrefix: 'search' })} + {t('search.embedCode')}
{ variant="secondary" > - {t('openInNewTab', { keyPrefix: 'common' })} + {t('common.openInNewTab')}
{t(isAgent ? 'flow' : 'chat', { keyPrefix: 'header' })} @@ -354,7 +363,7 @@ window.addEventListener('message',e=>{ target="_blank" rel="noreferrer" > - {t('howUseId', { keyPrefix: isAgent ? 'flow' : 'chat' })} + {t(`${isAgent ? 'flow' : 'chat'}.howUseId`)}
diff --git a/web/src/locales/en.ts b/web/src/locales/en.ts index fc813671df..1780015ad6 100644 --- a/web/src/locales/en.ts +++ b/web/src/locales/en.ts @@ -1844,7 +1844,7 @@ Example: Virtual Hosted Style`, dbType: 'Database type', database: 'Database', username: 'Username', - userId: 'User id', + userId: 'User ID', host: 'Host', port: 'Port', password: 'Password', diff --git a/web/src/pages/agent/chat/use-send-agent-message.ts b/web/src/pages/agent/chat/use-send-agent-message.ts index a76b4c11c9..35bb078e4f 100644 --- a/web/src/pages/agent/chat/use-send-agent-message.ts +++ b/web/src/pages/agent/chat/use-send-agent-message.ts @@ -26,7 +26,7 @@ import { useRef, useState, } from 'react'; -import { useParams } from 'react-router'; +import { useParams, useSearchParams } from 'react-router'; import { v4 as uuid } from 'uuid'; import { BeginId } from '../constant'; import { AgentChatLogContext } from '../context'; @@ -272,6 +272,10 @@ export const useSendAgentMessage = ({ removeFile, } = useSetUploadResponseData(); + const [searchParams] = useSearchParams(); + + const userId = searchParams.get('userId'); + const { stopMessage } = useStopMessage(); const stopConversation = useCallback(() => { @@ -315,6 +319,10 @@ export const useSendAgentMessage = ({ if (releaseMode) { params.release = releaseMode; } + + if (userId) { + params.user_id = userId; + } } try { @@ -341,12 +349,13 @@ export const useSendAgentMessage = ({ beginParams, uploadResponseList, sessionId, + releaseMode, + userId, send, clearUploadResponseList, setValue, removeLatestMessage, refetch, - releaseMode, ], ); diff --git a/web/src/pages/agent/hooks/use-send-shared-message.ts b/web/src/pages/agent/hooks/use-send-shared-message.ts index 5bcb31dfc1..e3f85af874 100644 --- a/web/src/pages/agent/hooks/use-send-shared-message.ts +++ b/web/src/pages/agent/hooks/use-send-shared-message.ts @@ -32,8 +32,7 @@ interface SharedChatSearchParams { export const useGetSharedChatSearchParams = () => { const [searchParams] = useSearchParams(); const data = Object.fromEntries( - searchParams - .entries() + Array.from(searchParams.entries()) .filter(([key]) => key.startsWith(DATA_PREFIX)) .map(([key, value]) => [key.replace(DATA_PREFIX, ''), value]), ); @@ -74,7 +73,7 @@ export const useSendNextSharedMessage = ( showModal: showParameterDialog, } = useSetModalState(); - const ret = useSendAgentMessage({ + const { handlePressEnter, ...ret } = useSendAgentMessage({ url, addEventList, beginParams: params, @@ -100,6 +99,10 @@ export const useSendNextSharedMessage = ( [hideParameterDialog, isTaskMode, ret], ); + const onPressEnter = useCallback(() => { + handlePressEnter(); + }, [handlePressEnter]); + const runTask = useCallback(() => { if ( isTaskMode && @@ -124,5 +127,6 @@ export const useSendNextSharedMessage = ( hideParameterDialog, showParameterDialog, ok, + handlePressEnter: onPressEnter, }; }; diff --git a/web/src/pages/agents/agent-log-page.tsx b/web/src/pages/agents/agent-log-page.tsx index ee9173291e..70728cc79e 100644 --- a/web/src/pages/agents/agent-log-page.tsx +++ b/web/src/pages/agents/agent-log-page.tsx @@ -8,6 +8,7 @@ import { BreadcrumbPage, BreadcrumbSeparator, } from '@/components/ui/breadcrumb'; +import { Button } from '@/components/ui/button'; import { SearchInput } from '@/components/ui/input'; import { RAGFlowPagination } from '@/components/ui/ragflow-pagination'; import { Spin } from '@/components/ui/spin'; @@ -20,6 +21,7 @@ import { import { IReferenceObject } from '@/interfaces/database/chat'; import { useQueryClient } from '@tanstack/react-query'; import React, { useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { useParams } from 'react-router'; import { DateRange } from '../../components/originui/calendar/index'; import { @@ -44,6 +46,7 @@ const getEndOfToday = (): Date => { return today; }; const AgentLogPage: React.FC = () => { + const { t } = useTranslation(); const { navigateToAgents, navigateToAgent } = useNavigatePage(); const { flowDetail: agentDetail } = useFetchDataOnMount(); const { id: canvasId } = useParams(); @@ -58,17 +61,24 @@ const AgentLogPage: React.FC = () => { page_size: 10, }; const [searchParams, setSearchParams] = useState(init); + const columns = [ { title: 'ID', dataIndex: 'id', key: 'id', }, + { + title: 'User ID', + dataIndex: 'user_id', + key: 'user_id', + render: (text: string) => {text}, + }, { title: 'Title', dataIndex: 'title', key: 'title', - render: (text, record: IAgentLogResponse) => ( + render: (_text: string, record: IAgentLogResponse) => ( {record?.message?.length ? record?.message[0]?.content : ''} @@ -78,7 +88,7 @@ const AgentLogPage: React.FC = () => { title: 'State', dataIndex: 'state', key: 'state', - render: (text, record: IAgentLogResponse) => ( + render: (_text: string, record: IAgentLogResponse) => (
{ key: 'create_date', sortable: true, }, + { + title: 'Version', + dataIndex: 'version', + key: 'version', + }, ]; const { data: logData, loading } = useFetchAgentLog(searchParams); @@ -231,6 +246,7 @@ const AgentLogPage: React.FC = () => {
+ ID/Title { {columns.map((column) => ( {column.render - ? column.render(item[column.dataIndex], item) - : item[column.dataIndex]} + ? column.render( + item[column.dataIndex as keyof IAgentLogResponse], + item, + ) + : (item[ + column.dataIndex as keyof typeof item + ] as string)} ))}