Python client for the AI Orchestrator (https://github.com/ernesto01louis/ai-orchestrator).
Project description
ai-orchestrator-client
Python SDK for the AI Orchestrator.
This is the primary consumer contract for the orchestrator platform.
Research projects (aerodynamics optimization, RF DF, music generation,
anything) install this library, call OrchestratorClient.run(...) or
OrchestratorClient.start_campaign(...), and stream results back without
having to know the HTTP surface.
Status: alpha. First PyPI release:
0.1.0a0. See CHANGELOG.md for shipping work.
Install
# 0.1.0a0 is a pre-release — `--pre` is required until 0.1.0 final ships.
pip install --pre ai-orchestrator-client
Python 3.11+. Wraps the orchestrator's HTTP API + /ws log stream;
async-first under the hood with a sync façade for scripts.
Quick start
Submit a single run (sync)
from ai_orchestrator_client import OrchestrateRequest, OrchestratorClient
req = OrchestrateRequest(
project_name="hello-world",
prompt="Write a Python script that prints fizzbuzz to 30.",
planner_model="qwen2.5-coder:14b",
generator_models=["qwen2.5-coder:14b"],
judge_model="qwen2.5-coder:14b",
deploy_target="local",
)
with OrchestratorClient(base_url="http://localhost:8000") as client:
ack = client.run(req)
final = client.wait_for_completion(ack.run_id, timeout=600)
print(final.score, final.result)
Submit a campaign (parameter sweep) and stream results (async)
import asyncio
from ai_orchestrator_client import (
AsyncOrchestratorClient, CampaignCreate, CampaignTemplate,
)
async def main() -> None:
req = CampaignCreate(
name="seed-sweep",
hypothesis="output is invariant across seeds 1..4",
template=CampaignTemplate(
project_name="hello-{seed}",
prompt="Print fizzbuzz with seed {seed}.",
planner_model="qwen2.5-coder:14b",
generator_models=["qwen2.5-coder:14b"],
judge_model="qwen2.5-coder:14b",
deploy_target="local",
),
params={"seed": [1, 2, 3, 4]},
)
async with AsyncOrchestratorClient(base_url="http://localhost:8000") as client:
ack = await client.start_campaign(req)
campaign = await client.get_campaign(ack.campaign_id)
async for run in campaign.iter_runs(client):
print("new run:", run.run_id, run.params)
verify = await client.verify_campaign_merkle(ack.campaign_id)
print("merkle ok?", verify.valid)
asyncio.run(main())
Stream live log lines via WebSocket
import asyncio
from ai_orchestrator_client import AsyncOrchestratorClient
async def tail() -> None:
async with AsyncOrchestratorClient(base_url="http://localhost:8000") as client:
async for event in client.iter_logs("run-uuid-here", include_status=True):
# LogEvent or StatusEvent — terminates on completed=True
print(event)
asyncio.run(tail())
Forward-compatible auth
The orchestrator's HTTP surface has no auth in 1.6 — Phase 1.7 adds bearer tokens. Wire your token now and it'll start being honored once the server ships:
from ai_orchestrator_client import BearerTokenAuth, OrchestratorClient
client = OrchestratorClient(base_url=..., auth=BearerTokenAuth(token))
What's here
| Surface | Sync | Async |
|---|---|---|
Run lifecycle (run, get_status, wait_for_completion, get_result, verify_run, tail_log) |
✓ | ✓ |
Control (pause, resume, restart, idempotent against the server's toggle endpoint) |
✓ | ✓ |
Campaigns (start_campaign, get_campaign, get_campaign_tree, pause/resume/abort, verify_campaign_merkle) |
✓ | ✓ |
Evidence (get_evidence, download_evidence_crate, refresh_evidence) |
✓ | ✓ |
Campaign.iter_runs(client) streaming with empty-runs[] race guard |
✓ | ✓ |
Live log streaming via /ws (iter_logs) |
— | ✓ |
| Bearer-token auth hooks (no-op until orchestrator Phase 1.7 ships token auth) | ✓ | ✓ |
| Typed Pydantic models for every endpoint | ✓ | ✓ |
| OpenAPI drift fixture protecting wire-format mirrors | n/a | n/a |
Errors
Catch OrchestratorError for the whole family. Specific subclasses for
common failure modes:
NotFound— server returned 404 (unknown run/campaign id)ValidationError— server returned 422; structured FastAPI detail preserved on.errorsServiceUnavailable— server returned 503 (typically: orchestrator paused via/control/pause)RunFailed—wait_for_completionsawcompleted=Truewith a non-emptyerrorfieldWaitTimeout—wait_for_completionexceeded itstimeoutWaitInterrupted— caller-suppliedstop_eventfired during a poll
Notes
download_evidence_crate(campaign_id)materializes the whole RO-Crate ZIP in memory — fine for typical bundles, but for multi-GB crates a streaming-to-path variant will land in a follow-up.iter_logsfilters frames client-side because the orchestrator's/wsbroadcasts globally; high-traffic deployments should preferget_status()polling +tail_log().
Examples
Runnable scripts in examples/:
examples/sync_run.py— single run end-to-end with the sync clientexamples/async_campaign.py— campaign + streaming runs + Merkle verifyexamples/stream_logs.py— live log tail via WS
Each script reads ORCHESTRATOR_URL (default
http://localhost:8000) and an optional ORCHESTRATOR_TOKEN.
License
Apache 2.0 — see LICENSE.
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 ai_orchestrator_client-0.1.0a0.tar.gz.
File metadata
- Download URL: ai_orchestrator_client-0.1.0a0.tar.gz
- Upload date:
- Size: 48.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5fdc893b108eb86ab1b0bb7deaa8a0f1327283087e1b8bef03949799a9e091ca
|
|
| MD5 |
12f9cc06e33932bcfccd38da8d9f5d53
|
|
| BLAKE2b-256 |
bbb934a2a7cdc5c1b49339acaaccf3892957279ebd38ba000c9ba6d61d8ae14c
|
Provenance
The following attestation bundles were made for ai_orchestrator_client-0.1.0a0.tar.gz:
Publisher:
release.yml on ernesto01louis/ai-orchestrator-client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ai_orchestrator_client-0.1.0a0.tar.gz -
Subject digest:
5fdc893b108eb86ab1b0bb7deaa8a0f1327283087e1b8bef03949799a9e091ca - Sigstore transparency entry: 1458023467
- Sigstore integration time:
-
Permalink:
ernesto01louis/ai-orchestrator-client@d6480d209e3cf429c683b1b96a58b15bbad5513c -
Branch / Tag:
refs/tags/v0.1.0a0 - Owner: https://github.com/ernesto01louis
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d6480d209e3cf429c683b1b96a58b15bbad5513c -
Trigger Event:
push
-
Statement type:
File details
Details for the file ai_orchestrator_client-0.1.0a0-py3-none-any.whl.
File metadata
- Download URL: ai_orchestrator_client-0.1.0a0-py3-none-any.whl
- Upload date:
- Size: 33.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7911fb303e7abc87c9fa76da5b69765073929fcc5e4d3ee1e71c8bbc9b705fb5
|
|
| MD5 |
0cc771fa07117129c3f47b1b5dbcb705
|
|
| BLAKE2b-256 |
cd6f27dba0ed972d96940c488b98e3e2fd5a70b954b7ca9c9c0aa00dc24aa36e
|
Provenance
The following attestation bundles were made for ai_orchestrator_client-0.1.0a0-py3-none-any.whl:
Publisher:
release.yml on ernesto01louis/ai-orchestrator-client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ai_orchestrator_client-0.1.0a0-py3-none-any.whl -
Subject digest:
7911fb303e7abc87c9fa76da5b69765073929fcc5e4d3ee1e71c8bbc9b705fb5 - Sigstore transparency entry: 1458023690
- Sigstore integration time:
-
Permalink:
ernesto01louis/ai-orchestrator-client@d6480d209e3cf429c683b1b96a58b15bbad5513c -
Branch / Tag:
refs/tags/v0.1.0a0 - Owner: https://github.com/ernesto01louis
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d6480d209e3cf429c683b1b96a58b15bbad5513c -
Trigger Event:
push
-
Statement type: