Skip to main content

License-gated, encrypted-model SDK for on-prem AI services.

Project description

Licantha SDK

License-gated, encrypted-model SDK for on-prem AI services.

The SDK validates a customer's license against a Keygen.sh server (or an offline Ed25519-signed .lic file for air-gapped deployments), activates this machine, runs a background heartbeat, and decrypts AES-256-GCM encrypted model files using keys delivered through license metadata.

✨ Features

  • Online activation against a self-hosted Keygen server (SecureClient)
  • Offline / air-gapped mode via signed .lic files
  • AES-256-GCM model envelope with embedded model_id for multi-model licenses
  • Background heartbeat daemon with clean SIGTERM-safe shutdown
  • Pluggable KeyProvider abstraction (lease today, GPU-attestation tomorrow)
  • Pydantic-validated config (SecureClientConfigPM) and .env loader (SecureClientCliConfig)
  • Self-contained example mini-apps for every flow

🛠 Installation

1. 🚧 Prerequisites

[OPTIONAL] For DEVELOPMENT environment:

2. 📥 Download or clone the repository

[TIP] Skip this step, if you're going to install the package directly from PyPi or GitHub repository.

2.1. Prepare projects directory (if not exists):

# Create projects directory:
mkdir -pv ~/workspaces/projects

# Enter into projects directory:
cd ~/workspaces/projects

2.2. Follow one of the below options [A], [B] or [C]:

OPTION A. Clone the repository:

git clone https://github.com/humblebeeai/int-sdk-python-licensing.git && \
    cd int-sdk-python-licensing

OPTION B. Clone the repository (for DEVELOPMENT: git + ssh key):

git clone git@github.com:humblebeeai/int-sdk-python-licensing.git && \
    cd int-sdk-python-licensing

OPTION C. Download source code:

  1. Download archived zip file from releases.
  2. Extract it into the projects directory.

3. 📦 Install the package

[NOTE] Choose one of the following methods to install the package [A ~ F]:

OPTION A. [RECOMMENDED] Install from PyPi:

# Install from staging TestPyPi:
pip install -i https://test.pypi.org/simple -U licantha-sdk

# Or install from production PyPi:
# pip install -U licantha-sdk

OPTION B. Install latest version directly from GitHub repository:

pip install git+https://github.com/humblebeeai/int-sdk-python-licensing.git

OPTION C. Install from the downloaded source code:

# Install directly from the source code:
pip install .

# Or install with editable mode:
pip install -e .

OPTION D. Install for DEVELOPMENT environment:

pip install -e .[dev]

# Install pre-commit hooks:
pre-commit install

OPTION E. Install from pre-built release files:

  1. Download .whl or .tar.gz file from releases
  2. Install with pip:
# Install from .whl file:
pip install ./licantha-sdk-[VERSION]-py3-none-any.whl

# Or install from .tar.gz file:
pip install ./licantha-sdk-[VERSION].tar.gz

OPTION F. Copy the module into the project directory (for testing):

# Install python dependencies:
pip install -r ./requirements.txt

# Copy the module source code into the project:
cp -r ./src/licantha_sdk [PROJECT_DIR]
# For example:
cp -r ./src/licantha_sdk /some/path/project/

🚸 Usage/Examples

Simple

examples/simple/main.py:

# Standard libraries
import sys
import logging
from pathlib import Path

# Third-party libraries
from dotenv import load_dotenv

# Internal modules
from licantha_sdk import LicenseError, SecureClient, SecureClientCliConfig


HERE = Path(__file__).parent
load_dotenv(HERE / ".env")
logger = logging.getLogger("quickstart")


def serve(weights: bytes) -> None:
    logger.info(f"model loaded — {len(weights)} bytes")


def main() -> int:
    logging.basicConfig(level=logging.INFO)

    _config = SecureClientCliConfig()  # picks up LICANTHA_SDK_* from .env / env
    with SecureClient(config=_config) as _client:
        try:
            _weights = _client.decrypt_model(str(HERE / "model.encrypted"))
        except LicenseError as _e:
            logger.critical(f"cannot start: {_e}")
            return 2
        serve(_weights)
    return 0


if __name__ == "__main__":
    sys.exit(main())

See examples/ for offline / custom-inference / multi-model / manual-lifecycle / error-shape variants.


⚙️ Configuration

Production callers construct SecureClientConfigPM explicitly — they do NOT pull env vars from inside a compiled binary:

from licantha_sdk import SecureClient, SecureClientConfigPM

config = SecureClientConfigPM(
    account_id="...",
    license_key="...",
    public_key="...",   # 64-char hex Ed25519
    app_id="my-product",
    api_url="https://licensing.your-company.com",
)
with SecureClient(config=config) as client:
    weights = client.decrypt_model("model.enc")

Dev / examples can load from .env via SecureClientCliConfig instead.

🌎 Environment Variables

.env.example:

# Required:
LICANTHA_SDK_ACCOUNT_ID=
LICANTHA_SDK_LICENSE_KEY=
LICANTHA_SDK_PUBLIC_KEY=

# Optional:
# LICANTHA_SDK_APP_ID=licantha-default
# LICANTHA_SDK_API_URL=https://licensing.your-company.com
# LICANTHA_SDK_OFFLINE_LICENSE_PATH=./license.lic
# LICANTHA_SDK_HEARTBEAT_INTERVAL=60
# LICANTHA_SDK_DEACTIVATE_ON_EXIT=true

🧪 Running Tests

To run tests, run the following command:

# Install python test dependencies:
pip install .[test]

# Run tests:
python -m pytest -sv -o log_cli=true
# Or use the test script:
./scripts/test.sh -l -v -c

🏗️ Build Package

To build the python package, run the following command:

# Install python build dependencies:
pip install -r ./requirements/requirements.build.txt

# Build python package:
python -m build
# Or use the build script:
./scripts/build.sh

📝 Generate Docs

To build the documentation, run the following command:

# Install python documentation dependencies:
pip install -r ./requirements/requirements.docs.txt

# Serve documentation locally (for development):
mkdocs serve -a 0.0.0.0:8000 --livereload
# Or use the docs script:
./scripts/docs.sh

# Or build documentation:
mkdocs build
# Or use the docs script:
./scripts/docs.sh -b

📚 Documentation


📑 References

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

licantha_sdk-0.1.0.tar.gz (25.6 kB view details)

Uploaded Source

Built Distribution

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

licantha_sdk-0.1.0-py3-none-any.whl (26.3 kB view details)

Uploaded Python 3

File details

Details for the file licantha_sdk-0.1.0.tar.gz.

File metadata

  • Download URL: licantha_sdk-0.1.0.tar.gz
  • Upload date:
  • Size: 25.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.20

File hashes

Hashes for licantha_sdk-0.1.0.tar.gz
Algorithm Hash digest
SHA256 4cfd3d6d917808414fdb7d031b76e390fc2f36d5ee5aca885bb5b218aca55b9b
MD5 db13ced3d1cffa3d72571f0d55ae884c
BLAKE2b-256 15c2fdce2a1e9bcdcb733a636c1ddad2d1392d559d6058a5ed2c09782a6ac54e

See more details on using hashes here.

File details

Details for the file licantha_sdk-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: licantha_sdk-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 26.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.20

File hashes

Hashes for licantha_sdk-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e7551baf2380ae95e281164a8bb7bf6f6cb80d68d2358bd2cdda9f36c72110be
MD5 96dcf0cca056062e49867e6bbe0dd63e
BLAKE2b-256 40b83e5895d15b96e82f3de61a12d3e78c4be02dcb207b9d99e9e15413837233

See more details on using hashes here.

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