Feat: Agent api (#14157)

### What problem does this PR solve?

1. **List agents**  
   **Prev API**:  
   - `/v1/canvas/list GET`  
   - `/api/v1/agents GET`  
   **Current API**: `/api/v2/agents GET`

2. **Get canvas template**  
   **Prev API**: `/v1/canvas/templates GET`  
   **Current API**: `/api/v2/agents/templates GET`

3. **Delete an agent**  
   **Prev API**: 
    - `/v1/canvas/rm POST`  
    - `/api/v1/agents/<agent_id> DELETE`
   **Current API**: `/api/v2/agents/<agent_id> DELETE`

4. **Update an agent**  
   **Prev API**: 
    - `/api/v1/agents/<agent_id> PUT`   
    - `/v1/canvas/setting POST `
   **Current API**: `/api/v2/agents/<agent_id> PATCH`


5. **Create an agent**  
   **Prev API**: 
    - `/v1/canvas/set POST`  
    - `/api/v1/agents POST`
   **Current API**: `/api/v2/agents POST`


6. **Get an agent**  
   **Prev API**: 
    - `/v1/canvas/get/<canvas_id> GET `  
   **Current API**: `/api/v2/agents/<agent_id> GET`


7. **Reset an agent**  
   **Prev API**: 
    - `/v1/canvas/reset POST`  
   **Current API**: `/api/v2/agents/<agent_id>/reset POST`


8. **Upload a file to an agent**  
   **Prev API**: 
    - `/v1/canvas/upload/<canvas_id> POST`  
   **Current API**: `/api/v2/agents/<agent_id>/upload POST`


9. **Input form**  
   **Prev API**: 
    - `/v1/canvas/input_form GET`  
**Current API**:
`/api/v2/agents/<agent_id>/components/<component_id>/input-form GET`


10. **Debug an agent**  
   **Prev API**: 
    - `/v1/canvas/debug POST`  
**Current API**:
`/api/v2/agents/<agent_id>/components/<component_id>/debug POST`


11. **Trace an agent**  
   **Prev API**: 
    - `/v1/canvas/trace GET`  
   **Current API**: `/api/v2/agents/<agent_id>/logs/<message_id> GET`


12. **Get an agent version list**  
   **Prev API**: 
    - `/v1/canvas/getlistversion/<canvas_id>`  
   **Current API**: `/api/v2/agents/<agent_id>/versions GET`


13. **Get a version of agent**  
   **Prev API**: 
    - `/v1/canvas/getversion/<version_id>`  
**Current API**: `/api/v2/agents/<agent_id>/versions/<version_id> GET`


14. **Test db connection**  
   **Prev API**: 
    - `/v1/canvas/test_db_connect POST`  
   **Current API**: `/api/v2/agents/test_db_connection`


15. **Rerun the agent**  
   **Prev API**: 
    - `/v1/canvas/rerun POST`  
   **Current API**: `/api/v2/agents/rerun POST`


16. **Get prompts**  
   **Prev API**: 
    - `/v1/canvas/prompts GET`  
   **Current API**: `/api/v2/agents/prompts GET`

### Type of change
- [x] New Feature (non-breaking change which adds functionality)

---------

Co-authored-by: chanx <1243304602@qq.com>
This commit is contained in:
Magicbook1108
2026-04-24 10:02:22 +08:00
committed by GitHub
parent d84438fd53
commit c74aece63c
34 changed files with 1819 additions and 4671 deletions

View File

@@ -10,7 +10,7 @@ import PdfSheet from '@/components/pdf-drawer';
import { useClickDrawer } from '@/components/pdf-drawer/hooks';
import {
useFetchAgent,
useUploadCanvasFileWithProgress,
useUploadAgentFileWithProgress,
} from '@/hooks/use-agent-request';
import { useFetchUserInfo } from '@/hooks/use-user-setting-request';
import { buildMessageUuidWithRole } from '@/utils/chat';
@@ -44,7 +44,7 @@ function AgentChatBox() {
useGetFileIcon();
const { data: userInfo } = useFetchUserInfo();
const { id: canvasId } = useParams();
const { uploadCanvasFile, loading } = useUploadCanvasFileWithProgress();
const { uploadAgentFile, loading } = useUploadAgentFileWithProgress();
const { buildInputList, handleOk, isWaitting } = useAwaitCompentData({
derivedMessages,
@@ -60,10 +60,10 @@ function AgentChatBox() {
const handleUploadFile: NonNullable<FileUploadProps['onUpload']> =
useCallback(
async (files, options) => {
const ret = await uploadCanvasFile({ files, options });
const ret = await uploadAgentFile({ files, options });
appendUploadResponseList(ret.data, files);
},
[appendUploadResponseList, uploadCanvasFile],
[appendUploadResponseList, uploadAgentFile],
);
return (

View File

@@ -240,7 +240,7 @@ export const useSendAgentMessage = ({
const inputs = useSelectBeginNodeDataInputs();
const [sessionId, setSessionId] = useState<string | null>(null);
const { send, answerList, done, stopOutputMessage, resetAnswerList } =
useSendMessageBySSE(url || api.runCanvas);
useSendMessageBySSE(url || api.agentChatCompletion);
const firstAnswer = answerList[0];
const messageId = useMemo(() => {
return firstAnswer?.message_id;
@@ -298,13 +298,12 @@ export const useSendAgentMessage = ({
beginInputs?: BeginQuery[];
exploreSessionId?: string;
}) => {
const params: Record<string, unknown> = {
id: agentId,
};
const params: Record<string, unknown> = { agent_id: agentId };
params.running_hint_text = i18n.t('flow.runningHintText', {
defaultValue: 'is running...🕞',
});
params['openai-compatible'] = false;
if (typeof message.content === 'string') {
const query = inputs;
@@ -361,7 +360,7 @@ export const useSendAgentMessage = ({
);
const sendFormMessage = useCallback(
async (body: { id?: string; inputs: Record<string, BeginQuery> }) => {
async (body: { agent_id?: string; inputs: Record<string, BeginQuery> }) => {
addNewestOneQuestion({
content: Object.entries(body.inputs)
.map(([, val]) => `${val.name}: ${val.value}`)

View File

@@ -13,7 +13,7 @@ import {
type FileUploadProps,
} from '@/components/file-upload';
import { Button } from '@/components/ui/button';
import { useUploadCanvasFile } from '@/hooks/use-agent-request';
import { useUploadAgentFile } from '@/hooks/use-agent-request';
import { Upload, X } from 'lucide-react';
import * as React from 'react';
import { toast } from 'sonner';
@@ -34,7 +34,7 @@ export function FileUploadDirectUpload({
Array.isArray(value) ? value : value ? [value] : [],
);
const { uploadCanvasFile } = useUploadCanvasFile();
const { uploadAgentFile } = useUploadAgentFile();
const onUpload: NonNullable<FileUploadProps['onUpload']> = React.useCallback(
async (files, { onSuccess, onError }) => {
@@ -47,7 +47,7 @@ export function FileUploadDirectUpload({
);
};
try {
const ret = await uploadCanvasFile([file]);
const ret = await uploadAgentFile([file]);
if (ret.code === 0) {
onSuccess(file);
uploadedFilesRef.current = [
@@ -70,7 +70,7 @@ export function FileUploadDirectUpload({
console.error('Unexpected error during upload:', error);
}
},
[onChange, uploadCanvasFile],
[onChange, uploadAgentFile],
);
const onFileReject = React.useCallback((file: File, message: string) => {

View File

@@ -4,7 +4,7 @@ import MessageItem from '@/components/next-message-item';
import PdfSheet from '@/components/pdf-drawer';
import { useClickDrawer } from '@/components/pdf-drawer/hooks';
import { MessageType } from '@/constants/chat';
import { useUploadCanvasFileWithProgress } from '@/hooks/use-agent-request';
import { useUploadAgentFileWithProgress } from '@/hooks/use-agent-request';
import { useFetchUserInfo } from '@/hooks/use-user-setting-request';
import { IAgentLogResponse } from '@/interfaces/database/agent';
import { IMessage } from '@/interfaces/database/chat';
@@ -55,16 +55,16 @@ export function SessionChat({ session }: SessionChatProps) {
useClickDrawer();
// File upload
const { uploadCanvasFile, loading: isUploading } =
useUploadCanvasFileWithProgress();
const { uploadAgentFile, loading: isUploading } =
useUploadAgentFileWithProgress();
const handleUploadFile: NonNullable<FileUploadProps['onUpload']> =
useCallback(
async (files, options) => {
const ret = await uploadCanvasFile({ files, options });
const ret = await uploadAgentFile({ files, options });
appendUploadResponseList(ret.data, files);
},
[appendUploadResponseList, uploadCanvasFile],
[appendUploadResponseList, uploadAgentFile],
);
useEffect(() => {

View File

@@ -6,7 +6,6 @@ import {
} from '@/hooks/use-agent-request';
import { useSendAgentMessage } from '@/pages/agent/chat/use-send-agent-message';
import { buildBeginInputListFromObject } from '@/pages/agent/form/begin-form/utils';
import api from '@/utils/api';
import { get, isEmpty } from 'lodash';
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { useParams } from 'react-router';
@@ -63,7 +62,6 @@ export const useSendSessionMessage = () => {
value,
...chatLogic
} = useSendAgentMessage({
url: api.runCanvasExplore(canvasId!),
beginParams,
});

View File

@@ -8,7 +8,7 @@ type IAwaitCompentData = {
derivedMessages: IMessage[];
sendFormMessage: (params: {
inputs: Record<string, BeginQuery>;
id: string;
agent_id: string;
}) => void;
canvasId: string;
};
@@ -37,7 +37,7 @@ const useAwaitCompentData = (props: IAwaitCompentData) => {
const nextInputs = buildBeginQueryWithObject(inputs, values);
sendFormMessage({
inputs: nextInputs,
id: canvasId,
agent_id: canvasId,
});
},
[getInputs, sendFormMessage, canvasId],

View File

@@ -13,7 +13,7 @@ export function useRunDataflow({
}: {
showLogSheet: () => void;
} & Pick<UseFetchLogReturnType, 'setMessageId'>) {
const { send } = useSendMessageBySSE(api.runCanvas);
const { send } = useSendMessageBySSE(api.agentChatCompletion);
const { id } = useParams();
const { saveGraph, loading } = useSaveGraph();
const [uploadedFileData, setUploadedFileData] =
@@ -27,8 +27,9 @@ export function useRunDataflow({
showLogSheet();
const res = await send({
id,
agent_id: id,
query: '',
'openai-compatible': false,
session_id: null,
files: [fileResponseData.file],
});

View File

@@ -6,7 +6,7 @@ import {
DialogHeader,
DialogTitle,
} from '@/components/ui/dialog';
import { useSetAgentSetting } from '@/hooks/use-agent-request';
import { useSetAgent } from '@/hooks/use-agent-request';
import { IModalProps } from '@/interfaces/common';
import { useCallback } from 'react';
import { useTranslation } from 'react-i18next';
@@ -18,16 +18,16 @@ import {
export function SettingDialog({ hideModal }: IModalProps<any>) {
const { t } = useTranslation();
const { setAgentSetting } = useSetAgentSetting();
const { setAgent } = useSetAgent();
const submit = useCallback(
async (values: SettingFormSchemaType) => {
const code = await setAgentSetting(values);
if (code === 0) {
const ret = await setAgent(values);
if (ret?.code === 0) {
hideModal?.();
}
},
[hideModal, setAgentSetting],
[hideModal, setAgent],
);
return (

View File

@@ -6,7 +6,7 @@ import PdfSheet from '@/components/pdf-drawer';
import { useClickDrawer } from '@/components/pdf-drawer/hooks';
import { useSyncThemeFromParams } from '@/components/theme-provider';
import { MessageType } from '@/constants/chat';
import { useUploadCanvasFileWithProgress } from '@/hooks/use-agent-request';
import { useUploadAgentFileWithProgress } from '@/hooks/use-agent-request';
import { cn } from '@/lib/utils';
import i18n, { changeLanguageAsync } from '@/locales/config';
import DebugContent from '@/pages/agent/debug-content';
@@ -33,8 +33,8 @@ const ChatContainer = () => {
const { visible, hideModal, documentId, selectedChunk, clickDocumentButton } =
useClickDrawer();
const { uploadCanvasFile, loading } =
useUploadCanvasFileWithProgress(conversationId);
const { uploadAgentFile, loading } =
useUploadAgentFileWithProgress(conversationId);
const {
addEventList,
setCurrentMessageId,
@@ -80,10 +80,10 @@ const ChatContainer = () => {
const handleUploadFile: NonNullable<FileUploadProps['onUpload']> =
useCallback(
async (files, options) => {
const ret = await uploadCanvasFile({ files, options });
const ret = await uploadAgentFile({ files, options });
appendUploadResponseList(ret.data, files);
},
[appendUploadResponseList, uploadCanvasFile],
[appendUploadResponseList, uploadAgentFile],
);
React.useEffect(() => {

View File

@@ -37,7 +37,7 @@ export function AgentDropdown({
);
const handleDelete: MouseEventHandler<HTMLDivElement> = useCallback(() => {
deleteAgent([agent.id]);
deleteAgent(agent.id);
}, [agent.id, deleteAgent]);
return (

View File

@@ -5,7 +5,7 @@ import PdfSheet from '@/components/pdf-drawer';
import { useClickDrawer } from '@/components/pdf-drawer/hooks';
import { useSyncThemeFromParams } from '@/components/theme-provider';
import { MessageType, SharedFrom } from '@/constants/chat';
import { useFetchFlowSSE } from '@/hooks/use-agent-request';
import { useFetchSharedAgent } from '@/hooks/use-agent-request';
import { useFetchExternalChatInfo } from '@/hooks/use-chat-request';
import i18n, { changeLanguageAsync } from '@/locales/config';
import { buildMessageUuidWithRole } from '@/utils/chat';
@@ -44,7 +44,7 @@ const ChatContainer = () => {
const sendDisabled = useSendButtonDisabled(value);
const { data: chatInfo } = useFetchExternalChatInfo();
const { data: flowData } = useFetchFlowSSE();
const { data: flowData } = useFetchSharedAgent();
React.useEffect(() => {
if (locale && i18n.language !== locale) {
changeLanguageAsync(locale);