Skip to main content

huggingface_hub but for CivitAI — inspect and download models/LoRAs

Project description

civitai-hub

CI Python Ruff

huggingface_hub, but for CivitAI. Point it at a model URL to inspect what's inside (type, base/parent model, every file with sizes and hashes) and download the checkpoint or LoRA into a deduplicated, content-addressed cache — usable as both a CLI and an importable Python library.

$ civitai download https://civitai.com/models/580857 --fp16 -o ~/ComfyUI/models/loras
~/ComfyUI/models/loras/realistic-skin-xl.safetensors

civitai info — model type, base model, and a table of every file
civitai info <url> — what's inside a model at a glance

Contents: Features · Install · CLI · Library · Auth · Configuration · How it works · Docker · Development

Features

  • Inspect before you fetchcivitai info <url> shows the model type, base/parent model, the selected version, and a table of every file in it (size, format, precision, hash, scan status).
  • Smart, scriptable downloads — picks the URL-pinned version (or the latest) and its primary file by default; override with --version-id, --fp16/--fp32, --pruned/--full, --format, --file, or grab everything with --all.
  • Find the base modelcivitai base <lora-url> lists the checkpoints a LoRA's base-model family runs on (CivitAI only exposes the family name, not a direct link), with --download N to grab one.
  • Managed cache like HF Hub — content-addressed blobs keyed by SHA256, with per-version snapshot symlinks. The same file reused across versions is stored once. Re-downloads are skipped.
  • Resumable & verified — HTTP range-resume for interrupted downloads, automatic SHA256 verification, and a live progress bar.
  • Library + CLI — everything the CLI does is a one-line call from Python.
  • Safe by default — blocks files flagged unsafe by CivitAI's scanners (override with --allow-unscanned) and fails fast on early-access/gated content with a clear message.

Install

From the GitHub release (available now):

# straight from the tag
pipx install "git+https://github.com/mr8bit/civit-ai-cli@v0.1.0"
# or the prebuilt wheel attached to the release
pipx install "https://github.com/mr8bit/civit-ai-cli/releases/download/v0.1.0/civitai_hub-0.1.0-py3-none-any.whl"

From PyPI (once published):

pipx install civitai-hub        # isolated CLI (recommended)
pip install civitai-hub         # into the current environment

For development from a clone:

python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"

CLI quickstart

# Inspect a model (human table, or --json for machines)
civitai info https://civitai.com/models/580857/realistic-skin
civitai info 580857 --json

# Download the primary file of the latest (or URL-pinned) version
civitai download https://civitai.com/models/580857

# Drop a specific precision straight into your ComfyUI/A1111 folder
civitai download 580857 --fp16 -o ~/ComfyUI/models/loras

# Preview what would be fetched without downloading
civitai download 580857 --dry-run

# Grab every file in the version
civitai download 580857 --all

# Find the base checkpoints a LoRA runs on, then grab one
civitai base 580857
civitai base 580857 --download 1 -o ~/ComfyUI/models/checkpoints

civitai base — ranked base checkpoints for a LoRA's base-model family
civitai base <url> — the checkpoints a LoRA runs on, most-downloaded first

The downloaded path is printed to stdout (the progress bar goes to stderr), so it pipes cleanly:

MODEL=$(civitai download 580857 --no-progress)

Library usage

import civitai_hub

# Inspect
info = civitai_hub.model_info("https://civitai.com/models/580857")
print(info.model.type, info.version.base_model, len(info.files))

# Download — returns the local Path (or list[Path] with all=True)
path = civitai_hub.download(
    "https://civitai.com/models/580857",
    fp="fp16",
    local_dir="~/ComfyUI/models/loras",
)

download(...) mirrors hf_hub_download (single file) and snapshot_download (all=True).

Authentication

Most public files download without a token. For gated, NSFW, or early-access resources, create an API key in your CivitAI account settings and provide it via:

export CIVITAI_TOKEN=<your key>     # or pass --token <key>

Configuration

Precedence is flag → environment variable → default.

Setting Flag Env var Default
API token --token (download/base) CIVITAI_TOKEN (anonymous)
Cache root --cache-dir (download/base) CIVITAI_HOME platform cache dir (~/.cache/civitai on Linux)
Offline (cache only) CIVITAI_OFFLINE off
Copy instead of symlink --no-symlinks (download) CIVITAI_DISABLE_SYMLINKS symlinks on
Disable progress bar --no-progress (download/base) CIVITAI_NO_PROGRESS progress on

The flags live on download/base; civitai info takes only --version-id/--json and reads the env vars for everything else.

How it works

A model URL resolves to one GET /api/v1/models/{id} call; the version is the URL's pinned modelVersionId (or the latest published one), and the file is that version's primary .safetensors unless you filter it. Downloads go only to civitai.com (the host is checked first) and authenticate with the Authorization header — httpx strips it on the cross-host CDN redirect, so the token never leaves civitai.com or lands in a URL. The download is SHA256-verified and lands in the cache:

$CIVITAI_HOME/
└── models/<modelId>/
    ├── blobs/<sha256>                      # content-addressed, deduplicated
    └── snapshots/<versionId>/<filename>    # symlink → ../../blobs/<sha256>

--local-dir then materializes a symlink (or copy) of the blob into the folder you choose.

For the full command/flag reference, cache details, troubleshooting, and exit codes, see docs/usage.md.

Docker

Prebuilt multi-arch images are published to the GitHub Container Registry on every release:

# inspect a model
docker run --rm ghcr.io/mr8bit/civit-ai-cli info 580857

# download into a host folder (mount it as the cache + output)
docker run --rm -v "$PWD/models:/data" \
  ghcr.io/mr8bit/civit-ai-cli download 580857 -o /data

# pass a token for gated content
docker run --rm -e CIVITAI_TOKEN="$CIVITAI_TOKEN" \
  ghcr.io/mr8bit/civit-ai-cli base 580857

The cache lives at /data inside the image (CIVITAI_HOME) — mount a volume there to persist downloads. Build it yourself with docker build -t civitai-hub ..

Development

pip install -e ".[dev]"
pytest                 # full suite (offline; httpx mocked with respx)
pytest tests/test_resolver.py::test_fp_selector -v   # a single test
ruff check src tests   # lint
CIVITAI_LIVE=1 pytest tests/test_live.py -v           # opt-in test against the real API

See CONTRIBUTING.md for the architecture overview and conventions, and docs/superpowers/specs/ + docs/superpowers/plans/ for the original design and implementation plan.

License

MIT © Artemiy Mazaew

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

civitai_hub-0.2.0.tar.gz (27.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

civitai_hub-0.2.0-py3-none-any.whl (20.7 kB view details)

Uploaded Python 3

File details

Details for the file civitai_hub-0.2.0.tar.gz.

File metadata

  • Download URL: civitai_hub-0.2.0.tar.gz
  • Upload date:
  • Size: 27.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for civitai_hub-0.2.0.tar.gz
Algorithm Hash digest
SHA256 8fb87d1ce2f51b08045aae4f8a3a8c065dc7fc7eef574f210441dd6368b68f1b
MD5 81f49b9e8ddbb5b133d9db211151d808
BLAKE2b-256 1e7f83ce560613f9e0bfb376947c159ba84ddd7aac642161b40165f5cb24c1f6

See more details on using hashes here.

Provenance

The following attestation bundles were made for civitai_hub-0.2.0.tar.gz:

Publisher: publish.yml on mr8bit/civit-ai-cli

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file civitai_hub-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: civitai_hub-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 20.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for civitai_hub-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4f0b3cc57f5b972da0ad44e1ea2c06f049e8f940fc7f8409b8cff3f31a09a209
MD5 966262df0223cc95848c1e1c25a3bc25
BLAKE2b-256 27313c159ef23c17aca6b5f274d67fe529a681288ee69c7c08cf83b9684fa73e

See more details on using hashes here.

Provenance

The following attestation bundles were made for civitai_hub-0.2.0-py3-none-any.whl:

Publisher: publish.yml on mr8bit/civit-ai-cli

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page