Official Python client SDK for the Ergon Platform public API
Project description
Ergon Platform SDK (Python)
Typed Python client for the Ergon Platform public HTTP API. Async and sync, with automatic API-key authentication, retries, pagination, and typed errors.
- Distribution:
ergon-platform-sdk - Import root:
ergon_platform
This is the client SDK (for consuming the platform API). It is unrelated to
ergon-framework-python(import rootergon), which is for building services.
Install
pip install ergon-platform-sdk
# or, in this workspace:
uv sync
Quick start
Synchronous
from ergon_platform import ErgonClient
# Machine-to-machine: the API key's company is baked into the issued token,
# so you never pass company_id.
client = ErgonClient(
client_id="ek_...",
client_secret="eks_...",
base_url="http://localhost", # gateway origin
)
# IAM — `companies` is a uniform collection
company = client.iam.companies.create(name="Acme")
for key in client.iam.api_keys.iter(company_id=company.id):
print(key.name)
# Workflows — the service node *is* the workflow resource (list/create are
# company-scoped); drill into one workflow's subtree via the scope accessor.
page = client.workflows.list(limit=50) # company_id is inferred from the JWT
for wf in page.items:
print(wf.id, wf.name)
scope = client.workflows.workflow(page.items[0].id)
scope.create_item(title="New ticket") # POST workflows/{id}/items
client.workflows.items.claim(item_id="...") # id-addressed action
Asynchronous
import asyncio
from ergon_platform import AsyncErgonClient
async def main() -> None:
async with AsyncErgonClient(client_id="ek_...", client_secret="eks_...") as client:
# `iter` transparently follows pagination across pages
async for bucket in client.buckets.buckets.iter():
print(bucket.id, bucket.name)
asyncio.run(main())
Errors
from ergon_platform import NotFoundError, PermissionDeniedError
try:
client.iam.companies.get("does-not-exist")
except NotFoundError as exc:
print(exc.status_code, exc.detail, exc.request_id)
Authentication
| Mode | Constructor args | Notes |
|---|---|---|
| API key (M2M) | client_id, client_secret |
Primary. Token exchanged + refreshed automatically. Tenant is implicit. |
| Bearer token | token= |
Pre-obtained JWT (e.g. a user access token). Pass company_id= if the token isn't pinned to a company. |
Services
Ten services hang off the client:
client.iam, client.workflows, client.channels, client.agents,
client.worksheets, client.buckets, client.event_streams,
client.conversations, client.automations, client.apps.
Conventions
The facade follows the same shape across every service, so once you learn one you know them all:
- Collections — a uniform REST resource exposes
list/iter/get/create/update/delete. For exampleclient.buckets.bucketsorclient.iam.companies. - Pages —
list(...)returns aPagewith.itemsand.total;iter(...)is a generator (or async generator) that transparently walks every page for you. - Scopes — resources nested under a parent id are reached through an
accessor that returns a sub-client, e.g.
client.workflows.workflow(workflow_id)exposesworkflows/{id}/*, andclient.buckets.buckets.access(bucket_id).grantsexposes the per-bucket grant subtree. - Actions — non-CRUD endpoints are plain methods named after the verb,
e.g.
client.workflows.items.claim(item_id=...)or.route(item_id=..., target_phase_id=...). - Typing — responses are parsed into generated Pydantic models when the schema is unambiguous; otherwise a permissive model is used that preserves every field the server returns (so new fields never break you).
- Escape hatch — the full, fully-typed generated client and every schema
for every endpoint live under
ergon_platform._generated.<service>if you need an operation the facade doesn't surface ergonomically.
Both ErgonClient and AsyncErgonClient expose the identical surface; the
async variant returns awaitables / async iterators.
Coverage
The facade wires every public operation of all ten services (see the
generated matrix at docs/coverage.md). Only each
service's /health liveness probe is intentionally left out. A CI guard
(scripts/coverage.py --check) fails the build if the platform grows a new
endpoint that isn't wired, so the SDK can't silently drift behind the API.
Development
uv run python scripts/export_openapi.py # refresh specs from a running platform
uv run python scripts/generate.py # regenerate the _generated client layer
uv run python scripts/coverage.py # regenerate docs/coverage.md
uv run python scripts/coverage.py --check # CI guard: fail on unwired endpoints
uv run --package ergon-platform-sdk pytest # unit tests
ERGON_INTEGRATION=1 uv run --package ergon-platform-sdk pytest -m integration
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ergon_platform_sdk-0.1.0.tar.gz.
File metadata
- Download URL: ergon_platform_sdk-0.1.0.tar.gz
- Upload date:
- Size: 143.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.23 {"installer":{"name":"uv","version":"0.11.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
245af802d512eeb0e2090bb3a50f49b0ad75023db8f7a17cf87a969467e3071b
|
|
| MD5 |
c560d19b613005549514489286fabb85
|
|
| BLAKE2b-256 |
658f977eec21661e2b0b6207ca09e39428aa6d9d3c1aa780cd4222460f4b1d22
|
File details
Details for the file ergon_platform_sdk-0.1.0-py3-none-any.whl.
File metadata
- Download URL: ergon_platform_sdk-0.1.0-py3-none-any.whl
- Upload date:
- Size: 244.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.23 {"installer":{"name":"uv","version":"0.11.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dab9d2178a796fa688d4a46afbf4bb79f5a8c7caed61d8ada3aa77120b1bb775
|
|
| MD5 |
9156059c51ad0086978279b742c1546a
|
|
| BLAKE2b-256 |
41a6b4c098cc8f7aa58a84b1105a921b001d462853f1d6574a3a9b69aa03426c
|