Skip to main content

Statistical testing framework for AI agents

Project description

xpbt

xpbt is a Python library for statistical testing of AI agents. It provides FSM-based hard-invariant monitors, Wald SPRT deployment gates, and Bayesian production monitoring.


Features

  • FSM hard-invariant monitor — intercepts tool calls at runtime and raises HardInvariantViolation before an illegal state transition executes.
  • SPRT deployment gate — Wald's Sequential Probability Ratio Test as a CI/CD gate; no fixed sample size required.
  • Beta posterior credible intervals — calibrated uncertainty reporting for production quality monitoring.
  • QualityScorer protocol — injection point for LLM-as-judge scorers; swap in a lambda for deterministic tests.
  • Zero ML dependencies (only scipy).

Installation

pip install xpbt

Built for Python 3.12 or above.


Quick Start

1. Hard-invariant monitor (FSM)

from xpbt import FSMMonitor, HardInvariantViolation

monitor = FSMMonitor(
    states=["s_init", "s_bal_read", "s_posted"],
    initial_state="s_init",
    transitions={
        ("s_init", "read_trial_balance"): "s_bal_read",
        ("s_bal_read", "post_journal"): "s_posted",
    },
)

monitor.step("read_trial_balance")  # ok
monitor.step("post_journal")        # ok

monitor.reset()
try:
    monitor.step("post_journal")    # raises HardInvariantViolation
except HardInvariantViolation as e:
    print(f"Blocked: {e}")

2. SPRT deployment gate

from xpbt import SPRTGate, SPRTDecision

gate = SPRTGate(theta_null=0.05, theta_alt=0.01)
# A ≈ 2.944, B ≈ -2.944

for trajectory in my_agent_trajectories():
    violation = not quality_check(trajectory)
    decision = gate.update(violation)
    if decision == SPRTDecision.ACCEPT:
        print("Deploy: agent is compliant")
        break
    elif decision == SPRTDecision.REJECT:
        print("Block: agent is noncompliant")
        break

3. Bayesian production monitoring

from xpbt import beta_credible_interval, violation_rate_summary

lower, upper = beta_credible_interval(k=5, n=1000)
print(f"95% credible interval: [{lower:.4f}, {upper:.4f}]")

summary = violation_rate_summary(k=5, n=1000)
print(summary)
# {'point_estimate': 0.005, 'lower': ..., 'upper': ..., 'n_samples': 1000, 'n_violations': 5}

Using a LLM-as-judge quality scorer

The QualityScorer protocol accepts any callable (trajectory: str) -> float:

import anthropic
from xpbt import SPRTGate, SPRTDecision

client = anthropic.Anthropic()

def llm_judge(trajectory: str) -> float:
    response = client.messages.create(
        model="claude-sonnet-5",
        max_tokens=10,
        messages=[{"role": "user", "content": f"Rate 0-1: {trajectory}"}],
    )
    return float(response.content[0].text.strip())

gate = SPRTGate(theta_null=0.05, theta_alt=0.01)
for traj in trajectories:
    violation = llm_judge(traj) < 0.85
    if gate.update(violation) != SPRTDecision.CONTINUE:
        break

In tests, replace llm_judge with lambda traj: 1.0 or a unittest.mock.Mock.


API Reference

See API.md.


License

MIT License. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

xpbt-0.0.3.tar.gz (5.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

xpbt-0.0.3-py3-none-any.whl (8.2 kB view details)

Uploaded Python 3

File details

Details for the file xpbt-0.0.3.tar.gz.

File metadata

  • Download URL: xpbt-0.0.3.tar.gz
  • Upload date:
  • Size: 5.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.11

File hashes

Hashes for xpbt-0.0.3.tar.gz
Algorithm Hash digest
SHA256 d9a8b31f0cd073362a7a43636ccc48926c1ee99196d075b320bb068742c8771b
MD5 b578518fa00a1507f87e2ae915f30bec
BLAKE2b-256 6d194d28b9d67d09511f3075165b541ba674c498cfa7218c9d4460b51464cd77

See more details on using hashes here.

File details

Details for the file xpbt-0.0.3-py3-none-any.whl.

File metadata

  • Download URL: xpbt-0.0.3-py3-none-any.whl
  • Upload date:
  • Size: 8.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.11

File hashes

Hashes for xpbt-0.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 b2d7c1987e50126ff5d9bc70a07decfc446a0a40a9334759a4350f304fcac95c
MD5 0288b22c95f714a052ab508e162d0aee
BLAKE2b-256 eee42448481a04acbdde060a86a59f8014fe0e5013d279a2ed9efb817ddfe06e

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