Feat: Rename agent #3221 (#7740)

### What problem does this PR solve?

Feat: Rename agent #3221

### Type of change


- [x] New Feature (non-breaking change which adds functionality)
This commit is contained in:
balibabu 2025-05-20 19:13:19 +08:00 committed by GitHub
parent d72468426e
commit 1c6320828c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 104 additions and 60 deletions

View File

@ -1,7 +1,8 @@
import { IFlow } from '@/interfaces/database/flow'; import { IFlow } from '@/interfaces/database/flow';
import flowService from '@/services/flow-service'; import flowService from '@/services/flow-service';
import { useQuery } from '@tanstack/react-query'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { useDebounce } from 'ahooks'; import { useDebounce } from 'ahooks';
import { message } from 'antd';
import { useCallback } from 'react'; import { useCallback } from 'react';
import { import {
useGetPaginationWithRouter, useGetPaginationWithRouter,
@ -10,6 +11,8 @@ import {
export const enum AgentApiAction { export const enum AgentApiAction {
FetchAgentList = 'fetchAgentList', FetchAgentList = 'fetchAgentList',
UpdateAgentSetting = 'updateAgentSetting',
DeleteAgent = 'deleteAgent',
} }
export const useFetchAgentListByPage = () => { export const useFetchAgentListByPage = () => {
@ -58,3 +61,51 @@ export const useFetchAgentListByPage = () => {
setPagination, setPagination,
}; };
}; };
export const useUpdateAgentSetting = () => {
const queryClient = useQueryClient();
const {
data,
isPending: loading,
mutateAsync,
} = useMutation({
mutationKey: [AgentApiAction.UpdateAgentSetting],
mutationFn: async (params: any) => {
const ret = await flowService.settingCanvas(params);
if (ret?.data?.code === 0) {
message.success('success');
queryClient.invalidateQueries({
queryKey: [AgentApiAction.FetchAgentList],
});
} else {
message.error(ret?.data?.data);
}
return ret?.data?.code;
},
});
return { data, loading, updateAgentSetting: mutateAsync };
};
export const useDeleteAgent = () => {
const queryClient = useQueryClient();
const {
data,
isPending: loading,
mutateAsync,
} = useMutation({
mutationKey: [AgentApiAction.DeleteAgent],
mutationFn: async (canvasIds: string[]) => {
const { data } = await flowService.removeCanvas({ canvasIds });
if (data.code === 0) {
queryClient.invalidateQueries({
queryKey: [AgentApiAction.FetchAgentList],
});
}
return data?.data ?? [];
},
});
return { data, loading, deleteAgent: mutateAsync };
};

View File

@ -9,9 +9,9 @@ import { useRenameAgent } from './use-rename-agent';
export type DatasetCardProps = { export type DatasetCardProps = {
data: IFlow; data: IFlow;
} & Pick<ReturnType<typeof useRenameAgent>, 'showDatasetRenameModal'>; } & Pick<ReturnType<typeof useRenameAgent>, 'showAgentRenameModal'>;
export function AgentCard({ data, showDatasetRenameModal }: DatasetCardProps) { export function AgentCard({ data, showAgentRenameModal }: DatasetCardProps) {
const { navigateToAgent } = useNavigatePage(); const { navigateToAgent } = useNavigatePage();
return ( return (
@ -25,8 +25,8 @@ export function AgentCard({ data, showDatasetRenameModal }: DatasetCardProps) {
</Avatar> </Avatar>
</div> </div>
<AgentDropdown <AgentDropdown
showDatasetRenameModal={showDatasetRenameModal} showAgentRenameModal={showAgentRenameModal}
dataset={data} agent={data}
> >
<MoreButton></MoreButton> <MoreButton></MoreButton>
</AgentDropdown> </AgentDropdown>

View File

@ -6,7 +6,7 @@ import {
DropdownMenuSeparator, DropdownMenuSeparator,
DropdownMenuTrigger, DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu'; } from '@/components/ui/dropdown-menu';
import { useDeleteKnowledge } from '@/hooks/use-knowledge-request'; import { useDeleteAgent } from '@/hooks/use-agent-request';
import { IFlow } from '@/interfaces/database/flow'; import { IFlow } from '@/interfaces/database/flow';
import { PenLine, Trash2 } from 'lucide-react'; import { PenLine, Trash2 } from 'lucide-react';
import { MouseEventHandler, PropsWithChildren, useCallback } from 'react'; import { MouseEventHandler, PropsWithChildren, useCallback } from 'react';
@ -15,33 +15,33 @@ import { useRenameAgent } from './use-rename-agent';
export function AgentDropdown({ export function AgentDropdown({
children, children,
showDatasetRenameModal, showAgentRenameModal,
dataset, agent: agent,
}: PropsWithChildren & }: PropsWithChildren &
Pick<ReturnType<typeof useRenameAgent>, 'showDatasetRenameModal'> & { Pick<ReturnType<typeof useRenameAgent>, 'showAgentRenameModal'> & {
dataset: IFlow; agent: IFlow;
}) { }) {
const { t } = useTranslation(); const { t } = useTranslation();
const { deleteKnowledge } = useDeleteKnowledge(); const { deleteAgent } = useDeleteAgent();
const handleShowDatasetRenameModal: MouseEventHandler<HTMLDivElement> = const handleShowAgentRenameModal: MouseEventHandler<HTMLDivElement> =
useCallback( useCallback(
(e) => { (e) => {
e.stopPropagation(); e.stopPropagation();
showDatasetRenameModal(dataset); showAgentRenameModal(agent);
}, },
[dataset, showDatasetRenameModal], [agent, showAgentRenameModal],
); );
const handleDelete: MouseEventHandler<HTMLDivElement> = useCallback(() => { const handleDelete: MouseEventHandler<HTMLDivElement> = useCallback(() => {
deleteKnowledge(dataset.id); deleteAgent([agent.id]);
}, [dataset.id, deleteKnowledge]); }, [agent.id, deleteAgent]);
return ( return (
<DropdownMenu> <DropdownMenu>
<DropdownMenuTrigger asChild>{children}</DropdownMenuTrigger> <DropdownMenuTrigger asChild>{children}</DropdownMenuTrigger>
<DropdownMenuContent> <DropdownMenuContent>
<DropdownMenuItem onClick={handleShowDatasetRenameModal}> <DropdownMenuItem onClick={handleShowAgentRenameModal}>
{t('common.rename')} <PenLine /> {t('common.rename')} <PenLine />
</DropdownMenuItem> </DropdownMenuItem>
<DropdownMenuSeparator /> <DropdownMenuSeparator />

View File

@ -16,12 +16,12 @@ export default function Agent() {
const { navigateToAgentTemplates } = useNavigatePage(); const { navigateToAgentTemplates } = useNavigatePage();
const { const {
datasetRenameLoading, agentRenameLoading,
initialDatasetName, initialAgentName,
onDatasetRenameOk, onAgentRenameOk,
datasetRenameVisible, agentRenameVisible,
hideDatasetRenameModal, hideAgentRenameModal,
showDatasetRenameModal, showAgentRenameModal,
} = useRenameAgent(); } = useRenameAgent();
const handlePageChange = useCallback( const handlePageChange = useCallback(
@ -51,7 +51,7 @@ export default function Agent() {
<AgentCard <AgentCard
key={x.id} key={x.id}
data={x} data={x}
showDatasetRenameModal={showDatasetRenameModal} showAgentRenameModal={showAgentRenameModal}
></AgentCard> ></AgentCard>
); );
})} })}
@ -63,12 +63,12 @@ export default function Agent() {
onChange={handlePageChange} onChange={handlePageChange}
></RAGFlowPagination> ></RAGFlowPagination>
</div> </div>
{datasetRenameVisible && ( {agentRenameVisible && (
<RenameDialog <RenameDialog
hideModal={hideDatasetRenameModal} hideModal={hideAgentRenameModal}
onOk={onDatasetRenameOk} onOk={onAgentRenameOk}
initialName={initialDatasetName} initialName={initialAgentName}
loading={datasetRenameLoading} loading={agentRenameLoading}
></RenameDialog> ></RenameDialog>
)} )}
</section> </section>

View File

@ -1,53 +1,46 @@
import { useSetModalState } from '@/hooks/common-hooks'; import { useSetModalState } from '@/hooks/common-hooks';
import { useUpdateKnowledge } from '@/hooks/use-knowledge-request'; import { useUpdateAgentSetting } from '@/hooks/use-agent-request';
import { IFlow } from '@/interfaces/database/flow'; import { IFlow } from '@/interfaces/database/flow';
import { omit } from 'lodash'; import { pick } from 'lodash';
import { useCallback, useState } from 'react'; import { useCallback, useState } from 'react';
export const useRenameAgent = () => { export const useRenameAgent = () => {
const [dataset, setDataset] = useState<IFlow>({} as IFlow); const [agent, setAgent] = useState<IFlow>({} as IFlow);
const { const {
visible: datasetRenameVisible, visible: agentRenameVisible,
hideModal: hideDatasetRenameModal, hideModal: hideAgentRenameModal,
showModal: showDatasetRenameModal, showModal: showAgentRenameModal,
} = useSetModalState(); } = useSetModalState();
const { saveKnowledgeConfiguration, loading } = useUpdateKnowledge(true); const { updateAgentSetting, loading } = useUpdateAgentSetting();
const onDatasetRenameOk = useCallback( const onAgentRenameOk = useCallback(
async (name: string) => { async (name: string) => {
const ret = await saveKnowledgeConfiguration({ const ret = await updateAgentSetting({
...omit(dataset, [ ...pick(agent, ['id', 'avatar', 'description', 'permission']),
'id', title: name,
'update_time',
'nickname',
'tenant_avatar',
'tenant_id',
]),
kb_id: dataset.id,
name,
}); });
if (ret.code === 0) { if (ret === 0) {
hideDatasetRenameModal(); hideAgentRenameModal();
} }
}, },
[saveKnowledgeConfiguration, dataset, hideDatasetRenameModal], [updateAgentSetting, agent, hideAgentRenameModal],
); );
const handleShowDatasetRenameModal = useCallback( const handleShowAgentRenameModal = useCallback(
async (record: IFlow) => { async (record: IFlow) => {
setDataset(record); setAgent(record);
showDatasetRenameModal(); showAgentRenameModal();
}, },
[showDatasetRenameModal], [showAgentRenameModal],
); );
return { return {
datasetRenameLoading: loading, agentRenameLoading: loading,
initialDatasetName: dataset?.title, initialAgentName: agent?.title,
onDatasetRenameOk, onAgentRenameOk,
datasetRenameVisible, agentRenameVisible,
hideDatasetRenameModal, hideAgentRenameModal,
showDatasetRenameModal: handleShowDatasetRenameModal, showAgentRenameModal: handleShowAgentRenameModal,
}; };
}; };