File tree Expand file tree Collapse file tree 7 files changed +608
-16
lines changed Expand file tree Collapse file tree 7 files changed +608
-16
lines changed Original file line number Diff line number Diff line change
1
+ ---
2
+ ' ai ' : patch
3
+ ---
4
+
5
+ feat (ui): support message replacement in chat via messageId param on sendMessage
Original file line number Diff line number Diff line change @@ -21,7 +21,18 @@ export async function POST(req: Request) {
21
21
let messages : MyUIMessage [ ] = chat . messages ;
22
22
23
23
if ( trigger === 'submit-user-message' ) {
24
- messages = [ ...messages , message ! ] ;
24
+ if ( messageId != null ) {
25
+ const messageIndex = messages . findIndex ( m => m . id === messageId ) ;
26
+
27
+ if ( messageIndex === - 1 ) {
28
+ throw new Error ( `message ${ messageId } not found` ) ;
29
+ }
30
+
31
+ messages = messages . slice ( 0 , messageIndex ) ;
32
+ messages . push ( message ! ) ;
33
+ } else {
34
+ messages = [ ...messages , message ! ] ;
35
+ }
25
36
} else if ( trigger === 'regenerate-assistant-message' ) {
26
37
const messageIndex =
27
38
messageId == null
Original file line number Diff line number Diff line change @@ -43,6 +43,7 @@ export default function ChatComponent({
43
43
trigger : 'submit-user-message' ,
44
44
id,
45
45
message : messages [ messages . length - 1 ] ,
46
+ messageId,
46
47
} ,
47
48
} ;
48
49
@@ -73,7 +74,13 @@ export default function ChatComponent({
73
74
return (
74
75
< div className = "flex flex-col w-full max-w-md py-24 mx-auto stretch" >
75
76
{ messages . map ( message => (
76
- < Message key = { message . id } message = { message } regenerate = { regenerate } />
77
+ < Message
78
+ key = { message . id }
79
+ message = { message }
80
+ regenerate = { regenerate }
81
+ sendMessage = { sendMessage }
82
+ status = { status }
83
+ />
77
84
) ) }
78
85
< ChatInput
79
86
status = { status }
Original file line number Diff line number Diff line change 1
1
import { MyUIMessage } from '@/util/chat-schema' ;
2
+ import { ChatStatus } from 'ai' ;
2
3
3
4
export default function Message ( {
4
5
message,
6
+ status,
5
7
regenerate,
8
+ sendMessage,
6
9
} : {
10
+ status : ChatStatus ;
7
11
message : MyUIMessage ;
8
12
regenerate : ( { messageId } : { messageId : string } ) => void ;
13
+ sendMessage : ( {
14
+ text,
15
+ messageId,
16
+ } : {
17
+ text : string ;
18
+ messageId ?: string ;
19
+ } ) => void ;
9
20
} ) {
10
21
const date = message . metadata ?. createdAt
11
22
? new Date ( message . metadata . createdAt ) . toLocaleString ( )
@@ -25,12 +36,24 @@ export default function Message({
25
36
. join ( '' ) }
26
37
</ div >
27
38
{ message . role === 'user' && (
28
- < button
29
- onClick = { ( ) => regenerate ( { messageId : message . id } ) }
30
- className = "px-3 py-1 mt-2 text-sm transition-colors bg-gray-200 rounded-md hover:bg-gray-300"
31
- >
32
- Regenerate
33
- </ button >
39
+ < >
40
+ < button
41
+ onClick = { ( ) => regenerate ( { messageId : message . id } ) }
42
+ className = "px-3 py-1 mt-2 text-sm transition-colors bg-gray-200 rounded-md hover:bg-gray-300"
43
+ disabled = { status !== 'ready' }
44
+ >
45
+ Regenerate
46
+ </ button >
47
+ < button
48
+ onClick = { ( ) =>
49
+ sendMessage ( { text : 'Hello' , messageId : message . id } )
50
+ }
51
+ className = "px-3 py-1 mt-2 text-sm transition-colors bg-gray-200 rounded-md hover:bg-gray-300"
52
+ disabled = { status !== 'ready' }
53
+ >
54
+ Replace with Hello
55
+ </ button >
56
+ </ >
34
57
) }
35
58
</ div >
36
59
) ;
You can’t perform that action at this time.
0 commit comments