Add failed training type

This commit is contained in:
Nicolas Mowen 2025-11-09 13:37:09 -07:00
parent 6c47a131e4
commit 03b9b05d17
5 changed files with 17 additions and 9 deletions

View File

@ -23,6 +23,7 @@ class ModelStatusTypesEnum(str, Enum):
error = "error"
training = "training"
complete = "complete"
failed = "failed"
class TrackedObjectUpdateTypesEnum(str, Enum):

View File

@ -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,
},
)

View File

@ -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}}"
}

View File

@ -87,7 +87,8 @@ export type ModelState =
| "downloaded"
| "error"
| "training"
| "complete";
| "complete"
| "failed";
export type EmbeddingsReindexProgressType = {
thumbnails: number;

View File

@ -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"