3
3
4
4
import { KeyboardEventHandler , SyntheticEvent , useEffect , useRef , useState } from 'react'
5
5
import styleClasses from "./conversation.module.scss"
6
- import { ActionIcon , Group , Textarea , Title , rem } from '@mantine/core'
7
- import { IconArrowRight , IconMessagePlus } from '@tabler/icons-react'
8
- import { conversationSelector , doConversation , getAllConversations , newConversation } from '../../redux/Conversation/ConversationSlice'
6
+ import { ActionIcon , Group , Textarea , Title , Tooltip , rem } from '@mantine/core'
7
+ import { IconArrowDown , IconArrowRight , IconArrowUp , IconMessagePlus } from '@tabler/icons-react'
8
+ import { conversationSelector , doConversation , getAllConversations , newConversation , setSystemPrompt } from '../../redux/Conversation/ConversationSlice'
9
9
import { ConversationMessage } from '../Message/conversationMessage'
10
10
import { useAppDispatch , useAppSelector } from '../../redux/store'
11
11
import { Message , MessageRole } from '../../redux/Conversation/Conversation'
12
12
import { getCurrentTimeStamp } from '../../common/util'
13
-
14
13
import { ConversationSideBar } from './ConversationSideBar'
15
14
import { getPrompts } from '../../redux/Prompt/PromptSlice'
16
15
import { userSelector } from '../../redux/User/userSlice'
@@ -22,21 +21,22 @@ type ConversationProps = {
22
21
23
22
const Conversation = ( { title } : ConversationProps ) => {
24
23
const [ prompt , setPrompt ] = useState < string > ( "" )
24
+ const [ updateSystemPrompt , setUpdateSystemPrompt ] = useState ( false )
25
25
26
26
const dispatch = useAppDispatch ( ) ;
27
27
const promptInputRef = useRef < HTMLTextAreaElement > ( null )
28
28
29
- const { conversations, onGoingResult, selectedConversationId, selectedConversationHistory } = useAppSelector ( conversationSelector )
29
+ const { conversations, onGoingResult, selectedConversationId, selectedConversationHistory, temperature , token , model , systemPrompt } = useAppSelector ( conversationSelector )
30
30
const { name } = useAppSelector ( userSelector )
31
31
const selectedConversation = conversations . find ( x => x . id === selectedConversationId )
32
32
33
33
const scrollViewport = useRef < HTMLDivElement > ( null )
34
34
35
35
const toSend = "Enter"
36
36
37
- const systemPrompt : Message = {
37
+ const systemPromptObject : Message = {
38
38
role : MessageRole . System ,
39
- content : "You are helpful assistant" ,
39
+ content : systemPrompt ,
40
40
} ;
41
41
42
42
@@ -54,13 +54,15 @@ const Conversation = ({ title }: ConversationProps) => {
54
54
// })
55
55
// }
56
56
57
- messages = [ systemPrompt , ...( selectedConversationHistory ) ]
57
+ messages = [ systemPromptObject , ...( selectedConversationHistory ) ]
58
58
59
59
doConversation ( {
60
60
conversationId : selectedConversationId ,
61
61
userPrompt,
62
62
messages,
63
- model : "Intel/neural-chat-7b-v3-3" ,
63
+ model,
64
+ temperature,
65
+ token
64
66
} )
65
67
setPrompt ( "" )
66
68
}
@@ -70,7 +72,7 @@ const Conversation = ({ title }: ConversationProps) => {
70
72
}
71
73
72
74
useEffect ( ( ) => {
73
- if ( name && name != "" ) {
75
+ if ( name && name != "" ) {
74
76
dispatch ( getPrompts ( { promptText : "" } ) )
75
77
dispatch ( getAllConversations ( { user : name } ) )
76
78
}
@@ -81,6 +83,7 @@ const Conversation = ({ title }: ConversationProps) => {
81
83
} , [ onGoingResult , selectedConversationHistory ] )
82
84
83
85
const handleKeyDown : KeyboardEventHandler = ( event ) => {
86
+ setUpdateSystemPrompt ( false )
84
87
if ( ! event . shiftKey && event . key === toSend ) {
85
88
handleSubmit ( )
86
89
setTimeout ( ( ) => {
@@ -99,18 +102,23 @@ const Conversation = ({ title }: ConversationProps) => {
99
102
event . preventDefault ( )
100
103
setPrompt ( ( event . target as HTMLTextAreaElement ) . value )
101
104
}
105
+
106
+ const handleSystemPromptChange = ( event : SyntheticEvent ) => {
107
+ event . preventDefault ( )
108
+ dispatch ( setSystemPrompt ( ( event . target as HTMLTextAreaElement ) . value ) )
109
+ }
102
110
return (
103
111
< div className = { styleClasses . conversationWrapper } >
104
112
< ConversationSideBar title = { title } />
105
113
< div className = { styleClasses . conversationContent } >
106
- < div className = { styleClasses . conversationContentMessages } >
114
+ < div className = { styleClasses . conversationContentMessages } style = { updateSystemPrompt ? { gridTemplateRows : `60px 1fr 160px` } : { } } >
107
115
< div className = { styleClasses . conversationTitle } >
108
- < Title order = { 3 } > { selectedConversation ?. first_query || "" } </ Title >
116
+ < Title order = { 3 } className = { styleClasses . title } > { selectedConversation ?. first_query || "" } </ Title >
109
117
< span className = { styleClasses . spacer } > </ span >
110
118
< Group >
111
119
{ ( selectedConversation || selectedConversationHistory . length > 0 ) && (
112
120
< ActionIcon onClick = { handleNewConversation } disabled = { onGoingResult != "" } size = { 32 } variant = "default" >
113
- < IconMessagePlus />
121
+ < IconMessagePlus />
114
122
</ ActionIcon >
115
123
) }
116
124
@@ -123,15 +131,16 @@ const Conversation = ({ title }: ConversationProps) => {
123
131
< div className = { styleClasses . newConversation } >
124
132
< div className = { styleClasses . infoMessages } >
125
133
< div className = "infoMessage" > Start by asking a question</ div >
126
- < div className = "infoMessage" > You can also upload your Document by clicking on Document icon on top right corner</ div >
134
+ < div className = "infoMessage" > You can update the system prompt by clicking on up arrow beside prompt field</ div >
135
+ < div className = "infoMessage" > You can also upload your Documents in the Data Management Tab</ div >
127
136
</ div >
128
137
< PromptTemplate setPrompt = { setPrompt } />
129
138
130
139
</ div >
131
140
) }
132
141
133
- { selectedConversationHistory . map ( ( message , index ) => {
134
- return ( message . role !== MessageRole . System && ( < ConversationMessage key = { `${ index } _ai` } date = { message . time ? + message . time * 1000 : getCurrentTimeStamp ( ) } human = { message . role == MessageRole . User } message = { message . content } /> ) )
142
+ { selectedConversationHistory . map ( ( message , index ) => {
143
+ return ( message . role !== MessageRole . System && ( < ConversationMessage key = { `${ index } _ai` } date = { message . time ? + message . time * 1000 : getCurrentTimeStamp ( ) } human = { message . role == MessageRole . User } message = { message . content } /> ) )
135
144
} )
136
145
}
137
146
@@ -142,21 +151,43 @@ const Conversation = ({ title }: ConversationProps) => {
142
151
143
152
< div className = { styleClasses . conversationActions } >
144
153
< Textarea
145
- radius = "xl"
154
+ style = { {
155
+ display : updateSystemPrompt ? 'block' : 'none' ,
156
+ marginBottom : '10px' ,
157
+ marginLeft :'35px'
158
+ } }
159
+ radius = "lg"
146
160
size = "md"
147
- placeholder = "Ask a question"
148
- ref = { promptInputRef }
149
- onKeyDown = { handleKeyDown }
150
- onChange = { handleChange }
151
- value = { prompt }
152
- rightSectionWidth = { 42 }
153
- rightSection = {
154
- < ActionIcon onClick = { handleSubmit } size = { 32 } radius = "xl" variant = "filled" >
155
- < IconArrowRight style = { { width : rem ( 18 ) , height : rem ( 18 ) } } stroke = { 1.5 } />
156
- </ ActionIcon >
157
- }
158
- // {...props}
161
+ placeholder = "system prompt"
162
+ onChange = { handleSystemPromptChange }
163
+ value = { systemPrompt }
159
164
/>
165
+ < div style = { { display : 'flex' , alignItems : 'center' } } >
166
+ < Tooltip label = "update system prompt" >
167
+ < ActionIcon onClick = { ( ) => setUpdateSystemPrompt ( ( prev ) => ! prev ) } size = { 32 } radius = "xl" variant = "filled" >
168
+ { updateSystemPrompt ? ( < IconArrowDown style = { { width : rem ( 18 ) , height : rem ( 18 ) } } stroke = { 1.5 } /> ) :
169
+ ( < IconArrowUp style = { { width : rem ( 18 ) , height : rem ( 18 ) } } stroke = { 1.5 } /> ) }
170
+ </ ActionIcon >
171
+ </ Tooltip >
172
+
173
+ < Textarea
174
+ radius = "lg"
175
+ size = "md"
176
+ style = { { flex : 90 , marginLeft : '3px' } }
177
+ placeholder = "Ask a question"
178
+ ref = { promptInputRef }
179
+ onKeyDown = { handleKeyDown }
180
+ onChange = { handleChange }
181
+ value = { prompt }
182
+ rightSectionWidth = { 42 }
183
+ rightSection = {
184
+ < ActionIcon onClick = { handleSubmit } size = { 32 } radius = "xl" variant = "filled" >
185
+ < IconArrowRight style = { { width : rem ( 18 ) , height : rem ( 18 ) } } stroke = { 1.5 } />
186
+ </ ActionIcon >
187
+ }
188
+ // {...props}
189
+ />
190
+ </ div >
160
191
</ div >
161
192
</ div >
162
193
</ div >
0 commit comments