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

Uploaded CPython 3.13Windows x86-64

signai_sdk-0.4.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

signai_sdk-0.4.9-cp313-cp313-macosx_11_0_arm64.whl (5.6 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

signai_sdk-0.4.9-cp313-cp313-macosx_10_13_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

signai_sdk-0.4.9-cp312-cp312-win_amd64.whl (5.4 MB view details)

Uploaded CPython 3.12Windows x86-64

signai_sdk-0.4.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

signai_sdk-0.4.9-cp312-cp312-macosx_11_0_arm64.whl (5.6 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

signai_sdk-0.4.9-cp312-cp312-macosx_10_13_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

signai_sdk-0.4.9-cp311-cp311-win_amd64.whl (5.5 MB view details)

Uploaded CPython 3.11Windows x86-64

signai_sdk-0.4.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (14.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

signai_sdk-0.4.9-cp311-cp311-macosx_11_0_arm64.whl (5.6 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

signai_sdk-0.4.9-cp311-cp311-macosx_10_9_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

signai_sdk-0.4.9-cp310-cp310-win_amd64.whl (5.5 MB view details)

Uploaded CPython 3.10Windows x86-64

signai_sdk-0.4.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (14.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

signai_sdk-0.4.9-cp310-cp310-macosx_11_0_arm64.whl (5.6 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

signai_sdk-0.4.9-cp310-cp310-macosx_10_9_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: signai_sdk-0.4.9-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 5.4 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.9-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 43746b7f4159ed00ddfc5fed3dbc87fd3e2fd42721c1d02e97bba54cc3277e95
MD5 78f0d6f6e17f450ab43fc6e9565d7bd7
BLAKE2b-256 56a293b66d1caf81243a934a67dfee275b65b2d86a016f8f6e938eeeba14db18

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d28d12dc0b1627649157ad275f35520bc48970d934f0db6ea498d0be82083663
MD5 a8d3559c1172b1ba3fbc5545a392b1cf
BLAKE2b-256 7c9751a1fbf5d6ece801f68a909503751ff562fd80d4698ed18c472bcb614193

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.9-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b98c258d830b7b0bd0364df0274cd3610c56ccfb3c6c36dd273624396c8f973e
MD5 bdcb02fd628c78b327649bd9d501ca62
BLAKE2b-256 344d79ee9040c7da2b035190b7bd7b1d6edd157832a05d16b2c652ab29119d02

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.9-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 8af6b5f12839922539770babf406b312c17a824b59915cb1cc55e8d94f647780
MD5 3a152c699780f2a1c87e9e6a76114518
BLAKE2b-256 254686fce8d51003a732e43769190ed9859faf480ff04efc06d9d91a894d77e3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: signai_sdk-0.4.9-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 5.4 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.9-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ef51cda8eb430ac34ae170fe37200270382b8ba7513c0e94035fba71315c036f
MD5 51ca5fd0cb0e959a07f03ed166f71143
BLAKE2b-256 099a0184c123c93aa00aac756aab89efe5af882dcfc081afd1769f5e061dfb8d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c36c1101c3273b554ff344fda948763d1ef12289885417ff039e4e1d5e108806
MD5 9160a0d6bf1ea3f186e3afc312044743
BLAKE2b-256 a606b2555644d905f5d9e9d99ae7b21d887202e9354c48806252ac5e2f441c7e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.9-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d21e44f4830b573f0797bbf75003bd877c33714da65292bb7b62737abe603a3e
MD5 3fc4b81bda1134efba1d6e5048e2872e
BLAKE2b-256 0b7033cbc233ecd2da24cf9de662db1a5932250e37f8d6c22cb0f113b5be0d64

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.9-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 2632902772850fc1481a36dfb50f9f35d6d92541d2a09e09be7ab63d0b5aec16
MD5 2b671cf9391bf59bd2b30642c3b7b7cb
BLAKE2b-256 bf9204443f0225fe9adf31a757f3fcb8b8b1790ae0c35256ffb19a77aa0de304

See more details on using hashes here.

File details

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

File metadata

  • Download URL: signai_sdk-0.4.9-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 5.5 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.9-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 fcf6ecc2aed254aecd5b9f8a2e7da6ac51509c6208c8c3b5b6a7f4043fc5eb2d
MD5 5ee97a8d800d51a43b537aaa12538bba
BLAKE2b-256 39c2e9c481cf514f8b3f840cfc3110c90edff4c6c48096b9c38106964d721f0e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dc043cbdabe59f5eb7b99a1407ae7eaf5ae00365f25e6cb0cf8447aade86e96e
MD5 2596f5afb749c13e4258254f810a6a69
BLAKE2b-256 a4e6dec7e7854906c705eb6ba89e687d19141b717edc38131bd52460b1e54863

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.9-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 44ffd040fb0dbd6f51da95914ce93e58217aec5f8c71524bdafd1022949978f5
MD5 255d1fa75f9bd92edecb4a2172111c66
BLAKE2b-256 d0cb699decd0c38b7835935fc351a74fb7592a88f727c3e5a70f714e46478dc2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.9-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 9688aba9c9ae0bdf337548632b490ee14dba57695cf9a9edeab78c5cae611996
MD5 619283a63d655f4c642b06c001cf7951
BLAKE2b-256 cfed01d684741dd7c57dcc3c4fee8874535da0bf94018fbf184bb52f62c71eaa

See more details on using hashes here.

File details

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

File metadata

  • Download URL: signai_sdk-0.4.9-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 5.5 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.9-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 3dddebb8f51254138e90460555dbfecee22426bd790bcb861226b779fcc6d4a2
MD5 dd3db564c0b652b2f3e9e3d37284df82
BLAKE2b-256 ad7181bf901f06108852bece926d4260eb0541d7a138566cdb662a85df5abc57

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7f4a73b49279c88fcff69b22f63bd349f87a5433d00aafcca372b840611560f6
MD5 bd2854f9853cfcf8242b65794005017d
BLAKE2b-256 e0eb5905a0626772630560f2d409f0d74e9df6a69760df266679e26a41c5a1fd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.9-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e0ef387dfbfe1f486be35a31521ad88f99bde0242a610088c8828841c2536e77
MD5 d787897b81439f0baa0fafced20b16fd
BLAKE2b-256 b53995477fe1ff5b147acad897ddf115be758bf2b9463df0ea66439665a8a613

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.9-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 64f2d6b79fe366d86a17f12f49b0e37dfbd3df0bfb8b5985d2ba14aef60255bc
MD5 d449f46097dfd95094081c64140f1e4d
BLAKE2b-256 a447482fb40d116f0791cf6d397804189c600e368c49a6f43b883a7fe675b648

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