Python SDK
Asynchroon Python-SDK voor het Audact-compliance-validatieplatform. Dekt alle API-operaties af met volledige typeveiligheid via pydantic en httpx.
Asynchroon Python-SDK voor het Audact-compliance-validatieplatform.
Vereisten
Installatie
De Python-SDK is nog niet gepubliceerd. De installatie-instructies verschijnen hier zodra dat zo is.
Snelstart
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
De client via base_url op één host instellen; elke dienst verwijst daarnaar en het SDK voegt
de paden /v1/... zelf toe (een afsluitende / of /v1 in base_url wordt verwijderd):
python
client = AudactClient(api_key="aud_live_...", base_url="https://api.audact.ai")
De basis-URL kan zonder codewijziging overschreven worden via de omgevingsvariabele:
bash
export AUDACT_BASE_URL=https://api.audact.ai
Volgorde van instelling per dienst: <service>_url=-kwarg → AUDACT_<SERVICE>_URL-omgeving →
base_url=-kwarg → AUDACT_BASE_URL-omgeving.
Dienstspecifieke URL's zijn alleen nodig voor implementaties waarbij elke dienst een eigen
host heeft (zie Configuratie).
Configuratie
Dienst-basis-URL's overschrijven via constructorsleutelwoordargumenten of omgevingsvariabelen:
| Omgevingsvariabele | Standaardwaarde |
|---|---|
AUDACT_API_KEY | (leeg) |
AUDACT_BASE_URL | (niet ingesteld) — één host voor elke dienst (zie Basis-URL) |
AUDACT_POLICY_ENGINE_URL | valt terug op AUDACT_BASE_URL |
AUDACT_VALIDATOR_URL | valt terug op AUDACT_BASE_URL |
AUDACT_EVIDENCE_LAYER_URL | valt terug op AUDACT_BASE_URL |
AUDACT_LLM_PROXY_URL | valt terug op AUDACT_BASE_URL |
AUDACT_TENANT_MANAGEMENT_URL | valt terug op AUDACT_BASE_URL |
AUDACT_AUDIO_VALIDATOR_URL | valt terug op AUDACT_BASE_URL |
AUDACT_AGGREGATOR_URL | valt terug op AUDACT_BASE_URL |
AUDACT_VOICE_GATEWAY_URL | valt terug op AUDACT_BASE_URL |
AUDACT_AGENT_WORKER_URL | valt terug op AUDACT_BASE_URL |
AUDACT_ORG_MANAGEMENT_URL | valt terug op AUDACT_BASE_URL |
AUDACT_ORG_TOKEN | (leeg) — OrgBearer-JWT voor client.org.* |
max_retries (constructor-kwarg, standaard 0) activeert een beperkt aantal nieuwe pogingen
met backoff voor idempotente GET-verzoeken en 429/5xx-antwoorden — zie
Nieuwe pogingen & rate-limieten hieronder.
Dekking
Het SDK dekt de gedocumenteerde API volledig af: 209 van 211 operaties zijn gedekt.
De resterende 2 zijn ontvangstzijdige webhooks van aanbieder naar platform —
POST /telnyx/webhook en POST /webhooks/livekit — dit zijn inkomende eindpunten die
Audact ontvangt, maar nooit aanroept.
Het SDK is monolithisch met attribuut-subclients: elke bestaande vlakke methode op
AudactClient (bijv. client.validate, client.evaluate, client.create_tenant) blijft
ongewijzigd werken, en de grote nieuwe oppervlakken die voor volledige dekking zijn toegevoegd
worden beschikbaar gesteld als client.<name>.*-subclients:
| Subclient | Gebied | Authenticatie | Dekking |
|---|---|---|---|
| (vlakke methoden) | Validatie | API-sleutel | ACVF-validatie per gesprekbeurt |
| (vlakke methoden) | Policy | API-sleutel | Policy-evaluatie, jurisdictie-policydocumenten |
| (vlakke methoden) | Evidence | API-sleutel | Bewijsgebeurtenissen, ketens, verificatie/reconstructie, gesprekken, overtredingen, Artikel 50-rapporten/-exports, C2PA, bonnen, levering, transcriptafstemming |
| (vlakke methoden) | LLM Proxy | API-sleutel | Compliance-gevalideerde LLM-chatafronding (synchroon + streaming) |
| (vlakke methoden) | Tenant Management | API-sleutel / platformtoken | Tenant-CRUD, API-sleutels, configuraties, KYC-documenten/-sets, platformexport/-import (export/import vereisen een platform_token) |
| (vlakke methoden) | Voice Gateway | API-sleutel | Nummerbestelstroom + beheerlevenscyclus, bring-your-own (BYO) SIP-trunk-verbinding |
client.calls | Voice Gateway | API-sleutel | SIP-gesprek-levenscyclus (uitgaand/inkomend/browser, ophangen, status, overdracht, doorverbinden), trunks, verzendregels, admission-URL, WS-tickets |
client.webhooks | Tenant Management | API-sleutel | Webhook-eindpunt-CRUD, testping, aflevergeschiedenis/-herhaling, gebeurtenistype/-schemadetectie, geheimstatus/-rotatie, verify_webhook_signature-hulpfunctie |
client.agents | Agent Worker | API-sleutel | Agent-CRUD + dupliceren, TTS-spraakcatalogus-CRUD, pipelinestatus |
client.tools | Agent Worker | API-sleutel | Function-calling-tool-CRUD/-test, agent-tool koppelen/ontkoppelen |
client.knowledge_bases | Tenant Management | API-sleutel | Kennisbasis (RAG)-CRUD, bronnen (url/tekst, upload_kb_source_file multipart, opnieuw inlezen), agentgekoppelde retrieval-afstemming, crawluitsluitingen, test_kb_retrieval-testomgeving |
client.integrations | Agent Worker | API-sleutel | Cal.com-verbindings-CRUD/-test, gebeurtenistypedetectie |
client.aggregation | Aggregator | API-sleutel (openbaar: get_metachain, verify_inclusion) | Merkle-aggregatiebewijzen, openbare meta-chain, offline inclusiebevestiging |
client.audio | Audio Validator | API-sleutel | Synchrone audiovalidatie per gesprekbeurt, nabewerking audio-naar-transcriptafstemming |
client.auth | Tenant Management | API-sleutel | API-sleutel ↔ JWT-sessiebrug (exchange_key, refresh_token) |
client.org | Org Management | OrgBearer (JWT) | Org-selfservice: registreren/aanmelden/token vernieuwen/afmelden, profiel, KYC, en de door de org beheerde tenantlevenscyclus (weergeven/aanmaken/ophalen, zachte verwijdering/inschakelen/uitschakelen/herstellen, initialiseren, sleutel uitgeven, imiteren) |
client.pii | Evidence Layer | API-sleutel | PII-keyset-verwijderingsstatus, incl. list_erased_keysets(call_id, keyset_ids) |
Authenticatiestromen
De meeste methoden sturen Authorization: Bearer <api_key> met de api_key die aan de
AudactClient-constructor is doorgegeven. Twee oppervlakken gebruiken een andere Bearer-token
(org en platform):
- OrgBearer — een JWT verkregen via
client.org.login(). Het SDK slaat hem automatisch in het geheugen van de client op; elk volgendclient.org.*-aanroep stuurt hem in plaats van de API-sleutel. - Platformtoken — een super-beheerdertoken dat vereist is voor
export_tenant/import_tenant. Geef het door alsplatform_token=aan de constructor of roep op elk momentclient.set_platform_token(token)aan.
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()
# Of starten met vooraf geverifieerde aanmelding:
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-documenten en nummerprovisioning
De tenantidentiteit wordt altijd ontleend aan de API-sleutel — geen van deze methoden
accepteert een tenant_id-parameter. Documentuploads verlopen via multipart/form-data;
documentbytes worden door geen enkel eindpunt teruggegeven (alleen metadata + 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
De tenantidentiteit wordt altijd ontleend aan de API-sleutel. BYO is puur JSON —
geen multipart vereist. SIP-aanmeldgegevens (sip_username/sip_password) zijn
schrijfbeveiligd: ze worden veilig opgeslagen en nooit teruggegeven in enig antwoord
(has_credentials is uitsluitend een booleaanse markering).
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)Een nieuwe subclient: 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)Inkomende afleveringen verifiëren met de bijgeleverde handtekeninghulpfunctie (in constante tijd, tolerant voor een geheimrotatieovergangstermijn):
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,
)Voorbeelden
Een uitvoerbaar voorbeeldscript staat onder examples/:
examples/end_to_end_flow.py— de gebruikelijke stroom: een agent aanmaken, een telefoonnummer via de bestelstroom provisionen en toewijzen, een browsertestaanroep plaatsen en vervolgens aanroepen weergeven/lezen. Uitvoeren metAUDACT_API_KEYingesteld, of als dry-run met--check(simuleert elke HTTP-aanroep in het proces, geen netwerktoegang vereist).
Foutafhandeling
API-fouten erven van AudactAPIError; time-outs (AudactTimeoutError) en verbindingsfouten (AudactConnectionError) erven van AudactError:
| Uitzondering | HTTP-status |
|---|---|
AudactAuthError | 401 |
AudactForbiddenError | 403 |
AudactNotFoundError | 404 |
AudactRateLimitError | 429 |
AudactTimeoutError | time-out |
AudactConnectionError | verbindingsfout |
De server verpakt elke fout in een geneste envelop:
{"error": {"code", "message", "hint", "details", "request_id"}}.
AudactAPIError parseert deze envelop en stelt code, message, details, hint en
request_id beschikbaar (het laatste valt ook terug op de X-Request-ID-antwoordheader) —
vermeld request_id bij contact met ondersteuning:
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)Nieuwe pogingen & rate-limieten
AudactRateLimitError(HTTP 429) stelt aanvullendretry_afterbeschikbaar (geparseerd uit deRetry-After-header) enrate_limit(eenRateLimitInfo-momentopname vanX-RateLimit-Limit/-Remaining/-Reset).client.last_rate_limitbevat de meest recenteX-RateLimit-*-momentopname van elk antwoord, geslaagd of niet.- Nieuwe pogingen zijn opt-in en standaard uitgeschakeld — geef
max_retries=Naan de constructor om een beperkt aantal nieuwe pogingen met backoff te activeren voor idempotenteGET-verzoeken en429/5xx-antwoorden (met inachtneming vanRetry-After). Nieuwe pogingen worden nooit toegepast op validator-gerelateerde aanroepen (/v1/validate), die een hotpath-budget van 40 ms hebben.
Licentie
MIT
