@@ -15,10 +15,11 @@ import { t } from 'i18next'
15
15
import FormatQuoteIcon from '@mui/icons-material/FormatQuote'
16
16
import useLocalStorageState from '../../hooks/useLocalStorageState'
17
17
import { BlueButton } from './general/Buttons'
18
- import type { ChatMessage , ToolCallResultEvent , ToolCallStatusEvent } from '../../../shared/chat'
18
+ import type { AssistantMessage , ChatMessage , MessageGenerationInfo , ToolCallResultEvent , ToolCallStatusEvent , UserMessage } from '../../../shared/chat'
19
19
import { useId , useMemo } from 'react'
20
+ import { ArrowRight } from '@mui/icons-material'
20
21
21
- const UserMessage = ( { content , attachments } : { content : string ; attachments ?: string } ) => (
22
+ const UserMessageItem = ( { message } : { message : UserMessage } ) => (
22
23
< Box
23
24
sx = { {
24
25
backgroundColor : '#efefef' ,
@@ -33,9 +34,9 @@ const UserMessage = ({ content, attachments }: { content: string; attachments?:
33
34
width : 'fit-content' ,
34
35
} }
35
36
>
36
- { content }
37
+ { message . content }
37
38
38
- { attachments && (
39
+ { message . attachments && (
39
40
< Typography
40
41
variant = "body2"
41
42
sx = { {
@@ -47,7 +48,7 @@ const UserMessage = ({ content, attachments }: { content: string; attachments?:
47
48
} }
48
49
>
49
50
< AttachFileIcon fontSize = "small" />
50
- { attachments }
51
+ { message . attachments }
51
52
</ Typography >
52
53
) }
53
54
</ Box >
@@ -102,18 +103,24 @@ const ToolResult = ({ toolResult, handleToolResult }: { toolResult: ToolCallResu
102
103
)
103
104
}
104
105
105
- const AssistantMessage = ( {
106
- content,
107
- error,
108
- toolResults,
109
- setActiveToolResult,
110
- } : {
111
- content : string
112
- error ?: string
113
- toolResults ?: Record < string , ToolCallResultEvent >
114
- setActiveToolResult : ( data : ToolCallResultEvent ) => void
115
- } ) => {
116
- const processedContent = preprocessMath ( content )
106
+ const AssistantMessageInfo = ( { message } : { message : AssistantMessage } ) => {
107
+ if ( ! message . generationInfo ) return null
108
+
109
+ const title =
110
+ message . generationInfo . promptInfo . type === 'saved'
111
+ ? `${ message . generationInfo . promptInfo . name } (${ message . generationInfo . model } )`
112
+ : `${ message . generationInfo . model } `
113
+
114
+ return (
115
+ < Box sx = { { display : 'flex' , opacity : 0.7 , alignItems : 'center' } } >
116
+ < ArrowRight fontSize = "small" />
117
+ < Typography fontSize = "small" > { title } </ Typography >
118
+ </ Box >
119
+ )
120
+ }
121
+
122
+ const AssistantMessageItem = ( { message, setActiveToolResult } : { message : AssistantMessage ; setActiveToolResult : ( data : ToolCallResultEvent ) => void } ) => {
123
+ const processedContent = preprocessMath ( message . content )
117
124
const katexOptions = {
118
125
macros : {
119
126
'\\abs' : '\\left|#1\\right|' ,
@@ -185,8 +192,9 @@ const AssistantMessage = ({
185
192
borderRadius : 4 ,
186
193
} }
187
194
>
188
- < CopyToClipboardButton id = { msgId } copied = { content } />
195
+ < CopyToClipboardButton id = { msgId } copied = { message . content } />
189
196
</ Box >
197
+ < AssistantMessageInfo message = { message } />
190
198
< ReactMarkdown
191
199
remarkPlugins = { [ remarkGfm , [ remarkMath , { singleDollarTextMath : false } ] ] }
192
200
rehypePlugins = { [ [ rehypeKatex , katexOptions ] ] }
@@ -255,12 +263,12 @@ const AssistantMessage = ({
255
263
>
256
264
{ processedContent }
257
265
</ ReactMarkdown >
258
- { error && (
266
+ { message . error && (
259
267
< Box >
260
- < Typography variant = "body1" fontStyle = "italic" color = "#cc0000" > { `\n\n ${ error } ` } </ Typography >
268
+ < Typography variant = "body1" fontStyle = "italic" color = "#cc0000" > { `\n\n ${ message . error } ` } </ Typography >
261
269
</ Box >
262
270
) }
263
- { Object . values ( toolResults ?? { } ) . map ( ( toolResult ) => (
271
+ { Object . values ( message . toolCalls ?? { } ) . map ( ( toolResult ) => (
264
272
< ToolResult key = { toolResult . callId } toolResult = { toolResult } handleToolResult = { handleToolResult } />
265
273
) ) }
266
274
</ Box >
@@ -276,13 +284,13 @@ export const MessageItem = ({ message, setActiveToolResult }: { message: ChatMes
276
284
height : 'auto' ,
277
285
} }
278
286
>
279
- < AssistantMessage content = { message . content } error = { message . error } toolResults = { message . toolCalls } setActiveToolResult = { setActiveToolResult } />
287
+ < AssistantMessageItem message = { message } setActiveToolResult = { setActiveToolResult } />
280
288
</ Box >
281
289
)
282
290
} else {
283
291
return (
284
292
< Box data-sentry-mask data-testid = "user-message" sx = { { alignSelf : 'flex-end' } } >
285
- < UserMessage content = { message . content } attachments = { message . attachments ?? '' } />
293
+ < UserMessageItem message = { message } />
286
294
</ Box >
287
295
)
288
296
}
@@ -291,13 +299,15 @@ export const MessageItem = ({ message, setActiveToolResult }: { message: ChatMes
291
299
export const Conversation = ( {
292
300
messages,
293
301
completion,
302
+ generationInfo,
294
303
toolCalls,
295
304
isStreaming,
296
305
setActiveToolResult,
297
306
initial,
298
307
} : {
299
308
messages : ChatMessage [ ]
300
309
completion : string
310
+ generationInfo ?: MessageGenerationInfo
301
311
toolCalls : { [ callId : string ] : ToolCallStatusEvent }
302
312
isStreaming : boolean
303
313
setActiveToolResult : ( data : ToolCallResultEvent ) => void
@@ -326,7 +336,7 @@ export const Conversation = ({
326
336
{ isStreaming &&
327
337
messages . length > 0 &&
328
338
( completion . length > 0 ? (
329
- < MessageItem message = { { role : 'assistant' , content : completion } } setActiveToolResult = { setActiveToolResult } />
339
+ < MessageItem message = { { role : 'assistant' , content : completion , generationInfo } } setActiveToolResult = { setActiveToolResult } />
330
340
) : (
331
341
< LoadingMessage toolCalls = { toolCalls } />
332
342
) ) }
0 commit comments