FORMA — AI agent compliance SDK. Zero-config tracking, EU AI Act/DPDP/RBI compliance, cryptographic audit trails.
Project description
FORMA SDK
Make non-compliance impossible — in one line of code.
FORMA doesn't just record what your AI did; it blocks non-compliant decisions before they execute. Add enforce=[...] and PII leaks, prompt injections, and policy violations are stopped at runtime — then every decision is cryptographically signed and mapped to RBI, DPDP, EU AI Act, and ISO 42001.
Install
pip install forma-sdk
Import name is trustlayer:
import trustlayer as tl
Quickstart — runtime enforcement
import trustlayer as tl
tl.init(
api_key="tl_live_YOUR_KEY", # from forma.2bd.net → Settings
human_sponsor="ops@company.com",
purpose="Loan application evaluation",
risk_level="HIGH",
enforce=["rbi_ml_risk", "dpdp"], # ← blocks violations BEFORE they run
)
def approve_loan(application: dict) -> dict:
with tl.using("loan-approval-agent", risk_level="HIGH", enforce=["rbi_ml_risk"]):
return run_underwriting_model(application)
Now, before any LLM or tool call executes:
- An Aadhaar / PAN / card number in the prompt → blocked (DPDP)
- "Ignore previous instructions…" / jailbreaks → blocked
- "Auto-approve without review" → blocked (RBI human-review rule)
A blocked action raises ComplianceViolation, and every decision (allow / warn / block) lands in your signed audit trail. The gate runs locally in ~1 ms — no network hop in your request path.
from trustlayer import ComplianceViolation
try:
result = approve_loan(application)
except ComplianceViolation as e:
print(e.reason) # "PII detected in LLM prompt: Aadhaar number. ..."
Zero-config tracking (no enforcement)
import trustlayer as tl
tl.init(api_key="tl_live_YOUR_KEY")
# Every OpenAI / Anthropic / LangChain / LiteLLM call is now auto-captured —
# tokens, cost, latency, anomaly score — with no other code changes.
Human approvals (EU AI Act Article 14 / RBI human review)
import trustlayer as tl
tl.init(
api_key="tl_live_YOUR_KEY",
require_approval_when=lambda ctx: ctx.get("amount", 0) > 1_000_000,
approval_message="Loan above ₹10L requires human review.",
)
def approve_loan(application: dict) -> dict:
with tl.using("loan-approval-agent"):
return run_underwriting_model(application)
The decision pauses in your FORMA Approvals inbox until a human approves or rejects. Fail-closed: a timeout or unreachable API is treated as a denial — a skipped review never silently passes.
Policy packs
| Pack | Region | Enforces |
|---|---|---|
dpdp |
India | Aadhaar / PAN / card / phone blocked from prompts & tool args; consent-bypass blocked |
rbi_ml_risk |
India Banking | auto-approval-without-review blocked; fund-disbursal routed to approval |
eu_ai_act |
EU | human-oversight bypass (Art. 14) & logging suppression (Art. 12) blocked; PII protection |
iso42001 |
Global | concealing AI involvement blocked |
Manual step control
import openai
import trustlayer as tl
tracker = tl.init(api_key="tl_live_YOUR_KEY", auto_capture=False)
def my_agent(task: str) -> str:
with tl.using("my-agent"):
with tracker.llm_call(label="generate", model="gpt-4o", prompt=task) as step:
resp = openai.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": task}],
)
step.prompt_tokens = resp.usage.prompt_tokens
step.completion_tokens = resp.usage.completion_tokens
return resp.choices[0].message.content
# For tools: with tracker.tool_call("send_email", {"to": addr}): ...
Kill switch
Pass kill_switch=True to tl.init(). When you trigger a kill from the dashboard, the next LLM/tool call raises KillSwitchTriggered in under ~100 ms.
CI/CD compliance gate
# Blocks the deploy (exit 1) if any agent is below the threshold
trustlayer gate --pre-deploy --fail-below 80
tl.init() parameters
| Parameter | Type | Description |
|---|---|---|
api_key |
str |
Your FORMA API key (tl_live_… / tl_test_…) |
enforce |
list[str] |
Framework packs enforced on every call, e.g. ["dpdp"] |
human_sponsor |
str |
Accountable human (EU AI Act Art. 14 / RBI) |
auto_capture |
bool |
Auto-patch OpenAI/Anthropic/LangChain/LiteLLM (default True) |
kill_switch |
bool |
Start the process-level kill watcher (default False) |
compliance |
list[str] |
Frameworks for scoring/reports |
require_approval_when |
callable |
Lambda on approval context; return True to require human review |
approval_message |
str |
Message shown in the Approvals inbox |
Node.js / TypeScript
npm install forma-sdk
import * as forma from "forma-sdk";
forma.init({ apiKey: "tl_live_YOUR_KEY", humanSponsor: "ops@company.com" });
const { decision } = await forma.gate("agent-id", {
actionType: "llm_call",
prompt: userPrompt,
});
Note: The Node SDK is coming soon (not yet published to npm). Runtime enforcement (
enforce) and approvals are Python-only today. The Node package will provideinit+gatefirst; enforcement parity is on the roadmap.
Dashboard & docs
- Dashboard: forma.2bd.net
- Developer guide: forma.2bd.net/developer-guide
- Generate a tailored snippet: forma.2bd.net/snippet-generator
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file forma_sdk-2.0.0.tar.gz.
File metadata
- Download URL: forma_sdk-2.0.0.tar.gz
- Upload date:
- Size: 52.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f347357374a2cddac9dcbd6310285113f8fe50f85b4787c1ce55139ca10590a0
|
|
| MD5 |
791d7e683fad50a255f244df90fe51e1
|
|
| BLAKE2b-256 |
45f7d02a3bff52635489112cdd4245699ec4d090783bd60827e977e10ddcdfc3
|
File details
Details for the file forma_sdk-2.0.0-py3-none-any.whl.
File metadata
- Download URL: forma_sdk-2.0.0-py3-none-any.whl
- Upload date:
- Size: 54.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fc1a1b363f0a27af2895b4fe2c5aebd5514b66c741192ca703b751da2cc9e783
|
|
| MD5 |
26389e27ecbf8338c09a0bf1163ec6a5
|
|
| BLAKE2b-256 |
953010de7ae507a97b5d91fa4556c5d5ad4771a885ca8baeb53075ebf5bc5e6e
|