hydopt-client
Python client for the HydOpt hydropower optimization API.
Install
uv add hydopt-client
Authentication
Every provider implements TokenProvider and plugs into the client via Client(token_provider=...). The default is ServiceAccountTokenProvider targeting WEB_CLIENT_ID, the OAuth client id the HydOpt API accepts as token audience.
Local development — mint an ID token from a service account key:
from hydopt_client.auth import WEB_CLIENT_ID, ServiceAccountTokenProvider
from hydopt_client.client import Client
client = Client(
token_provider=ServiceAccountTokenProvider(
audience=WEB_CLIENT_ID,
key_path="/path/to/sa-key.json",
)
)
Create the key in Google Cloud Console (IAM & Admin → Service Accounts → Keys, project hydopt) or with:
gcloud iam service-accounts keys create ~/.config/gcloud/hydopt-sa.json \
--iam-account <SA_EMAIL> --project hydopt
If key_path is omitted, credentials are resolved through Application Default Credentials. Locally, point GOOGLE_APPLICATION_CREDENTIALS at your key file before running:
export GOOGLE_APPLICATION_CREDENTIALS=$HOME/.config/gcloud/hydopt-sa.json
uv run streamlit run examples/streamlit_app.py
Note: end-user credentials from gcloud auth application-default login do not work for this flow — use a service account key. Keep the key file outside any git repository.
Deployed on Cloud Run — mints a service-to-service ID token for WEB_CLIENT_ID via the metadata server (no key file needed). Only without a configured audience does it forward the IAP JWT injected into the incoming request — such forwarded tokens carry this app's own IAP client id as audience and are only accepted by APIs that explicitly trust it:
from hydopt_client.auth import WEB_CLIENT_ID
from hydopt_client.auth.iap import CloudRunIAPTokenProvider # requires streamlit
client = Client(token_provider=CloudRunIAPTokenProvider(audience=WEB_CLIENT_ID))
The bundled example app picks automatically: CloudRunIAPTokenProvider when it detects it runs on Cloud Run (K_SERVICE env var), ServiceAccountTokenProvider otherwise.
Quick Start
from hydopt_client.client import Client
client = Client()
# List available partition dates
dates = client.list_partitions()
print(dates) # ["2026-01-01", "2026-01-02", ...]
# Fetch a time series
records = client.series(dates[0], "production")
for record in records:
print(record.name, record.x[0], record.y[0])
# Filter and group results
from hydopt_client.client import Filters, GroupBy
filtered = client.series(
dates[0],
"production",
filters=Filters(country=["norway"]),
group_by=[GroupBy.region],
)
Available Methods
| Method | Description |
|---|---|
list_partitions() |
List available partition dates |
series(asof, category1, ...) |
Query time-series data |
diff(category1, from, to, ...) |
Compare two partitions |
static(category1, ...) |
Query static dataset |
realized(category1, ...) |
Query realized dataset |
anomaly(asof, category1, ...) |
Subtract Normal from Forecast, History, Actual, and/or Actual region. Filter with Filters(value_type=["Forecast"]) (repeat values for several); omit value_type to get all four. |
hierarchy_layers(asof, graph=...) |
Owners, regions, and other graph layers |
catchments(asof) |
Fetch catchment geometries |
orders(asof) |
Fetch energy orders |
object_report(source, target) |
Compare two partition objects |
Metadata
Release files for hydopt-client 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| hydopt_client-0.1.0.tar.gz | 92.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| hydopt_client-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 102.1 kB
Release files / hydopt_client-0.1.0.tar.gz
| Download URL | hydopt_client-0.1.0.tar.gz |
|---|---|
| Size | 92.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f0581e782612e84f77ec26b4996214deaa050a1e35cd0f8ac96e5c90c8b923c4
|
|
BLAKE2b-256 checksum How to use checksums |
c7fd5d4eb3c933b4e66e01301c1544e16966146414dec490d0ef2ccd505f56f5
|
| 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 10, 2026.
Transparency logRelease files / hydopt_client-0.1.0-py3-none-any.whl
| Download URL | hydopt_client-0.1.0-py3-none-any.whl |
|---|---|
| Size | 9.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f2592755777304c381d5d90ae88d5dff1d2051305b650774628647348a638072
|
|
BLAKE2b-256 checksum How to use checksums |
2862eebc099984ee9a0da589311a2a7f954eff273b07d748f2d7222446b1b1ea
|
| 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 10, 2026.
Transparency log