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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

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

Uploaded CPython 3.10macOS 11.0+ ARM64

signai_sdk-0.4.10-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.10-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for signai_sdk-0.4.10-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ce6b4360236c2e7eadb4f1fbbc5c8994fcca8c261878bc8fcd6e01c111b998ba
MD5 f5c939bc9b7e05c8d122c9b8e1cb197b
BLAKE2b-256 778adfe5fb58749da5b39525d521b69a65f4dbf6b4f64a7be9345dc10e35f01d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 31d64855f37ea3f7e0f0457cd43013f031d5b5469130ff9b83a35f9eb2f6691c
MD5 a72567a51782c78c41fce9f380408387
BLAKE2b-256 b864218c52c41d71f23a32e21b0a512c7c1eeec021251f1dc2a77c0fbeeb55e5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.10-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 483070e2cab028ef672ab3c5b8bc7ffda64cd001577d62bd244bbd8db6e2e7a2
MD5 614151c149c550562a4e4c014052e946
BLAKE2b-256 339b91bbec08c95e0b0cb41dccd8e6c0b9d467c51aa3c8fc93f64b4284f45010

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.10-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 92e96b84b5708b447402fcc31578152fbeb7890c50adb9839ccbc7c2034c3edc
MD5 0c76fd1e57f65a713e48e978f3840571
BLAKE2b-256 218ca99639d94b1c9428f4658b4e0a744b398c2927d8982d995a04e6b4513bb8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.10-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 b810943951b0318c7a7135ba4dc89b663d10576cfd3445c68e7e27fb203b49c2
MD5 8f7a4a72f2c3b0506fe668b02f4819ac
BLAKE2b-256 68a8283a60a0363aba0b96f2857f8bfe377dfcb6a5ce47760479608441e00107

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0f2cd08c4c363b1c0c3f87754c844b02b80ccffb4203ddfa4fb5ad8167e0c95e
MD5 6e6b3ebd7cf1b0b0d3112ff6c5801e9c
BLAKE2b-256 c3f6e1ec3b854bb628f9380a0ec7cecf423f409df004ac08196f4ce356734cab

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.10-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 17a59be29578a040e0c07724268cfbab2ccd399a971f366966dae593cb10ee8c
MD5 d7b818fa3c1722f0ad42315d463cae71
BLAKE2b-256 44b4acb078d4de500c01529d4fcbfd48495c4adecb61888d9a44b969d87b47cc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.10-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 8a1b2e3ca1d934e3847c116279e7ea1bc6dacf7a860246fbed9bc5bede92e06c
MD5 76b2083bd09932f41f793630ee7b7885
BLAKE2b-256 abebf5b881772c98e630a9bbf0fce16d8bd7beb827c72576b03434f253e4cfe9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.10-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 44e31f7ebbdd1c2f1e2ac95baf6c2cc5cc5a03f764f70ccc6e74ef46dbcd5560
MD5 376fc0bd2f64293cc37aa31f1c66170d
BLAKE2b-256 acb26e55e8569f394773c1e0088041832798665de9ff8b2f15721f062c348d2f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dd2973cb9d1ffba236563831dd791f3a9b6fdbe8d9dfccb825faa2f525e31201
MD5 7a531c9e1ced7375ad35be49974711ad
BLAKE2b-256 e785061f24d305e4ed6e3a12b86ac927afafb4732593f97447fe5f1ac3e1bb83

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.10-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 94bbc8af2351d69a6df27de0fc5c09a29ee556dc26e619608b2d9f9a96dd40df
MD5 35b6b07bdf326c1a4d88dff679641ea4
BLAKE2b-256 ff1f53addafe651bcc5d3205eedc5662d85266b9d130f02929e3c895339c5aea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.10-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 da62e283cf799d71c0350c0891d69151fb758f9a45b98eff0c4a62ac70bcdb9e
MD5 65bba955647b2d09ee9d5e6b396e8c31
BLAKE2b-256 205e67b37c421dd61ac6921530a5c046e31b530b8e4d06038f6c0e3f1f2dd220

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.10-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 875affc040e3911ff27c1b3ba115979d15f7e09b9728da9660e4e9b165cd62b7
MD5 775ae76cbd083a47489593c11d9f0051
BLAKE2b-256 70460c4b5cb1be2adc24c7428da7ac0e76a05af60b790deb75b54c6acefb63dc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d8c6be03a2061a908c1595bb450cc0cab7c3ee43cf1de53db9381944bb5ebb6a
MD5 b7be307a3d7d540259cc865f117e975a
BLAKE2b-256 7222bdc8ca4f8c435259dfb4b7d21a136b9086833374a9dafabbcfb93834de84

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.10-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4964ac592606f3b54309a436635df23658b78f0b604c86854ffd96820fe032ac
MD5 8ba46786e204c152483d0644d42114b6
BLAKE2b-256 4774a14e206a2da081502afd2959bb7feb895fac5cb07438c40ee92855a3f0dc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.10-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 89fc8deb459e78fee70fdd3d1bbc04f055e62a097c329febe9d0f603735e26de
MD5 97e2be49afc5d4438cba43c380c4d8d6
BLAKE2b-256 08097861f5615a2de3d0b40faaa650e9c62d2a7a387d2555794dd4ffccafe07c

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