wovyr-sdk
A Python client for the Wovyr AI Platform HTTP API,
hand-written from the actual wovyr-server routes (see
docs/09-api/openapi.yaml for the full
contract) — the same source sdks/typescript was generated
from, so the two clients cover identical ground.
Zero runtime dependencies: the HTTP layer is built on urllib from the
standard library rather than requests/httpx, so there's nothing to
install to use it.
Install
Published as wovyr-sdk on PyPI:
pip install wovyr-sdk
Usage
from wovyr_sdk import WovyrClient
client = WovyrClient(
"http://127.0.0.1:8080",
tenant="acme", # optional, defaults to the server's "default" tenant
principal="alice", # optional
)
result = client.agents.run({"manifest": my_agent_yaml, "input": {"message": "Hi"}})
print(result["output"]["message"])
# Streaming:
for frame in client.agents.stream({"manifest": my_agent_yaml, "input": {}}):
if frame["type"] == "delta":
print(frame["text"], end="")
if frame["type"] == "result":
print("\ndone:", frame["output"]["message"])
Every resource is namespaced on the client: client.agents, client.workflows,
client.memory, client.plugins, client.marketplace, client.secrets,
client.organizations, client.projects, client.webhooks, client.audit,
client.tools.
Errors are raised as WovyrApiError (.status, .code, .request_id, .body)
mapping the server's {error: {...}} envelope.
Pagination: every list method returns a Page dict (data/has_more/
next_cursor/total_estimate); paginate_all drains every page:
from wovyr_sdk import paginate_all
for agent_id in paginate_all(client.agents.list, limit=25):
...
Development
No package manager is required to run this SDK — it's stdlib-only. To run the tests:
cargo run -p wovyr-cli -- dev --addr 127.0.0.1:8080 &
python3 -m unittest discover -s tests -v
Tests are integration tests against a real, locally running server (skip
cleanly, not failing, if WOVYR_TEST_BASE_URL — default
http://127.0.0.1:8080 — is unreachable), plus a handful of unit tests for
the retry/backoff logic against a fake opener (no socket).
One test (test_projects_create_with_stale_if_match_is_rejected) exercises
organization/project creation, which — unlike agents/workflows/memory — has no
anonymous-default-tenant back-compat bypass; it needs a real org.admin role.
Start the server with WOVYR_PLATFORM_ADMINS=sdk-test-admin for that test to
run instead of skip.
Asyncio
For asyncio programs, wovyr_sdk.aio.AsyncWovyrClient exposes the same
resource surface with every method awaitable (the sync transport runs in a
worker thread, so the event loop never blocks; streaming yields frames as
they arrive):
from wovyr_sdk.aio import AsyncWovyrClient
client = AsyncWovyrClient("http://127.0.0.1:8080")
result = await client.agents.run({"manifest": my_agent_yaml, "input": {"message": "Hi"}})
final = await client.workflows.wait_for_completion(execution_id)
async for frame in client.agents.stream({"manifest": my_agent_yaml}):
...
Retries, polling, versions
- GET requests retry transient failures (429/502/503/504, network errors)
with exponential backoff — configurable via
retry=RetryOptions(...). - Mutations retry only when keyed: pass
idempotency_key=and the same retry policy applies — the server's replay middleware makes it safe. A keyless mutation never auto-retries (it could double-execute). client.workflows.wait_for_completion(execution_id)polls to a terminal status and returns the final snapshot (WovyrTimeoutErroron deadline) — no more hand-rolled poll loops.- Versioning: the SDK version tracks the platform release it targets
(same major.minor = same API surface; see
CHANGELOG.md).health()emits anWovyrVersionSkewWarningonce per client if the server's major.minor differs.
Known gaps
- No
redocly-style contract test wired againstopenapi.yaml(the TypeScript SDK'snpm testruns one; this package has no npm-equivalent tool available in this environment to wire the same check to).
Release files for wovyr-sdk 0.4.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| wovyr_sdk-0.4.1.tar.gz | 22.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| wovyr_sdk-0.4.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 42.3 kB
Release files / wovyr_sdk-0.4.1.tar.gz
| Download URL | wovyr_sdk-0.4.1.tar.gz |
|---|---|
| Size | 22.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5d2ac0ffb3de9901ed8b625896e69d134428729447771fc4271a1214c90bdaa4
|
|
BLAKE2b-256 checksum How to use checksums |
0d49a4eb4321db3145b884a37409cd5f741a5697eebdb6b274e8c64989921959
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.13
|
Release files / wovyr_sdk-0.4.1-py3-none-any.whl
| Download URL | wovyr_sdk-0.4.1-py3-none-any.whl |
|---|---|
| Size | 19.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f763013adc0e1e4d2327f7a6042de6c4d63293807d7b4b83e8dcaa8710e2d3f6
|
|
BLAKE2b-256 checksum How to use checksums |
323ecc1dc21a0c32f47c4ac32e9adf15a266bc8cbf42f5277a43fd6eeb57602a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.13
|