Skip to content

v1.0.0

Choose a tag to compare

@antoox-yk antoox-yk released this 21 Aug 13:29
· 9 commits to main since this release

Generated from API version v2026-08-20.

First release. Covers every operation in that spec — 18 of them — plus two polling helpers over
its status endpoints. Response models are generated from its schemas. Requires Python 3.10+.

Added

  • Abyssale and AsyncAbyssale, over httpx. Both are context managers and both accept a
    caller-supplied httpx client.
  • All 18 endpoints — auth; design list/read/format read; sync and async generation; multipage
    PDF; generation-request status; file read; fonts; projects list/create; export; dynamic image
    URL; workspace templates, categories, duplication and duplication status.
  • wait_for_generation_request / wait_for_duplication_request — exponential backoff with
    jitter, a 30-minute default deadline, and a budget of three consecutive transient failures that
    resets on any successful poll. Partial success resolves: a finalized request carrying both banners
    and per-format errors is a result, not an exception. Only a request that finalized with no banners
    at all and at least one error raises.
  • Retries that follow the spec's error contract — 5xx on idempotent methods only (every POST
    bills credits, and a 504 does not mean the render did not happen); the full ladder for a 429
    carrying Retry-After; exactly one one-second probe for a bare 429, because
    rate_limit_exceeded conflates spent credits with the gateway's per-second ceiling;
    feature_not_in_plan never retried, whatever headers the response carries.
  • max_retry_wait ($ABYSSALE_MAX_RETRY_WAIT_MS, default 30s) — the longest single
    Retry-After the SDK will sleep through on your behalf. The rate limiter can name a cool-off of
    ~1700s once a quota is spent, and max_retries multiplies it, so honouring it blindly would turn
    one call into 83 minutes of silence. Past the bound the call fails immediately with
    AbyssaleRateLimitError, retry_after carrying the server's figure so the decision is yours.
    Pass math.inf to wait however long the server asks.
  • An exception hierarchy under AbyssaleError, built from the API's single error envelope — the
    machine-readable id is always on the exception, and errors holds the per-field problems when
    the failure was a payload problem.
  • Pydantic response models generated from the spec, with the Alpha design-import surface
    stripped by scripts/fetch_spec.py.
  • Seven runnable examples in examples/, each exercising a documented operation end to end.

Notes

  • Request bodies are plain dicts. The elements schema is an anyOf of ten deliberately
    overlapping branches with no discriminator, and the API accepts unknown element names by design,
    so bodies are passed through untouched rather than modelled.
  • Parsing never fails a successful response. Unknown fields are kept, and a field the spec
    calls required but the response omits does not raise — the spec is hand-maintained and the API is
    the authority.