Skip to content

Commit 25d40df

Browse files
committed
Refactor Message types
1 parent e2a5d74 commit 25d40df

File tree

15 files changed

+91
-72
lines changed

15 files changed

+91
-72
lines changed

src/client/components/ChatV2/ChatV2.tsx

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
import { ArrowDownward, ChevronLeft, MenuBookTwoTone, Tune, WidthFull } from '@mui/icons-material'
1+
import { ArrowDownward, ChevronLeft, Tune } from '@mui/icons-material'
22
import HelpIcon from '@mui/icons-material/Help'
33
import RestartAltIcon from '@mui/icons-material/RestartAlt'
44

55
import { Alert, Box, Drawer, Fab, FormControlLabel, Paper, Switch, Typography, useMediaQuery, useTheme } from '@mui/material'
6-
import type { TFunction } from 'i18next'
76
import { enqueueSnackbar } from 'notistack'
87
import { useCallback, useEffect, useRef, useState } from 'react'
98
import { useTranslation } from 'react-i18next'
109
import { useParams, useSearchParams } from 'react-router-dom'
1110
import { DEFAULT_ASSISTANT_INSTRUCTIONS, DEFAULT_MODEL, DEFAULT_MODEL_TEMPERATURE, FREE_MODEL, inProduction, validModels } from '../../../config'
12-
import type { ToolCallResultEvent } from '../../../shared/chat'
11+
import type { ChatMessage, Message, ToolCallResultEvent } from '../../../shared/chat'
1312
import type { RagIndexAttributes } from '../../../shared/types'
1413
import { getLanguageValue } from '../../../shared/utils'
1514
import { useIsEmbedded } from '../../contexts/EmbeddedContext'
@@ -22,7 +21,7 @@ import { useCourseRagIndices } from '../../hooks/useRagIndices'
2221
import useRetryTimeout from '../../hooks/useRetryTimeout'
2322
import useUserStatus from '../../hooks/useUserStatus'
2423
import { useAnalyticsDispatch } from '../../stores/analytics'
25-
import type { Course, Message, Prompt } from '../../types'
24+
import type { Course, Prompt } from '../../types'
2625
import Footer from '../Footer'
2726
import { ChatBox } from './ChatBox'
2827
import { Conversation } from './Conversation'
@@ -84,7 +83,7 @@ export const ChatV2 = () => {
8483
'temperature',
8584
)
8685

87-
const [messages, setMessages] = useLocalStorageState(`${localStoragePrefix}-chat-messages`, [] as Message[])
86+
const [messages, setMessages] = useLocalStorageState(`${localStoragePrefix}-chat-messages`, [] as ChatMessage[])
8887
const [saveConsent, setSaveConsent] = useLocalStorageState<boolean>('save-consent', false)
8988

9089
// App States
@@ -131,7 +130,7 @@ export const ChatV2 = () => {
131130
const { processStream, completion, isStreaming, setIsStreaming, toolCalls, streamController } = useChatStream({
132131
onComplete: ({ message }) => {
133132
if (message.content.length > 0) {
134-
setMessages((prev: Message[]) => prev.concat(message))
133+
setMessages((prev: ChatMessage[]) => prev.concat(message))
135134
refetchStatus()
136135
}
137136
chatScroll.autoScroll()
@@ -172,7 +171,7 @@ export const ChatV2 = () => {
172171
const newMessages = messages.concat({
173172
role: 'user',
174173
content: message,
175-
attachements: file && fileName ? fileName : undefined,
174+
attachments: file && fileName ? fileName : undefined,
176175
})
177176

178177
setMessages(newMessages)
@@ -618,7 +617,7 @@ const LeftMenu = ({
618617
ragIndex?: RagIndexAttributes
619618
setRagIndexId: React.Dispatch<React.SetStateAction<number | undefined>>
620619
ragIndices?: RagIndexAttributes[]
621-
messages: Message[]
620+
messages: ChatMessage[]
622621
activePrompt: Prompt | undefined
623622
setActivePrompt: (prompt: Prompt | undefined) => void
624623
currentModel: string

src/client/components/ChatV2/Conversation.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { oneDark } from 'react-syntax-highlighter/dist/cjs/styles/prism'
66
import rehypeKatex from 'rehype-katex'
77
import remarkGfm from 'remark-gfm'
88
import remarkMath from 'remark-math'
9-
import type { ActivityPeriod, Message } from '../../types'
9+
import type { ActivityPeriod } from '../../types'
1010
import { ConversationSplash } from './general/ConversationSplash'
1111
import { LoadingMessage } from './general/LoadingMessage'
1212
import { preprocessMath } from './util'
@@ -17,10 +17,10 @@ import { t } from 'i18next'
1717
import FormatQuoteIcon from '@mui/icons-material/FormatQuote'
1818
import useLocalStorageState from '../../hooks/useLocalStorageState'
1919
import { BlueButton } from './general/Buttons'
20-
import type { ToolCallResultEvent, ToolCallStatusEvent } from '../../../shared/chat'
20+
import type { ChatMessage, Message, ToolCallResultEvent, ToolCallStatusEvent } from '../../../shared/chat'
2121
import { useId, useMemo } from 'react'
2222

23-
const UserMessage = ({ content, attachements }: { content: string; attachements?: string }) => (
23+
const UserMessage = ({ content, attachments }: { content: string; attachments?: string }) => (
2424
<Box
2525
sx={{
2626
backgroundColor: '#efefef',
@@ -37,7 +37,7 @@ const UserMessage = ({ content, attachements }: { content: string; attachements?
3737
>
3838
{content}
3939

40-
{attachements && (
40+
{attachments && (
4141
<Typography
4242
variant="body2"
4343
sx={{
@@ -49,7 +49,7 @@ const UserMessage = ({ content, attachements }: { content: string; attachements?
4949
}}
5050
>
5151
<AttachFileIcon fontSize="small" />
52-
{attachements}
52+
{attachments}
5353
</Typography>
5454
)}
5555
</Box>
@@ -269,7 +269,7 @@ const AssistantMessage = ({
269269
)
270270
}
271271

272-
const MessageItem = ({ message, setActiveToolResult }: { message: Message; setActiveToolResult: (data: ToolCallResultEvent) => void }) => {
272+
const MessageItem = ({ message, setActiveToolResult }: { message: ChatMessage; setActiveToolResult: (data: ToolCallResultEvent) => void }) => {
273273
if (message.role === 'assistant') {
274274
return (
275275
<Box
@@ -284,7 +284,7 @@ const MessageItem = ({ message, setActiveToolResult }: { message: Message; setAc
284284
} else {
285285
return (
286286
<Box data-sentry-mask data-testid="user-message" sx={{ alignSelf: 'flex-end' }}>
287-
<UserMessage content={message.content} attachements={message.attachements ?? ''} />
287+
<UserMessage content={message.content} attachments={message.attachments ?? ''} />
288288
</Box>
289289
)
290290
}
@@ -303,7 +303,7 @@ export const Conversation = ({
303303
courseName?: string
304304
courseDate?: ActivityPeriod
305305
conversationRef: React.RefObject<HTMLElement>
306-
messages: Message[]
306+
messages: ChatMessage[]
307307
completion: string
308308
toolCalls: { [callId: string]: ToolCallStatusEvent }
309309
isStreaming: boolean

src/client/components/ChatV2/ConversationV1.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ import { Box, Button, Paper, Stack, Typography } from '@mui/material'
33
import { useTranslation } from 'react-i18next'
44
import ReactMarkdown from 'react-markdown'
55
import remarkGfm from 'remark-gfm'
6-
import type { Message, Role } from '../../types'
76
import CopyToClipboardButton from './CopyToClipboardButton'
7+
import { ChatMessage, ChatRole } from '../../../shared/chat'
88

9-
export const Response = ({ role, content, setMessage, id }: { role: Role; content: string; setMessage?: any; id: string }) => {
9+
export const Response = ({ role, content, setMessage, id }: { role: ChatRole; content: string; setMessage?: any; id: string }) => {
1010
const isUser = role === 'user'
1111

1212
//Formats input string to have correctly formatted spaces and linebreaks.
@@ -57,7 +57,7 @@ const Conversation = ({
5757
handleStop = () => {},
5858
setMessage,
5959
}: {
60-
messages: Message[]
60+
messages: ChatMessage[]
6161
completion: string
6262
handleStop?: () => void
6363
setMessage?: any

src/client/components/ChatV2/EmailButton.tsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { renderToStaticMarkup } from 'react-dom/server'
66
import { enqueueSnackbar } from 'notistack'
77
import { useTranslation } from 'react-i18next'
88
import useCurrentUser from '../../hooks/useCurrentUser'
9-
import type { Message } from '../../types'
9+
import type { ChatMessage } from '../../../shared/chat'
1010
import { sendEmail } from '../../util/email'
1111
import { OutlineButtonBlack } from './general/Buttons'
1212

@@ -135,16 +135,17 @@ const formatEmailContent = (content: string): string => {
135135
}
136136
}
137137

138-
const formatEmail = (messages: Message[], t: any): string => {
138+
const formatEmail = (messages: ChatMessage[], t: any): string => {
139139
const emailContent = messages
140140
.map(({ role, content }) => {
141141
const formattedContent = role === 'assistant' ? formatEmailContent(content) : escapeHtml(content)
142142

143143
return `
144-
<div style="padding: 2rem; ${role === 'user'
144+
<div style="padding: 2rem; ${
145+
role === 'user'
145146
? 'background: #efefef; margin-left: 100px; border-radius: 0.6rem; box-shadow: 0px 2px 2px rgba(0,0,0,0.2); white-space: pre-wrap; word-break: break-word; '
146147
: 'margin-right: 2rem;'
147-
}">
148+
}">
148149
<h3 style="font-style: italic; margin: 0; ${role === 'user' ? 'color: rgba(0, 0, 0, 0.8)' : 'color: #107eab'}">${t(`email:${role}`)}:</h3>
149150
${formattedContent}
150151
</div>
@@ -171,7 +172,7 @@ const formatEmail = (messages: Message[], t: any): string => {
171172
`
172173
}
173174

174-
const EmailButton = ({ messages, disabled }: { messages: Message[]; disabled: boolean }) => {
175+
const EmailButton = ({ messages, disabled }: { messages: ChatMessage[]; disabled: boolean }) => {
175176
const { t } = useTranslation()
176177
const { user, isLoading } = useCurrentUser()
177178

src/client/components/ChatV2/useChatStream.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { useState } from 'react'
2-
import type { Message } from '../../types'
3-
import type { ChatEvent, ToolCallResultEvent, ToolCallStatusEvent } from '../../../shared/chat'
2+
import type { AssistantMessage, ChatEvent, ToolCallResultEvent, ToolCallStatusEvent } from '../../../shared/chat'
43

54
type ToolCallState = ToolCallStatusEvent
65

@@ -10,7 +9,7 @@ export const useChatStream = ({
109
onError,
1110
onText,
1211
}: {
13-
onComplete: ({ previousResponseId, message }: { previousResponseId: string | undefined; message: Message }) => void
12+
onComplete: ({ previousResponseId, message }: { previousResponseId: string | undefined; message: AssistantMessage }) => void
1413
onToolCallComplete: (toolResult: ToolCallResultEvent) => void
1514
onError: (error: unknown) => void
1615
onText: () => void

src/client/components/ChatV2/util.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import type { Message } from '../../types'
1+
import type { ChatMessage } from '../../../shared/chat'
22
import { postAbortableStream } from '../../util/apiClient'
33

44
interface GetCompletionStreamProps {
55
courseId?: string
66
assistantInstructions: string
7-
messages: Message[]
7+
messages: ChatMessage[]
88
model: string
99
formData: FormData
1010
ragIndexId?: number
@@ -55,7 +55,7 @@ export const getCompletionStream = async ({
5555
interface GetCompletionStreamPropsV3 {
5656
courseId?: string
5757
systemMessage: string
58-
messages: Message[]
58+
messages: ChatMessage[]
5959
model: string
6060
formData: FormData
6161
ragIndexId?: number

src/client/components/Courses/Course/index.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import useCourse from '../../../hooks/useCourse'
1010
import useCurrentUser from '../../../hooks/useCurrentUser'
1111
import { useCreatePromptMutation, useDeletePromptMutation } from '../../../hooks/usePromptMutation'
1212
import usePrompts from '../../../hooks/usePrompts'
13-
import type { Message as MessageType, Responsebility, User } from '../../../types'
13+
import type { Responsebility, User } from '../../../types'
1414
import Conversation from '../../ChatV2/ConversationV1'
1515
import SystemMessage from '../../ChatV2/SystemMessage'
1616
import Rag from '../../Rag/Rag'
@@ -25,6 +25,7 @@ import apiClient from '../../../util/apiClient'
2525
import { ActionUserSearch } from '../../Admin/UserSearch'
2626
import { useCourseRagIndices } from '../../../hooks/useRagIndices'
2727
import RagSelector, { RagSelectorDescription } from '../../ChatV2/RagSelector'
28+
import { ChatMessage } from '../../../../shared/chat'
2829

2930
const Course = () => {
3031
const [showTeachers, setShowTeachers] = useState(false)
@@ -325,7 +326,7 @@ const Prompts = ({ courseId, chatInstanceId }: { courseId: string; chatInstanceI
325326
const { ragIndices } = useCourseRagIndices(courseId)
326327
const [name, setName] = useState('')
327328
const [system, setSystem] = useState('')
328-
const [messages, setMessages] = useState<MessageType[]>([])
329+
const [messages, setMessages] = useState<ChatMessage[]>([])
329330
const [hidden, setHidden] = useState(false)
330331
const [mandatory, setMandatory] = useState(false)
331332
const [ragIndexId, setRagIndexId] = useState<number | undefined>(undefined)

src/client/hooks/usePromptMutation.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
import { useMutation } from '@tanstack/react-query'
22

3-
import { Message, Prompt } from '../types'
3+
import type { Prompt } from '../types'
44
import queryClient from '../util/queryClient'
55
import { queryKey } from './usePrompts'
66
import apiClient from '../util/apiClient'
7+
import type { ChatMessage } from '../../shared/chat'
78

89
interface NewPromptData {
910
chatInstanceId: string
1011
type: 'CHAT_INSTANCE' | 'PERSONAL' | 'RAG_INDEX'
1112
name: string
1213
systemMessage: string
13-
messages: Message[]
14+
messages: ChatMessage[]
1415
hidden: boolean
1516
mandatory: boolean
1617
ragIndexId: number | undefined

src/client/types.ts

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,12 @@
1-
import type { ToolCallResultEvent, ToolCallStatusEvent } from '../shared/chat'
2-
import { ChatToolDef } from '../shared/tools'
1+
import type { ChatMessage } from '../shared/chat'
32
import type { UserPreferences } from '../shared/user'
43

5-
export type SetState<T> = React.Dispatch<React.SetStateAction<T>>
6-
7-
export type Role = 'system' | 'assistant' | 'user'
4+
/*
5+
* Important: This file contains types used in the client, but we should consider moving them to shared.
6+
* Before adding new types, consider whether they are already defined in shared or if they should be moved there.
7+
*/
88

9-
export interface Message {
10-
role: Role
11-
content: string
12-
error?: string
13-
attachements?: string
14-
toolCalls?: Record<string, ToolCallResultEvent>
15-
}
9+
export type SetState<T> = React.Dispatch<React.SetStateAction<T>>
1610

1711
interface Term {
1812
label: Locales[]
@@ -65,10 +59,10 @@ export type Prompt = {
6559
name: string
6660
chatInstanceId: string
6761
systemMessage: string
68-
messages: Message[]
62+
messages: ChatMessage[]
6963
hidden: boolean
7064
mandatory: boolean
71-
type: 'CHAT_INSTANCE' | 'PERSONAL' | 'RAG_INDEX'
65+
type: 'CHAT_INSTANCE' | 'PERSONAL'
7266
createdAt: string
7367
}
7468

src/server/routes/ai/fileParsing.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { Message } from '../../../shared/llmTypes'
1+
import type { ChatMessage } from '../../../shared/chat'
22
import { pdfToText } from '../../util/pdfToText'
33

4-
export const parseFileAndAddToLastMessage = async (messages: Message[], file: Express.Multer.File) => {
4+
export const parseFileAndAddToLastMessage = async (messages: ChatMessage[], file: Express.Multer.File) => {
55
let fileContent = ''
66

77
const textFileTypes = ['text/plain', 'text/html', 'text/css', 'text/csv', 'text/markdown', 'text/md']

0 commit comments

Comments
 (0)