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.8-cp313-cp313-win_amd64.whl (5.7 MB view details)

Uploaded CPython 3.13Windows x86-64

signai_sdk-0.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

signai_sdk-0.4.8-cp313-cp313-macosx_11_0_arm64.whl (5.8 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

signai_sdk-0.4.8-cp313-cp313-macosx_10_13_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

signai_sdk-0.4.8-cp312-cp312-win_amd64.whl (5.7 MB view details)

Uploaded CPython 3.12Windows x86-64

signai_sdk-0.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (16.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

signai_sdk-0.4.8-cp312-cp312-macosx_11_0_arm64.whl (5.9 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

signai_sdk-0.4.8-cp312-cp312-macosx_10_13_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

signai_sdk-0.4.8-cp311-cp311-win_amd64.whl (5.7 MB view details)

Uploaded CPython 3.11Windows x86-64

signai_sdk-0.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.8 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

signai_sdk-0.4.8-cp311-cp311-macosx_11_0_arm64.whl (5.9 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

signai_sdk-0.4.8-cp311-cp311-macosx_10_9_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

signai_sdk-0.4.8-cp310-cp310-win_amd64.whl (5.7 MB view details)

Uploaded CPython 3.10Windows x86-64

signai_sdk-0.4.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

signai_sdk-0.4.8-cp310-cp310-macosx_11_0_arm64.whl (5.9 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

signai_sdk-0.4.8-cp310-cp310-macosx_10_9_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: signai_sdk-0.4.8-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 5.7 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.8-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 fcae6364f256984c4cc162e4a0a3b11e00692bd93857111f97e059fce493fb5d
MD5 c6338aab1d394304484644e98c93da3d
BLAKE2b-256 69f58eae539725010f3e909f3cbd4568a142e22f3da48559506a7386765486ad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e77022a5d8ebf31df8f364072809345eabe666740688279ca8ba98d23d50fe37
MD5 9b1390c2ea237583e1f13cf40eac6cb2
BLAKE2b-256 2429bca965f1aef994a4498ef15c0e1a1b230d7d561e29d31d61430428de2e33

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.8-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fb6f620072463847b6a576107cf51a06f74d24d4ba3527299d866e425012da79
MD5 457eb0cf79e3d099d062dbc8f443f214
BLAKE2b-256 4a45ff07684b045260a32322b878cf7cd52adc6afe2f59076d07094d3bcc8838

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.8-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 82edefafcad5c012d5197393c934c6e8db66f0284546badfd54c37b2447c3bec
MD5 767b316ae92efc436ec542c8df1daf85
BLAKE2b-256 8bba70dc69db86e49eaaca296f7b5068c1a2577824bf1597d52b49ea1861e49c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: signai_sdk-0.4.8-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 5.7 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.8-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d55c8e1bd3abfb18e79c508f7e59116ea9851ca32a54fc8c9520eb521e51c35a
MD5 a2b60060c2f778506d183631e626ab6e
BLAKE2b-256 9d961c787f3bd6f2fbcf7a6f57700b0c5238ef30be901b09e5cf42f8bc96e040

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d4b1eb42f2e8e9feb24e133569a32a4e53e3db7f2b93ffc7d71607e9edd86362
MD5 5e4c6d272ed183515cbe37f506bfaa91
BLAKE2b-256 da940c7df28a35e2de0c38ab6de6e3710ab53211112fba64cd9318fb487f4904

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.8-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 96302ddaac8f833306ad14899684791eeeb7fbccfe736ac5848a797fa54089c1
MD5 7397f14b381f54f962126656de99e367
BLAKE2b-256 0c062ae581a6a4cc83ccaf04d7ec757d38e7da2cc04930dba15e181a158b63e8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.8-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 3aee9f0cb9993dbede2f2ade93d4c5e332c51f9b563794db29d5220063783de4
MD5 5edc47451a7b240ea2554a23f7ff7dfd
BLAKE2b-256 28c83282fce3653def49a436a1f4faf0eca6953b72ec71b93419e4091099a795

See more details on using hashes here.

File details

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

File metadata

  • Download URL: signai_sdk-0.4.8-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 5.7 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.8-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 90f734e4b666f0e5ebc234deb0fc5a167445e20b4ca72d1e4c443e2a12f5d989
MD5 e836930313e19beef4660ea0e2de3a08
BLAKE2b-256 1b2ba258316eeecc0ce2c1788a4194d4675e5696edcb5d0566819559d5c1cbba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 df0657add9f94c207e30916140071002fe691b81e60835c460aa8c68319bb65f
MD5 422c12dae1cfb7a88a69b396a5f8ceaa
BLAKE2b-256 9238493b2f0e13ab857ac88acd710dc8897bc5c49f0b13634e3af1688fce704d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.8-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f0ac39f3fbf6f3fa2d71ce445605975beab3df6962ad3f21ef57efa0fb5cdc53
MD5 c8101d2256003d323f6cb97c5bc8bd6d
BLAKE2b-256 11b38d776f5f0e30483591b0906655c685aa6d7b6a776bc5d4bea8f09d4bde8d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.8-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 26b84690c64a26ec0b9511bde8896b0e0958af3274c3ab2e9192a2d4aa8a4995
MD5 bb6b5785a01ee233c700ffe26c9c61a1
BLAKE2b-256 2bbf5c62277a5d6a91b1c9fdc68106fc9cb5c781d728b078229129a4f6fa9bf1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: signai_sdk-0.4.8-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 5.7 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.8-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 1ac133048ca6ad03446b1b05336ca24b3da38a8ce6c0436df4bd50e36f50ff65
MD5 15e2231b9a11069b24cf2ab0b8308597
BLAKE2b-256 9c96a1aa2b60520144d81153f281c780916526fd2c5a70c5fc6263b28be026ea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b833d794e03630f9b94a9906c33dc5e1aa397cab0767d1810a58b65948fcf284
MD5 e37bc078a7813f01f9d37fab2f765ffc
BLAKE2b-256 9fb2b76960029c781636405ab824a169b7a4c0f40aab03a77fcd4127a3a50fc9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.8-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1471a32d354e59cd1147d75292ad0e2913085773a16fbbd6f1fc55f6118add40
MD5 93985c74d175c70e5108e3de3608dd2c
BLAKE2b-256 a396e5891c1e0298efef4b13ce6c50f68e5077203727150e353b6ecd5e2c2f42

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.8-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0845293da130e085b331e1e9cd73cb55b2a5db07a392eb1827e46704275272c4
MD5 d70917da4a8f4099c305a90c90920c64
BLAKE2b-256 6e10accdd1b27515a432dcffb13f12301de28753ff1b95e5a5277022e648bbcc

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