- {(message.status !== MessageStatus.Pending ||
+ {((message.status !== MessageStatus.Error &&
+ message.status !== MessageStatus.Pending) ||
message.content.length > 0) && (
)}
diff --git a/web/screens/Chat/ErrorMessage/index.tsx b/web/screens/Chat/ErrorMessage/index.tsx
index b73884659..ea9906335 100644
--- a/web/screens/Chat/ErrorMessage/index.tsx
+++ b/web/screens/Chat/ErrorMessage/index.tsx
@@ -9,6 +9,10 @@ import { Button } from '@janhq/uikit'
import { useAtomValue, useSetAtom } from 'jotai'
import { RefreshCcw } from 'lucide-react'
+import ModalTroubleShooting, {
+ modalTroubleShootingAtom,
+} from '@/containers/ModalTroubleShoot'
+
import useSendChatMessage from '@/hooks/useSendChatMessage'
import { extensionManager } from '@/extension'
@@ -23,6 +27,7 @@ const ErrorMessage = ({ message }: { message: ThreadMessage }) => {
const thread = useAtomValue(activeThreadAtom)
const deleteMessage = useSetAtom(deleteMessageAtom)
const { resendChatMessage } = useSendChatMessage()
+ const setModalTroubleShooting = useSetAtom(modalTroubleShootingAtom)
const regenerateMessage = async () => {
const lastMessageIndex = messages.length - 1
@@ -64,29 +69,22 @@ const ErrorMessage = ({ message }: { message: ThreadMessage }) => {
)}
{message.status === MessageStatus.Error && (
-
-
- <>
- Apologies, something's amiss!
- Jan's in beta. Find troubleshooting guides{' '}
-
- here
- {' '}
- or reach out to us on{' '}
-
- Discord
- {' '}
- for assistance.
- >
-
+
+
{`Apologies, something’s amiss!`}
+
+ Jan’s in beta. Access
+ setModalTroubleShooting(true)}
+ >
+ troubleshooting assistance
+
+ now.
+
+
)}
>
diff --git a/web/screens/LocalServer/Logs.tsx b/web/screens/LocalServer/Logs.tsx
deleted file mode 100644
index 125bd93ef..000000000
--- a/web/screens/LocalServer/Logs.tsx
+++ /dev/null
@@ -1,179 +0,0 @@
-/* eslint-disable @typescript-eslint/naming-convention */
-import { useEffect, useState } from 'react'
-
-import React from 'react'
-
-import { useAtomValue } from 'jotai'
-
-import { useServerLog } from '@/hooks/useServerLog'
-
-import { serverEnabledAtom } from '@/helpers/atoms/LocalServer.atom'
-
-const Logs = () => {
- const { getServerLog } = useServerLog()
- const serverEnabled = useAtomValue(serverEnabledAtom)
- const [logs, setLogs] = useState([])
-
- useEffect(() => {
- getServerLog().then((log) => {
- if (typeof log?.split === 'function') {
- setLogs(log.split(/\r?\n|\r|\n/g))
- }
- })
-
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [logs, serverEnabled])
-
- return (
-
- {logs.length > 1 ? (
-
-
- {logs.map((log, i) => {
- return (
-
- {log}
-
- )
- })}
-
-
- ) : (
-
-
-
Empty logs
-
- )}
-
- )
-}
-
-export default Logs
diff --git a/web/screens/LocalServer/index.tsx b/web/screens/LocalServer/index.tsx
index b96f4c228..65b6c8563 100644
--- a/web/screens/LocalServer/index.tsx
+++ b/web/screens/LocalServer/index.tsx
@@ -20,11 +20,12 @@ import {
SelectValue,
} from '@janhq/uikit'
-import { atom, useAtom, useAtomValue } from 'jotai'
+import { atom, useAtom, useAtomValue, useSetAtom } from 'jotai'
import { Paintbrush, CodeIcon } from 'lucide-react'
import { ExternalLinkIcon, InfoIcon } from 'lucide-react'
+import { AlertTriangleIcon } from 'lucide-react'
import { twMerge } from 'tailwind-merge'
import CardSidebar from '@/containers/CardSidebar'
@@ -33,8 +34,13 @@ import DropdownListSidebar, {
selectedModelAtom,
} from '@/containers/DropdownListSidebar'
-import { useActiveModel } from '@/hooks/useActiveModel'
-import { useServerLog } from '@/hooks/useServerLog'
+import ModalTroubleShooting, {
+ modalTroubleShootingAtom,
+} from '@/containers/ModalTroubleShoot'
+import ServerLogs from '@/containers/ServerLogs'
+
+import { loadModelErrorAtom, useActiveModel } from '@/hooks/useActiveModel'
+import { useLogs } from '@/hooks/useLogs'
import { getConfigurationsData } from '@/utils/componentSettings'
import { toSettingParams } from '@/utils/modelParam'
@@ -45,8 +51,6 @@ import SettingComponentBuilder from '../Chat/ModelSetting/SettingComponent'
import { showRightSideBarAtom } from '../Chat/Sidebar'
-import Logs from './Logs'
-
import { serverEnabledAtom } from '@/helpers/atoms/LocalServer.atom'
import { getActiveThreadModelParamsAtom } from '@/helpers/atoms/Thread.atom'
@@ -60,11 +64,12 @@ const LocalServerScreen = () => {
const [serverEnabled, setServerEnabled] = useAtom(serverEnabledAtom)
const showRightSideBar = useAtomValue(showRightSideBarAtom)
const activeModelParams = useAtomValue(getActiveThreadModelParamsAtom)
+ const setModalTroubleShooting = useSetAtom(modalTroubleShootingAtom)
const modelEngineParams = toSettingParams(activeModelParams)
const componentDataEngineSetting = getConfigurationsData(modelEngineParams)
- const { openServerLog, clearServerLog } = useServerLog()
+ const { openServerLog, clearServerLog } = useLogs()
const { startModel, stateModel } = useActiveModel()
const selectedModel = useAtomValue(selectedModelAtom)
@@ -72,6 +77,7 @@ const LocalServerScreen = () => {
const [isVerboseEnabled, setIsVerboseEnabled] = useAtom(verboseEnabledAtom)
const [host, setHost] = useAtom(hostAtom)
const [port, setPort] = useAtom(portAtom)
+ const [loadModelError, setLoadModelError] = useAtom(loadModelErrorAtom)
const hostOptions = ['127.0.0.1', '0.0.0.0']
@@ -122,6 +128,7 @@ const LocalServerScreen = () => {
if (serverEnabled) {
window.core?.api?.stopServer()
setServerEnabled(false)
+ setLoadModelError(undefined)
} else {
startModel(String(selectedModel?.id))
window.core?.api?.startServer({
@@ -350,7 +357,9 @@ const LocalServerScreen = () => {
) : (
-