mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-08-04 06:40:29 +08:00
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:
@@ -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 (
|
||||
|
||||
@@ -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}`)
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -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(() => {
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
|
||||
|
||||
@@ -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],
|
||||
|
||||
@@ -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],
|
||||
});
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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(() => {
|
||||
|
||||
@@ -37,7 +37,7 @@ export function AgentDropdown({
|
||||
);
|
||||
|
||||
const handleDelete: MouseEventHandler<HTMLDivElement> = useCallback(() => {
|
||||
deleteAgent([agent.id]);
|
||||
deleteAgent(agent.id);
|
||||
}, [agent.id, deleteAgent]);
|
||||
|
||||
return (
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user