Skip to main content
KaireonAI ships two production-grade model-health surfaces:
  1. Fairness — standard audit-recognized bias metrics (demographic parity, disparate impact / four-fifths, equal opportunity, equalized odds, and Gini concentration) evaluated over any slice of decision outcomes.
  2. Drift — Population Stability Index + two-sample Kolmogorov– Smirnov tests over feature distributions, with a multi-feature rollup verdict (none / monitor / alert).
Both are purpose-built for the EU AI Act Article 10 § 2(f) examination-for-biases requirement and for Reg B / ECOA disparate- impact demonstrations under the four-fifths rule (29 CFR § 1607.4D).

Fairness evaluation

POST /api/v1/fairness/evaluate

Two input modes: Inline — CI / regression workflows supply samples directly:
Trace-join — server pulls a decision-trace window and joins to a caller-supplied groupLookup map:
Protected attributes live only in the request — this route never persists them beyond the audit log’s aggregate counts.

Response

Metrics explained:
  • demographicParityGapmax − min positive-decision rate.
  • disparateImpactRatiomin / max. Below 0.80 triggers the four-fifths-rule flag when every group has ≥ 30 samples.
  • equalOpportunityGap — TPR gap across groups (requires ground- truth label on each sample).
  • equalizedOddsGap — the larger of the TPR-gap and FPR-gap across groups.
  • giniCoefficient — concentration of positive decisions across groups, computed via a size-weighted Lorenz curve (0 = every group sees the same rate, 1 = one group captures every decision). Returned alongside the lorenzCurve points.

Continuous fairness recheck

The publish-time fairness hard-gate can also run after a flow goes live. GET /api/v1/cron/fairness-recheck (Bearer CRON_SECRET) sweeps every tenant with fairnessPolicy.enabled = true and fairnessPolicy.continuousRecheck = true, re-runs the gate over the last 7 days of traces, and auto-pauses any still-active decision flow whose thresholds are breached (audit-logged as update / auto_pause with reason fairness_recheck_drift).

Drift detection

POST /api/v1/models/:id/drift

Submit two feature-value snapshots (reference + current) and the endpoint returns PSI + KS per feature plus an aggregate severity:
Response:

PSI thresholds (Siddiqi 2005, Basel-recognized)

KS significance

Two-sided p-value via the Kolmogorov distribution Q(λ) with regime switching (alternating series for λ ≥ 0.3, Jacobi-theta alternative for smaller λ). significant: true when p < 0.05.

Overall severity

alert fires if any feature has PSI ≥ 0.25 OR a significant KS with D > 0.1. monitor fires if any feature crosses 0.1 PSI without alerting. Otherwise none.

Rate limits + audit

  • POST /fairness/evaluate — 20/min/tenant, audit-logged as action=fairness_evaluate.
  • POST /models/:id/drift — 30/min/tenant, audit-logged as action=drift_evaluate.
Both are tenant-scoped; cross-tenant lookup returns 404.