mirror of
https://github.com/blakeblackshear/frigate.git
synced 2025-12-07 05:54:10 +03:00
Add failed training type
This commit is contained in:
parent
6c47a131e4
commit
03b9b05d17
@ -23,6 +23,7 @@ class ModelStatusTypesEnum(str, Enum):
|
||||
error = "error"
|
||||
training = "training"
|
||||
complete = "complete"
|
||||
failed = "failed"
|
||||
|
||||
|
||||
class TrackedObjectUpdateTypesEnum(str, Enum):
|
||||
|
||||
@ -306,13 +306,13 @@ def kickoff_model_training(
|
||||
logger.error(
|
||||
f"Training subprocess failed for {model_name} (exit code: {training_process.exitcode})"
|
||||
)
|
||||
# mark training as complete (not failed) so UI doesn't stay in training state
|
||||
# but don't reload the model since it failed
|
||||
# mark training as failed so UI shows error state
|
||||
# don't reload the model since it failed
|
||||
requestor.send_data(
|
||||
UPDATE_MODEL_STATE,
|
||||
{
|
||||
"model": model_name,
|
||||
"state": ModelStatusTypesEnum.complete,
|
||||
"state": ModelStatusTypesEnum.failed,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@ -35,7 +35,8 @@
|
||||
"deleteCategoryFailed": "Failed to delete class: {{errorMessage}}",
|
||||
"deleteModelFailed": "Failed to delete model: {{errorMessage}}",
|
||||
"categorizeFailed": "Failed to categorize image: {{errorMessage}}",
|
||||
"trainingFailed": "Failed to start model training: {{errorMessage}}",
|
||||
"trainingFailed": "Model training failed. Check Frigate logs for details.",
|
||||
"trainingFailedToStart": "Failed to start model training: {{errorMessage}}",
|
||||
"updateModelFailed": "Failed to update model: {{errorMessage}}",
|
||||
"renameCategoryFailed": "Failed to rename class: {{errorMessage}}"
|
||||
}
|
||||
|
||||
@ -87,7 +87,8 @@ export type ModelState =
|
||||
| "downloaded"
|
||||
| "error"
|
||||
| "training"
|
||||
| "complete";
|
||||
| "complete"
|
||||
| "failed";
|
||||
|
||||
export type EmbeddingsReindexProgressType = {
|
||||
thumbnails: number;
|
||||
|
||||
@ -103,6 +103,11 @@ export default function ModelTrainingView({ model }: ModelTrainingViewProps) {
|
||||
});
|
||||
setWasTraining(false);
|
||||
refreshDataset();
|
||||
} else if (modelState == "failed") {
|
||||
toast.error(t("toast.error.trainingFailed"), {
|
||||
position: "top-center",
|
||||
});
|
||||
setWasTraining(false);
|
||||
}
|
||||
// only refresh when modelState changes
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
@ -188,7 +193,7 @@ export default function ModelTrainingView({ model }: ModelTrainingViewProps) {
|
||||
error.response?.data?.detail ||
|
||||
"Unknown error";
|
||||
|
||||
toast.error(t("toast.error.trainingFailed", { errorMessage }), {
|
||||
toast.error(t("toast.error.trainingFailedToStart", { errorMessage }), {
|
||||
position: "top-center",
|
||||
});
|
||||
});
|
||||
@ -437,9 +442,9 @@ export default function ModelTrainingView({ model }: ModelTrainingViewProps) {
|
||||
<Button
|
||||
className="flex justify-center gap-2"
|
||||
onClick={trainModel}
|
||||
variant="select"
|
||||
variant={modelState == "failed" ? "destructive" : "select"}
|
||||
disabled={
|
||||
modelState != "complete" ||
|
||||
(modelState != "complete" && modelState != "failed") ||
|
||||
(trainingMetadata?.new_images_count ?? 0) === 0
|
||||
}
|
||||
>
|
||||
@ -462,7 +467,7 @@ export default function ModelTrainingView({ model }: ModelTrainingViewProps) {
|
||||
</Button>
|
||||
</TooltipTrigger>
|
||||
{((trainingMetadata?.new_images_count ?? 0) === 0 ||
|
||||
modelState != "complete") && (
|
||||
(modelState != "complete" && modelState != "failed")) && (
|
||||
<TooltipPortal>
|
||||
<TooltipContent>
|
||||
{modelState == "training"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user