Skip to content

Commit da58e37

Browse files
committed
Refactor settings to follow deployer pattern
Move HuggingFaceDeployerSettings to flavor module and make HuggingFaceDeployerConfig inherit from it, following the pattern used by other deployers in the codebase. Key changes: - Move HuggingFaceDeployerSettings from deployer to flavor module - Make HuggingFaceDeployerConfig inherit from HuggingFaceDeployerSettings - Remove duplicate space_hardware and space_storage fields from config - Remove app_port setting and use uvicorn_port from DeploymentSettings instead, consistent with docker deployer pattern - Add comprehensive Field descriptions for settings fields This addresses PR feedback from @stefannica.
1 parent f43c6c1 commit da58e37

File tree

2 files changed

+41
-35
lines changed

2 files changed

+41
-35
lines changed

src/zenml/integrations/huggingface/deployers/huggingface_deployer.py

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
)
2929

3030
from zenml.config.base_settings import BaseSettings
31-
from zenml.deployers.base_deployer import BaseDeployerSettings
3231
from zenml.deployers.containerized_deployer import ContainerizedDeployer
3332
from zenml.deployers.exceptions import (
3433
DeployerError,
@@ -44,6 +43,7 @@
4443
from zenml.enums import DeploymentStatus
4544
from zenml.integrations.huggingface.flavors.huggingface_deployer_flavor import (
4645
HuggingFaceDeployerConfig,
46+
HuggingFaceDeployerSettings,
4747
)
4848
from zenml.logger import get_logger
4949
from zenml.models import DeploymentOperationalState, DeploymentResponse
@@ -60,22 +60,6 @@
6060
logger = get_logger(__name__)
6161

6262

63-
class HuggingFaceDeployerSettings(BaseDeployerSettings):
64-
"""Hugging Face deployer settings.
65-
66-
Attributes:
67-
space_hardware: Hardware tier for the Space (e.g., 'cpu-basic', 't4-small')
68-
space_storage: Persistent storage tier (e.g., 'small', 'medium', 'large')
69-
private: Whether to create a private Space (default: True for security)
70-
app_port: Port the container exposes (default 8000 for ZenML server)
71-
"""
72-
73-
space_hardware: Optional[str] = None
74-
space_storage: Optional[str] = None
75-
private: bool = True
76-
app_port: int = 8000
77-
78-
7963
class HuggingFaceDeployer(ContainerizedDeployer):
8064
"""Deployer that runs deployments as Hugging Face Spaces."""
8165

@@ -354,10 +338,12 @@ def do_provision_deployment(
354338
with tempfile.TemporaryDirectory() as tmpdir:
355339
# Create README
356340
readme = os.path.join(tmpdir, "README.md")
341+
# Get port from deployment settings
342+
port = deployment.snapshot.pipeline_configuration.deployment_settings.uvicorn_port
357343
with open(readme, "w") as f:
358344
f.write(
359345
f"---\ntitle: {deployment.name}\nsdk: docker\n"
360-
f"app_port: {settings.app_port}\n---\n"
346+
f"app_port: {port}\n---\n"
361347
)
362348

363349
# Create Dockerfile

src/zenml/integrations/huggingface/flavors/huggingface_deployer_flavor.py

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from zenml.deployers.base_deployer import (
2121
BaseDeployerConfig,
2222
BaseDeployerFlavor,
23+
BaseDeployerSettings,
2324
)
2425
from zenml.integrations.huggingface import HUGGINGFACE_DEPLOYER_FLAVOR
2526
from zenml.models import ServiceConnectorRequirements
@@ -29,24 +30,15 @@
2930
from zenml.integrations.huggingface.deployers import HuggingFaceDeployer
3031

3132

32-
class HuggingFaceDeployerConfig(BaseDeployerConfig):
33-
"""Configuration for the Hugging Face deployer."""
33+
class HuggingFaceDeployerSettings(BaseDeployerSettings):
34+
"""Hugging Face deployer settings.
35+
36+
Attributes:
37+
space_hardware: Hardware tier for the Space (e.g., 'cpu-basic', 't4-small')
38+
space_storage: Persistent storage tier (e.g., 'small', 'medium', 'large')
39+
private: Whether to create a private Space (default: True for security)
40+
"""
3441

35-
token: Optional[str] = SecretField(
36-
default=None,
37-
description="Hugging Face API token for authentication with write permissions. "
38-
"Can reference a ZenML secret using {{secret_name.key}} syntax or provide "
39-
"the token directly. Create tokens at https://huggingface.co/settings/tokens "
40-
"with 'write' access enabled. Example: '{{hf_token.token}}' references the "
41-
"'token' key in the 'hf_token' secret",
42-
)
43-
organization: Optional[str] = Field(
44-
default=None,
45-
description="Hugging Face organization name to deploy Spaces under. If not "
46-
"specified, Spaces are created under the authenticated user's account. "
47-
"Example: 'zenml' deploys to https://huggingface.co/spaces/zenml/. "
48-
"Requires organization membership with appropriate permissions",
49-
)
5042
space_hardware: Optional[str] = Field(
5143
default=None,
5244
description="Hardware tier for Space execution. Controls compute resources "
@@ -63,6 +55,34 @@ class HuggingFaceDeployerConfig(BaseDeployerConfig):
6355
"'large' (1TB). Storage persists across Space restarts. If not specified, "
6456
"uses ephemeral storage that resets on restart",
6557
)
58+
private: bool = Field(
59+
default=True,
60+
description="Controls whether the deployed Space is private or public. "
61+
"Private Spaces are only accessible to the owner and authorized users. "
62+
"Public Spaces are visible to anyone with the URL. Defaults to True for security",
63+
)
64+
65+
66+
class HuggingFaceDeployerConfig(
67+
BaseDeployerConfig, HuggingFaceDeployerSettings
68+
):
69+
"""Configuration for the Hugging Face deployer."""
70+
71+
token: Optional[str] = SecretField(
72+
default=None,
73+
description="Hugging Face API token for authentication with write permissions. "
74+
"Can reference a ZenML secret using {{secret_name.key}} syntax or provide "
75+
"the token directly. Create tokens at https://huggingface.co/settings/tokens "
76+
"with 'write' access enabled. Example: '{{hf_token.token}}' references the "
77+
"'token' key in the 'hf_token' secret",
78+
)
79+
organization: Optional[str] = Field(
80+
default=None,
81+
description="Hugging Face organization name to deploy Spaces under. If not "
82+
"specified, Spaces are created under the authenticated user's account. "
83+
"Example: 'zenml' deploys to https://huggingface.co/spaces/zenml/. "
84+
"Requires organization membership with appropriate permissions",
85+
)
6686
space_prefix: str = Field(
6787
default="zenml",
6888
description="Prefix for Space names to organize deployments and avoid naming "

0 commit comments

Comments
 (0)