Skip to main content

Behavioral integrity layer for AI systems during training and inference

Project description

signAI

Runtime behavioral integrity monitoring for PyTorch models.

signAI adds a small monitoring layer around training and inference so you can detect suspicious model behavior in real time — without exposing model weights, raw inputs, or gradients. The production layer supports:

  • Local artifact mode with no server
  • Daemon mode (localhost:7731, auto-discovered by the SDK)
  • Self-hosted server mode
  • Air-gapped private deployment mode

What signAI detects

signAI monitors a model's behavioral fingerprint rather than its accuracy. It catches anomalies such as:

  • distribution shift in inputs or activations
  • gradient manipulation and targeted poisoning during training
  • unexpected output distribution changes at inference time

Detection is based on a conditional behavioral model (CBM): for each operating state S, signAI learns the expected behavioral response Z and flags deviations.

What is in this repo

  • signai/core/: research and scoring core
  • signai/core/extractors/: S/Z feature extractors for classifiers, LLMs, and custom models
  • signai/core/detectors/: detector registry (Mahalanobis, neural, association)
  • signai/client/: production SDK
  • signai_server/: standalone REST server for hosted and self-hosted scoring

Install

SDK only, local mode:

pip install signai

SDK plus server dependencies:

pip install "signai[server]"

SDK plus server plus Postgres support:

pip install "signai[server,postgres]"

For local development in this repo:

python -m venv .venv
.venv\Scripts\activate
pip install -e ".[server]"

Quick Start

Local mode (any classifier)

from signai import monitor

m = monitor.attach(model, num_classes=10)
m.calibrate(clean_loader, device="cuda", phase="inference", calib_batches=200)
m.save("./integrity.json")

Load and score:

m = monitor.load(model, artifact="./integrity.json", device="cuda")

for x, y in test_loader:
    result = m.score_inference(x, y)
    if result.flagged:
        route_to_fallback(x)

LLM / large model quick start

For models above 200M parameters or HuggingFace generative models, use LLMExtractor and IntegrityMonitor directly:

from signai import IntegrityMonitor, LLMExtractor

extractor = LLMExtractor(llm)
m = IntegrityMonitor(llm, num_classes=None, extractor=extractor, detector_kind="v1")
m.calibrate_inference(clean_loader, calib_batches=200, device="cuda")
m.export_json("./integrity_llm.json")

Score LLM inference:

m = IntegrityMonitor(llm, num_classes=None, extractor=LLMExtractor(llm), detector_kind="v1")
m.import_json("./integrity_llm.json")

for batch in eval_loader:
    result = m.score_input(batch["input_ids"], None, device="cuda")

Remote mode

Start the server:

signai-server serve --host 0.0.0.0 --port 8000 --storage ./artifacts

Connect the SDK:

from signai import monitor

m = monitor.attach(
    model,
    num_classes=10,
    endpoint="http://localhost:8000",
    api_key="",
    monitor_id="demo-model",
    device="cuda",
)
m.calibrate(clean_loader, device="cuda", phase="inference", calib_batches=200)
m.save("./integrity.json")

Detector Kinds

signAI ships three detector algorithms. Choose by setting detector_kind:

Kind Algorithm Best for
"v1" Conditional Mahalanobis (sklearn) general purpose; fast; no GPU required
"nn" Neural conditional monitor complex activation geometry; higher accuracy
"assoc" Blockwise association neural monitor high-dimensional behavioral spaces

Use v1 as the default. Use nn or assoc when you need finer discrimination on complex models.

from signai import IntegrityMonitor, ClassificationExtractor

# Neural detector
m = IntegrityMonitor(
    model,
    num_classes=10,
    extractor=ClassificationExtractor(model),
    detector_kind="nn",
)

Extractor Kinds

signAI uses an extractor plugin system to support different model types. The right extractor is auto-selected when you use monitor.attach():

Extractor Auto-selected when Description
ClassificationExtractor ≤200M params, classification CNN/ViT classifier; tracks gradient geometry and activation depth
LLMExtractor >200M params or HF generative Per-module L2 norm delta tracking; constant memory

To override auto-selection:

from signai import IntegrityMonitor, LLMExtractor

# Force LLMExtractor on a model below the size threshold
m = IntegrityMonitor(model, extractor=LLMExtractor(model), detector_kind="v1")

To implement a custom extractor for a novel architecture:

from signai import SignatureExtractorBase
import numpy as np

class MyExtractor(SignatureExtractorBase):
    def prepare(self, example_batch): ...
    def reset_state(self): ...
    def extract_training(self, logits, loss) -> tuple[np.ndarray, np.ndarray]: ...
    def extract_inference(self, x, y, device="cpu", use_sensitivity=True) -> tuple[np.ndarray, np.ndarray]: ...

Deployment Modes

1. Local artifact

m = monitor.load(model, artifact="./integrity.json")

2. Daemon (localhost:7731)

The SDK auto-discovers a running signai-server on localhost:7731. No endpoint config needed:

m = monitor.attach(model, num_classes=10)  # connects to daemon if running

3. Self-hosted

m = monitor.load(
    model,
    endpoint="http://signai.internal:8000",
    api_key="...",
    monitor_id="my-model",
)

4. Air-gapped

m = monitor.load(
    model,
    endpoint="http://10.0.1.5:8000",
    api_key="...",
    monitor_id="my-model",
)

Training Loop Integration

First calibrate for the training phase — optimizer and criterion are required:

from signai import monitor
import torch

optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
criterion = torch.nn.CrossEntropyLoss()

m = monitor.attach(model, num_classes=10)
m.calibrate(
    train_loader,
    device="cpu",
    phase="training",
    optimizer=optimizer,
    criterion=criterion,
)
m.save("./integrity_train.json")

Then score each training step after optimizer.step():

m = monitor.load(model, artifact="./integrity_train.json", device="cpu")

for x, y in train_loader:
    optimizer.zero_grad()
    logits = model(x)
    loss = criterion(logits, y)
    loss.backward()
    optimizer.step()

    result = m.score_training(logits, loss)
    if result.flagged:
        quarantine_update(result)

Inference Loop Integration

from signai import monitor

m = monitor.load(model, artifact="./integrity.json", device="cuda")

for x, y in test_loader:
    result = m.score_inference(x, y)
    if result.flagged:
        route_to_fallback(x)

Public API

Top-level exports from signai:

Symbol Description
monitor.attach(model, num_classes, ...) Create a new monitor
monitor.load(model, artifact, ...) Load from artifact or remote
Monitor Monitor class with calibrate, save, score_inference, score_training
MonitorResult Score result dataclass
IntegrityMonitor Advanced: unified monitor with extractor + detector_kind params
SignatureExtractorBase Advanced: ABC for custom extractor plugins
ClassificationExtractor Classifier extractor (CNN, ViT, HF classification)
LLMExtractor LLM extractor (generative transformers, >200M param models)

Run The Server

CLI

signai-server serve \
  --host 0.0.0.0 \
  --port 8000 \
  --storage ./artifacts \
  --store-backend file

Shortcut through the main CLI:

signai serve --host 0.0.0.0 --port 8000 --storage ./artifacts

Docker

docker build -t signai .
docker run -p 8000:8000 -v %cd%\artifacts:/data signai

docker-compose

docker compose up --build

Licensing

All usage requires a license key. A bundled trial key is active on fresh installs — no purchase needed to get started.

signai apply-key sk_...    # activate or renew a key
signai status              # show seat, plan, features, expiry, usage

Visit https://umarjanjua.github.io/signai/ to purchase or renew.

API Summary

Server endpoints:

  • GET /health
  • POST /v1/artifacts
  • GET /v1/artifacts/{monitor_id}
  • DELETE /v1/artifacts/{monitor_id}
  • POST /v1/score/inference
  • POST /v1/score/training
  • POST /v1/score/batch
  • POST /v1/calibrate/start
  • POST /v1/calibrate/push
  • POST /v1/calibrate/commit
  • GET /v1/history/{monitor_id}
  • POST /v1/notify/configure
  • GET /v1/audit/export
  • GET /v1/status
  • GET /v1/monitors
  • POST /v1/license

Model Support

Framework Status
PyTorch (CNN, ViT, ResNet, etc.) ✅ Supported
HuggingFace Transformers (BERT, GPT, LLaMA, etc.) ✅ Supported
Custom PyTorch architectures via extractor plugin ✅ Supported
TensorFlow / Keras Planned
JAX / Flax Planned
ONNX Planned
XGBoost / LightGBM / CatBoost Planned
PyG / DGL (graph neural networks) Planned

Privacy Model

signAI is built so that privacy is enforced structurally:

  • feature extraction runs on the customer machine
  • remote scoring receives only s and z float vectors (compact; typically <100 bytes per score call)
  • the server discards raw vectors after scoring
  • only {ts, score, flagged, phase} is stored in history
  • model weights, raw inputs, and gradients never leave the customer machine

Documentation

Development Notes

Run the targeted test suite:

python -m pytest tests\test_imports.py tests\test_local_backend.py tests\test_monitor.py tests\test_server.py

License

AGPL-3.0 for open-source use. Commercial licensing available for closed-source distribution.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

signai_sdk-0.4.4-cp313-cp313-win_amd64.whl (4.3 MB view details)

Uploaded CPython 3.13Windows x86-64

signai_sdk-0.4.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

signai_sdk-0.4.4-cp313-cp313-macosx_11_0_arm64.whl (4.4 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

signai_sdk-0.4.4-cp313-cp313-macosx_10_13_x86_64.whl (4.5 MB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

signai_sdk-0.4.4-cp312-cp312-win_amd64.whl (4.3 MB view details)

Uploaded CPython 3.12Windows x86-64

signai_sdk-0.4.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

signai_sdk-0.4.4-cp312-cp312-macosx_11_0_arm64.whl (4.5 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

signai_sdk-0.4.4-cp312-cp312-macosx_10_13_x86_64.whl (4.5 MB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

signai_sdk-0.4.4-cp311-cp311-win_amd64.whl (4.4 MB view details)

Uploaded CPython 3.11Windows x86-64

signai_sdk-0.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.0 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

signai_sdk-0.4.4-cp311-cp311-macosx_11_0_arm64.whl (4.5 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

signai_sdk-0.4.4-cp311-cp311-macosx_10_9_x86_64.whl (4.5 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

signai_sdk-0.4.4-cp310-cp310-win_amd64.whl (4.4 MB view details)

Uploaded CPython 3.10Windows x86-64

signai_sdk-0.4.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

signai_sdk-0.4.4-cp310-cp310-macosx_11_0_arm64.whl (4.5 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

signai_sdk-0.4.4-cp310-cp310-macosx_10_9_x86_64.whl (4.5 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

File details

Details for the file signai_sdk-0.4.4-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: signai_sdk-0.4.4-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 4.3 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for signai_sdk-0.4.4-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 399d1f927e9e0df4c35996fd11bc980418d940200e740e52ca0b94957de2d577
MD5 7c15fe7daf9055a7a206691af3154e04
BLAKE2b-256 525ff355eb3650d632845057300791f7af6f4a29bba91dd9f4bda60c7ff64eb3

See more details on using hashes here.

File details

Details for the file signai_sdk-0.4.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for signai_sdk-0.4.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 54ead7f1dcba34484adc4483f10c443bec874cfe69536c36f498d0e5af258ed2
MD5 df4722a86cb78bc286c9a633c37e26f7
BLAKE2b-256 4372c10ea68d5ca70898585640b841bb25d3b7f12ee87f20733a04762d49e298

See more details on using hashes here.

File details

Details for the file signai_sdk-0.4.4-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for signai_sdk-0.4.4-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cf157682263c1924d6d1702958a96af2548e5bafd955d62ab13909a45cf763d7
MD5 49bc90a7b66ed0baed0bafbcff108ce0
BLAKE2b-256 92ef419e92d52936456d0c2ee2a2966ad263434b5ff4560cc5dc6a5a5e9ce50a

See more details on using hashes here.

File details

Details for the file signai_sdk-0.4.4-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for signai_sdk-0.4.4-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 5b282cb90cdd162274b5be529bfb4a43f30fe6c475a75c6204acced6de956351
MD5 2a7e1e2d35c99b167a533b05cba326ae
BLAKE2b-256 919eeea05b1b32974053530b75d3210c8ccbb8a0d02af8dea68e1be07d3a5f4c

See more details on using hashes here.

File details

Details for the file signai_sdk-0.4.4-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: signai_sdk-0.4.4-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 4.3 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for signai_sdk-0.4.4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 b71c54b00099b20a7bf5da619087dcc4a391360dce27cb7d6eb24a8f39669cf5
MD5 f1683b5cca5a6fa706b40b44f53d6e4c
BLAKE2b-256 30eaf21cb08e5eaf0d7f8afe494a4e3b6b5e1604b1139aa175ab2225ebea529b

See more details on using hashes here.

File details

Details for the file signai_sdk-0.4.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for signai_sdk-0.4.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 19ae42e27ee2e09a4906ade81d0ca1e74b2c6f5e64c1c97d4c1fef1a2f3fa36b
MD5 0a28f2b9416e1ee251219694c0b0cc31
BLAKE2b-256 82cfb68beaef9503f2974ac1dddbb71972faaf30e4a92ec3c2491dc06e55414f

See more details on using hashes here.

File details

Details for the file signai_sdk-0.4.4-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for signai_sdk-0.4.4-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b50380285b455e181ebf1ca173f221b8f077025d31c8dabca1e690d54f3d5ff4
MD5 8bee82af2ccc8955802af894d0d7b1af
BLAKE2b-256 13113113b670c16e420ae21985025bba1ab807889cef3f53f6c680f240f5baeb

See more details on using hashes here.

File details

Details for the file signai_sdk-0.4.4-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for signai_sdk-0.4.4-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 9fb99ed893844a11dea987ce61468692a89d22609bf75a2c6643ba5e50788750
MD5 59f70a1b2031948cc5693d8791482cff
BLAKE2b-256 57b10bda2e5afb430a6afb9e9c3aafd4ac91173ab6d50b9b6ea1dbebfd72993f

See more details on using hashes here.

File details

Details for the file signai_sdk-0.4.4-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: signai_sdk-0.4.4-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 4.4 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for signai_sdk-0.4.4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 499e97c716fd2291df9d349b9372bdf06db27e9efc980898e33553656005da1c
MD5 5a2823d60bdc0b7334d7f5655236abbd
BLAKE2b-256 f4b988a4286ffd7b640cc24ba10f676840386f58abddf0ddb87dece6f1009f43

See more details on using hashes here.

File details

Details for the file signai_sdk-0.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for signai_sdk-0.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 72bc2e3ee6e64d3ea22cdc0cd4681ed4657c1d89de1e30998ce18e03c8114fe5
MD5 b963d8c52900d6fb21431cd50823a99f
BLAKE2b-256 595d840309e1b1a0c8c9d55f2974d7342b2d9d25505c8ccdef37bcbed94643d5

See more details on using hashes here.

File details

Details for the file signai_sdk-0.4.4-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for signai_sdk-0.4.4-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 24b17caf9e2a9a0a4e9db20e9670c26afc4cd253c7bc6993ae8fd4feb1926ef7
MD5 3d83aa9b385b3e832455fd667a051cd3
BLAKE2b-256 df233003a7f3b2c63d5e9cd4b7e457c4acd6dd4f744427e1ea99bc66e643e394

See more details on using hashes here.

File details

Details for the file signai_sdk-0.4.4-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for signai_sdk-0.4.4-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 69b29894c74522c324e0e8983df376818d5fc95bea4163daa1be9e05b22271f6
MD5 a09f6783d6b03d5ada12f94f76a2a067
BLAKE2b-256 72913380ad42f8950321405eaf77c146676871e7fa367a8e31c7fb011ce88ecc

See more details on using hashes here.

File details

Details for the file signai_sdk-0.4.4-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: signai_sdk-0.4.4-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 4.4 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for signai_sdk-0.4.4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 ded4a36eeeb481300df32c015e2f6f3581d11dee1a0becc073eb3f49c50e74b6
MD5 d27d6828baccde2bfe14cf821ae3eac0
BLAKE2b-256 9803beb22b7b82731d43cf139525c69c39b6ee50d05c2850c7f7fc7509f87d79

See more details on using hashes here.

File details

Details for the file signai_sdk-0.4.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for signai_sdk-0.4.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a2c235f891d49f9d3f42885263f11fd596a4dc2c719b638c0dc375c36111987f
MD5 9e50d2a008dfd74d37ec825428b92c9b
BLAKE2b-256 0e152f63228af63872d6a914228d83887531967f698fd9dfe72a72fae30b377d

See more details on using hashes here.

File details

Details for the file signai_sdk-0.4.4-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for signai_sdk-0.4.4-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d6d0672f48d725576173e76229ec47a7c449b4c730297e642d140be2b865e421
MD5 d1c050c87e10fd56f9aa138e9c72f823
BLAKE2b-256 5e73cdf2ca3caeb3d77ebaf5df72d9143b5b6830c9f1c8dfffd78ddd58872556

See more details on using hashes here.

File details

Details for the file signai_sdk-0.4.4-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for signai_sdk-0.4.4-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8e1b544c42f0e1a33bc5365130bd7348c1a5172e6b915a6e018067ee867a0571
MD5 d822c9e090ab9cbbf7062216d34df25e
BLAKE2b-256 46e95a46b89cc3da8a5f0f9fba809cd7df3212c97d9a646456f9ab0d5fd49d35

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