Browse Source

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)
tags/v0.19.x
balibabu 5 months ago
parent
commit
1c6320828c
No account linked to committer's email address

+ 52
- 1
web/src/hooks/use-agent-request.ts View File

@@ -1,7 +1,8 @@
import { IFlow } from '@/interfaces/database/flow';
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 { message } from 'antd';
import { useCallback } from 'react';
import {
useGetPaginationWithRouter,
@@ -10,6 +11,8 @@ import {

export const enum AgentApiAction {
FetchAgentList = 'fetchAgentList',
UpdateAgentSetting = 'updateAgentSetting',
DeleteAgent = 'deleteAgent',
}

export const useFetchAgentListByPage = () => {
@@ -58,3 +61,51 @@ export const useFetchAgentListByPage = () => {
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 };
};

+ 4
- 4
web/src/pages/agents/agent-card.tsx View File

@@ -9,9 +9,9 @@ import { useRenameAgent } from './use-rename-agent';

export type DatasetCardProps = {
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();

return (
@@ -25,8 +25,8 @@ export function AgentCard({ data, showDatasetRenameModal }: DatasetCardProps) {
</Avatar>
</div>
<AgentDropdown
showDatasetRenameModal={showDatasetRenameModal}
dataset={data}
showAgentRenameModal={showAgentRenameModal}
agent={data}
>
<MoreButton></MoreButton>
</AgentDropdown>

+ 12
- 12
web/src/pages/agents/agent-dropdown.tsx View File

@@ -6,7 +6,7 @@ import {
DropdownMenuSeparator,
DropdownMenuTrigger,
} 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 { PenLine, Trash2 } from 'lucide-react';
import { MouseEventHandler, PropsWithChildren, useCallback } from 'react';
@@ -15,33 +15,33 @@ import { useRenameAgent } from './use-rename-agent';

export function AgentDropdown({
children,
showDatasetRenameModal,
dataset,
showAgentRenameModal,
agent: agent,
}: PropsWithChildren &
Pick<ReturnType<typeof useRenameAgent>, 'showDatasetRenameModal'> & {
dataset: IFlow;
Pick<ReturnType<typeof useRenameAgent>, 'showAgentRenameModal'> & {
agent: IFlow;
}) {
const { t } = useTranslation();
const { deleteKnowledge } = useDeleteKnowledge();
const { deleteAgent } = useDeleteAgent();

const handleShowDatasetRenameModal: MouseEventHandler<HTMLDivElement> =
const handleShowAgentRenameModal: MouseEventHandler<HTMLDivElement> =
useCallback(
(e) => {
e.stopPropagation();
showDatasetRenameModal(dataset);
showAgentRenameModal(agent);
},
[dataset, showDatasetRenameModal],
[agent, showAgentRenameModal],
);

const handleDelete: MouseEventHandler<HTMLDivElement> = useCallback(() => {
deleteKnowledge(dataset.id);
}, [dataset.id, deleteKnowledge]);
deleteAgent([agent.id]);
}, [agent.id, deleteAgent]);

return (
<DropdownMenu>
<DropdownMenuTrigger asChild>{children}</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuItem onClick={handleShowDatasetRenameModal}>
<DropdownMenuItem onClick={handleShowAgentRenameModal}>
{t('common.rename')} <PenLine />
</DropdownMenuItem>
<DropdownMenuSeparator />

+ 12
- 12
web/src/pages/agents/index.tsx View File

@@ -16,12 +16,12 @@ export default function Agent() {
const { navigateToAgentTemplates } = useNavigatePage();

const {
datasetRenameLoading,
initialDatasetName,
onDatasetRenameOk,
datasetRenameVisible,
hideDatasetRenameModal,
showDatasetRenameModal,
agentRenameLoading,
initialAgentName,
onAgentRenameOk,
agentRenameVisible,
hideAgentRenameModal,
showAgentRenameModal,
} = useRenameAgent();

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

+ 24
- 31
web/src/pages/agents/use-rename-agent.ts View File

@@ -1,53 +1,46 @@
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 { omit } from 'lodash';
import { pick } from 'lodash';
import { useCallback, useState } from 'react';

export const useRenameAgent = () => {
const [dataset, setDataset] = useState<IFlow>({} as IFlow);
const [agent, setAgent] = useState<IFlow>({} as IFlow);
const {
visible: datasetRenameVisible,
hideModal: hideDatasetRenameModal,
showModal: showDatasetRenameModal,
visible: agentRenameVisible,
hideModal: hideAgentRenameModal,
showModal: showAgentRenameModal,
} = useSetModalState();
const { saveKnowledgeConfiguration, loading } = useUpdateKnowledge(true);
const { updateAgentSetting, loading } = useUpdateAgentSetting();

const onDatasetRenameOk = useCallback(
const onAgentRenameOk = useCallback(
async (name: string) => {
const ret = await saveKnowledgeConfiguration({
...omit(dataset, [
'id',
'update_time',
'nickname',
'tenant_avatar',
'tenant_id',
]),
kb_id: dataset.id,
name,
const ret = await updateAgentSetting({
...pick(agent, ['id', 'avatar', 'description', 'permission']),
title: name,
});

if (ret.code === 0) {
hideDatasetRenameModal();
if (ret === 0) {
hideAgentRenameModal();
}
},
[saveKnowledgeConfiguration, dataset, hideDatasetRenameModal],
[updateAgentSetting, agent, hideAgentRenameModal],
);

const handleShowDatasetRenameModal = useCallback(
const handleShowAgentRenameModal = useCallback(
async (record: IFlow) => {
setDataset(record);
showDatasetRenameModal();
setAgent(record);
showAgentRenameModal();
},
[showDatasetRenameModal],
[showAgentRenameModal],
);

return {
datasetRenameLoading: loading,
initialDatasetName: dataset?.title,
onDatasetRenameOk,
datasetRenameVisible,
hideDatasetRenameModal,
showDatasetRenameModal: handleShowDatasetRenameModal,
agentRenameLoading: loading,
initialAgentName: agent?.title,
onAgentRenameOk,
agentRenameVisible,
hideAgentRenameModal,
showAgentRenameModal: handleShowAgentRenameModal,
};
};

Loading…
Cancel
Save