Python SDK
Asynchrones Python-SDK für die Audact-Compliance-Validierungsplattform. Deckt alle API-Operationen mit vollständiger Typsicherheit via pydantic und httpx ab.
Asynchrones Python-SDK für die Audact-Compliance-Validierungsplattform.
Voraussetzungen
Installation
Das Python-SDK ist noch nicht veröffentlicht. Die Installationsanleitung erscheint hier, sobald es so weit ist.
Schnellstart
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())Basis-URL
Den Client mit base_url auf einen einzelnen Host zeigen; jeder Dienst löst sich darüber auf,
und das SDK fügt die Pfade /v1/... selbst an (ein abschließendes / oder /v1 in
base_url wird entfernt):
python
client = AudactClient(api_key="aud_live_...", base_url="https://api.audact.ai")
Die Basis-URL kann ohne Codeänderung über die Umgebungsvariable überschrieben werden:
bash
export AUDACT_BASE_URL=https://api.audact.ai
Auflösungsreihenfolge je Dienst: <service>_url=-Kwarg → AUDACT_<SERVICE>_URL-Umgebung →
base_url=-Kwarg → AUDACT_BASE_URL-Umgebung.
Dienstspezifische URLs werden nur für Deployments benötigt, bei denen jeder Dienst auf einem
eigenen Host läuft (siehe Konfiguration).
Konfiguration
Dienst-Basis-URLs über Konstruktor-Schlüsselwortargumente oder Umgebungsvariablen überschreiben:
| Umgebungsvariable | Standardwert |
|---|---|
AUDACT_API_KEY | (leer) |
AUDACT_BASE_URL | (nicht gesetzt) — ein Host für jeden Dienst (siehe Basis-URL) |
AUDACT_POLICY_ENGINE_URL | fällt zurück auf AUDACT_BASE_URL |
AUDACT_VALIDATOR_URL | fällt zurück auf AUDACT_BASE_URL |
AUDACT_EVIDENCE_LAYER_URL | fällt zurück auf AUDACT_BASE_URL |
AUDACT_LLM_PROXY_URL | fällt zurück auf AUDACT_BASE_URL |
AUDACT_TENANT_MANAGEMENT_URL | fällt zurück auf AUDACT_BASE_URL |
AUDACT_AUDIO_VALIDATOR_URL | fällt zurück auf AUDACT_BASE_URL |
AUDACT_AGGREGATOR_URL | fällt zurück auf AUDACT_BASE_URL |
AUDACT_VOICE_GATEWAY_URL | fällt zurück auf AUDACT_BASE_URL |
AUDACT_AGENT_WORKER_URL | fällt zurück auf AUDACT_BASE_URL |
AUDACT_ORG_MANAGEMENT_URL | fällt zurück auf AUDACT_BASE_URL |
AUDACT_ORG_TOKEN | (leer) — OrgBearer-JWT für client.org.* |
max_retries (Konstruktor-Kwarg, Standardwert 0) aktiviert einen begrenzten
Wiederholungsversuch mit Backoff für idempotente GET-Anfragen und 429/5xx-Antworten —
siehe Wiederholungsversuche & Rate-Limits weiter unten.
Abdeckung
Das SDK deckt die dokumentierte API vollständig ab: 209 von 211 Operationen sind abgedeckt.
Die verbleibenden 2 sind empfangsseitige Provider-zu-Plattform-Webhooks —
POST /telnyx/webhook und POST /webhooks/livekit — hierbei handelt es sich um
Ingress-Endpunkte, die Audact empfängt, aber nie aufruft.
Das SDK ist monolithisch mit attributbasierten Sub-Clients: Jede bestehende flache Methode
auf AudactClient (z. B. client.validate, client.evaluate, client.create_tenant)
funktioniert weiterhin unverändert, und die großen neuen Oberflächen für die vollständige
Abdeckung sind als client.<name>.*-Sub-Clients verfügbar:
| Sub-Client | Bereich | Authentifizierung | Abdeckung |
|---|---|---|---|
| (flache Methoden) | Validierung | API-Schlüssel | ACVF-Validierung pro Gesprächszug |
| (flache Methoden) | Policy | API-Schlüssel | Policy-Auswertung, Jurisdictions-Policy-Dokumente |
| (flache Methoden) | Evidence | API-Schlüssel | Nachweis-Ereignisse, Ketten, Verifikation/Rekonstruktion, Anrufe, Verstöße, Artikel-50-Berichte/-Exporte, C2PA, Quittungen, Zustellung, Transkript-Abstimmung |
| (flache Methoden) | LLM Proxy | API-Schlüssel | Compliance-validierter LLM-Chat-Abschluss (synchron + Streaming) |
| (flache Methoden) | Tenant Management | API-Schlüssel / Plattform-Token | Mandanten-CRUD, API-Schlüssel, Konfigurationen, KYC-Dokumente/-Sets, Plattform-Export/-Import (Export/Import erfordern einen platform_token) |
| (flache Methoden) | Voice Gateway | API-Schlüssel | Rufnummern-Bestellablauf + Verwaltungslebenszyklus, Bring-your-own (BYO) SIP-Trunk-Verbindung |
client.calls | Voice Gateway | API-Schlüssel | SIP-Anruf-Lebenszyklus (ausgehend/eingehend/Browser, Auflegen, Status, Übergabe, Transfer), Trunks, Dispatch-Regeln, Admission-URL, WS-Tickets |
client.webhooks | Tenant Management | API-Schlüssel | Webhook-Endpunkt-CRUD, Test-Ping, Zustellungsverlauf/-Wiederholung, Event-Typ-/Schema-Ermittlung, Geheimnis-Status/-Rotation, verify_webhook_signature-Hilfsfunktion |
client.agents | Agent Worker | API-Schlüssel | Agent-CRUD + Duplizieren, TTS-Stimmen-Katalog-CRUD, Pipeline-Status |
client.tools | Agent Worker | API-Schlüssel | Function-Calling-Tool-CRUD/-Test, Agent-Tool-Anhängen/-Abhängen |
client.knowledge_bases | Tenant Management | API-Schlüssel | Knowledge-Base (RAG)-CRUD, Quellen (url/text, upload_kb_source_file multipart, erneutes Einlesen), Agent-Verknüpfungen + Retrieval-Abstimmung, Crawl-Ausschlüsse, test_kb_retrieval-Testumgebung |
client.integrations | Agent Worker | API-Schlüssel | Cal.com-Verbindungs-CRUD/-Test, Event-Typ-Ermittlung |
client.aggregation | Aggregator | API-Schlüssel (öffentlich: get_metachain, verify_inclusion) | Merkle-Aggregationsnachweise, öffentliche Meta-Chain, Offline-Einschlussverifikation |
client.audio | Audio Validator | API-Schlüssel | Synchrone Audio-Validierung pro Gesprächszug, nachträgliche Audio-zu-Transkript-Abstimmung |
client.auth | Tenant Management | API-Schlüssel | API-Schlüssel ↔ JWT-Session-Bridge (exchange_key, refresh_token) |
client.org | Org Management | OrgBearer (JWT) | Org-Self-Service: Registrierung/Anmeldung/Token-Aktualisierung/Abmeldung, Profil, KYC, sowie der org-eigene Mandanten-Lebenszyklus (auflisten/erstellen/abrufen, Soft-Delete/Aktivieren/Deaktivieren/Wiederherstellen, Initialisieren, Schlüssel ausstellen, Impersonation) |
client.pii | Evidence Layer | API-Schlüssel | PII-Keyset-Löschstatus, inkl. list_erased_keysets(call_id, keyset_ids) |
Authentifizierungsabläufe
Die meisten Methoden senden Authorization: Bearer <api_key> mit dem api_key, der dem
AudactClient-Konstruktor übergeben wurde. Zwei Oberflächen verwenden einen anderen
Bearer-Token (Org und Plattform):
- OrgBearer — ein JWT, der von
client.org.login()bezogen wird. Das SDK speichert ihn automatisch im Arbeitsspeicher des Clients; jeder nachfolgendeclient.org.*-Aufruf sendet ihn anstelle des API-Schlüssels. - Plattform-Token — ein Super-Admin-Token, der für
export_tenant/import_tenanterforderlich ist. Alsplatform_token=an den Konstruktor übergeben oder jederzeit mitclient.set_platform_token(token)setzen.
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()
# Oder vorher authentifiziert starten:
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)KYC-Dokumente & Rufnummernbereitstellung
Die Mandantenidentität wird immer aus dem API-Schlüssel entnommen — keine dieser Methoden
nimmt einen tenant_id-Parameter entgegen. Dokument-Uploads erfolgen als
multipart/form-data; Dokumentbytes werden von keinem Endpunkt zurückgegeben
(nur Metadaten + sha256).
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/cancelledBring-your-own (BYO)-Telefonie
Die Mandantenidentität wird immer aus dem API-Schlüssel entnommen. BYO ist reines JSON —
kein Multipart erforderlich. SIP-Anmeldedaten (sip_username/sip_password) sind
schreibgeschützt: sie werden sicher gespeichert und in keiner Antwort zurückgegeben
(has_credentials ist ausschließlich ein boolesches Flag).
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)Ein neuer Sub-Client: 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)Eingehende Zustellungen mit dem mitgelieferten Signatur-Hilfsprogramm verifizieren (zeitkonstant, tolerant gegenüber einer Geheimnis-Rotations-Karenzzeit):
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,
)Beispiele
Ein ausführbares Beispielskript liegt unter examples/:
examples/end_to_end_flow.py— der typische Ablauf: einen Agenten erstellen, eine Rufnummer über den Bestellvorgang bereitstellen und zuweisen, einen Browser-Testanruf tätigen, dann Anrufe auflisten/lesen. Mit gesetzter UmgebungsvariableAUDACT_API_KEYausführen oder mit--checkals Dry-Run starten (jeder HTTP-Aufruf wird prozessintern simuliert, kein Netzwerkzugriff erforderlich).
Fehlerbehandlung
API-Fehler erben von AudactAPIError; Timeouts (AudactTimeoutError) und Verbindungsfehler (AudactConnectionError) erben von AudactError:
| Ausnahme | HTTP-Status |
|---|---|
AudactAuthError | 401 |
AudactForbiddenError | 403 |
AudactNotFoundError | 404 |
AudactRateLimitError | 429 |
AudactTimeoutError | Timeout |
AudactConnectionError | Verbindungsfehler |
Der Server verpackt jeden Fehler in ein verschachteltes Envelope:
{"error": {"code", "message", "hint", "details", "request_id"}}.
AudactAPIError analysiert dieses und stellt code, message, details, hint und
request_id bereit (letzteres greift auch auf den X-Request-ID-Antwort-Header zurück) —
geben Sie request_id beim Support an:
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)Wiederholungsversuche & Rate-Limits
AudactRateLimitError(HTTP 429) stellt zusätzlichretry_afterbereit (geparst aus demRetry-After-Header) sowierate_limit(einRateLimitInfo-Snapshot vonX-RateLimit-Limit/-Remaining/-Reset).client.last_rate_limitenthält den aktuellstenX-RateLimit-*-Snapshot von jeder Antwort, ob Erfolg oder Fehler.- Wiederholungsversuche sind opt-in und standardmäßig deaktiviert —
max_retries=Nan den Konstruktor übergeben, um einen begrenzten Wiederholungsversuch mit Backoff für idempotenteGET-Anfragen und429/5xx-Antworten zu aktivieren (unter Beachtung vonRetry-After). Wiederholungsversuche werden nie auf Validator-nahe Aufrufe (/v1/validate) angewendet, die ein 40-ms-Hotpath-Budget haben.
Lizenz
MIT
