aetia-gateway-sdk
The official Python SDK for the Aetia LLM Gateway — a governed, versioned
inference facade. It wraps authentication, HTTP, and SSE so you never hand-roll
requests: typed models mirror the API contract exactly, and a contract test keeps
the SDK and the gateway in lockstep (GATEWAY_CONTRACT_VERSION).
pip install aetia-gateway-sdk
Requires Python 3.11+. The client is async (built on httpx.AsyncClient).
Authentication — two modes
The gateway has two external front doors; the SDK supports both.
API key (aek_…)
A long-lived key, sent directly on every request.
import asyncio
from aetia_gateway_sdk import GatewayClient, ApiKey
async def main():
async with GatewayClient("https://api.aetia.ai", ApiKey("aek_your_key")) as client:
result = await client.infer(model="openai:gpt-4o-mini", input="Hello, world")
print(result.output)
asyncio.run(main())
Client credentials (OAuth2 client-credentials)
Pass a client_id / secret; the SDK exchanges them at
POST /api/v1/auth/service-token for a short-lived scoped bearer, caches it,
and auto-refreshes it before expiry and once on a 401. A burst of
concurrent requests coalesces onto a single token exchange.
from aetia_gateway_sdk import GatewayClient, ClientCredentials
creds = ClientCredentials(client_id="svc_...", secret="...")
async with GatewayClient("https://api.aetia.ai", creds) as client:
result = await client.infer(model="openai:gpt-4o-mini", input="Hello")
print(result.output, result.usage)
base_urlis the host root (e.g.https://api.aetia.ai), not the/gatewayprefix — the SDK builds the full/api/v1/...paths itself.
The surface
Synchronous inference
result = await client.infer(
model="openai:gpt-4o-mini",
input="Summarize the meeting notes.",
options={"temperature": 0.2, "max_tokens": 256}, # provider params go here
trace_id="my-trace-123", # echoed as correlation_id
)
result.output # the model output
result.routed_alias # the provider account the engine routed to
result.usage # token accounting
result.finish_reason
result.correlation_id # == trace_id (or a server-stamped id)
Unknown top-level fields are rejected client-side before any HTTP call — put
provider parameters in options, not at the top level.
Streaming (SSE)
stream() is an async context manager + iterator. It yields the engine's delta
events and, after iteration, exposes the terminal usage / finish_reason /
correlation_id plus the assembled text.
async with client.stream(model="openai:gpt-4o-mini", input="Write a haiku") as stream:
async for event in stream:
... # each engine delta event (dict)
print(stream.text) # assembled output
print(stream.usage, stream.correlation_id)
Streaming requires a provider-qualified model (alias:model_id). A non-streaming
provider raises StreamingUnsupportedError at open time (never a silent degrade).
Async inference jobs
submitted = await client.submit_job(model="openai:gpt-4o-mini", input="long batch job")
status = await client.get_job(submitted.job_id)
if status.status == "succeeded":
print(status.result)
Run records (tamper-evident WORM ledger)
receipt = await client.submit_run(
"run-42",
usage={"total_tokens": 1200},
project="deep-research", # arbitrary consumer fields ride along verbatim
)
receipt.ledger_event_id, receipt.record_hash, receipt.previous_hash # inclusion proof
view = await client.get_run("run-42") # tenant-scoped read-back
runs = await client.list_runs()
Catalog & usage
models = await client.list_models() # list[GatewayModelEntry], tenant-scoped
usage = await client.usage() # own-usage counts + honest rate-limit posture
Errors
Every non-2xx response raises a typed error (all subclasses of GatewayError),
carrying status_code, the machine error_code, detail, correlation_id, and
retry_after where present:
| Class | HTTP | Meaning |
|---|---|---|
AuthenticationError |
401 | Missing/invalid/expired/rejected credential |
PermissionDeniedError |
403 | Authenticated but missing scope / cross-tenant |
NotFoundError |
404 | Unknown job/run for this tenant |
RequestValidationError |
422 | Server-side request validation failed |
RateLimitError |
429 | Rate limited (retry_after) |
StreamingUnsupportedError |
400 | Streaming requested on a non-streaming provider |
ServerError |
5xx | Upstream/engine failure |
StreamError |
— | An error event mid-stream |
Transient failures (429, and 5xx for idempotent requests) are retried with
backoff that honors Retry-After.
Contract versioning
aetia_gateway_sdk.GATEWAY_CONTRACT_VERSION pins the semantic gateway contract
this SDK targets. The v1 contract is additive-compatible; a breaking change moves
the API to /v2 and the SDK to 2.x. The SDK's tests/test_contract.py asserts
the SDK's models match the published external OpenAPI
(GET /api/v1/gateway/openapi.json) in both directions, so drift fails the build.
Development
pip install -e "sdk/python[test]"
# The in-process tests run against a real backend + real auth (only the LLM is
# mocked); the contract test needs only aetia_webapp importable (no DB).
pytest sdk/python/tests
License
Proprietary — © Aetia.
Metadata
Release files for aetia-gateway-sdk 1.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| aetia_gateway_sdk-1.1.0.tar.gz | 35.1 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| aetia_gateway_sdk-1.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 54.7 kB
Release files / aetia_gateway_sdk-1.1.0.tar.gz
| Download URL | aetia_gateway_sdk-1.1.0.tar.gz |
|---|---|
| Size | 35.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ecbe365a91c6d55f20075a8b164d5e40d2b168877d9a58757b80ae1c46d0902c
|
|
BLAKE2b-256 checksum How to use checksums |
172d20a6ddef46375bba093efde12215d06eb2a55286bb4eb88a1ef1737ec7f3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / aetia_gateway_sdk-1.1.0-py3-none-any.whl
| Download URL | aetia_gateway_sdk-1.1.0-py3-none-any.whl |
|---|---|
| Size | 19.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5391c661ff73479b96a8604d48dc6acc4a4609fa63ad6616dea7d4cdd38f0363
|
|
BLAKE2b-256 checksum How to use checksums |
4a9f0ef74f4c93585c7c05cecf6f93c90f7521535efbf69fbf33df0e49e65a6e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Security for aetia-gateway-sdk 1.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.