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

Uploaded CPython 3.13Windows x86-64

signai_sdk-0.4.11-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.11-cp313-cp313-macosx_11_0_arm64.whl (5.6 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

signai_sdk-0.4.11-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.11-cp312-cp312-win_amd64.whl (5.5 MB view details)

Uploaded CPython 3.12Windows x86-64

signai_sdk-0.4.11-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.11-cp312-cp312-macosx_11_0_arm64.whl (5.6 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

signai_sdk-0.4.11-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.11-cp311-cp311-win_amd64.whl (5.5 MB view details)

Uploaded CPython 3.11Windows x86-64

signai_sdk-0.4.11-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.11-cp311-cp311-macosx_11_0_arm64.whl (5.6 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

signai_sdk-0.4.11-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.11-cp310-cp310-win_amd64.whl (5.5 MB view details)

Uploaded CPython 3.10Windows x86-64

signai_sdk-0.4.11-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.11-cp310-cp310-macosx_11_0_arm64.whl (5.6 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

signai_sdk-0.4.11-cp310-cp310-macosx_10_9_x86_64.whl (5.7 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.11-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 a2dbb8c975a188e7286a8d48f143175b13ebd92af6be62acd4abbf89b21c961f
MD5 595182b2f392091ac8e0251b61c17255
BLAKE2b-256 80d2b9c148c71ceaf58dabd38be060c88b11aee72c15c9b2e2d62e40424bca15

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a8e6303ff5b55a4a2cdf9907ef9a8cd7f81d7562babe8705f6dbd3d75f3bb99d
MD5 35f044533cef8926059c57db8b4b6966
BLAKE2b-256 cf4956903b10658b0cd97661ffe60d242fa85d8261b615dd6e70786dc2e46c90

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.11-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ff86279cdbc65ab23bf14313274fe8e91425b98da088b2116f6cc8e2879328de
MD5 37433235e47eee6b5f62d72ea86c10cb
BLAKE2b-256 eeabff9d0db38be76ef79a49b5925be93b0dacbc8e7b6d1596d772b5d4b783f2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.11-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 e7c200edd168854dfe32f320e57f9803136d9239c19cba5548b34386ed51122a
MD5 994074832ba16619b6c5e802be5e9f03
BLAKE2b-256 cccd0129c2495a62bb532fb81832da7eb3e52cba66cb7506e3bf3cbf30a180be

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.11-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 18f3eb4b550a0d8f0c9aab10d80eddb3cb890d5f3c637dcd5d019c0603e7c2b2
MD5 8b2aaa9c761e8f51f6e9efbe42efdd6a
BLAKE2b-256 482703f69b644a4c7b47639931408cc76df7fadc9e360743c5093496bb80c174

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b470b44e156cb4635e36a1e6fa6a0de63bebfe53f5eb44d686d10486839f31ac
MD5 309143abfee23ac950b9502a4c38a069
BLAKE2b-256 a6613dc555ab71375cc97f45f8554563e0caef1422e4314a3683b49bbd8678d2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.11-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 df26be4ab5a87212c8b0163c552ff5f1a2f61155deaf884b0265b22b0406919d
MD5 d5582cb4731b347f649f3f11db45b4ef
BLAKE2b-256 cb5d7bb2bc1be20fbc49df78f83493a69ebbf0ee643836b77aa2fc3a533ec208

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.11-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 191b13b96743848cc14243459dea90abb63934784431580a8d61b61e3911c771
MD5 a2660102dc2d2633eec9a61ab895dda8
BLAKE2b-256 b31827dc9df137dce1342e02fa390697fa9e4b786b5fbf15a0df3c81a3807ad7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.11-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ddca194d2b58e3d0a6c374125f99f5493c3039b305b2340c6792fa29b274ba16
MD5 94ec0d2cdc0f60a348a39a6c048b4087
BLAKE2b-256 6dc8e68d45699ef2aef918b4c6450be16c24c697a71111893485a71f35389e1e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3fea77371c837fd2b2f40fab9d9caed7f30c68b1cb9ee290018697014d9e3e1a
MD5 1c2ea76a44c5dfc3c735b9a13d449156
BLAKE2b-256 cf1ffe28baea022230570da5c45ca3ce4ef20331f73777de0e1a99baa5726773

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.11-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 af21dceb738b056fc000a483c5230a866ab0ae368ced90624668ac90ce9e97ac
MD5 7d8c64a5d56c999091728631ee0d8309
BLAKE2b-256 8dea3174443a8e3c6870340fbcf8b76f3b62229666b410f71d077b47870ec694

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.11-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2825215569dce6656335417342135a61140c3630cd3a3b2b73a414526e5a2415
MD5 63626a44f7dbdef65660c614dd1c6ff2
BLAKE2b-256 ead67071c9e13d0994e9dc388189421fc46a6b524fb38eaa378fcd79b9e65a1f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.11-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 22def2c754dc1dd7089d61a2869d2b4d82e4f06c543df8b0e5c6b460e7537b23
MD5 48a2f2927d00fafdc613cc0a708c0808
BLAKE2b-256 b684f173072d5199a974a35e9803479615897419ca63da4743a068e7e6519cf6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8c28bc48bb432937a68bc4460cd04bca76c6ac99c053dbbc13fdf31fa9ae8cfe
MD5 dd20aa05230a1bd562c227154468807f
BLAKE2b-256 1ce55862406c33f09dbec643df8314794496f283c379f91b8d8705c26f7f76e0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.11-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b7549d7736dbba9aeee129e477ed2cc563d1bb666236775d3bf6e7725936960a
MD5 475229abdc2eef2ddca77d3900a93433
BLAKE2b-256 48ac68254302bdbcb5df25efa5a79027441308f78b9e0d586fa0b4717de6bc27

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.11-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1fbe4ad269d042abd6066271682b97e25dd83e1c2cd93071ed2b37abe604d3f6
MD5 adec70abc1f68018e83ad7c0b35acabc
BLAKE2b-256 14631069339bbf740ecf7eeb1a30121d973afb6cd5eaf89aea3776931963fcb5

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