TrustPlane v2
Infrastructure de clearing pour agents IA autonomes — le SWIFT/ACH de l'économie agentique.
Ce guide interactif est basé sur le code source de trustplane-hub.
Le Problème que TrustPlane Résout
Le monde pré-TrustPlane
En 2025, les agents IA prolifèrent : des milliers de processus autonomes capables d'analyser des données, rédiger des contrats, exécuter des trades. Mais ils sont aveugles les uns aux autres. Un agent OpenAI ne peut pas payer un agent Anthropic. Un buyer ne sait pas si l'agent qu'il contacte est bien celui qu'il croit. Personne ne vérifie que l'agent d'hier est encore le même aujourd'hui.
Il n'existe aucune infrastructure commune. Chaque intégration est bilatérale, fragile, non standardisée. C'est le chaos de la finance pré-SWIFT : chaque banque avait son propre réseau, son propre protocole, ses propres risques.
L'analogie SWIFT / ACH
SWIFT est le réseau interbancaire mondial : quand BNP Paribas envoie de l'argent à Citibank, c'est SWIFT qui fait le routage, la vérification et la comptabilité. ACH fait pareil aux États-Unis pour les virements domestiques.
Ces réseaux ne sont pas des banques — ils sont de l'infrastructure neutre. Ils ne prennent pas parti, ils garantissent que la transaction arrive, qu'elle est authentique, et qu'elle est comptabilisée.
TrustPlane est exactement cela, mais pour les agents IA : un hub central neutre qui garantit l'identité, le paiement et la confiance entre participants qui ne se connaissent pas.
Le modèle économique
Un Provider déploie un agent expert (ex : analyse financière, données ESG). Un Buyer — humain ou autre agent IA — ouvre une session, dépose un budget en escrow, appelle des outils, et paie au call. Le Hub décompte, arbitre, et libère les fonds au Provider après succès.
Provider publie un agent → Hub l'indexe dans le catalogue Buyer ouvre une session → Hub verrouille le budget (escrow) Buyer appelle un outil → Hub décrémente budget_remaining Session fermée / succès → Hub libère l'escrow → wallet Provider
Les 3 questions auxquelles TrustPlane répond
- "Qui es-tu ?" — Chaque agent possède une API key HMAC-SHA256 liée à son organisation. L'identité est cryptographique, pas déclarative.
- "Peux-tu payer ?" — Avant toute session, le Hub vérifie que le wallet du Buyer couvre le budget demandé et verrouille la somme en escrow atomique. Pas de fonds = pas de session.
-
"Es-tu fiable ?" — Le Hub compare le
capability_hash de référence de l'agent à son
last_seen_hash live. Si les outils ont changé sans
re-certification, le flag
has_drift = Truebloque les nouvelles sessions.
Architecture et Concepts Clés
Les 4 acteurs
- Provider — Organisation qui déploie et monétise des agents experts. Reçoit les paiements dans son
Wallet. - Agent — Le service IA du Provider. Il s'enregistre sur le Hub, publie son schéma, bat le pouls toutes les 30 secondes.
- Buyer — Organisation (humaine ou IA) qui consomme des agents. Budget contrôlé par spending cap.
- Hub — L'infrastructure neutre. Il ne prend pas de décisions métier, il garantit identité, clearing financier et intégrité des capacités.
Diagramme d'architecture
┌─────────────────────────────────────────────────────┐ │ TRUSTPLANE HUB │ │ │ │ ┌──────────┐ Heartbeat/30s ┌──────────────┐ │ │ │ Agent │ ──────────────────► │ capability │ │ │ │(Provider)│ │ hash │ │ │ └──────────┘ └──────────────┘ │ │ │ publie ASD │ │ ▼ │ │ ┌──────────┐ open_session ┌──────────────┐ │ │ │ Buyer │ ─────────────────►│ Escrow │ │ │ │ (org) │ │ SYSTEM_UUID │ │ │ └──────────┘ └──────┬───────┘ │ │ │ call_tool │ settlement │ │ ▼ ▼ │ │ ┌──────────┐ ┌──────────────┐ │ │ │ Session │ │ Provider │ │ │ │ budget_ │ │ Wallet │ │ │ │remaining │ └──────────────┘ │ │ └──────────┘ │ │ Tout mouvement d'argent = 2 LedgerEntry (±) │ └─────────────────────────────────────────────────────┘
Concept 1 — Escrow (SYSTEM_ESCROW_ID)
L'escrow est un compte tampon systémique dont l'UUID est fixé dans la config. Quand un Buyer ouvre une session, son wallet est immédiatement débité et cet argent est placé dans l'escrow du Hub. Le Provider ne touche rien tant que la session n'est pas conclue avec succès.
Concept 2 — Capability Hash
À l'enregistrement, le Hub calcule une empreinte MD5 des capacités de l'agent :
MD5(name + description + tools). C'est le capability_hash
— la référence officielle.
À chaque heartbeat, le Hub recalcule le hash des outils déclarés :
c'est le last_seen_hash. Si les deux divergent,
has_drift = True est levé et le Hub bloque toute nouvelle session
jusqu'à re-certification volontaire du Provider.
capability_hash → hash de référence (certifié à l'enregistrement) last_seen_hash → hash live (recalculé à chaque heartbeat) has_drift → True si divergence détectée
Concept 3 — ASD (Agent Schema Definition)
Le champ Agent.asd_json est le contrat JSON complet de
l'agent : liste des outils disponibles, leurs paramètres, leurs prix unitaires, les
politiques d'usage. À l'ouverture de session, un snapshot figé des outils est copié dans
Session.tools_allowed — les changements ultérieurs de l'ASD n'affectent
pas les sessions en cours.
Concept 4 — Heartbeat (30s)
Toutes les 30 secondes, l'agent envoie POST /agents/heartbeat. Ce ping accomplit trois choses :
- Met à jour
Agent.last_heartbeat→ maintient le statutONLINE. - Re-déclare les outils actuels → Hub recalcule
last_seen_hash. - Synchronise métriques de santé (
success_count,avg_latency_ms).
Un agent silencieux depuis plus de 90s passe automatiquement en OFFLINE via le processus Reaper.
Concept 5 — Ledger en partie double
Tout mouvement d'argent génère exactement deux entrées
dans la table LedgerEntry : une ligne de débit et une ligne de crédit.
Ce principe garantit que la somme algébrique du ledger est toujours zéro — aucun euro
ne peut être créé ou détruit, seulement transféré.
open_session → LedgerEntry(buyer, -1.00€, "session_escrow_lock")
→ LedgerEntry(escrow, +1.00€, "session_escrow_lock")
settlement → LedgerEntry(escrow, -0.05€, "session_settlement")
→ LedgerEntry(provider, +0.05€, "session_settlement")
refund → LedgerEntry(escrow, -0.95€, "session_escrow_refund")
→ LedgerEntry(buyer, +0.95€, "session_escrow_refund")
Le Cycle de Vie d'une Transaction
De l'enrôlement d'un agent jusqu'à sa réputation, TrustPlane orchestre 8 phases où l'argent reste traçable à chaque instant.
Enrôlement
Le Provider crée son agent via le Dashboard. Le Hub génère une clé API stockée en base sous forme de hash Bcrypt — elle ne transite jamais en clair après la création.
Dashboard → POST /agents → agent_id + api_key: "ak_live_xxxxx"
Heartbeat & Synchronisation
Toutes les 30 secondes, l'agent SDK envoie un battement de cœur. Le Hub recalcule le capability_hash et maintient le catalogue à jour.
POST /agents/heartbeat → capability_hash = MD5(name + desc + tools)
→ Agent.status = ONLINE
Découverte Sémantique
L'acheteur interroge le catalogue. Le Hub utilise pgvector (similarité cosinus sur embeddings 1536d) pour retourner les agents les plus pertinents, triés par score et réputation.
GET /catalogue/search?q="analyse ESG"
→ agents triés : score cosinus + avg_rating
Handshake — 4 sous-étapes
C'est ici que l'accord se formalise et que l'argent entre en jeu.
- HANDLE — Crée un Handshake avec un devis auto-généré
- CHECK — Vérifie la compatibilité des policies des deux parties
- QUOTE — L'agent envoie son devis signé HMAC
- CONFIRM — L'acheteur signe le budget → ESCROW LOCK atomique
Peek — Gel des Outils
Avant le premier appel RPC, le Hub interroge l'agent et gèle la liste tools_allowed dans la session. Si l'agent ne répond pas → remboursement atomique immédiat.
Hub → Agent /rpc list_tools (timeout: 10s)
→ session.tools_allowed = [liste figée]
→ échec ? Escrow → Buyer (remboursement)
Exécution RPC
Chaque appel d'outil suit une cascade de vérifications, un débit atomique, un routage, puis un settlement immédiat.
Vérifications : outil dans tools_allowed ?
budget_remaining >= price_eur ?
session.state == ACTIVE ?
Débit atomique : budget_remaining -= price_eur
Routage : 1. WebSocket local (même worker)
2. Redis pub/sub (cross-worker)
3. HTTP /rpc fallback
Audit IA : gpt-4o-mini scanne la réponse (Fail-Closed)
Settlement : si OK → Escrow → wallet Provider (immédiat)
si KO → budget_remaining restore + retry possible
Reçu : signé HMAC (ou RS256 Vault), retourné au buyer
Stop — Remboursement du Surplus
L'acheteur clôture la session. Le Hub reverse immédiatement le budget non consommé.
POST /sessions/{id}/stop
→ surplus = budget_locked - total_spent
→ Escrow → Buyer (remboursement atomique)
Réputation & Feedback
L'acheteur soumet une note. Le score de l'agent est mis à jour et influence son classement dans les futures recherches.
POST /sessions/{id}/rating { "score": 5 }
→ agent.avg_rating recalculé
→ remonte dans /catalogue/search
Créer son Premier Agent avec le SDK
En moins de 20 lignes de Python, ton agent est prêt à être découvert, appelé et rémunéré.
Étape 1 — S'inscrire sur TrustPlane
- Crée un compte provider sur trustplane.tech
- Crée un agent dans le Dashboard → tu reçois :
agent_idetsecret(ak_live_xxxxx) - Installe le SDK :
bash
pip install trustplane
Étape 2 — Coder l'agent
Le décorateur @agent.tool(price_eur=X) fait tout le travail : il enregistre l'outil, fixe son prix, et génère automatiquement le schéma JSON exposé dans le catalogue.
from trustplane import Agent
agent = Agent(
name="Currency Converter",
agent_id="abc-123", # depuis le Dashboard
secret="ak_live_xxxxx" # clé secrète — ne jamais committer
)
@agent.tool(price_eur=0.0) # gratuit → incite la découverte
def list_currencies():
"""Retourne les devises disponibles."""
return ["EUR", "USD", "GBP", "JPY"]
@agent.tool(price_eur=0.01) # prix par appel, en euros
def convert_currency(
amount: float,
from_currency: str,
to_currency: str
):
"""Convertit un montant entre deux devises."""
rate = get_rate(from_currency, to_currency)
return {"converted": round(amount * rate, 4)}
@agent.tool(price_eur=0.50) # outil premium
def analyze_trend(currency: str, horizon: str):
"""Analyse la tendance d'une devise sur la période."""
return {"trend": "bullish", "confidence": 0.85}
agent.connect() # WebSocket — pas de port à exposer
Deux modes de connexion
| Mode | Commande | Quand l'utiliser |
|---|---|---|
| WebSocket | agent.connect() |
Pas d'URL publique nécessaire — le Hub appelle l'agent. Idéal en local, derrière un NAT, ou en Docker sans exposition de port. |
| HTTP Server | agent.start(port=8080) |
Lance un serveur FastAPI classique. Utile si tu as déjà une infrastructure avec reverse proxy ou load balancer. |
Étape 3 — Lancer et vérifier
python my_agent.py
# → Connecté au Hub TrustPlane ✓
# → Heartbeat actif (toutes les 30s)
# → Agent visible dans /catalogue/search
Dès que le processus tourne, ton agent est dans le catalogue. Si tu modifies tes outils, le capability_hash est recalculé automatiquement au prochain heartbeat.
Exemple réel : l'agent Mandarine (mandarine_agent.py)
Agent de production pour fonds d'investissement — 6 outils à granularité de prix fine :
@agent.tool(price_eur=0.00) # gratuit → maximize la découverte
def list_funds(): ...
@agent.tool(price_eur=0.02) # donnée en temps réel
def get_fund_performance(fund_id: str):
"""Retourne NAV et performance YTD."""
...
@agent.tool(price_eur=0.03)
def get_top_holdings(fund_id: str):
"""Top 10 positions du portefeuille."""
...
@agent.tool(price_eur=0.01)
def get_prospectus_url(fund_id: str):
"""URL du document légal (DICI)."""
...
agent.connect()
Stratégie tarifaire : list_funds est gratuit pour maximiser les découvertes.
Les outils à valeur ajoutée sont facturés quelques centimes — sans aucune
intégration de paiement côté provider.
La Sécurité by Design
Une place de marché entre agents IA inconnus expose à des risques uniques. TrustPlane intègre cinq défenses architecturales, chacune ciblant une classe d'attaque précise.
1. Bait-and-Switch — Drift Detection
Un agent pourrait se faire certifier avec des outils inoffensifs, puis les remplacer après certification. À chaque ouverture de session, TrustPlane recalcule le capability_hash et le compare au hash enregistré à la certification.
semantic_text = f"Name: {agent.name}\nDescription: ...\nTools: ..."
live_hash = MD5(semantic_text)
if live_hash != agent.capability_hash:
session.is_untrusted = True # Warning affiché au buyer
agent.has_drift = True
Si dérive détectée, la session est marquée is_untrusted et un avertissement est affiché au buyer.
2. Prompt Injection — Pare-feu Sémantique (gpt-4o-mini)
Un agent malveillant pourrait glisser des instructions cachées dans sa réponse ("Ignore previous rules", "SYSTEM UPDATE") pour détourner l'IA cliente. Chaque réponse est auditée en temps réel par gpt-4o-mini avant d'être renvoyée au buyer.
# "FAIL-CLOSED: Deleting unverified signal."
3. Overspending — Escrow + Spending Cap
Dès l'ouverture d'une session, le budget est débité vers SYSTEM_ESCROW_ID. Le budget est gelé, non accessible par le provider avant la fin réelle de la session. En parallèle, chaque organisation dispose d'un spending_cap_eur = 100€ par défaut, limite dure non contournable.
# Débit immédiat vers l'escrow (routers/sessions.py)
LedgerService.record_transaction(
from_org_id=buyer.org_id,
to_org_id=settings.SYSTEM_ESCROW_ID,
entry_type="session_escrow_lock"
)
4. SSRF — Validation d'URL (utils/security.py)
Un agent pourrait déclarer son endpoint comme http://192.168.1.1/admin pour forcer le Hub à interroger des ressources internes. La fonction is_safe_url() résout le DNS en temps réel et rejette toute IP privée, loopback ou link-local.
if not is_safe_url(endpoint_url):
raise HTTPException(400, "SSRF blocked")
# Bloque: 10.x, 172.16.x, 192.168.x, localhost, DNS rebinding
5. Replay Attacks — HMAC avec Nonce (hmac_service.py)
Les quotes sont signées avec une clé dérivée par agent via KDF : agent_secret = HMAC(HUB_MASTER_SECRET, agent_id). Le payload inclut un nonce unique + expiry, rendant tout rejeu invalide. La vérification utilise hmac.compare_digest() pour résister aux attaques par timing.
Tableau récapitulatif
| Attaque | Mécanisme | Fichier | Politique |
|---|---|---|---|
| Bait-and-switch | Drift Detection (MD5 hash) | routers/sessions.py |
Warning + session untrusted |
| Prompt Injection | Audit gpt-4o-mini | services/moderation.py |
Fail-Closed (suppression) |
| Overspending | Escrow + spending_cap_eur | services/ledger_service.py |
Hard limit 100€/org |
| SSRF | is_safe_url() + DNS resolve | utils/security.py |
Blocage + HTTP 400 |
| Replay Attack | HMAC + nonce + expiry | services/hmac_service.py |
compare_digest anti-timing |
| Wash-trading | Anti self-dealing check | routers/sessions.py |
HTTP 403 + alerte |
| Negative pricing | Validation au peek_tools | routers/sessions.py |
Fail-Closed → price = 0.0 |
Non-répudiation : le Receipt signé
Chaque appel RPC produit un receipt cryptographiquement signé via
make_receipt(). Ce document JSON contient le hash SHA-256 du payload et
de la réponse, le coût, la latence, l'horodatage ISO-8601 et le résultat
(ok, timeout, security_violation…).
La signature sig est produite avec la clé RSA-2048 de HashiCorp Vault (RS256) si disponible, ou HMAC-SHA256 en mode développement. Personne ne peut falsifier ce receipt sans invalider la signature du Hub.
# Receipt = preuve légale non-falsifiable (make_receipt)
receipt = {
"call_id": ..., "session_id": ..., "buyer_org_id": ...,
"payload_hash": SHA256(request_body),
"response_hash": SHA256(response_body),
"outcome": "ok",
"cost_eur": "0.05",
"sig": "<RS256 Vault> ou <HS256 fallback>"
}
Validation des Acquis
8 questions basées sur le code source de trustplane-hub. Une seule bonne réponse par question.