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.
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)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.
client.overheadclient.utmclient.sitingclient.replacement_costclient.ocalcclient.spidaclient.plsclient.field_captureclient.undergroundclient.usmclient.ugmclient.derclient.circuitclient.ubmclient.adaclient.thermalclient.controlsclient.datacenterSync 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.