diff --git a/core/services/hf/src/backend.rs b/core/services/hf/src/backend.rs index db9fc0606daa..0182df24050b 100644 --- a/core/services/hf/src/backend.rs +++ b/core/services/hf/src/backend.rs @@ -144,6 +144,20 @@ impl HfBuilder { .unwrap_or_else(|| "https://huggingface.co".to_string()) } + /// Resolve the download mode: an explicit config value wins; otherwise a set, + /// non-empty HF_HUB_DISABLE_XET (a huggingface_hub env var) forces http; default Xet. + fn hf_download_mode(&self) -> HfDownloadMode { + if let Some(mode) = self.config.download_mode { + return mode; + } + if let Ok(val) = std::env::var("HF_HUB_DISABLE_XET") { + if !val.is_empty() { + return HfDownloadMode::Http; + } + } + HfDownloadMode::default() + } + fn hf_home() -> Option { if let Ok(h) = std::env::var("HF_HOME") { return Some(PathBuf::from(h)); @@ -191,6 +205,7 @@ impl Builder for HfBuilder { let token = self.hf_token(); let endpoint = self.hf_endpoint(); + let download_mode = self.hf_download_mode(); let repo_type = self.config.repo_type.ok_or_else(|| { Error::new(ErrorKind::ConfigInvalid, "repo_type is required") @@ -216,7 +231,6 @@ impl Builder for HfBuilder { debug!("backend use root: {}", &root); debug!("backend use token: {}", token.is_some()); debug!("backend use endpoint: {}", &endpoint); - let download_mode = self.config.download_mode.unwrap_or_default(); debug!("backend use download_mode: {:?}", download_mode); let info = ServiceInfo::new(HF_SCHEME, "", ""); @@ -541,6 +555,40 @@ mod tests { assert_eq!(result, "https://env.example.com"); } + #[test] + fn hf_download_mode_defaults_to_xet() { + let _guard = ENV_LOCK.lock().unwrap(); + unsafe { std::env::remove_var("HF_HUB_DISABLE_XET") }; + assert_eq!(HfBuilder::default().hf_download_mode(), HfDownloadMode::Xet); + } + + #[test] + fn hf_download_mode_disable_xet_env_forces_http() { + let _guard = ENV_LOCK.lock().unwrap(); + unsafe { std::env::set_var("HF_HUB_DISABLE_XET", "1") }; + let mode = HfBuilder::default().hf_download_mode(); + unsafe { std::env::remove_var("HF_HUB_DISABLE_XET") }; + assert_eq!(mode, HfDownloadMode::Http); + } + + #[test] + fn hf_download_mode_config_takes_priority_over_env() { + let _guard = ENV_LOCK.lock().unwrap(); + unsafe { std::env::set_var("HF_HUB_DISABLE_XET", "1") }; + let mode = HfBuilder::default().download_mode("xet").hf_download_mode(); + unsafe { std::env::remove_var("HF_HUB_DISABLE_XET") }; + assert_eq!(mode, HfDownloadMode::Xet); + } + + #[test] + fn hf_download_mode_empty_env_keeps_xet() { + let _guard = ENV_LOCK.lock().unwrap(); + unsafe { std::env::set_var("HF_HUB_DISABLE_XET", "") }; + let mode = HfBuilder::default().hf_download_mode(); + unsafe { std::env::remove_var("HF_HUB_DISABLE_XET") }; + assert_eq!(mode, HfDownloadMode::Xet); + } + #[test] fn build_accepts_datasets_alias() { HfBuilder::default()