global status
This commit is contained in:
		
							parent
							
								
									9a3657e6ea
								
							
						
					
					
						commit
						3aaf16b38b
					
				@ -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;
 | 
				
			||||||
 | 
				
			|||||||
@ -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>
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
				
			|||||||
@ -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" />
 | 
				
			||||||
 | 
				
			|||||||
@ -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);
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -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) => {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user