Skip to content

Référence API

EnforceCore expose 30 symboles publics Tier 1 depuis le package enforcecore — le contrat stable et gelé. 80 symboles Tier 2 supplémentaires restent importables pour la compatibilité ascendante mais ne sont pas couverts par la garantie de stabilité.

Stabilité API : Les 30 symboles Tier 1 sont gelés depuis v1.0.0b1. Aucun ajout ni retrait jusqu'à v2.0.0. Les imports Tier 2 émettent des avertissements de dépréciation.

Symboles Tier 1 (Stables — 30)

Catégorie Symboles
Enforcement enforce, Enforcer, Decision, EnforcementResult
Politique Policy, load_policy
Rédaction Redactor, RedactionResult, RedactionStrategy, SecretScanner
Audit Auditor, AuditEntry, VerificationResult, verify_trail, load_trail
Ressources ResourceGuard, CostTracker, KillSwitch, RateLimiter
Exceptions EnforceCoreError, EnforcementViolation, ToolDeniedError, ContentViolationError, PolicyError, PolicyLoadError, CostLimitError, ResourceLimitError
Configuration Settings, settings, __version__

API Principale

Décorateur @enforce()

from enforcecore import enforce

@enforce(policy="policies/agent.yaml")
async def search_web(query: str) -> str:
    return await api.search(query)

# Politique inline
@enforce(
    allowed_tools=["search_web", "calculator"],
    pii_redaction=True,
    max_cost_usd=5.0,
)
async def my_tool(args: dict) -> str: ...

Classe Enforcer

from enforcecore import Enforcer, Policy

enforcer = Enforcer.from_file("policy.yaml")
result = enforcer.enforce_sync(search_fn, "query", tool_name="search_web")
result = await enforcer.enforce_async(search_fn, "query", tool_name="search_web")

Note : guard_sync() et guard_async() ont été supprimés en v1.0.16a1. Utilisez enforce_sync() / enforce_async() à la place.


API Politique

from enforcecore import Policy, load_policy

policy = load_policy("policies/strict.yaml")

policy = Policy(
    name="ma-politique",
    rules={
        "allowed_tools": ["search", "calculator"],
        "pii_redaction": {"enabled": True, "categories": ["email", "phone"]},
    },
    on_violation="block",
)

API Rédacteur

Catégories PII

Catégorie Exemple Placeholder
email john@example.com <EMAIL>
phone (555) 123-4567 <PHONE>
ssn 123-45-6789 <SSN>
credit_card 4111-1111-1111-1111 <CREDIT_CARD>
ip_address 192.168.1.100 <IP_ADDRESS>
passport AB1234567 <PASSPORT>

Stratégies de Rédaction

Stratégie Résultat pour john@example.com
placeholder <EMAIL>
mask ****@****.***
hash [SHA256:6b0b4806b1e57501]
remove (chaîne vide)
from enforcecore.redactor import Redactor

redactor = Redactor(categories=["email", "phone"])
result = redactor.redact("Appeler 555-123-4567 ou john@example.com")
print(result.text)   # "Appeler <PHONE> ou <EMAIL>"

API Auditeur

from enforcecore import Auditor, verify_trail, load_trail

auditor = Auditor(output_path="audit.jsonl")
e1 = auditor.record(tool_name="search_web", policy_name="default", decision="allowed")

result = verify_trail("audit.jsonl")
print(result.is_valid)

Backends d'Audit Pluggables

from enforcecore import JsonlBackend, NullBackend, CallbackBackend, MultiBackend

callback = CallbackBackend(on_event=lambda entry: send_to_datadog(entry))
multi = MultiBackend([JsonlBackend("audit.jsonl"), callback])

API Witness

Backends witness à hash uniquement pour la détection de falsification au-delà de la vérification Merkle.

from enforcecore.auditor.witness import CallbackWitness, FileWitness, LogWitness

witness = FileWitness(path="/var/log/enforcecore/witness.jsonl")

auditor = Auditor(
    output_path="audit.jsonl",
    witness=witness,
)

Vérification Witness

from enforcecore.auditor.witness import verify_with_witness

result = verify_with_witness(
    trail_path="audit.jsonl",
    witness_path="/secure/witness.jsonl",
)
print(result.is_valid)
print(result.mismatches)

Witness piloté par Settings (v1.0.0b5)

ENFORCECORE_AUDIT_WITNESS_FILE=/var/log/enforcecore/witness.jsonl

API Immutable

Protection append-only au niveau OS pour les fichiers d'audit.

auditor = Auditor(output_path="audit.jsonl", immutable=True)
Plateforme Mécanisme Root requis Notes conteneur
Linux chattr +a Non (avec CAP_LINUX_IMMUTABLE) Docker : --cap-add LINUX_IMMUTABLE
macOS chflags uappend Non (niveau utilisateur) N/A
Windows Non supporté Fallback sécurisé
ENFORCECORE_AUDIT_IMMUTABLE=true

API Guard

from enforcecore.guard import ResourceGuard, CostTracker, KillSwitch

tracker = CostTracker(budget_usd=10.0)
tracker.record(0.05)
tracker.check_budget()

guard = ResourceGuard(cost_tracker=tracker)
print(guard.leaked_thread_count)  # 0 = sain

API Scanner de Secrets

from enforcecore import SecretScanner, PatternRegistry

scanner = SecretScanner()
secrets = scanner.scan("aws_key = AKIAIOSFODNN7EXAMPLE")

# 11 catégories intégrées : aws_key, github_token, generic_api_key,
# bearer_jwt, private_key, password_url, gcp_service_account,
# azure_connection_string, database_uri, ssh_private_key, slack_token

API Règles de Contenu

from enforcecore import RuleEngine, get_builtin_rules

engine = RuleEngine(rules=get_builtin_rules())
violations = engine.check("os.system('rm -rf /')")
# 4 catégories : shell_injection, path_traversal, sql_injection, code_execution

API Rate Limiter

from enforcecore import RateLimiter, RateLimit

limiter = RateLimiter(
    per_tool=RateLimit(max_calls=10, window_seconds=60),
    global_limit=RateLimit(max_calls=50, window_seconds=60),
)
limiter.check("search_web")  # Lève RateLimitError si dépassé

API Vérificateur de Domaines

from enforcecore import DomainChecker

checker = DomainChecker(
    allowed=["api.example.com", "*.trusted.io"],
    denied=["*.evil.com"],
)
checker.check("api.example.com")  # OK
checker.check("hack.evil.com")    # Lève DomainDeniedError

API Hooks

from enforcecore import on_pre_call, on_post_call, on_violation, on_redaction

@on_violation
def alerter(ctx):
    send_alert(f"⚠️ {ctx.tool_name} bloqué : {ctx.violation_type}")

@on_redaction
def suivre_pii(ctx):
    metrics.increment("pii_redacted", ctx.redaction_count)

API Observabilité

from enforcecore import EnforceCoreMetrics, EnforceCoreInstrumentor

metrics = EnforceCoreMetrics()
instrumentor = EnforceCoreInstrumentor()
instrumentor.instrument()

API Hardening

from enforcecore import validate_tool_name, check_input_size, deep_redact
from enforcecore import get_enforcement_depth, get_enforcement_chain
from enforcecore import prepare_for_detection  # Pipeline unicode complet

Hiérarchie des Exceptions

EnforceCoreError              # Exception de base
├── PolicyError
│   ├── PolicyLoadError       # Fichier introuvable / illisible
│   ├── PolicyValidationError # Violation de schéma
│   └── PolicyEvaluationError # Erreur durant évaluation
├── EnforcementViolation
│   ├── ToolDeniedError       # Outil non autorisé
│   ├── DomainDeniedError     # Domaine réseau bloqué
│   ├── CostLimitError        # Budget dépassé
│   ├── RateLimitError        # Limite de débit dépassée
│   ├── ContentViolationError # Règle de contenu violée
│   └── ResourceLimitError    # Limite de ressource dépassée
├── RedactionError            # Erreur PII (fail-closed)
├── AuditError                # Erreur audit (fail-closed)
├── HardeningError
│   ├── InvalidToolNameError  # Nom d'outil invalide
│   ├── InputTooLargeError    # Payload trop volumineux
│   └── EnforcementDepthError # Profondeur récursive dépassée
└── GuardError                # Échec resource guard

CLI

enforcecore info                          # Version et plateforme
enforcecore validate policies/strict.yaml # Valider une politique
enforcecore verify audit.jsonl            # Vérifier une piste d'audit
enforcecore eval --scenarios all          # Suite d'évaluation
enforcecore dry-run --policy policy.yaml --tool search_web  # Dry-run
enforcecore inspect policies/strict.yaml  # Inspecter les règles

Variables d'Environnement

Toutes les configurations via variables d'environnement (via pydantic-settings). Référence canonique — les 18 variables :

Variable Défaut Description
ENFORCECORE_DEFAULT_POLICY None Chemin de politique par défaut
ENFORCECORE_AUDIT_PATH ./audit_logs/ Répertoire des pistes d'audit
ENFORCECORE_AUDIT_ENABLED true Activer/désactiver l'audit
ENFORCECORE_AUDIT_BACKEND jsonl Backend d'audit (jsonl, null, callback, multi)
ENFORCECORE_AUDIT_MAX_BYTES 10485760 Taille max de fichier d'audit avant rotation (10 Mo)
ENFORCECORE_AUDIT_MAX_FILES 5 Nombre max de fichiers d'audit en rotation
ENFORCECORE_AUDIT_IMMUTABLE false Activer les fichiers d'audit append-only au niveau OS
ENFORCECORE_AUDIT_WITNESS_FILE None Chemin du fichier witness JSONL à hash uniquement
ENFORCECORE_REDACTION_ENABLED true Activer/désactiver la rédaction PII
ENFORCECORE_SECRET_SCANNING true Activer la détection de secrets
ENFORCECORE_CONTENT_RULES true Activer la vérification des règles de contenu
ENFORCECORE_LOG_LEVEL INFO Niveau de log structuré
ENFORCECORE_COST_BUDGET_USD 100.0 Budget global de coût
ENFORCECORE_RATE_LIMIT_RPM 0 Limite de débit globale (0 = désactivé)
ENFORCECORE_FAIL_OPEN false Contournement en cas d'erreur (⚠️ dev uniquement)
ENFORCECORE_DEV_MODE false Mode développement
ENFORCECORE_OTEL_ENABLED false Activer métriques/tracing OpenTelemetry
ENFORCECORE_WEBHOOK_URL None Endpoint webhook pour les événements
ESC