[08/23/25 21:52:59] INFO Application startup complete. [08/23/25 21:55:08] INFO Loading detection model 'buffalo_l' to memory [08/23/25 21:55:08] INFO Setting execution providers to ['CPUExecutionProvider'], in descending order of preference [08/23/25 21:55:09] INFO Loading visual model 'ViT-B-32__openai' to memory [08/23/25 21:55:09] ERROR Exception in ASGI application ╭─────── Traceback (most recent call last) ───────╮ │ /usr/src/immich_ml/main.py:177 in predict │ │ │ │ 174 │ │ inputs = text │ │ 175 │ else: │ │ 176 │ │ raise HTTPException(400, "Either │ │ ❱ 177 │ response = await run_inference(inputs │ │ 178 │ return ORJSONResponse(response) │ │ 179 │ │ 180 │ │ │ │ /usr/src/immich_ml/main.py:200 in run_inference │ │ │ │ 197 │ │ response[entry["task"]] = output │ │ 198 │ │ │ 199 │ without_deps, with_deps = entries │ │ ❱ 200 │ await asyncio.gather(*[_run_inference │ │ 201 │ if with_deps: │ │ 202 │ │ await asyncio.gather(*[_run_infer │ │ 203 │ if isinstance(payload, Image): │ │ │ │ /usr/src/immich_ml/main.py:194 in │ │ _run_inference │ │ │ │ 191 │ │ │ except KeyError: │ │ 192 │ │ │ │ message = f"Task {entry[' │ │ output of {dep}" │ │ 193 │ │ │ │ raise HTTPException(400, │ │ ❱ 194 │ │ model = await load(model) │ │ 195 │ │ output = await run(model.predict, │ │ 196 │ │ outputs[model.identity] = output │ │ 197 │ │ response[entry["task"]] = output │ │ │ │ /usr/src/immich_ml/main.py:238 in load │ │ │ │ 235 │ │ return model │ │ 236 │ │ │ 237 │ try: │ │ ❱ 238 │ │ return await run(_load, model) │ │ 239 │ except (OSError, InvalidProtobuf, Bad │ │ 240 │ │ log.warning(f"Failed to load {mod │ │ '{model.model_name}'. Clearing cache.") │ │ 241 │ │ model.clear_cache() │ │ │ │ /usr/src/immich_ml/main.py:213 in run │ │ │ │ 210 │ if thread_pool is None: │ │ 211 │ │ return func(*args, **kwargs) │ │ 212 │ partial_func = partial(func, *args, * │ │ ❱ 213 │ return await asyncio.get_running_loop │ │ 214 │ │ 215 │ │ 216 async def load(model: InferenceModel) -> │ │ │ │ /usr/local/lib/python3.11/concurrent/futures/th │ │ read.py:58 in run │ │ │ │ /usr/src/immich_ml/main.py:225 in _load │ │ │ │ 222 │ │ │ raise HTTPException(500, f"Fa │ │ 223 │ │ with lock: │ │ 224 │ │ │ try: │ │ ❱ 225 │ │ │ │ model.load() │ │ 226 │ │ │ except FileNotFoundError as e │ │ 227 │ │ │ │ if model.model_format == │ │ 228 │ │ │ │ │ raise e │ │ │ │ /usr/src/immich_ml/models/base.py:54 in load │ │ │ │ 51 │ │ self.download() │ │ 52 │ │ attempt = f"Attempt #{self.load_a │ │ else "Loading" │ │ 53 │ │ log.info(f"{attempt} {self.model_ │ │ '{self.model_name}' to memory") │ │ ❱ 54 │ │ self.session = self._load() │ │ 55 │ │ self.loaded = True │ │ 56 │ │ │ 57 │ def predict(self, *inputs: Any, **mod │ │ │ │ /usr/src/immich_ml/models/clip/visual.py:63 in │ │ _load │ │ │ │ 60 │ │ 61 class OpenClipVisualEncoder(BaseCLIPVisual │ │ 62 │ def _load(self) -> ModelSession: │ │ ❱ 63 │ │ size: list[int] | int = self.prepr │ │ 64 │ │ self.size = size[0] if isinstance( │ │ 65 │ │ │ │ 66 │ │ self.resampling = get_pil_resampli │ │ │ │ /usr/local/lib/python3.11/functools.py:1001 in │ │ __get__ │ │ │ │ 998 │ │ │ │ # check if another threa │ │ 999 │ │ │ │ val = cache.get(self.att │ │ 1000 │ │ │ │ if val is _NOT_FOUND: │ │ ❱ 1001 │ │ │ │ │ val = self.func(inst │ │ 1002 │ │ │ │ │ try: │ │ 1003 │ │ │ │ │ │ cache[self.attrn │ │ 1004 │ │ │ │ │ except TypeError: │ │ │ │ /usr/src/immich_ml/models/clip/visual.py:56 in │ │ preprocess_cfg │ │ │ │ 53 │ @cached_property │ │ 54 │ def preprocess_cfg(self) -> dict[str, │ │ 55 │ │ log.debug(f"Loading visual preproc │ │ '{self.model_name}'") │ │ ❱ 56 │ │ preprocess_cfg: dict[str, Any] = j │ │ 57 │ │ log.debug(f"Loaded visual preproce │ │ '{self.model_name}'") │ │ 58 │ │ return preprocess_cfg │ │ 59 │ │ │ │ /usr/local/lib/python3.11/json/__init__.py:293 │ │ in load │ │ │ │ 290 │ To use a custom ``JSONDecoder`` subcl │ │ 291 │ kwarg; otherwise ``JSONDecoder`` is u │ │ 292 │ """ │ │ ❱ 293 │ return loads(fp.read(), │ │ 294 │ │ cls=cls, object_hook=object_hook, │ │ 295 │ │ parse_float=parse_float, parse_in │ │ 296 │ │ parse_constant=parse_constant, ob │ │ │ │ /usr/local/lib/python3.11/json/__init__.py:346 │ │ in loads │ │ │ │ 343 │ if (cls is None and object_hook is No │ │ 344 │ │ │ parse_int is None and parse_f │ │ 345 │ │ │ parse_constant is None and ob │ │ ❱ 346 │ │ return _default_decoder.decode(s) │ │ 347 │ if cls is None: │ │ 348 │ │ cls = JSONDecoder │ │ 349 │ if object_hook is not None: │ │ │ │ /usr/local/lib/python3.11/json/decoder.py:337 │ │ in decode │ │ │ │ 334 │ │ containing a JSON document). │ │ 335 │ │ │ │ 336 │ │ """ │ │ ❱ 337 │ │ obj, end = self.raw_decode(s, idx │ │ 338 │ │ end = _w(s, end).end() │ │ 339 │ │ if end != len(s): │ │ 340 │ │ │ raise JSONDecodeError("Extra │ │ │ │ /usr/local/lib/python3.11/json/decoder.py:355 │ │ in raw_decode │ │ │ │ 352 │ │ try: │ │ 353 │ │ │ obj, end = self.scan_once(s, │ │ 354 │ │ except StopIteration as err: │ │ ❱ 355 │ │ │ raise JSONDecodeError("Expect │ │ 356 │ │ return obj, end │ │ 357 │ ╰─────────────────────────────────────────────────╯ JSONDecodeError: Expecting value: line 1 column 1 (char 0)