From a9e91780d3f2b38e30299e4cce8cf73463ec46fa Mon Sep 17 00:00:00 2001 From: alashchev17 Date: Mon, 20 Jan 2025 13:53:18 +0100 Subject: [PATCH] fix: retryFromIndex resends all messages before problematic one --- src/components/ChatForm/ChatForm.tsx | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/components/ChatForm/ChatForm.tsx b/src/components/ChatForm/ChatForm.tsx index 18c185a6..cd3d8d8b 100644 --- a/src/components/ChatForm/ChatForm.tsx +++ b/src/components/ChatForm/ChatForm.tsx @@ -11,6 +11,7 @@ import { useIsOnline, useConfig, useAgentUsage, + useSendChatRequest, } from "../../hooks"; import { ErrorCallout, Callout } from "../Callout"; import { ComboBox } from "../ComboBox"; @@ -42,6 +43,7 @@ import { selectPreventSend, selectToolUse, } from "../../features/Chat"; +import { isUserMessage } from "../../services/refact"; export type ChatFormProps = { onSubmit: (str: string) => void; @@ -59,13 +61,13 @@ export const ChatForm: React.FC = ({ const dispatch = useAppDispatch(); const isStreaming = useAppSelector(selectIsStreaming); const isWaiting = useAppSelector(selectIsWaiting); + const { retryFromIndex } = useSendChatRequest(); const config = useConfig(); const toolUse = useAppSelector(selectToolUse); const error = useAppSelector(getErrorMessage); const information = useAppSelector(getInformationMessage); const pauseReasonsWithPause = useAppSelector(getPauseReasonsWithPauseStatus); const [helpInfo, setHelpInfo] = React.useState(null); - const onClearError = useCallback(() => dispatch(clearError()), [dispatch]); const { disableInput } = useAgentUsage(); const isOnline = useIsOnline(); @@ -73,6 +75,23 @@ export const ChatForm: React.FC = ({ const messages = useAppSelector(selectMessages); const preventSend = useAppSelector(selectPreventSend); + const onClearError = useCallback(() => { + dispatch(clearError()); + const userMessages = messages.filter(isUserMessage); + + // getting second-to-last user message + const lastSuccessfulUserMessage = + userMessages.slice(-2, -1)[0] || userMessages[0]; + + const lastSuccessfulUserMessageIndex = messages.indexOf( + lastSuccessfulUserMessage, + ); + retryFromIndex( + lastSuccessfulUserMessageIndex, + lastSuccessfulUserMessage.content, + ); + }, [dispatch, retryFromIndex, messages]); + const disableSend = useMemo(() => { // TODO: if interrupting chat some errors can occur if (messages.length === 0) return false;