@@ -129,7 +129,6 @@ export type MessageResponseVersion = {
129129 artifacts ?: Partial < FileUpload > [ ] ;
130130 thinking ?: string ;
131131 thinkingDuration ?: number ;
132- isThinking ?: boolean ;
133132 rating ?: FeedbackRatingType ;
134133 dateTime ?: string ;
135134} ;
@@ -516,7 +515,7 @@ export const Bot = (botProps: BotProps & { class?: string }) => {
516515 const [ isMessageStopping , setIsMessageStopping ] = createSignal ( false ) ;
517516 const [ starterPrompts , setStarterPrompts ] = createSignal < string [ ] > ( [ ] , { equals : false } ) ;
518517 const [ chatFeedbackStatus , setChatFeedbackStatus ] = createSignal < boolean > ( false ) ;
519- const [ chatFeedbackRegenerateResponseStatus , setChatFeedbackRegenerateResponseStatus ] = createSignal < boolean > ( false ) ;
518+ const [ messageRatings , setMessageRatings ] = createSignal < Record < string , FeedbackRatingType > > ( { } ) ;
520519 const [ fullFileUpload , setFullFileUpload ] = createSignal < boolean > ( false ) ;
521520 const [ uploadsConfig , setUploadsConfig ] = createSignal < UploadsConfig > ( ) ;
522521 const [ leadsConfig , setLeadsConfig ] = createSignal < LeadsConfig > ( ) ;
@@ -915,21 +914,10 @@ export const Bot = (botProps: BotProps & { class?: string }) => {
915914 artifacts : message . artifacts ,
916915 thinking : message . thinking ,
917916 thinkingDuration : message . thinkingDuration ,
918- isThinking : message . isThinking ,
919917 rating : message . rating ,
920918 dateTime : message . dateTime ,
921919 } ) ;
922920
923- const parseConfigBoolean = ( value : unknown , defaultValue : boolean ) => {
924- if ( typeof value === 'boolean' ) return value ;
925- if ( typeof value === 'string' ) {
926- const normalized = value . trim ( ) . toLowerCase ( ) ;
927- if ( normalized === 'true' ) return true ;
928- if ( normalized === 'false' ) return false ;
929- }
930- return defaultValue ;
931- } ;
932-
933921 const getLastApiMessageIndex = ( ) => {
934922 const currentMessages = messages ( ) ;
935923 for ( let i = currentMessages . length - 1 ; i >= 0 ; i -- ) {
@@ -939,30 +927,44 @@ export const Bot = (botProps: BotProps & { class?: string }) => {
939927 } ;
940928
941929 const canRegenerateResponse = ( messageIndex : number ) => {
942- if ( ! chatFeedbackStatus ( ) || ! chatFeedbackRegenerateResponseStatus ( ) || loading ( ) ) return false ;
930+ if ( ! chatFeedbackStatus ( ) || loading ( ) ) return false ;
943931 if ( messageIndex !== getLastApiMessageIndex ( ) ) return false ;
944932 const previousMessage = messages ( ) [ messageIndex - 1 ] ;
945933 if ( ! previousMessage || previousMessage . type !== 'userMessage' ) return false ;
946934 if ( previousMessage . fileUploads ?. length ) return false ;
947935 return true ;
948936 } ;
949937
938+ const handleRatingUpdate = ( messageId : string , rating : FeedbackRatingType ) => {
939+ setMessageRatings ( ( prev ) => ( { ...prev , [ messageId ] : rating } ) ) ;
940+ } ;
941+
950942 const handleRegenerateResponse = async ( messageIndex : number ) => {
951943 if ( loading ( ) ) return ;
952944 if ( previews ( ) . length ) return ;
953945 if ( startInputType ( ) === 'formInput' ) return ;
954946
955947 const currentMessages = messages ( ) ;
956948 const targetMessage = currentMessages [ messageIndex ] ;
957- if ( ! targetMessage || targetMessage . type !== 'apiMessage' ) return ;
958-
959949 const previousMessage = currentMessages [ messageIndex - 1 ] ;
960- if ( ! previousMessage || previousMessage . type !== 'userMessage' || previousMessage . fileUploads ?. length ) return ;
961950
962- const existingResponseVersions =
963- targetMessage . responseVersions && targetMessage . responseVersions . length > 0
964- ? [ ...targetMessage . responseVersions ]
965- : [ createResponseVersion ( targetMessage ) ] ;
951+ const ratings = messageRatings ( ) ;
952+ const withRating = ( v : MessageResponseVersion ) : MessageResponseVersion =>
953+ v . messageId && ratings [ v . messageId ] ? { ...v , rating : ratings [ v . messageId ] } : v ;
954+
955+ const existingResponseVersions = ( ( ) => {
956+ if ( targetMessage . responseVersions && targetMessage . responseVersions . length > 0 ) {
957+ const versions = [ ...targetMessage . responseVersions ] . map ( withRating ) ;
958+ // The latest slot may have message:'' if it was loaded from localStorage before
959+ // the end-event persist ran. Overwrite it with the actual content on the top-level message.
960+ const last = versions . length - 1 ;
961+ if ( ! versions [ last ] . message ) {
962+ versions [ last ] = withRating ( createResponseVersion ( targetMessage ) ) ;
963+ }
964+ return versions ;
965+ }
966+ return [ withRating ( createResponseVersion ( targetMessage ) ) ] ;
967+ } ) ( ) ;
966968
967969 setFollowUpPrompts ( [ ] ) ;
968970 const updatedMessages = currentMessages . slice ( 0 , messageIndex ) ;
@@ -1109,6 +1111,17 @@ export const Bot = (botProps: BotProps & { class?: string }) => {
11091111 break ;
11101112 case 'end' :
11111113 finalizeThinking ( ) ;
1114+ if ( options ?. responseVersions && options . responseVersions . length > 0 ) {
1115+ setMessages ( ( prevMessages ) => {
1116+ const lastMsg = prevMessages [ prevMessages . length - 1 ] ;
1117+ if ( lastMsg . type === 'userMessage' || ! lastMsg . responseVersions ?. length ) return prevMessages ;
1118+ const versions = [ ...lastMsg . responseVersions ] ;
1119+ versions [ versions . length - 1 ] = createResponseVersion ( lastMsg ) ;
1120+ const updatedMessages = [ ...prevMessages . slice ( 0 , - 1 ) , { ...lastMsg , responseVersions : versions } ] ;
1121+ addChatMessage ( updatedMessages ) ;
1122+ return updatedMessages ;
1123+ } ) ;
1124+ }
11121125 setLocalStorageChatflow ( chatflowid , chatId ) ;
11131126 closeResponse ( ) ;
11141127 break ;
@@ -2734,6 +2747,7 @@ export const Bot = (botProps: BotProps & { class?: string }) => {
27342747 chatFeedbackStatus = { chatFeedbackStatus ( ) }
27352748 onRegenerateResponse = { ( ) => handleRegenerateResponse ( index ( ) ) }
27362749 showRegenerateResponseButton = { canRegenerateResponse ( index ( ) ) }
2750+ onRatingUpdate = { handleRatingUpdate }
27372751 fontSize = { props . fontSize }
27382752 isLoading = { loading ( ) && index ( ) === messages ( ) . length - 1 }
27392753 showAgentMessages = { props . showAgentMessages }
0 commit comments