Skip to main content

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 .errors
  • ServiceUnavailable — server returned 503 (typically: orchestrator paused via /control/pause)
  • RunFailedwait_for_completion saw completed=True with a non-empty error field
  • WaitTimeoutwait_for_completion exceeded its timeout
  • WaitInterrupted — caller-supplied stop_event fired 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_logs filters frames client-side because the orchestrator's /ws broadcasts globally; high-traffic deployments should prefer get_status() polling + tail_log().

Examples

Runnable scripts in examples/:

  • examples/sync_run.py — single run end-to-end with the sync client
  • examples/async_campaign.py — campaign + streaming runs + Merkle verify
  • examples/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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ai_orchestrator_client-0.1.0a0.tar.gz (48.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ai_orchestrator_client-0.1.0a0-py3-none-any.whl (33.7 kB view details)

Uploaded Python 3

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

Hashes for ai_orchestrator_client-0.1.0a0.tar.gz
Algorithm Hash digest
SHA256 5fdc893b108eb86ab1b0bb7deaa8a0f1327283087e1b8bef03949799a9e091ca
MD5 12f9cc06e33932bcfccd38da8d9f5d53
BLAKE2b-256 bbb934a2a7cdc5c1b49339acaaccf3892957279ebd38ba000c9ba6d61d8ae14c

See more details on using hashes here.

Provenance

The following attestation bundles were made for ai_orchestrator_client-0.1.0a0.tar.gz:

Publisher: release.yml on ernesto01louis/ai-orchestrator-client

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ai_orchestrator_client-0.1.0a0-py3-none-any.whl.

File metadata

File hashes

Hashes for ai_orchestrator_client-0.1.0a0-py3-none-any.whl
Algorithm Hash digest
SHA256 7911fb303e7abc87c9fa76da5b69765073929fcc5e4d3ee1e71c8bbc9b705fb5
MD5 0cc771fa07117129c3f47b1b5dbcb705
BLAKE2b-256 cd6f27dba0ed972d96940c488b98e3e2fd5a70b954b7ca9c9c0aa00dc24aa36e

See more details on using hashes here.

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

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page