Skip to content

Commit 1d1e1f9

Browse files
authored
Add Settings and Update system Prompt option (#746)
* Added settings and system prompt option Signed-off-by: jaswanth8888 <karani.jaswanth@gmail.com>
1 parent 67394b8 commit 1d1e1f9

File tree

7 files changed

+190
-49
lines changed

7 files changed

+190
-49
lines changed

ProductivitySuite/docker/ui/react/src/components/Conversation/Conversation.tsx

Lines changed: 60 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@
33

44
import { KeyboardEventHandler, SyntheticEvent, useEffect, useRef, useState } from 'react'
55
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'
99
import { ConversationMessage } from '../Message/conversationMessage'
1010
import { useAppDispatch, useAppSelector } from '../../redux/store'
1111
import { Message, MessageRole } from '../../redux/Conversation/Conversation'
1212
import { getCurrentTimeStamp } from '../../common/util'
13-
1413
import { ConversationSideBar } from './ConversationSideBar'
1514
import { getPrompts } from '../../redux/Prompt/PromptSlice'
1615
import { userSelector } from '../../redux/User/userSlice'
@@ -22,21 +21,22 @@ type ConversationProps = {
2221

2322
const Conversation = ({ title }: ConversationProps) => {
2423
const [prompt, setPrompt] = useState<string>("")
24+
const [updateSystemPrompt, setUpdateSystemPrompt] = useState(false)
2525

2626
const dispatch = useAppDispatch();
2727
const promptInputRef = useRef<HTMLTextAreaElement>(null)
2828

29-
const { conversations, onGoingResult, selectedConversationId,selectedConversationHistory } = useAppSelector(conversationSelector)
29+
const { conversations, onGoingResult, selectedConversationId, selectedConversationHistory, temperature, token, model, systemPrompt } = useAppSelector(conversationSelector)
3030
const { name } = useAppSelector(userSelector)
3131
const selectedConversation = conversations.find(x => x.id === selectedConversationId)
3232

3333
const scrollViewport = useRef<HTMLDivElement>(null)
3434

3535
const toSend = "Enter"
3636

37-
const systemPrompt: Message = {
37+
const systemPromptObject: Message = {
3838
role: MessageRole.System,
39-
content: "You are helpful assistant",
39+
content: systemPrompt,
4040
};
4141

4242

@@ -54,13 +54,15 @@ const Conversation = ({ title }: ConversationProps) => {
5454
// })
5555
// }
5656

57-
messages = [systemPrompt, ...(selectedConversationHistory) ]
57+
messages = [systemPromptObject, ...(selectedConversationHistory)]
5858

5959
doConversation({
6060
conversationId: selectedConversationId,
6161
userPrompt,
6262
messages,
63-
model: "Intel/neural-chat-7b-v3-3",
63+
model,
64+
temperature,
65+
token
6466
})
6567
setPrompt("")
6668
}
@@ -70,7 +72,7 @@ const Conversation = ({ title }: ConversationProps) => {
7072
}
7173

7274
useEffect(() => {
73-
if(name && name!=""){
75+
if (name && name != "") {
7476
dispatch(getPrompts({ promptText: "" }))
7577
dispatch(getAllConversations({ user: name }))
7678
}
@@ -81,6 +83,7 @@ const Conversation = ({ title }: ConversationProps) => {
8183
}, [onGoingResult, selectedConversationHistory])
8284

8385
const handleKeyDown: KeyboardEventHandler = (event) => {
86+
setUpdateSystemPrompt(false)
8487
if (!event.shiftKey && event.key === toSend) {
8588
handleSubmit()
8689
setTimeout(() => {
@@ -99,18 +102,23 @@ const Conversation = ({ title }: ConversationProps) => {
99102
event.preventDefault()
100103
setPrompt((event.target as HTMLTextAreaElement).value)
101104
}
105+
106+
const handleSystemPromptChange = (event: SyntheticEvent) => {
107+
event.preventDefault()
108+
dispatch(setSystemPrompt((event.target as HTMLTextAreaElement).value))
109+
}
102110
return (
103111
<div className={styleClasses.conversationWrapper}>
104112
<ConversationSideBar title={title} />
105113
<div className={styleClasses.conversationContent}>
106-
<div className={styleClasses.conversationContentMessages}>
114+
<div className={styleClasses.conversationContentMessages} style={updateSystemPrompt ? { gridTemplateRows: `60px 1fr 160px` } : {} }>
107115
<div className={styleClasses.conversationTitle}>
108-
<Title order={3}>{selectedConversation?.first_query || ""} </Title>
116+
<Title order={3} className={styleClasses.title}>{selectedConversation?.first_query || ""} </Title>
109117
<span className={styleClasses.spacer}></span>
110118
<Group>
111119
{(selectedConversation || selectedConversationHistory.length > 0) && (
112120
<ActionIcon onClick={handleNewConversation} disabled={onGoingResult != ""} size={32} variant="default">
113-
<IconMessagePlus />
121+
<IconMessagePlus />
114122
</ActionIcon>
115123
)}
116124

@@ -123,15 +131,16 @@ const Conversation = ({ title }: ConversationProps) => {
123131
<div className={styleClasses.newConversation}>
124132
<div className={styleClasses.infoMessages}>
125133
<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>
127136
</div>
128137
<PromptTemplate setPrompt={setPrompt} />
129138

130139
</div>
131140
)}
132141

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} />))
135144
})
136145
}
137146

@@ -142,21 +151,43 @@ const Conversation = ({ title }: ConversationProps) => {
142151

143152
<div className={styleClasses.conversationActions}>
144153
<Textarea
145-
radius="xl"
154+
style={{
155+
display: updateSystemPrompt ? 'block' : 'none',
156+
marginBottom: '10px',
157+
marginLeft:'35px'
158+
}}
159+
radius="lg"
146160
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}
159164
/>
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>
160191
</div>
161192
</div>
162193
</div>

ProductivitySuite/docker/ui/react/src/components/Conversation/ConversationSideBar.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
// Copyright (C) 2024 Intel Corporation
22
// SPDX-License-Identifier: Apache-2.0
33

4-
import { ActionIcon, ScrollAreaAutosize, Title } from "@mantine/core"
4+
import { ActionIcon, Title } from "@mantine/core"
55

66
import contextStyles from "../../styles/components/context.module.scss"
77
import { useAppDispatch, useAppSelector } from "../../redux/store"
88
import { conversationSelector, deleteConversation, getConversationHistory, setSelectedConversationId } from "../../redux/Conversation/ConversationSlice"
99
import { useEffect } from "react"
1010
import { userSelector } from "../../redux/User/userSlice"
1111
import { IconTrash } from "@tabler/icons-react"
12+
import Settings from "./settings"
1213
// import { userSelector } from "../../redux/User/userSlice"
1314

1415
export interface ConversationContextProps {
@@ -27,7 +28,7 @@ export function ConversationSideBar({ title }: ConversationContextProps) {
2728
}
2829
}, [selectedConversationId])
2930

30-
const handleDeleteConversation = (id : string) => {
31+
const handleDeleteConversation = (id: string) => {
3132
dispatch(deleteConversation({ user: name, conversationId: id }))
3233
}
3334

@@ -56,9 +57,10 @@ export function ConversationSideBar({ title }: ConversationContextProps) {
5657
<Title order={3} className={contextStyles.contextTitle}>
5758
{title}
5859
</Title>
59-
<ScrollAreaAutosize type="hover" scrollHideDelay={0}>
60-
<div className={contextStyles.contextList}>{conversationList}</div>
61-
</ScrollAreaAutosize>
60+
<div className={contextStyles.contextList}>{conversationList}</div>
61+
<div className={contextStyles.settings}>
62+
<Settings />
63+
</div>
6264
</div>
6365
)
6466
}

ProductivitySuite/docker/ui/react/src/components/Conversation/conversation.module.scss

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
@import "../../styles/styles";
5+
@import "../../styles/components/content.scss";
56

67
.spacer {
78
flex: 1 1 auto;
@@ -19,35 +20,39 @@
1920
position: relative;
2021
.conversationContentMessages {
2122
@include absolutes;
22-
// @include flex(column, nowrap, flex-start, flex-start);
2323

2424
display: grid;
25+
height: 100vh;
2526
grid-template-areas:
2627
"header"
2728
"messages"
2829
"inputs";
2930

3031
grid-template-columns: auto;
31-
grid-template-rows: 60px 655px 100px;
32+
grid-template-rows: 60px 1fr 80px;
3233

3334
.conversationTitle {
3435
grid-area: header;
36+
width: 100%;
37+
flex: 1;
3538
@include flex(row, nowrap, center, flex-start);
3639
height: 60px;
3740
padding: 8px 24px;
3841
border-bottom: 1px solid light-dark(var(--mantine-color-gray-3), var(--mantine-color-dark-4));
42+
.title {
43+
@include textWrapEllipsis;
44+
width: 70vw;
45+
}
3946
}
4047

4148
.historyContainer {
4249
grid-area: messages;
4350
overflow: auto;
4451
width: 100%;
45-
// padding: 16px 32px;
4652
.newConversation {
4753
@include flex(row, nowrap, flex-start, flex-start);
4854
.infoMessages {
4955
padding: 16px 32px;
50-
5156
flex: 80;
5257
}
5358
}
@@ -57,9 +62,9 @@
5762
}
5863

5964
.conversationActions {
60-
// padding: --var()
6165
grid-area: inputs;
62-
padding: 18px;
66+
width: 100%;
67+
padding: 10px;
6368
border-top: 1px solid light-dark(var(--mantine-color-gray-3), var(--mantine-color-dark-4));
6469
}
6570
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { NumberInput, Slider, Text, Title } from "@mantine/core"
2+
import { useAppDispatch, useAppSelector } from "../../redux/store"
3+
import { conversationSelector, setTemperature, setToken } from "../../redux/Conversation/ConversationSlice"
4+
5+
6+
7+
function Settings() {
8+
const { token,maxTemperature, minTemperature, maxToken, minToken, temperature} = useAppSelector(conversationSelector)
9+
const dispatch = useAppDispatch();
10+
11+
const onTemperatureChange = (value: number) => {
12+
dispatch(setTemperature(value))
13+
}
14+
const onTokenChange = (value: number | string) => {
15+
dispatch(setToken(Number(value)))
16+
}
17+
18+
return (
19+
<>
20+
<div>
21+
<Title order={4}>Settings</Title>
22+
</div>
23+
<div>
24+
<Text>Temperature</Text>
25+
<Slider
26+
value={temperature}
27+
min={minTemperature}
28+
max={maxTemperature}
29+
step={0.1}
30+
onChange={onTemperatureChange}
31+
/>
32+
</div>
33+
<div>
34+
<Text>Token ({`${minToken} - ${maxToken}`})</Text>
35+
<NumberInput
36+
value={token}
37+
min={minToken}
38+
max={maxToken}
39+
step={100}
40+
onChange={onTokenChange}
41+
/>
42+
</div>
43+
</>
44+
45+
)
46+
}
47+
48+
export default Settings

ProductivitySuite/docker/ui/react/src/redux/Conversation/Conversation.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ export type ConversationRequest = {
66
userPrompt: Message;
77
messages: Message[];
88
model: string;
9+
temperature: number;
10+
token: number;
911
};
1012
export enum MessageRole {
1113
Assistant = "assistant",
@@ -34,4 +36,12 @@ export interface ConversationReducer {
3436
selectedConversationHistory: Message[];
3537
onGoingResult: string;
3638
filesInDataSource: file[];
39+
systemPrompt: string;
40+
model: string;
41+
minToken: number;
42+
maxToken: number;
43+
token: number;
44+
minTemperature: number;
45+
maxTemperature: number;
46+
temperature: number;
3747
}

0 commit comments

Comments
 (0)