Python SDK

vertical-ai-sdk

A typed client over every API route — plus a real mechanism for layering your own utility-specific standards on top of it, entirely on your side of the network boundary.

Getting the SDK

The SDK is shared with API customers on request — it isn't on the public package index.Email usand we'll send the current release along with your key. The code below is what you'll run once you have it.

quickstart
from vertical_ai_sdk import Client

with Client(api_key="vaico_live_...") as client:
    # jurisdiction-scoped facades -- the code param is pre-filled for you
    result = client.overhead.nesc.grade(inp, source_ref="...")
    result = client.overhead.go95.grade(inp, source_ref="...")
    result = client.overhead.csa.grade(inp, source_ref="...")

    # every other route: a typed request model (or a plain dict) in, a typed result out
    soc = client.der.calculate_state_of_charge(request)
your own standards, loaded from a file and applied client-side
from vertical_ai_sdk.circuit import CircuitStandardsPack

my_standard = CircuitStandardsPack.from_file("our_standards.yaml")   # JSON or YAML; a typo'd key raises, never silently ignored

amp = client.circuit.calculate_conductor_ampacity(conductor, environment, max_conductor_temp_c=75.0)
verdict = my_standard.classify_conductor_ampacity(amp, "336 ACSR", 40, 75, actual_amps=430.0)
# verdict.effective_limit_amps is the TIGHTER of the computed ampacity and your published rating --
# your own table can make a design stricter than the physics, never looser. It never leaves your process.

Every route, all 18 domains

Every API route has a typed method — 308 of them, across all 18 domains — and they're generated from the live API schema, so the SDK follows the API instead of lagging it. Overhead, underground, circuit and ADA also have hand-written, friendlier methods and jurisdiction facades on top; everything else uses the generated methods directly. Each one is a thin wrapper: no compute logic, no lookup tables, every call a real HTTP request.

Overhead Linesclient.overheadclient.utmclient.sitingclient.replacement_cost
Pole Design & Field Dataclient.ocalcclient.spidaclient.plsclient.field_capture
Undergroundclient.underground
Substations & Generationclient.usmclient.ugmclient.der
Circuits, Buildings & Accessibilityclient.circuitclient.ubmclient.ada
AI-Factory & Datacenterclient.thermalclient.controlsclient.datacenter

See every domain →

Sync and async

Client andAsyncClient expose the same routes with the same typed results, so a batch job can fan out hundreds of calls concurrently.

Retries built in

Connection failures, timeouts and 429/502/503/504 are retried with jittered backoff andRetry-After honoured. A bad request is never retried.

Errors you can act on

A missing scope, a validation failure (with the field paths) and a rate limit are each their own exception — no parsing error text.

StandardsPack — your data never leaves your infrastructure

Generic physics and cited regulatory floors are computed server-side. A utility's own proprietary layer — a margin, a stricter limit, a substitute table, a jurisdiction's own adoption status, pure reference data with no code anchor at all — is a pack you write (in Python, or as a JSON/YAML file) and run entirely on your own machines. Five real shapes, each grounded in a real gap or a production standards schema, not designed in the abstract:

Margin on a code floor

NESC/GO-95/CSA clearances and tension limits stay legally fixed — you can't override what the code requires, only add your own conservative margin on top of it. Defaults to "use the code minimum exactly" if you don't override anything.

Stricter-than-code limits

Grounding resistance, vegetation clearance, conductor ampacity, voltage drop — your published number is applied only when it's tighter than the code or computed value. A looser table can never weaken the floor.

Utility-table substitution

Setting depth, anchor pull-out capacity — a published table entry replaces the server's computed value outright, not an additive margin. Closes real, disclosed gaps named directly in production engineering code but never built server-side.

Pure reference data

Framing assemblies, angle limits, span policy, sag-tension table rows, transformer loading tables — data with no code anchor at all. Defaults to "no limit configured" rather than inventing a threshold on your behalf.

Jurisdiction edition tracking

Which edition of a code your own AHJs enforce, and what they've locally amended — private operational knowledge no domain API can know on your behalf. Defaults to "adoption status unknown" until you populate it.