SDK Python
SDK Python asynchrone pour la plateforme de validation de conformité Audact. Couvre toutes les opérations de l’API avec un typage complet grâce à pydantic et httpx.
- SDK Python et Go: Est-ce construit
- Est-ce construitEn développement
- SDK Python et Go: Puis-je y accéder
- Puis-je y accéderNon disponible
Pourquoi cet état
- Affirmation
- En développement · Non disponible
- Périmètre
- Les bibliothèques clientes Python et Go documentées à /docs/sdks/python et /docs/sdks/go. Pas le SDK TypeScript, qui a sa propre entrée.
- Fondement
- Mesuré le 22 octobre 2026 : les SDK Python (audact) et Go (github.com/audactai/audact-go-sdk) sont construits dans le dépôt du produit, mais aucun n’est publié : PyPI et le proxy de modules Go renvoient tous deux 404.
- Ce que cela n’établit pas
- La date de publication publique des paquets.
- Ce que vous pouvez obtenir aujourd’hui
- Rien à installer pour l’instant.
- Dernière vérification
- 22 octobre 2026
- Où le vérifier
- /docs/sdks
SDK Python asynchrone pour la plateforme de validation de conformité Audact.
Prérequis
Installation
Le SDK Python n’est pas encore publié. Les instructions d’installation figureront ici lorsqu’il le sera.
Démarrage rapide
python
import asyncio
import uuid
from audact import AudactClient
async def main():
async with AudactClient(api_key="aud_live_...") as client:
# Validate a conversation turn
result = await client.validate(
call_id=uuid.uuid4(),
tenant_id=uuid.UUID("..."),
config_id=uuid.UUID("..."),
turn=1,
content="Hello, this is an automated message.",
)
print(result.verdict) # "ALLOW" | "BLOCK" | "MODIFY"
asyncio.run(main())URL de base
Pointez le client vers un seul hôte avec base_url ; tous les services y sont résolus
et le SDK ajoute lui-même les chemins /v1/... (un / ou un /v1 final dans
base_url est supprimé) :
python
client = AudactClient(api_key="aud_live_...", base_url="https://api.audact.ai")
Remplacez l’URL de base via la variable d’environnement, sans changer le code :
bash
export AUDACT_BASE_URL=https://api.audact.ai
Ordre de résolution par service : argument nommé <service>_url= → variable d’environnement AUDACT_<SERVICE>_URL
→ argument nommé base_url= → variable d’environnement AUDACT_BASE_URL.
Les URL par service ne sont nécessaires que pour les déploiements où chaque service a son
propre hôte (voir Configuration).
Configuration
Remplacez les URL de base des services via les arguments nommés du constructeur ou via des variables d’environnement :
| Variable d’environnement | Valeur par défaut |
|---|---|
AUDACT_API_KEY | (vide) |
AUDACT_BASE_URL | (non définie) — un seul hôte pour tous les services (voir URL de base) |
AUDACT_POLICY_ENGINE_URL | se replie sur AUDACT_BASE_URL |
AUDACT_VALIDATOR_URL | se replie sur AUDACT_BASE_URL |
AUDACT_EVIDENCE_LAYER_URL | se replie sur AUDACT_BASE_URL |
AUDACT_LLM_PROXY_URL | se replie sur AUDACT_BASE_URL |
AUDACT_TENANT_MANAGEMENT_URL | se replie sur AUDACT_BASE_URL |
AUDACT_AUDIO_VALIDATOR_URL | se replie sur AUDACT_BASE_URL |
AUDACT_AGGREGATOR_URL | se replie sur AUDACT_BASE_URL |
AUDACT_VOICE_GATEWAY_URL | se replie sur AUDACT_BASE_URL |
AUDACT_AGENT_WORKER_URL | se replie sur AUDACT_BASE_URL |
AUDACT_ORG_MANAGEMENT_URL | se replie sur AUDACT_BASE_URL |
AUDACT_ORG_TOKEN | (vide) — JWT OrgBearer pour client.org.* |
max_retries (argument nommé du constructeur, 0 par défaut) active, sur demande, une
reprise bornée avec temporisation progressive pour les GET idempotents et les réponses 429/5xx — voir
Nouvelles tentatives et limites de débit ci-dessous.
Couverture
Le SDK est à parité complète avec l’API documentée : 209 des 211 opérations sont couvertes. Les 2 restantes sont des webhooks côté réception,
du fournisseur vers la plateforme — POST /telnyx/webhook et
POST /webhooks/livekit — qui sont des points d’entrée qu’Audact reçoit,
sans jamais les appeler.
Le SDK est monolithique avec des sous-clients en attributs : toutes les méthodes plates
préexistantes de AudactClient (par exemple client.validate, client.evaluate,
client.create_tenant) continuent de fonctionner sans changement, et les nouvelles grandes surfaces
ajoutées pour la parité sont exposées sous forme de sous-clients client.<name>.* :
| Sous-client | Domaine | Authentification | Ce qu’il couvre |
|---|---|---|---|
| (méthodes plates) | Validation | Clé API | Validation ACVF à chaque tour |
| (méthodes plates) | Règles | Clé API | Évaluation des règles, documents de règles par juridiction |
| (méthodes plates) | Preuves | Clé API | Événements de preuve, chaînes, vérification/reconstruction, appels, violations, rapports et exports de l’article 50, C2PA, reçus, livraison, rapprochement des transcriptions |
| (méthodes plates) | LLM Proxy | Clé API | Complétion de chat LLM validée par les contrôles de conformité (synchrone + streaming) |
| (méthodes plates) | Tenant Management | Clé API / jeton de plateforme | CRUD des tenants, clés API, configurations, documents/ensembles KYC, export/import de la plateforme (l’export et l’import exigent un platform_token) |
| (méthodes plates) | Voice Gateway | Clé API | Parcours de commande et cycle de vie de gestion du provisionnement des numéros, connexion de trunk SIP bring-your-own (BYO) |
client.calls | Voice Gateway | Clé API | Cycle de vie des appels SIP (sortant/entrant/navigateur, raccrochage, état, reprise en main, transfert), trunks, règles de distribution, URL d’admission, tickets WS |
client.webhooks | Tenant Management | Clé API | CRUD des points de terminaison de webhooks, ping de test, historique des livraisons/renvoi, découverte des types d’événements/schémas, état/rotation des secrets, assistant verify_webhook_signature |
client.agents | Agent Worker | Clé API | CRUD des agents + duplication, CRUD du catalogue de voix TTS, état du pipeline |
client.tools | Agent Worker | Clé API | CRUD/test des outils d’appel de fonctions, rattachement/détachement d’outils aux agents |
client.knowledge_bases | Tenant Management | Clé API | CRUD des bases de connaissances (RAG), sources (url/texte, upload_kb_source_file multipart, réingestion), liens avec les agents + réglage de la récupération, exclusions d’exploration, banc de test test_kb_retrieval |
client.integrations | Agent Worker | Clé API | CRUD/test des connexions Cal.com, découverte des types d’événements |
client.aggregation | Aggregator | Clé API (public : get_metachain, verify_inclusion) | Preuves d’agrégation de Merkle, méta-chaîne publique, vérification hors ligne des preuves d’inclusion |
client.audio | Audio Validator | Clé API | Validation audio synchrone à chaque tour, rapprochement audio-transcription après l’appel |
client.auth | Tenant Management | Clé API | Passerelle clé API ↔ session JWT (exchange_key, refresh_token) |
client.org | Org Management | OrgBearer (JWT) | Libre-service de l’organisation : inscription/connexion/rafraîchissement/déconnexion, profil, KYC, ainsi que le cycle de vie des tenants rattachés à l’organisation (liste/création/lecture, suppression logique/activation/désactivation/restauration, initialisation, émission de clé, impersonation) |
client.pii | Evidence Layer | Clé API | État de l’effacement des jeux de clés PII, y compris list_erased_keysets(call_id, keyset_ids) |
Flux d’authentification
La plupart des méthodes envoient Authorization: Bearer <api_key> avec la api_key
transmise au constructeur AudactClient. Deux surfaces utilisent un autre
jeton Bearer (organisation et plateforme) :
- OrgBearer — un JWT obtenu auprès de
client.org.login(). Le SDK le conserve automatiquement en mémoire sur le client ; chaque appelclient.org.*suivant l’envoie à la place de la clé API. - Jeton de plateforme — un jeton de super-administrateur exigé pour
export_tenant/import_tenant. Transmettez-le au constructeur sous la formeplatform_token=ou appelezclient.set_platform_token(token)à tout moment.
python
async with AudactClient(api_key="aud_live_...") as client:
# login() is public (no bearer required) and stores the returned access
# token on client.org automatically.
await client.org.login(OrgLoginRequest(email="admin@example.com", password="hunter2"))
# Subsequent calls send `Authorization: Bearer <jwt>`.
profile = await client.org.get_profile()
tenants = await client.org.list_tenants()
# Rotate the token before it expires, then clear it when done.
await client.org.refresh()
await client.org.logout()
# Or start pre-authenticated:
client = AudactClient(
api_key="aud_live_...",
org_token="<jwt from a prior login>",
)Streaming
python
async with AudactClient(api_key="...") as client:
async for chunk in client.proxy_stream(
"/v1/proxy/openai/stream",
json={"model": "gpt-4o", "messages": [...], "stream": True},
):
print(chunk.decode(), end="", flush=True)Documents KYC et provisionnement de numéros
L’identité du tenant est toujours tirée de la clé API — aucune de ces méthodes
n’accepte de paramètre tenant_id. Les envois de documents se font en multipart/form-data ;
les octets des documents ne sont jamais renvoyés par aucun point de terminaison (métadonnées + sha256 uniquement).
python
async with AudactClient(api_key="aud_live_...") as client:
# Upload a KYC document (raw bytes or an open file handle both work).
doc = await client.upload_kyc_document(
open("passport.pdf", "rb"), doc_type="passport"
)
# Discover what Telnyx requires, then create + submit a document set.
requirements = await client.get_kyc_requirements(country="NL", number_type="mobile")
doc_set = await client.create_kyc_document_set(
CreateKYCDocumentSetRequest(
name="NL mobile KYC",
country_code="NL",
number_type="mobile",
items=[
KYCDocumentSetItemRequest(requirement_id=req.id, document_id=doc.id)
for req in requirements
],
)
)
# Once doc_set.status == "approved" (poll get_kyc_document_set), place an order.
order = await client.create_number_order(
CreateNumberOrderRequest(country_code="NL", number_type="mobile", set_id=doc_set.id)
)
order = await client.wait_for_order(order.id) # polls until success/failure/cancelledTéléphonie bring-your-own (BYO)
L’identité du tenant est toujours tirée de la clé API. Le BYO se fait en JSON pur — sans
multipart. Les identifiants SIP (sip_username/sip_password) sont en écriture seule :
stockés de manière sécurisée et jamais renvoyés dans
une réponse (has_credentials est uniquement un indicateur booléen).
python
async with AudactClient(api_key="aud_live_...") as client:
# Fetch this deployment's SIP ingress host before configuring any trunk.
config = await client.get_byo_config()
print(config.sip_ingress_host, config.signaling_ips)
# Register a BYO SIP trunk connection (either creds or an IP allowlist
# is required) — runs a connect-time health probe before returning.
conn = await client.create_byo_connection(
CreateBYOConnectionRequest(
name="Acme HQ Twilio Trunk",
provider="twilio",
sip_host="acme.pstn.twilio.com",
sip_username="acme-trunk-user",
sip_password="correct-horse-battery-staple",
)
)
print(conn.connection_health) # "healthy" | "unreachable"
# Add a number over that connection — origin-aware create_number.
number = await client.create_number(
CreateNumberRequest(
did="+12125551234",
country_code="US",
origin="byo",
byo_connection_id=conn.id,
)
)
print(number.origin, number.provider, number.connection_health)Un nouveau sous-client : les webhooks
python
async with AudactClient(api_key="aud_live_...") as client:
endpoint = await client.webhooks.create_webhook(
CreateWebhookRequest(
scope="account",
url="https://example.com/hooks/audact",
events=["call_ended", "compliance.violation_detected"],
)
)
# `endpoint.signing_secret` is returned ONLY on this first call — store it.
await client.webhooks.test_webhook(endpoint.id)
deliveries = await client.webhooks.list_webhook_deliveries(endpoint.id)Vérifiez les livraisons entrantes avec l’assistant de signature fourni (en temps constant, tolérant à une période de grâce de rotation du secret) :
python
from audact import verify_webhook_signature
is_valid = verify_webhook_signature(
payload_bytes=raw_request_body, # the exact, unparsed bytes
signature_header=request.headers["X-Audact-Signature"],
secret=stored_signing_secret,
)Exemples
Un script d’exemple exécutable se trouve sous examples/ :
examples/end_to_end_flow.py— le parcours courant : créer un agent, provisionner et affecter un numéro de téléphone via le parcours de commande, passer un appel de test depuis le navigateur, puis lister/lire les appels. Exécutez-le avecAUDACT_API_KEYdéfini, ou en simulation avec--check(simule tous les appels HTTP dans le processus, aucun accès réseau n’est requis).
Gestion des erreurs
Les erreurs d’API héritent de AudactAPIError ; les délais dépassés (AudactTimeoutError) et les échecs de connexion (AudactConnectionError) héritent de AudactError :
| Exception | Statut HTTP |
|---|---|
AudactAuthError | 401 |
AudactForbiddenError | 403 |
AudactNotFoundError | 404 |
AudactRateLimitError | 429 |
AudactTimeoutError | délai dépassé |
AudactConnectionError | erreur de connexion |
Le serveur enveloppe chaque erreur dans une enveloppe imbriquée,
{"error": {"code", "message", "hint", "details", "request_id"}}.
AudactAPIError l’analyse et expose
code, message, details, hint et request_id (ce dernier se rabat aussi
sur l’en-tête de réponse X-Request-ID) — indiquez request_id
lorsque vous contactez le support :
python
from audact import AudactAPIError, AudactRateLimitError
try:
await client.validate(...)
except AudactRateLimitError as exc:
print("retry in", exc.retry_after, "seconds", exc.request_id)
except AudactAPIError as exc:
print(exc.code, exc.message, exc.hint, exc.request_id)Nouvelles tentatives et limites de débit
AudactRateLimitError(HTTP 429) expose en plusretry_after(analysé à partir de l’en-têteRetry-After) etrate_limit(un instantanéRateLimitInfodeX-RateLimit-Limit/-Remaining/-Reset).client.last_rate_limitconserve le dernier instantanéX-RateLimit-*vu sur n’importe quelle réponse, en succès comme en erreur.- Les nouvelles tentatives sont facultatives et désactivées par défaut — transmettez
max_retries=Nau constructeur pour activer une reprise bornée avec temporisation progressive pour lesGETidempotents et les réponses429/5xx(en respectantRetry-After). Les nouvelles tentatives ne sont jamais appliquées aux appels proches du Validator (/v1/validate), qui disposent d’un budget de 40 ms sur le chemin critique.
Licence
MIT