From 1d46c655b4de53e5f291043ee86c155dd32b6087 Mon Sep 17 00:00:00 2001 From: Daniel Han Date: Mon, 6 Apr 2026 12:07:57 +0000 Subject: [PATCH] Harden HfFileSystem glob: fix Windows path splitting, add try/except - Use str.rsplit("/", 1) instead of os.path.split to extract filenames from HfFileSystem paths. HfFileSystem always returns POSIX-style paths, but os.path.split uses the OS separator, so on Windows the entire path was returned as the "filename" and the config name comparison always failed. - Wrap the HfFileSystem().glob() call in try/except to gracefully handle network failures (offline mode, timeouts, unreachable Hub). On failure both_exist stays False, which is the safe default. --- unsloth/models/loader.py | 41 +++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/unsloth/models/loader.py b/unsloth/models/loader.py index b7bbf14085..c6164e326f 100644 --- a/unsloth/models/loader.py +++ b/unsloth/models/loader.py @@ -517,14 +517,19 @@ class FastLanguageModel(FastLlamaModel): exist_config = os.path.exists(os.path.join(model_name, "config.json")) both_exist = exist_adapter_config and exist_config else: - # Because HfFileSystem assumes linux paths, we need to set the path with forward slashes, even on Windows. - files = HfFileSystem(token = token).glob(f"{model_name}/*.json") - files = list(os.path.split(x)[-1] for x in files) - if ( - sum(x == "adapter_config.json" or x == "config.json" for x in files) - >= 2 - ): - both_exist = True + # HfFileSystem returns POSIX paths; use str.rsplit to extract + # filenames correctly on all platforms (os.path.split uses the + # OS separator which breaks on Windows). + try: + files = HfFileSystem(token = token).glob(f"{model_name}/*.json") + files = [x.rsplit("/", 1)[-1] for x in files] + if ( + sum(x == "adapter_config.json" or x == "config.json" for x in files) + >= 2 + ): + both_exist = True + except Exception: + pass if not is_model and not is_peft: error = autoconfig_error if autoconfig_error is not None else peft_error @@ -1291,13 +1296,19 @@ class FastModel(FastBaseModel): exist_config = os.path.exists(os.path.join(model_name, "config.json")) both_exist = exist_adapter_config and exist_config else: - files = HfFileSystem(token = token).glob(f"{model_name}/*.json") - files = list(os.path.split(x)[-1] for x in files) - if ( - sum(x == "adapter_config.json" or x == "config.json" for x in files) - >= 2 - ): - both_exist = True + # HfFileSystem returns POSIX paths; use str.rsplit to extract + # filenames correctly on all platforms (os.path.split uses the + # OS separator which breaks on Windows). + try: + files = HfFileSystem(token = token).glob(f"{model_name}/*.json") + files = [x.rsplit("/", 1)[-1] for x in files] + if ( + sum(x == "adapter_config.json" or x == "config.json" for x in files) + >= 2 + ): + both_exist = True + except Exception: + pass if not is_model and not is_peft: error = autoconfig_error if autoconfig_error is not None else peft_error