Skill for interacting with Dell Enterprise Hub (DEH) - discovering models, exploring hardware platforms, generating deployment snippets, etc.
npx skills add https://github.com/huggingface/dell-ai --skill dell-ai
dell-ai interacts with the Dell Enterprise Hub (DEH) — discovering models, exploring hardware platforms, generating deployment snippets, managing app catalog entries, checking system compatibility, etc.
uv pip install dell-ai
Uses a Hugging Face token. Auto-loads from HF token cache, or accepts one directly.
from dell_ai import DellAIClient
client = DellAIClient() # Uses cached HF token
client = DellAIClient(token="your_hf_token") # Or explicit token
client.is_authenticated() # Returns bool
client.get_user_info() # Returns dict with name, email, orgs, etc.
list_models returns List[str] of IDs. search_models accepts the same filters but returns full Model objects.
# List model IDs (all filters are optional and combinable)
models = client.list_models(
query="llama", # Search name/description
multimodal=True, # True for multimodal, False for text-only
min_size=7000, # Min params in millions
max_size=70000, # Max params in millions
license_filter="apache", # License substring match
platform_id="xe9680-nvidia-h200", # Only models compatible with this platform
)
# Full Model objects with same filters
results = client.search_models(query="llama", multimodal=True)
# Model fields: repo_name, description, license, size, is_multimodal,
# has_system_prompt, creator_type, status, configs_deploy
# Returns Model object
model = client.get_model("meta-llama/Llama-4-Maverick-17B-128E-Instruct")
platforms = client.get_compatible_platforms("google/gemma-3-27b-it")
# Returns List[PlatformCompatibility] with platform_id and configs (List[ModelConfig])
for p in platforms:
print(p.platform_id, [c.model_dump() for c in p.configs])
# Returns True, or raises GatedRepoAccessError / AuthenticationError
client.check_model_access("meta-llama/Llama-4-Maverick-17B-128E-Instruct")
Automatically validates model access and model-platform compatibility.
Provide either num_gpus (manual sizing) or goodput (server-optimized) —
the two are mutually exclusive, and exactly one is required.
# Basic deployment snippet with manual GPU sizing
snippet = client.get_deployment_snippet(
model_id="meta-llama/Llama-4-Maverick-17B-128E-Instruct",
platform_id="xe9680-nvidia-h200",
engine="docker", # "docker" or "kubernetes"
num_gpus=8,
num_replicas=1,
)
print(snippet) # Ready-to-use docker command or k8s manifest
# Goodput-optimized: DEH returns the GPU count and optimized params for the
# scenario. Omit num_gpus when using goodput.
snippet = client.get_deployment_snippet(
model_id="nvidia/MiniMax-M2.7-NVFP4",
platform_id="xe9680-nvidia-h200",
engine="docker",
goodput="balanced", # balanced | long-context | high-concurrency | performance
)
Not every (model, platform, scenario) combination has an optimized config; the
API is the source of truth and raises ResourceNotFoundError with a message
like No optimized config for "balanced" scenario on this SKU. when it doesn't.
Global, static reference data: scenario definitions, SLO field docs, and SLO
targets per SKU. Cached on disk after the first call.
ref = client.get_goodput_scenarios()
# GoodputReference fields:
# scenarios -> List[Scenario] (id, label, description)
# slo_field_descriptions -> Dict[str, str]
# slos_by_sku -> Dict[SkuId, Dict[scenario, Slo]] (sparse)
# Slo fields: max_model_context, virtual_users, input_tokens [min,max], output_tokens [min,max]
slo = ref.slos_by_sku.get("xe9680-nvidia-h100", {}).get("balanced")
platforms = client.list_platforms() # Returns List[str] of SKU IDs
platform = client.get_platform("xe9680-nvidia-h200")
# Fields: id, name, platform_type, vendor, accelerator_type, accelerator,
# gpuram, gpuinterconnect, totalgpucount, product_name
sys_infos = client.get_platform_system_info("xe9680-nvidia-h200") # List[SystemInfo]
apps = client.list_apps() # Returns List[str] of app names
app = client.get_app("openwebui")
# App fields: id, name, license, description, features, instructions,
# tags, recommendedModels, components
for component in app.components:
for param in component.config:
print(f" {param.name}: {param.helmPath} ({param.type}), default={param.default}")
for secret in component.secrets:
print(f" [secret] {secret.name}: {secret.helmPath}")
Each config item requires: helmPath, type ("string", "boolean", "number", or "json"), and value.
config = [
{"helmPath": "main.config.storageClassName", "type": "string", "value": "gp2"},
{"helmPath": "main.config.enableOpenAI", "type": "boolean", "value": True},
]
snippet = client.get_app_snippet("openwebui", config)
print(snippet) # Helm install command
Beyond generating snippets, dell-ai can execute them on the local node using
the locally available engine: docker (Docker CLI), kubernetes (`kubectl
apply`), or Helm (apps). The relevant tool must be installed and configured.
Deployments run detached (background) by default. For Docker, dell-ai
automatically:
-it) to detached (-d) and captures thecontainer ID and inferred endpoint URL,
On success, metadata (endpoint, engine, container/deployment ID, assigned GPUs)
is written to the deployment registry (see below).
Provide either num_gpus or goodput — mutually exclusive, exactly one
required (same rule as snippet generation).
# Deploy a model on the local node
result = client.deploy_model(
model_id="meta-llama/Llama-4-Maverick-17B-128E-Instruct",
platform_id="xe9680-nvidia-h200",
engine="docker", # "docker" or "kubernetes"
num_gpus=8, # or goodput="balanced" (omit num_gpus)
num_replicas=1,
detach=True, # False = run in foreground
# local_dir="/data/weights", # mount local weights (Docker only)
# hf_cache_dir="~/.cache/huggingface", # or reuse an HF cache (mutually exclusive)
)
# result dict: success(bool), engine, endpoint, container_id | k8s_deployment, error?
# Deploy an app (Helm)
result = client.deploy_app(app_id="openwebui", config=[...], detach=True)
deploy_model / deploy_app do not raise on runtime failure — they return
{"success": False, "error": ...}. They still raise ValidationError,
ResourceNotFoundError, or GatedRepoAccessError for bad parameters or access.
CLI equivalents:
# Manual GPU sizing / goodput
dell-ai models deploy -m <model_id> -p <platform_id> -e docker --gpus 8
dell-ai models deploy -m <model_id> -p <platform_id> -e docker --goodput balanced
# Kubernetes / foreground
dell-ai models deploy -m <model_id> -p <platform_id> -e kubernetes --gpus 8
dell-ai models deploy -m <model_id> -p <platform_id> -e docker --no-detach
# Serve local weights instead of downloading (Docker only; path must exist; mutually exclusive)
dell-ai models deploy -m <model_id> -p <platform_id> -e docker --gpus 8 --local-dir /data/weights
dell-ai models deploy -m <model_id> -p <platform_id> -e docker --gpus 8 --hf-cache-dir ~/.cache/huggingface
# App (Helm)
dell-ai apps deploy openwebui --config '{"config":[{"helmPath":"main.config.storageClassName","type":"string","value":"gp2"}]}'
Successful deployments are tracked in a registry so they can be listed,
inspected, and torn down. Two scopes:
.dell-ai-deployments.json (current working directory)~/.config/dell-ai/deployments.jsonEach entry is keyed by a deployment ID (defaults to the model ID; additional
instances of the same model are suffixed, e.g. org/model_1, each with its own
host port and GPU indices). Running DEH Docker containers are auto-discovered and
added; entries whose containers are gone are pruned automatically.
from dell_ai import deployments
deployments.list_deployments() # dict keyed by deployment ID
deployments.get_deployment("org/model_1") # single entry or None
deployments.delete_deployment("org/model_1") # remove registry entry (no container stop)
Tear down a deployment — stops the Docker container / Kubernetes deployment and
removes its registry entry:
dell-ai models undeploy -d <deployment_id>
undeploy acts on one deployment at a time. Always run
dell-ai status first to see if the target deployment ID exists.
dell-ai persists configuration as environment variables in two scopes,
auto-loaded into os.environ on CLI startup and DellAIClient init. Resolution
precedence: shell env → local → global.
.dell-ai-env.json (current working directory)~/.config/dell-ai/env.jsonfrom dell_ai import env
env.set_env_var("DELL_AI_CHECKPOINT", "/data/ckpt", is_global=False)
env.get_env_var("DELL_AI_CHECKPOINT")
env.list_env_vars() # is_global: None=combined, True=global only, False=local only
env.delete_env_var("DELL_AI_CHECKPOINT", is_global=False)
dell-ai env set DELL_AI_CHECKPOINT /data/ckpt # add --global for the global scope
dell-ai env get DELL_AI_CHECKPOINT
dell-ai env list # --local / --global to scope
dell-ai env delete DELL_AI_CHECKPOINT # --global to delete from global
dell-ai status # active deployments, checkpoints, running Docker/K8s
dell-ai status --clean # also remove exited containers and stopped K8s deployments
Reports:
(online + response time); auto-discovers running DEH containers.
DELL_AI_*_CHECKPOINTenvironment variables.
Docker/Kubernetes scanning is skipped gracefully when docker / kubectl are
not available on the node.
dell-ai utils describe-system # Get system info as JSON
dell-ai utils describe-system -o out.json # Save to file
dell-ai utils describe-system | jq # Pretty-print
dell-ai utils check-system # Check compatibility against Dell AI validated configs
Requires: lscpu, lspci, lsblk, dmidecode. For GPUs: nvidia-smi, nvidia-ctk. For K8s: kubectl.
All in dell_ai.exceptions:
AuthenticationError — Invalid or missing tokenGatedRepoAccessError — No access to a gated model repositoryResourceNotFoundError — Model, platform, or app not foundValidationError — Invalid parameters (may include valid_values)APIError — General API errorsTake huggingface/dell-ai from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference pip, uv.
Without those the skill loads but fails at the first command.