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

Uploaded CPython 3.13Windows x86-64

signai_sdk-0.4.5-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.5-cp313-cp313-macosx_11_0_arm64.whl (5.8 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

signai_sdk-0.4.5-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.5-cp312-cp312-win_amd64.whl (5.7 MB view details)

Uploaded CPython 3.12Windows x86-64

signai_sdk-0.4.5-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.5-cp312-cp312-macosx_11_0_arm64.whl (5.9 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

signai_sdk-0.4.5-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.5-cp311-cp311-win_amd64.whl (5.7 MB view details)

Uploaded CPython 3.11Windows x86-64

signai_sdk-0.4.5-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.5-cp311-cp311-macosx_11_0_arm64.whl (5.9 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

signai_sdk-0.4.5-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.5-cp310-cp310-win_amd64.whl (5.7 MB view details)

Uploaded CPython 3.10Windows x86-64

signai_sdk-0.4.5-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.5-cp310-cp310-macosx_11_0_arm64.whl (5.9 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

signai_sdk-0.4.5-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.5-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: signai_sdk-0.4.5-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.5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 90a9997bb2f486149697ed6a6ccdd9349434efc6edcc3f0accb088e14c5fe79d
MD5 486683ba40173d8ea56ac17142d94e27
BLAKE2b-256 fb02bb11f40fb4827c824f2c6c562a097437ecd6e7ec41886beb6b9ed9a6d5f2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 02b6b50bf96241d4e55baf57ddd96b96f8467559b69cbd8422d405e03628d022
MD5 6b79739ea20fd465974d102bacf102e0
BLAKE2b-256 556ba9e30d6b2f8703e14db0c2e200f3e16031b4bb853a55437f8636afc98320

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.5-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 face0b0dd6eac8a37f13827dbcbee16e1fb13aa489ea0366a1690697dfee9a7c
MD5 124f8009aeb16f18074c1f7a9be2af68
BLAKE2b-256 afbaad984838f2502ff4e7804ade123a4d5eb4d6a45892a4e36492fe4686025a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.5-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 22751783c52978758ff538fa919ee8f8cf24eb4174d862a744964a369d5a1e74
MD5 3a6738e6f5f2449271e22d2adad1c251
BLAKE2b-256 62695e9ec79b9d29da94c5e0eb883de0dbd73d45cf464b0930014f32475155d9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: signai_sdk-0.4.5-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.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 2547f7f2b43fa93e1c4b52ad07aa9a14735af86835e2bdb5a280e29a5a7f50d3
MD5 aee1a27d704456d35feff633b747ca1b
BLAKE2b-256 2876ce84e0596fc96a3f61aae4bc21ffd5a7aa26db6590cf179f33c2f40f2d29

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5d8c6cca9ca9d181af7ea0398e6fc9fbc4d2ad0b1a972d4399c38deb82aedcd1
MD5 51cb00c1e7c050a0838c3c63dae37083
BLAKE2b-256 ec7211bbb0b871bc26e8b546f08f7740f354845abc1b37798e8ee9b90de69303

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.5-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e63d03dd003546cad4682afffcd9b0ec0afdc82a2c2369f1623e62672917a696
MD5 5d064c4a2f5892367204dad8eadf4a2d
BLAKE2b-256 b19dcb861d0df7e0c001d753f8490b2805c77e6e39d033ec5f0166bc1c86cf58

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.5-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 a04a25a33849bee66175292dc2d6aa967ae4eb1997987c2f9a3012d459a4bf0a
MD5 21793d02c0c92f17c66e77705e795eb9
BLAKE2b-256 8eb369a2d007f4bb0a5e4c02e3526e14e4fe7d4e00a567b3046cfa98543bab55

See more details on using hashes here.

File details

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

File metadata

  • Download URL: signai_sdk-0.4.5-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.5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 a0f1d3bedc1079b6132e04c56c0f56c40a4fd05f1cf9a95cc4caddf1d9a02e7f
MD5 5d272f790c2f22c567d6528df87338f3
BLAKE2b-256 647b8aa1a9c6e195f3c057671c7a52f1329e093fb9d0b315b0e0d00b865dc09a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 95483a4cacf449323332f19cbc004819bb8df7dfa43d4da91d1a2d46a6fcab6b
MD5 6a5182510f111aa30bee9f6a1a6915d8
BLAKE2b-256 f408c696745b1ed39ddd690262a5e20bbdb18a487a913bf93b58d9847b76651e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.5-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d23a09a51df0cd780edbdf8251b353f9f75d3d27d63c4e77417f4197aaacaaf7
MD5 f8d6d0c49a694a023083667963c57421
BLAKE2b-256 bb315ed07114714c7624fe9a4772c293cd0373a921c58134dd84c8e6cd3f8589

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.5-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1bec699492eabed8e8eea055a17509cc74f7acb0853f51ec3e55c47fe7f40bfe
MD5 2d391aefc1471bf65100fb177ed816f2
BLAKE2b-256 84fcbf43abf47bc4093e9ed2fab0e89f7a27729a535d885348e5a0d418c7531c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: signai_sdk-0.4.5-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.5-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 167a6bbc9f4def384e6ddb13a9f31470450baf018007acf2fb7127476f88b9a6
MD5 252f5ec79425ea2b6ae4c07e9c970e95
BLAKE2b-256 385e249df16a081bc49a444b9e6238707845e0ed4f0c0375e172af659b6981e4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fdd9111d6461e8f7624101433e8173949132ac13b679c80170933aba27b2ed86
MD5 7e5faa82e380b899a79c5b8083e7cfe5
BLAKE2b-256 e001ce242adcdf27eac75c891719f684f94ffee78048bded46ba69cb68a61dbc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.5-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5925da861657ffb210fd5a6bf2d5e9d8739a8b41104546b1ea9e0331e6225748
MD5 d757b83304484619a60974148892a68d
BLAKE2b-256 a47a0b739c89427b3ec33be979bfc73f09363bca9c0eee65bbb25bf432165303

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.5-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 af17f23341dbf87e83ecbfa66357550085b7b191b7f2d6bbcbbb32cd42565750
MD5 0f4b78d83b50e176c463916bc97ae5f4
BLAKE2b-256 3ed9201dc51098d2c08c7f7a837878ccb5df7a981741303ab2bd33767455f6db

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