Ga naar hoofdinhoud
Audact
Bekijk het aanbod

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

  • Python 3.11+
  • httpx voor asynchroon HTTP
  • pydantic v2 voor typeveiligheid

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:

OmgevingsvariabeleStandaardwaarde
AUDACT_API_KEY(leeg)
AUDACT_BASE_URL(niet ingesteld) — één host voor elke dienst (zie Basis-URL)
AUDACT_POLICY_ENGINE_URLvalt terug op AUDACT_BASE_URL
AUDACT_VALIDATOR_URLvalt terug op AUDACT_BASE_URL
AUDACT_EVIDENCE_LAYER_URLvalt terug op AUDACT_BASE_URL
AUDACT_LLM_PROXY_URLvalt terug op AUDACT_BASE_URL
AUDACT_TENANT_MANAGEMENT_URLvalt terug op AUDACT_BASE_URL
AUDACT_AUDIO_VALIDATOR_URLvalt terug op AUDACT_BASE_URL
AUDACT_AGGREGATOR_URLvalt terug op AUDACT_BASE_URL
AUDACT_VOICE_GATEWAY_URLvalt terug op AUDACT_BASE_URL
AUDACT_AGENT_WORKER_URLvalt terug op AUDACT_BASE_URL
AUDACT_ORG_MANAGEMENT_URLvalt 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:

SubclientGebiedAuthenticatieDekking
(vlakke methoden)ValidatieAPI-sleutelACVF-validatie per gesprekbeurt
(vlakke methoden)PolicyAPI-sleutelPolicy-evaluatie, jurisdictie-policydocumenten
(vlakke methoden)EvidenceAPI-sleutelBewijsgebeurtenissen, ketens, verificatie/reconstructie, gesprekken, overtredingen, Artikel 50-rapporten/-exports, C2PA, bonnen, levering, transcriptafstemming
(vlakke methoden)LLM ProxyAPI-sleutelCompliance-gevalideerde LLM-chatafronding (synchroon + streaming)
(vlakke methoden)Tenant ManagementAPI-sleutel / platformtokenTenant-CRUD, API-sleutels, configuraties, KYC-documenten/-sets, platformexport/-import (export/import vereisen een platform_token)
(vlakke methoden)Voice GatewayAPI-sleutelNummerbestelstroom + beheerlevenscyclus, bring-your-own (BYO) SIP-trunk-verbinding
client.callsVoice GatewayAPI-sleutelSIP-gesprek-levenscyclus (uitgaand/inkomend/browser, ophangen, status, overdracht, doorverbinden), trunks, verzendregels, admission-URL, WS-tickets
client.webhooksTenant ManagementAPI-sleutelWebhook-eindpunt-CRUD, testping, aflevergeschiedenis/-herhaling, gebeurtenistype/-schemadetectie, geheimstatus/-rotatie, verify_webhook_signature-hulpfunctie
client.agentsAgent WorkerAPI-sleutelAgent-CRUD + dupliceren, TTS-spraakcatalogus-CRUD, pipelinestatus
client.toolsAgent WorkerAPI-sleutelFunction-calling-tool-CRUD/-test, agent-tool koppelen/ontkoppelen
client.knowledge_basesTenant ManagementAPI-sleutelKennisbasis (RAG)-CRUD, bronnen (url/tekst, upload_kb_source_file multipart, opnieuw inlezen), agentgekoppelde retrieval-afstemming, crawluitsluitingen, test_kb_retrieval-testomgeving
client.integrationsAgent WorkerAPI-sleutelCal.com-verbindings-CRUD/-test, gebeurtenistypedetectie
client.aggregationAggregatorAPI-sleutel (openbaar: get_metachain, verify_inclusion)Merkle-aggregatiebewijzen, openbare meta-chain, offline inclusiebevestiging
client.audioAudio ValidatorAPI-sleutelSynchrone audiovalidatie per gesprekbeurt, nabewerking audio-naar-transcriptafstemming
client.authTenant ManagementAPI-sleutelAPI-sleutel ↔ JWT-sessiebrug (exchange_key, refresh_token)
client.orgOrg ManagementOrgBearer (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.piiEvidence LayerAPI-sleutelPII-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 volgend client.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 als platform_token= aan de constructor of roep op elk moment client.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/cancelled

Bring-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 met AUDACT_API_KEY ingesteld, 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:

UitzonderingHTTP-status
AudactAuthError401
AudactForbiddenError403
AudactNotFoundError404
AudactRateLimitError429
AudactTimeoutErrortime-out
AudactConnectionErrorverbindingsfout

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 aanvullend retry_after beschikbaar (geparseerd uit de Retry-After-header) en rate_limit (een RateLimitInfo-momentopname van X-RateLimit-Limit/-Remaining/-Reset). client.last_rate_limit bevat de meest recente X-RateLimit-*-momentopname van elk antwoord, geslaagd of niet.
  • Nieuwe pogingen zijn opt-in en standaard uitgeschakeld — geef max_retries=N aan de constructor om een beperkt aantal nieuwe pogingen met backoff te activeren voor idempotente GET-verzoeken en 429/5xx-antwoorden (met inachtneming van Retry-After). Nieuwe pogingen worden nooit toegepast op validator-gerelateerde aanroepen (/v1/validate), die een hotpath-budget van 40 ms hebben.

Licentie

MIT

Bron bijgewerkt: 19 oktober 2026