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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

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

Uploaded CPython 3.10macOS 11.0+ ARM64

signai_sdk-0.4.6-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.6-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: signai_sdk-0.4.6-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.6-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 6662ef32af76a35b47684941cd1586a6d0f1791fc9514aa1c047413fc66f7fd1
MD5 14a2583beb4e5cff87a3b80f76b00e6c
BLAKE2b-256 2f8be68b4f4f948c0fa9c980e3757a56583e79297835487af31ead00c774d032

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e5eb52203aaf371db32a5771fbbe5ba2f26588e6f9c4256a40cc0a40981922af
MD5 720d2fede280ba00a7de15fe2eebb528
BLAKE2b-256 1469a0de47ff18efa9566768acf7e0c779db409c5a88c0cba4443f6e6949f410

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.6-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c737b13f62c0fc3c27f782b8dc01580a7ecc599b6f12ce9dfe33bd53d3319692
MD5 c3f82dbbe627162cec09eac46e1c24d1
BLAKE2b-256 df0204c39f8cee019fcfa56917833ba6ef8a4c608932dea5b56e940eda92ebbd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.6-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 d75a23b756b3d9cec01d50300503d1d09c489fc5929dbf8dd19ab2a5a85d9ff8
MD5 9b097456443e8dbd0575459a8dbc0fd2
BLAKE2b-256 926449f7a552965644a3e0340e64bac6e338226b6072b99b168fe78f374c801c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: signai_sdk-0.4.6-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.6-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f802fee708a0fb1fc77a606626a123d64c3d1078bfc8bf55fd205281953ef6a0
MD5 dcab665fb4dc2ac5d1aad04e82d6e15f
BLAKE2b-256 894d06f3be626b9146b0e2b8b181919bcda7ab20c3358a3c01b430069b88e02d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9c75111df2f4a8e0cf52a01af9fb721e0968d4e07c38f224504236bcc5d453b2
MD5 b8be303e76e81ff58d6b5af9efcaace0
BLAKE2b-256 25dcc62370fa911dd7140bb9575e5ce11a55dc6ae779bff7f930ca4753bd503f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.6-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 915034fa451e31640e6db78b369337dc8670863f328cfe3fed0030fbbdc418c5
MD5 03efa6f5aeb9a1e8cdb3d982b14c5dfe
BLAKE2b-256 04be306024630597a4756b38f58b5de410b39c8e303e452e8b3a03ddd3d37df8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.6-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 6d3f94d07590f12d8f1f27dd4cd056daf3680e73a95590bae4b6fa273c56af0a
MD5 6ab42eb2c73f259a8dde6a9254721f2d
BLAKE2b-256 055dca9ee1caf465ddf9cbba7468aea52d19108da2ce2ec629c9884ae0af204a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: signai_sdk-0.4.6-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.6-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 b8617ae0f8ce2ff2a021597ab766bc7cd79bfdc4c10304360e4fc68c4d45387f
MD5 3ff6c1860864fac9029afd64b8bba17a
BLAKE2b-256 247751df680483687dc15c5504fa7c70e8db565c29baf1612f088465d43fb32f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 56098ccefedfa73b93dbf1b7c55393c9f16d86996ecc512e117e8bd6fcd9907a
MD5 fb9a8b67e81cad0d0cfee887599f1e19
BLAKE2b-256 832f9ec326a7ec8753c88904d2b474a54db79d6d62ee2315115277008d2d3792

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.6-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ae470106a36c6c761cdb2e6ca04b224581a8907824cb5b6b1e2536646c1d4342
MD5 fdceed006db1981dbb90926720b03909
BLAKE2b-256 6517c08e108eb9b844995e505a0170bcf6d7716aeee44b7c6872b98fec1905c6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.6-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 37aaa5c3a852490e0fbb45853a0d1581d33ed0407e34680afe6418a383ce5166
MD5 6e4c361bbe4c3f40b273881757e66557
BLAKE2b-256 893bae9fe151bdacd15091c97383af2d5242ae40ba5722772931e019ae3e752a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: signai_sdk-0.4.6-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.6-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 0ef444722649fa713ddef876d187c0cbd7269cff5d42655601c46f6bbb134004
MD5 a0ef99ce7ee9cd481441227151fac548
BLAKE2b-256 36069256e571c124de6474ac3a87ef92c7d0bf4dc04363ae7951ea3a17b65539

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 847211615f525052afdbecfff5ddea1dc61ad55d7622c15469c9276c0215440f
MD5 eaa16a7a53cd4658c51661c811251280
BLAKE2b-256 4fc0a93f5894be8862c901866d25478bcde9d61fc202ed03d53408913c1483fa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.6-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5bc786ac99fcd765da753521ca80edcfe89e002c76e8691b7815fb25d0b334c5
MD5 b20a3b272bd5fc9f64013ce04a8408dc
BLAKE2b-256 34351458eb44414a33dfd0e8bf90e0fba35faa3bf1007ec7bed57aca6ba2e9c6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for signai_sdk-0.4.6-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 7b5eaaae2bce2f95323aaddbe14b1bce02bdc499637077502925c4423ed08d7b
MD5 c0f687ff5213367aa2cf1311c4966bf8
BLAKE2b-256 b2957d5304a096091a9543c66a09962fdb2624c7c93d7147cd3f8a4cc9c54db2

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