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.0a1.tar.gz (49.5 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.0a1-py3-none-any.whl (34.0 kB view details)

Uploaded Python 3

File details

Details for the file ai_orchestrator_client-0.1.0a1.tar.gz.

File metadata

  • Download URL: ai_orchestrator_client-0.1.0a1.tar.gz
  • Upload date:
  • Size: 49.5 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.0a1.tar.gz
Algorithm Hash digest
SHA256 a315e45572a364dd51ac616cb8120a7435d5e28ccc55717c7c4ac5b9d7790eb2
MD5 f03c72b923572f63b0ee839d61e33153
BLAKE2b-256 b1b1fb54d81ce44f969518c65ec76aa99109189ae34f88f14ee50902b446d101

See more details on using hashes here.

Provenance

The following attestation bundles were made for ai_orchestrator_client-0.1.0a1.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.0a1-py3-none-any.whl.

File metadata

File hashes

Hashes for ai_orchestrator_client-0.1.0a1-py3-none-any.whl
Algorithm Hash digest
SHA256 18a889286f631772e9278b7dd7a93f4d95fed82cabe3f094c4d84a6b31a53da3
MD5 9fd6e1f7070395a67cde74b6cf62acca
BLAKE2b-256 73571282c8c0f4bccdb3442f2a532a6d55d8b7d80fa114af377c4bbc88d6e5b5

See more details on using hashes here.

Provenance

The following attestation bundles were made for ai_orchestrator_client-0.1.0a1-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