global status

This commit is contained in:
josc146 2023-05-23 12:50:53 +08:00
parent 9a3657e6ea
commit 3aaf16b38b
5 changed files with 38 additions and 28 deletions

View File

@ -1,4 +1,4 @@
import commonStore, { ModelStatus } from '../stores/commonStore'; import commonStore, { Status } from '../stores/commonStore';
export const readRoot = async () => { export const readRoot = async () => {
const port = commonStore.getCurrentModelConfig().apiParameters.apiPort; const port = commonStore.getCurrentModelConfig().apiParameters.apiPort;
@ -36,15 +36,15 @@ export const updateConfig = async (body: any) => {
}); });
}; };
export const getStatus = async (timeout?: number): Promise<ModelStatus | undefined> => { export const getStatus = async (timeout?: number): Promise<Status | undefined> => {
const controller = new AbortController(); const controller = new AbortController();
if (timeout) if (timeout)
setTimeout(() => controller.abort(), timeout); setTimeout(() => controller.abort(), timeout);
const port = commonStore.getCurrentModelConfig().apiParameters.apiPort; const port = commonStore.getCurrentModelConfig().apiParameters.apiPort;
let ret: ModelStatus | undefined; let ret: Status | undefined;
await fetch(`http://127.0.0.1:${port}/status`, { signal: controller.signal }).then(r => r.json()).then(data => { await fetch(`http://127.0.0.1:${port}/status`, { signal: controller.signal }).then(r => r.json()).then(data => {
ret = data.status; ret = data;
}).catch(() => { }).catch(() => {
}); });
return ret; return ret;

View File

@ -42,8 +42,8 @@ export const RunButton: FC<{ onClickRun?: MouseEventHandler, iconMode?: boolean
const navigate = useNavigate(); const navigate = useNavigate();
const onClickMainButton = async () => { const onClickMainButton = async () => {
if (commonStore.modelStatus === ModelStatus.Offline) { if (commonStore.status.modelStatus === ModelStatus.Offline) {
commonStore.setModelStatus(ModelStatus.Starting); commonStore.setStatus({ modelStatus: ModelStatus.Starting });
const modelConfig = commonStore.getCurrentModelConfig(); const modelConfig = commonStore.getCurrentModelConfig();
let modelName = ''; let modelName = '';
@ -53,7 +53,7 @@ export const RunButton: FC<{ onClickRun?: MouseEventHandler, iconMode?: boolean
modelPath = `./${manifest.localModelDir}/${modelName}`; modelPath = `./${manifest.localModelDir}/${modelName}`;
} else { } else {
toast(t('Model Config Exception'), { type: 'error' }); toast(t('Model Config Exception'), { type: 'error' });
commonStore.setModelStatus(ModelStatus.Offline); commonStore.setStatus({ modelStatus: ModelStatus.Offline });
return; return;
} }
@ -79,7 +79,7 @@ export const RunButton: FC<{ onClickRun?: MouseEventHandler, iconMode?: boolean
} }
}); });
if (depErrorMsg) { if (depErrorMsg) {
commonStore.setModelStatus(ModelStatus.Offline); commonStore.setStatus({ modelStatus: ModelStatus.Offline });
return; return;
} }
commonStore.setDepComplete(true); commonStore.setDepComplete(true);
@ -100,7 +100,7 @@ export const RunButton: FC<{ onClickRun?: MouseEventHandler, iconMode?: boolean
} }
}); });
commonStore.setModelStatus(ModelStatus.Offline); commonStore.setStatus({ modelStatus: ModelStatus.Offline });
return; return;
} }
@ -118,7 +118,7 @@ export const RunButton: FC<{ onClickRun?: MouseEventHandler, iconMode?: boolean
.then(r => { .then(r => {
if (r.ok && !loading) { if (r.ok && !loading) {
clearInterval(intervalId); clearInterval(intervalId);
commonStore.setModelStatus(ModelStatus.Loading); commonStore.setStatus({ modelStatus: ModelStatus.Loading });
loading = true; loading = true;
toast(t('Loading Model'), { type: 'info' }); toast(t('Loading Model'), { type: 'info' });
updateConfig({ updateConfig({
@ -133,51 +133,51 @@ export const RunButton: FC<{ onClickRun?: MouseEventHandler, iconMode?: boolean
strategy: getStrategy(modelConfig) strategy: getStrategy(modelConfig)
}).then((r) => { }).then((r) => {
if (r.ok) { if (r.ok) {
commonStore.setModelStatus(ModelStatus.Working); commonStore.setStatus({ modelStatus: ModelStatus.Working });
toastWithButton(t('Startup Completed'), t('Chat'), () => { toastWithButton(t('Startup Completed'), t('Chat'), () => {
navigate({ pathname: '/chat' }); navigate({ pathname: '/chat' });
}, { type: 'success', autoClose: 3000 }); }, { type: 'success', autoClose: 3000 });
} else if (r.status === 304) { } else if (r.status === 304) {
toast(t('Loading Model'), { type: 'info' }); toast(t('Loading Model'), { type: 'info' });
} else { } else {
commonStore.setModelStatus(ModelStatus.Offline); commonStore.setStatus({ modelStatus: ModelStatus.Offline });
toast(t('Failed to switch model'), { type: 'error' }); toast(t('Failed to switch model'), { type: 'error' });
} }
}).catch(() => { }).catch(() => {
commonStore.setModelStatus(ModelStatus.Offline); commonStore.setStatus({ modelStatus: ModelStatus.Offline });
toast(t('Failed to switch model'), { type: 'error' }); toast(t('Failed to switch model'), { type: 'error' });
}); });
} }
}).catch(() => { }).catch(() => {
if (timeoutCount <= 0) { if (timeoutCount <= 0) {
clearInterval(intervalId); clearInterval(intervalId);
commonStore.setModelStatus(ModelStatus.Offline); commonStore.setStatus({ modelStatus: ModelStatus.Offline });
} }
}); });
timeoutCount--; timeoutCount--;
}, 1000); }, 1000);
} else { } else {
commonStore.setModelStatus(ModelStatus.Offline); commonStore.setStatus({ modelStatus: ModelStatus.Offline });
exit(); exit();
} }
}; };
const onClick = async (e: any) => { const onClick = async (e: any) => {
if (commonStore.modelStatus === ModelStatus.Offline) if (commonStore.status.modelStatus === ModelStatus.Offline)
await onClickRun?.(e); await onClickRun?.(e);
await onClickMainButton(); await onClickMainButton();
}; };
return (iconMode ? return (iconMode ?
<ToolTipButton disabled={commonStore.modelStatus === ModelStatus.Starting} <ToolTipButton disabled={commonStore.status.modelStatus === ModelStatus.Starting}
icon={iconModeButtonIcon[commonStore.modelStatus]} icon={iconModeButtonIcon[commonStore.status.modelStatus]}
desc={t(mainButtonText[commonStore.modelStatus])} desc={t(mainButtonText[commonStore.status.modelStatus])}
size="small" onClick={onClick} /> size="small" onClick={onClick} />
: :
<Button disabled={commonStore.modelStatus === ModelStatus.Starting} appearance="primary" size="large" <Button disabled={commonStore.status.modelStatus === ModelStatus.Starting} appearance="primary" size="large"
onClick={onClick}> onClick={onClick}>
{t(mainButtonText[commonStore.modelStatus])} {t(mainButtonText[commonStore.status.modelStatus])}
</Button> </Button>
); );
}); });

View File

@ -95,7 +95,7 @@ const ChatPanel: FC = observer(() => {
e.stopPropagation(); e.stopPropagation();
if (e.type === 'click' || (e.keyCode === 13 && !e.shiftKey)) { if (e.type === 'click' || (e.keyCode === 13 && !e.shiftKey)) {
e.preventDefault(); e.preventDefault();
if (commonStore.modelStatus === ModelStatus.Offline) { if (commonStore.status.modelStatus === ModelStatus.Offline) {
toast(t('Please click the button in the top right corner to start the model'), { type: 'warning' }); toast(t('Please click the button in the top right corner to start the model'), { type: 'warning' });
return; return;
} }
@ -315,8 +315,8 @@ export const Chat: FC = observer(() => {
<div className="flex flex-col gap-1 p-2 h-full overflow-hidden"> <div className="flex flex-col gap-1 p-2 h-full overflow-hidden">
<div className="flex justify-between items-center"> <div className="flex justify-between items-center">
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<PresenceBadge status={badgeStatus[commonStore.modelStatus]} /> <PresenceBadge status={badgeStatus[commonStore.status.modelStatus]} />
<Text size={100}>{t('Model Status') + ': ' + t(statusText[commonStore.modelStatus])}</Text> <Text size={100}>{t('Model Status') + ': ' + t(statusText[commonStore.status.modelStatus])}</Text>
</div> </div>
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<ConfigSelector size="small" /> <ConfigSelector size="small" />

View File

@ -21,7 +21,7 @@ export async function startup() {
getStatus(500).then(status => { // depends on config api port getStatus(500).then(status => { // depends on config api port
if (status) if (status)
commonStore.setModelStatus(status); commonStore.setStatus(status);
}); });
} }

View File

@ -18,9 +18,19 @@ export enum ModelStatus {
Working, Working,
} }
export type Status = {
modelStatus: ModelStatus;
pid: number;
device_name: string;
}
class CommonStore { class CommonStore {
// global // global
modelStatus: ModelStatus = ModelStatus.Offline; status: Status = {
modelStatus: ModelStatus.Offline,
pid: 0,
device_name: 'CPU'
};
depComplete: boolean = false; depComplete: boolean = false;
// home // home
introduction: IntroductionContent = manifest.introduction; introduction: IntroductionContent = manifest.introduction;
@ -54,8 +64,8 @@ class CommonStore {
return this.modelConfigs[this.currentModelConfigIndex]; return this.modelConfigs[this.currentModelConfigIndex];
}; };
setModelStatus = (status: ModelStatus) => { setStatus = (status: Partial<Status>) => {
this.modelStatus = status; this.status = { ...this.status, ...status };
}; };
setCurrentConfigIndex = (index: number, saveConfig: boolean = true) => { setCurrentConfigIndex = (index: number, saveConfig: boolean = true) => {