Skip to main content

Modaic Python SDK

The official, HTTP-only Python client for the public Modaic API. It includes matching synchronous and asynchronous clients and never invokes Git or reads or writes repository files.

Install

pip install modaic

Set an API key from https://modaic.dev/settings/keys:

export MODAIC_API_KEY="mdc_..."

Quickstart

from modaic import Modaic

with Modaic() as modaic:
    result = modaic.decisions.create(
        state={
            "ticket": "I was charged twice for order 4832. Please refund one charge."
        },
        model="typesafe/jev-latest",
        questions={
            "needs_refund": {
                "type": "noul",
                "instructions": "Should this customer receive a refund?",
                "criteria": {
                    "true": "A duplicate or invalid charge should be refunded.",
                    "false": "The charge is valid or more information is required.",
                },
            },
            "priority": {
                "type": "choice",
                "instructions": "Choose the support priority.",
                "criteria": {
                    "low": "No financial or time-sensitive impact.",
                    "normal": "Routine customer issue.",
                    "high": "Financial impact or an urgent blocker.",
                },
            },
        },
        idempotency_key="ticket-4832-v1",
    )

print(result.answers["priority"])

For a local server, pass the versioned API URL explicitly:

modaic = Modaic(api_key="mdc_...", base_url="http://localhost:3001/v1")

Async

The async client has the same resources and methods:

import asyncio
from modaic import AsyncModaic


async def main() -> None:
    async with AsyncModaic() as modaic:
        models = await modaic.models.list()
        print([model.name for model in models.models])


asyncio.run(main())

Model-bound resources

Models returned by models.create, models.get, and models.update can run decisions directly:

with Modaic() as modaic:
    model = modaic.models.get(workspace="acme", model="support-priority")
    result = model.decisions.create(
        state={"ticket": "Please refund my duplicate charge."},
    )
    examples = model.examples.list(page_size=10)
    batches = model.jobs.batch_decisions.list()
    alignments = model.jobs.alignments.list()

With AsyncModaic, await both calls. The bound method accepts every decision option except model and uses the same client; keep that client open while running decisions. Pass revision to pin a version. model_dump() and model_dump_json() contain only response data. The top-level modaic.decisions.create remains available.

model.examples exposes ingest, list, get, annotate, and list_decisions without a model ID argument. model.jobs.alignments and model.jobs.batch_decisions expose model-bound create and list. Use the top-level job resources to retrieve, wait for, or cancel a job by its ID.

Job progress

Pass progress=True to either job resource's wait() method for a tqdm display:

finished = modaic.batch_decisions.wait(job.id, progress=True)
finished = modaic.alignments.wait(alignment.id, progress=True)

With AsyncModaic, use await with the same option. Progress is off by default. Batch jobs show processed examples and failures; alignment shows its stage and metric-call budget usage, not an overall completion percentage. Updates use the existing polling interval. Timing out stops waiting without cancelling the job.

Resources

Resource Methods
decisions create
models list, create, get, update, delete
examples ingest, list, get, annotate, list_decisions
batch_decisions create, list, get, cancel, wait
alignments create, list, get, logs, cancel, wait

Responses are Pydantic models. Python attributes use snake_case even when the wire format uses camelCase.

Errors

Non-2xx responses raise ModaicAPIError, which exposes status_code, code, request_id, details, and the decoded response body. Network failures raise ModaicConnectionError; request and polling deadlines raise ModaicTimeoutError.

See the complete API documentation at https://docs.modaic.dev.

Release files for modaic 0.47.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distribution (wheel)

Table of built distributions (wheels) for modaic 0.47.0
File Interpreter ABI Platform
modaic-0.47.0-py3-none-any.whl Python 3 none any Details

Release files / modaic-0.47.0-py3-none-any.whl

Download URL modaic-0.47.0-py3-none-any.whl
Size 14.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2f42793925a8c91ff1fd77e5a76216b938746cad9dc4800af51790a949e4242a
BLAKE2b-256 checksum
How to use checksums
ee984cffec9b7f863e68814917f417790717dd796938869e3c0001f4e3f60efd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.

Transparency log

Release history Release notifications | RSS feed

0.51.0

2 release files

0.50.0

2 release files

0.49.0

2 release files

0.48.0

1 release file

This release

0.47.0 This release

1 release file

0.46.0

2 release files

0.45.5

2 release files

0.45.2

2 release files

0.45.1

2 release files

0.45.0

2 release files

0.44.3

2 release files

0.44.2

2 release files

0.43.0

2 release files

0.37.0

2 release files

0.36.3

2 release files

0.36.2

2 release files

0.36.1

2 release files

0.36.0

2 release files

0.35.0

2 release files

0.34.2

2 release files

0.34.1

2 release files

0.34.0

2 release files

0.33.0

2 release files

0.28.0

2 release files

0.27.0

2 release files

0.26.0

2 release files

0.25.2

2 release files

0.25.1

2 release files

0.25.0

2 release files

0.24.2

2 release files

0.24.1

2 release files

0.24.0

2 release files

0.21.1

2 release files

0.21.0

2 release files

0.20.0

2 release files

0.19.7

2 release files

0.19.6

2 release files

0.19.5

2 release files

0.19.2

2 release files

0.18.0

2 release files

0.17.0

2 release files

0.16.0

2 release files

0.15.0

2 release files

0.14.0

2 release files

0.13.1

2 release files

0.13.0

2 release files

0.12.7

2 release files

0.12.6

2 release files

0.12.5

2 release files

0.12.4

2 release files

0.12.3

2 release files

0.12.2

2 release files

0.12.1

2 release files

0.12.0

2 release files

0.11.0

2 release files

0.10.4

2 release files

0.10.3

2 release files

0.10.2

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.3

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page