mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-07-05 10:58:34 +08:00
Feat: published agent version control (#13410)
### What problem does this PR solve? Feat: published agent version control ### Type of change - [x] New Feature (non-breaking change which adds functionality)
This commit is contained in:
@@ -36,6 +36,7 @@ import { z } from 'zod';
|
||||
|
||||
const FormSchema = z.object({
|
||||
visibleAvatar: z.boolean(),
|
||||
publishAvatar: z.boolean(),
|
||||
locale: z.string(),
|
||||
embedType: z.enum(['fullscreen', 'widget']),
|
||||
enableStreaming: z.boolean(),
|
||||
@@ -62,6 +63,7 @@ function EmbedDialog({
|
||||
resolver: zodResolver(FormSchema),
|
||||
defaultValues: {
|
||||
visibleAvatar: false,
|
||||
publishAvatar: false,
|
||||
locale: '',
|
||||
embedType: 'fullscreen' as const,
|
||||
enableStreaming: false,
|
||||
@@ -79,7 +81,14 @@ function EmbedDialog({
|
||||
}, []);
|
||||
|
||||
const generateIframeSrc = useCallback(() => {
|
||||
const { visibleAvatar, locale, embedType, enableStreaming, theme } = values;
|
||||
const {
|
||||
visibleAvatar,
|
||||
publishAvatar,
|
||||
locale,
|
||||
embedType,
|
||||
enableStreaming,
|
||||
theme,
|
||||
} = values;
|
||||
const baseRoute =
|
||||
embedType === 'widget'
|
||||
? Routes.ChatWidget
|
||||
@@ -87,6 +96,9 @@ function EmbedDialog({
|
||||
? Routes.AgentShare
|
||||
: Routes.ChatShare;
|
||||
let src = `${location.origin}${baseRoute}?shared_id=${token}&from=${from}&auth=${beta}`;
|
||||
if (publishAvatar) {
|
||||
src += '&release=true';
|
||||
}
|
||||
if (visibleAvatar) {
|
||||
src += '&visible_avatar=1';
|
||||
}
|
||||
@@ -245,6 +257,22 @@ function EmbedDialog({
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
<FormField
|
||||
control={form.control}
|
||||
name="publishAvatar"
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>Publish Avatar</FormLabel>
|
||||
<FormControl>
|
||||
<Switch
|
||||
checked={field.value}
|
||||
onCheckedChange={field.onChange}
|
||||
></Switch>
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
{values.embedType === 'widget' && (
|
||||
<FormField
|
||||
control={form.control}
|
||||
|
||||
@@ -145,7 +145,7 @@ export const useSendMessageBySSE = (url: string = api.completeConversation) => {
|
||||
const val = JSON.parse(value?.data || '');
|
||||
|
||||
console.info('data:', val);
|
||||
if (val.code === 500) {
|
||||
if (typeof val?.code === 'number' && val.code !== 0) {
|
||||
message.error(val.message);
|
||||
}
|
||||
|
||||
|
||||
@@ -105,7 +105,13 @@ export function findInputFromList(eventList: IEventList) {
|
||||
}
|
||||
|
||||
export function getLatestError(eventList: IEventList) {
|
||||
return get(eventList.at(-1), 'data.outputs._ERROR');
|
||||
const latest = eventList.at(-1) as
|
||||
| { code?: number; message?: string }
|
||||
| undefined;
|
||||
return (
|
||||
get(latest, 'data.outputs._ERROR') ||
|
||||
(latest?.code && latest.code !== 0 ? latest?.message : undefined)
|
||||
);
|
||||
}
|
||||
|
||||
export const useGetBeginNodePrologue = () => {
|
||||
@@ -218,13 +224,15 @@ export const useSendAgentMessage = ({
|
||||
isShared,
|
||||
refetch,
|
||||
isTaskMode: isTask,
|
||||
releaseMode,
|
||||
}: {
|
||||
url?: string;
|
||||
addEventList?: (data: IEventList, messageId: string) => void;
|
||||
beginParams?: any[];
|
||||
beginParams?: BeginQuery[];
|
||||
isShared?: boolean;
|
||||
refetch?: () => void;
|
||||
isTaskMode?: boolean;
|
||||
releaseMode?: string | null;
|
||||
}) => {
|
||||
const { id: agentId } = useParams();
|
||||
const { handleInputChange, value, setValue } = useHandleMessageInputChange();
|
||||
@@ -232,9 +240,10 @@ export const useSendAgentMessage = ({
|
||||
const [sessionId, setSessionId] = useState<string | null>(null);
|
||||
const { send, answerList, done, stopOutputMessage, resetAnswerList } =
|
||||
useSendMessageBySSE(url || api.runCanvas);
|
||||
const firstAnswer = answerList[0];
|
||||
const messageId = useMemo(() => {
|
||||
return answerList[0]?.message_id;
|
||||
}, [answerList]);
|
||||
return firstAnswer?.message_id;
|
||||
}, [firstAnswer]);
|
||||
|
||||
const isTaskMode = useIsTaskMode(isTask);
|
||||
|
||||
@@ -266,12 +275,12 @@ export const useSendAgentMessage = ({
|
||||
const { stopMessage } = useStopMessage();
|
||||
|
||||
const stopConversation = useCallback(() => {
|
||||
const taskId = answerList.at(0)?.task_id;
|
||||
const taskId = firstAnswer?.task_id;
|
||||
stopOutputMessage();
|
||||
if (!isShared) {
|
||||
stopMessage(taskId);
|
||||
}
|
||||
}, [answerList, isShared, stopMessage, stopOutputMessage]);
|
||||
}, [firstAnswer, isShared, stopMessage, stopOutputMessage]);
|
||||
|
||||
const sendMessage = useCallback(
|
||||
async ({
|
||||
@@ -303,6 +312,9 @@ export const useSendAgentMessage = ({
|
||||
params.files = uploadResponseList;
|
||||
|
||||
params.session_id = sessionId || exploreSessionId;
|
||||
if (releaseMode) {
|
||||
params.release = releaseMode;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
@@ -334,6 +346,7 @@ export const useSendAgentMessage = ({
|
||||
setValue,
|
||||
removeLatestMessage,
|
||||
refetch,
|
||||
releaseMode,
|
||||
],
|
||||
);
|
||||
|
||||
@@ -345,10 +358,14 @@ export const useSendAgentMessage = ({
|
||||
.join('<br/>'),
|
||||
role: MessageType.User,
|
||||
});
|
||||
await send({ ...body, session_id: sessionId });
|
||||
await send({
|
||||
...body,
|
||||
session_id: sessionId,
|
||||
...(releaseMode ? { release: releaseMode } : {}),
|
||||
});
|
||||
refetch?.();
|
||||
},
|
||||
[addNewestOneQuestion, refetch, send, sessionId],
|
||||
[addNewestOneQuestion, refetch, releaseMode, send, sessionId],
|
||||
);
|
||||
|
||||
// reset session
|
||||
@@ -396,7 +413,7 @@ export const useSendAgentMessage = ({
|
||||
],
|
||||
);
|
||||
|
||||
const sendedTaskMessage = useRef<boolean>(false);
|
||||
const sendedTaskMessage = useRef(false);
|
||||
|
||||
const sendMessageInTaskMode = useCallback(() => {
|
||||
if (isShared || !isTaskMode || sendedTaskMessage.current) {
|
||||
@@ -457,10 +474,10 @@ export const useSendAgentMessage = ({
|
||||
}, [addEventList, answerList, addEventListFun, messageId]);
|
||||
|
||||
useEffect(() => {
|
||||
if (answerList[0]?.session_id) {
|
||||
setSessionId(answerList[0]?.session_id);
|
||||
if (firstAnswer?.session_id) {
|
||||
setSessionId(firstAnswer.session_id);
|
||||
}
|
||||
}, [answerList]);
|
||||
}, [firstAnswer]);
|
||||
|
||||
return {
|
||||
value,
|
||||
|
||||
@@ -6,6 +6,7 @@ import {
|
||||
buildRequestBody,
|
||||
useSendAgentMessage,
|
||||
} from '@/pages/agent/chat/use-send-agent-message';
|
||||
import { BeginQuery } from '@/pages/agent/interface';
|
||||
import { isEmpty } from 'lodash';
|
||||
import trim from 'lodash/trim';
|
||||
import { useCallback, useEffect, useRef, useState } from 'react';
|
||||
@@ -16,36 +17,54 @@ export const useSendButtonDisabled = (value: string) => {
|
||||
return trim(value) === '';
|
||||
};
|
||||
|
||||
const DATA_PREFIX = 'data_';
|
||||
|
||||
interface SharedChatSearchParams {
|
||||
from: SharedFrom;
|
||||
sharedId: string | null;
|
||||
release: string | null;
|
||||
locale: string | null;
|
||||
theme: string | null;
|
||||
data: Record<string, string>;
|
||||
visibleAvatar: boolean;
|
||||
}
|
||||
|
||||
export const useGetSharedChatSearchParams = () => {
|
||||
const [searchParams] = useSearchParams();
|
||||
const data_prefix = 'data_';
|
||||
const data = Object.fromEntries(
|
||||
searchParams
|
||||
.entries()
|
||||
.filter(([key]) => key.startsWith(data_prefix))
|
||||
.map(([key, value]) => [key.replace(data_prefix, ''), value]),
|
||||
.filter(([key]) => key.startsWith(DATA_PREFIX))
|
||||
.map(([key, value]) => [key.replace(DATA_PREFIX, ''), value]),
|
||||
);
|
||||
return {
|
||||
from: searchParams.get('from') as SharedFrom,
|
||||
sharedId: searchParams.get('shared_id'),
|
||||
release: searchParams.get('release'),
|
||||
locale: searchParams.get('locale'),
|
||||
theme: searchParams.get('theme'),
|
||||
data: data,
|
||||
data,
|
||||
visibleAvatar: searchParams.get('visible_avatar')
|
||||
? searchParams.get('visible_avatar') !== '1'
|
||||
: true,
|
||||
};
|
||||
} as SharedChatSearchParams;
|
||||
};
|
||||
|
||||
export const useSendNextSharedMessage = (
|
||||
addEventList: (data: IEventList, messageId: string) => void,
|
||||
) => {
|
||||
const { from, sharedId: conversationId } = useGetSharedChatSearchParams();
|
||||
const url = `/api/v1/${from === SharedFrom.Agent ? 'agentbots' : 'chatbots'}/${conversationId}/completions`;
|
||||
const {
|
||||
from,
|
||||
sharedId: conversationId,
|
||||
release,
|
||||
} = useGetSharedChatSearchParams();
|
||||
const botType = from === SharedFrom.Agent ? 'agentbots' : 'chatbots';
|
||||
const releaseQuery = release ? `?release=${encodeURIComponent(release)}` : '';
|
||||
const url = `/api/v1/${botType}/${conversationId}/completions${releaseQuery}`;
|
||||
const { data: inputsData } = useFetchExternalAgentInputs();
|
||||
|
||||
const [params, setParams] = useState<any[]>([]);
|
||||
const sendedTaskMessage = useRef<boolean>(false);
|
||||
const [params, setParams] = useState<BeginQuery[]>([]);
|
||||
const sendedTaskMessage = useRef(false);
|
||||
|
||||
const isTaskMode = inputsData.mode === AgentDialogueMode.Task;
|
||||
|
||||
@@ -61,10 +80,10 @@ export const useSendNextSharedMessage = (
|
||||
beginParams: params,
|
||||
isShared: true,
|
||||
isTaskMode,
|
||||
releaseMode: release,
|
||||
});
|
||||
|
||||
const ok = useCallback(
|
||||
(params: any[]) => {
|
||||
(params: BeginQuery[]) => {
|
||||
if (isTaskMode) {
|
||||
const msgBody = buildRequestBody('');
|
||||
|
||||
|
||||
@@ -21,38 +21,53 @@ export const useSendButtonDisabled = (value: string) => {
|
||||
return trim(value) === '';
|
||||
};
|
||||
|
||||
const DATA_PREFIX = 'data_';
|
||||
|
||||
interface SharedChatSearchParams {
|
||||
from: SharedFrom;
|
||||
sharedId: string | null;
|
||||
release: string | null;
|
||||
locale: string | null;
|
||||
theme: string | null;
|
||||
data: Record<string, string>;
|
||||
visibleAvatar: boolean;
|
||||
}
|
||||
|
||||
export const useGetSharedChatSearchParams = () => {
|
||||
const [searchParams] = useSearchParams();
|
||||
const data_prefix = 'data_';
|
||||
const data = Object.fromEntries(
|
||||
Array.from(searchParams.entries())
|
||||
.filter(([key]) => key.startsWith(data_prefix))
|
||||
.map(([key, value]) => [key.replace(data_prefix, ''), value]),
|
||||
.filter(([key]) => key.startsWith(DATA_PREFIX))
|
||||
.map(([key, value]) => [key.replace(DATA_PREFIX, ''), value]),
|
||||
);
|
||||
return {
|
||||
from: searchParams.get('from') as SharedFrom,
|
||||
sharedId: searchParams.get('shared_id'),
|
||||
release: searchParams.get('release'),
|
||||
locale: searchParams.get('locale'),
|
||||
theme: searchParams.get('theme'),
|
||||
data: data,
|
||||
visibleAvatar: searchParams.get('visible_avatar')
|
||||
? searchParams.get('visible_avatar') !== '1'
|
||||
: true,
|
||||
};
|
||||
} as SharedChatSearchParams;
|
||||
};
|
||||
|
||||
export const useSendSharedMessage = () => {
|
||||
const {
|
||||
from,
|
||||
sharedId: conversationId,
|
||||
data: data,
|
||||
release,
|
||||
data: sharedData,
|
||||
} = useGetSharedChatSearchParams();
|
||||
const botType = from === SharedFrom.Agent ? 'agentbots' : 'chatbots';
|
||||
const releaseQuery = release ? `?release=${encodeURIComponent(release)}` : '';
|
||||
const completionUrl = `/api/v1/${botType}/${conversationId}/completions${releaseQuery}`;
|
||||
const { createSharedConversation: setConversation } =
|
||||
useCreateNextSharedConversation();
|
||||
const { handleInputChange, value, setValue } = useHandleMessageInputChange();
|
||||
const { send, answer, done, stopOutputMessage } = useSendMessageWithSse(
|
||||
`/api/v1/${from === SharedFrom.Agent ? 'agentbots' : 'chatbots'}/${conversationId}/completions`,
|
||||
);
|
||||
const { send, answer, done, stopOutputMessage } =
|
||||
useSendMessageWithSse(completionUrl);
|
||||
const {
|
||||
derivedMessages,
|
||||
removeLatestMessage,
|
||||
@@ -79,6 +94,7 @@ export const useSendSharedMessage = () => {
|
||||
session_id: get(derivedMessages, '0.session_id'),
|
||||
reasoning: enableThinking,
|
||||
internet: enableInternet,
|
||||
...(release ? { release } : {}),
|
||||
});
|
||||
|
||||
if (isCompletionError(res)) {
|
||||
@@ -87,7 +103,14 @@ export const useSendSharedMessage = () => {
|
||||
removeLatestMessage();
|
||||
}
|
||||
},
|
||||
[send, conversationId, derivedMessages, setValue, removeLatestMessage],
|
||||
[
|
||||
send,
|
||||
conversationId,
|
||||
derivedMessages,
|
||||
setValue,
|
||||
removeLatestMessage,
|
||||
release,
|
||||
],
|
||||
);
|
||||
|
||||
const handleSendMessage = useCallback(
|
||||
@@ -111,12 +134,16 @@ export const useSendSharedMessage = () => {
|
||||
|
||||
const fetchSessionId = useCallback(async () => {
|
||||
const payload = { question: '' };
|
||||
const ret = await send({ ...payload, ...data });
|
||||
const ret = await send({
|
||||
...payload,
|
||||
...sharedData,
|
||||
...(release ? { release } : {}),
|
||||
});
|
||||
if (isCompletionError(ret)) {
|
||||
message.error(ret?.data.message);
|
||||
setHasError(true);
|
||||
}
|
||||
}, [send]);
|
||||
}, [sharedData, release, send]);
|
||||
|
||||
useEffect(() => {
|
||||
fetchSessionId();
|
||||
|
||||
Reference in New Issue
Block a user