diff --git a/web/hooks/useActiveModel.ts b/web/hooks/useActiveModel.ts
index edcc1faab..d869afd2f 100644
--- a/web/hooks/useActiveModel.ts
+++ b/web/hooks/useActiveModel.ts
@@ -107,7 +107,7 @@ export function useActiveModel() {
toaster({
title: 'Failed!',
description: `Model ${model.id} failed to start.`,
- type: 'success',
+ type: 'error',
})
setLoadModelError(error)
return Promise.reject(error)
diff --git a/web/screens/Chat/ChatBody/index.tsx b/web/screens/Chat/ChatBody/index.tsx
index 70521a9bd..be6107d1d 100644
--- a/web/screens/Chat/ChatBody/index.tsx
+++ b/web/screens/Chat/ChatBody/index.tsx
@@ -3,10 +3,14 @@ import ScrollToBottom from 'react-scroll-to-bottom'
import { MessageStatus } from '@janhq/core'
import { useAtomValue } from 'jotai'
+import { loadModelErrorAtom } from '@/hooks/useActiveModel'
+
import ChatItem from '../ChatItem'
import ErrorMessage from '../ErrorMessage'
+import LoadModelError from '../LoadModelError'
+
import EmptyModel from './EmptyModel'
import EmptyThread from './EmptyThread'
@@ -16,6 +20,7 @@ import { downloadedModelsAtom } from '@/helpers/atoms/Model.atom'
const ChatBody: React.FC = () => {
const messages = useAtomValue(getCurrentChatMessagesAtom)
const downloadedModels = useAtomValue(downloadedModelsAtom)
+ const loadModelError = useAtomValue(loadModelErrorAtom)
if (downloadedModels.length === 0) return
if (messages.length === 0) return
@@ -29,9 +34,15 @@ const ChatBody: React.FC = () => {
)}
- {(message.status === MessageStatus.Error ||
- message.status === MessageStatus.Stopped) &&
- index === messages.length - 1 && }
+ {loadModelError ? (
+
+ ) : (
+ index === messages.length - 1 &&
+ message.status !== MessageStatus.Pending &&
+ message.status !== MessageStatus.Ready && (
+
+ )
+ )}
))}
diff --git a/web/screens/Chat/ErrorMessage/index.tsx b/web/screens/Chat/ErrorMessage/index.tsx
index 17c23f773..7e7686ed1 100644
--- a/web/screens/Chat/ErrorMessage/index.tsx
+++ b/web/screens/Chat/ErrorMessage/index.tsx
@@ -10,7 +10,6 @@ import ModalTroubleShooting, {
import { MainViewState } from '@/constants/screens'
-import { loadModelErrorAtom } from '@/hooks/useActiveModel'
import useSendChatMessage from '@/hooks/useSendChatMessage'
import { mainViewStateAtom } from '@/helpers/atoms/App.atom'
@@ -20,9 +19,7 @@ const ErrorMessage = ({ message }: { message: ThreadMessage }) => {
const messages = useAtomValue(getCurrentChatMessagesAtom)
const { resendChatMessage } = useSendChatMessage()
const setModalTroubleShooting = useSetAtom(modalTroubleShootingAtom)
- const loadModelError = useAtomValue(loadModelErrorAtom)
const setMainState = useSetAtom(mainViewStateAtom)
- const PORT_NOT_AVAILABLE = 'PORT_NOT_AVAILABLE'
const regenerateMessage = async () => {
const lastMessageIndex = messages.length - 1
@@ -77,63 +74,23 @@ const ErrorMessage = ({ message }: { message: ThreadMessage }) => {
)}
{message.status === MessageStatus.Error && (
- <>
- {loadModelError === PORT_NOT_AVAILABLE ? (
-
+ {getErrorTitle()}
+
+ Jan’s in beta. Access
+ setModalTroubleShooting(true)}
>
-
- Port 3928 is currently unavailable. Check for conflicting apps,
- or access
- setModalTroubleShooting(true)}
- >
- troubleshooting assistance
-
- for further support.
-
-
-
- ) : loadModelError &&
- loadModelError?.includes('EXTENSION_IS_NOT_INSTALLED') ? (
-
-
- Model is currently unavailable. Please switch to a different
- model or install the{' '}
- setMainState(MainViewState.Settings)}
- >
- {loadModelError.split('::')[1] ?? ''}
- {' '}
- to continue using it.
-
-
- ) : (
-
- {getErrorTitle()}
-
- Jan’s in beta. Access
- setModalTroubleShooting(true)}
- >
- troubleshooting assistance
-
- now.
-
-
-
- )}
- >
+ troubleshooting assistance
+
+ now.
+
+
+
)}
)
diff --git a/web/screens/Chat/LoadModelError/index.tsx b/web/screens/Chat/LoadModelError/index.tsx
new file mode 100644
index 000000000..3bf01f8cb
--- /dev/null
+++ b/web/screens/Chat/LoadModelError/index.tsx
@@ -0,0 +1,70 @@
+import { useAtomValue, useSetAtom } from 'jotai'
+
+import ModalTroubleShooting, {
+ modalTroubleShootingAtom,
+} from '@/containers/ModalTroubleShoot'
+
+import { MainViewState } from '@/constants/screens'
+
+import { loadModelErrorAtom } from '@/hooks/useActiveModel'
+
+import { mainViewStateAtom } from '@/helpers/atoms/App.atom'
+
+const LoadModelError = () => {
+ const setModalTroubleShooting = useSetAtom(modalTroubleShootingAtom)
+ const loadModelError = useAtomValue(loadModelErrorAtom)
+ const setMainState = useSetAtom(mainViewStateAtom)
+ const PORT_NOT_AVAILABLE = 'PORT_NOT_AVAILABLE'
+
+ return (
+
+ {loadModelError === PORT_NOT_AVAILABLE ? (
+
+
+ Port 3928 is currently unavailable. Check for conflicting apps, or
+ access
+ setModalTroubleShooting(true)}
+ >
+ troubleshooting assistance
+
+ for further support.
+
+
+
+ ) : loadModelError &&
+ loadModelError?.includes('EXTENSION_IS_NOT_INSTALLED') ? (
+
+
+ Model is currently unavailable. Please switch to a different model
+ or install the{' '}
+ setMainState(MainViewState.Settings)}
+ >
+ {loadModelError.split('::')[1] ?? ''}
+ {' '}
+ to continue using it.
+
+
+ ) : (
+
+ Apologies, something’s amiss!
+
+ Jan’s in beta. Access
+ setModalTroubleShooting(true)}
+ >
+ troubleshooting assistance
+
+ now.
+
+
+
+ )}
+
+ )
+}
+export default LoadModelError