from enum import Enum
from pathlib import Path
from typing import Optional
class ModelFormat(Enum):
SAFETENSORS = "safetensors"
GGUF = "gguf"
PYTORCH = "pytorch"
TENSORRT = "tensorrt"
ONNX = "onnx"
MLX = "mlx"
COREML = "coreml"
TORCHSCRIPT = "torchscript"
TFLITE = "tflite"
TENSORFLOW = "tensorflow"
KERAS = "keras"
OPENVINO = "openvino"
TVM = "tvm"
NCNN = "ncnn"
MNN = "mnn"
RKNN = "rknn"
CAFFE = "caffe"
MXNET = "mxnet"
DARKNET = "darknet"
HDF5 = "hdf5"
PICKLE = "pickle"
NUMPY = "numpy"
CUSTOM = "custom"
@classmethod
def detect(cls, path: str) -> "ModelFormat":
ext = Path(path).suffix.lower()
extension_map = {
".safetensors": cls.SAFETENSORS,
".gguf": cls.GGUF,
".pt": cls.PYTORCH,
".pth": cls.PYTORCH,
".bin": cls.PYTORCH,
".plan": cls.TENSORRT,
".engine": cls.TENSORRT,
".trt": cls.TENSORRT,
".onnx": cls.ONNX,
".npz": cls.MLX,
".mlmodel": cls.COREML,
".mlpackage": cls.COREML,
".torchscript": cls.TORCHSCRIPT,
".tflite": cls.TFLITE,
".pb": cls.TENSORFLOW,
".savedmodel": cls.TENSORFLOW,
".h5": cls.KERAS,
".keras": cls.KERAS,
".xml": cls.OPENVINO,
".param": cls.NCNN,
".mnn": cls.MNN,
".rknn": cls.RKNN,
".caffemodel": cls.CAFFE,
".params": cls.MXNET,
".weights": cls.DARKNET,
".hdf5": cls.HDF5,
".pkl": cls.PICKLE,
".pickle": cls.PICKLE,
".npy": cls.NUMPY,
}
return extension_map.get(ext, cls.CUSTOM)
@property
def file_extensions(self) -> list:
ext_map = {
self.SAFETENSORS: [".safetensors"],
self.GGUF: [".gguf"],
self.PYTORCH: [".pt", ".pth", ".bin"],
self.TENSORRT: [".plan", ".engine", ".trt"],
self.ONNX: [".onnx"],
self.MLX: [".npz"],
self.COREML: [".mlmodel", ".mlpackage"],
self.TORCHSCRIPT: [".torchscript"],
self.TFLITE: [".tflite"],
self.TENSORFLOW: [".pb", ".savedmodel"],
self.KERAS: [".h5", ".keras"],
self.OPENVINO: [".xml"],
self.TVM: [],
self.NCNN: [".param"],
self.MNN: [".mnn"],
self.RKNN: [".rknn"],
self.CAFFE: [".caffemodel"],
self.MXNET: [".params"],
self.DARKNET: [".weights"],
self.HDF5: [".hdf5"],
self.PICKLE: [".pkl", ".pickle"],
self.NUMPY: [".npy", ".npz"],
}
return ext_map.get(self, [])
def __str__(self) -> str:
return self.value