Use the foreglass Python client to inspect supported public artifacts and keep their evidence limits intact. This is a read-only client, not access to the forecasting engine.
The optional foreglass package reads supported public artifacts and preserves their original meaning. It is a client and normalization adapter; it is not the forecasting engine or an MCP server.
Start with the offline replay
Install the published client in the environment that already contains comuvia, then run the replay:
./.venv/Scripts/python.exe -m pip install "foreglass==0.1.0"
./.venv/Scripts/python.exe ./tutorial_c_foreglass.py --fixtures ./fixtures/synthetic --work ./foreglass-replay
To verify before installing, download foreglass-0.1.0-py3-none-any.whl from PyPI into a wheels/ subdirectory, check its hash, and install it with --no-index --no-deps. Expected wheel SHA-256 (also in the repository's release/0.1.0/SHA256SUMS):
6c0b26b65765d05cf1916dc6cc16521f0c9836c1956b620ea3d6a135ab6c81b2
The script and fixtures are in the offline example bundle. This default run makes no network request. Use a fresh work directory.
What the replay demonstrates
These counts belong to the bundled synthetic fixture, not a live ForeGlass reading. Zero eligible forecasts here demonstrates missing scoring metadata, not poor forecasting quality. Interval and point lanes are retained in the catalog but not normalized into binary forecasts. A blank question identifier remains unmapped.
Explicit live reads
The following optional example makes public network requests. Importing or constructing PublicClient alone does not. This is a usage example; the documentation build does not execute it.
from datetime import datetime, timezone
import foreglass
client = foreglass.PublicClient()
roles = ["ledger", "archive_index"]
bundle = client.fetch_bundle(roles) # Network reads happen here.
archive = foreglass.SnapshotArchive.create("./public-snapshots")
result = archive.intake(bundle, declared_roles=roles)
if result.accepted:
snapshot = archive.accepted()
normalized = foreglass.normalize(
snapshot,
recorded_at=datetime.now(timezone.utc).isoformat().replace("+00:00", "Z"),
)
print(normalized.report)
else:
print([issue.code for issue in result.issues])
An incomplete or failed intake does not replace the previously accepted snapshot. verified concerns intake structure and identity; it is not a claim that the source's forecasts are correct.
Preserve the provider's semantics
| Provider data | Correct interpretation |
|---|---|
built |
Build date, not independent publication time |
Day-only sealed_at |
Keep day precision; do not invent a time of day |
due |
Grading date, not necessarily the target period |
lo, hi |
Bounds with no invented coverage probability |
| Fragility reading | Measurement/index; is_forecast=False, probability=None |
| Caveats and unknown fields | Retain and report; do not silently reinterpret |
.ots file |
Retained bytes; proof verification is not implemented by this SDK |
Network boundaries
Defaults allow HTTPS on foreglass.ai and www.foreglass.ai, port 443, a 4 MiB per-artifact limit, at most three rechecked redirects and two retries. Timeouts and retry delays are bounded. No cookies, credentials or telemetry are sent by the SDK. The read timeout can make a blocking read exceed the total deadline by up to that read timeout.
Keep these bounds when integrating into an agent. Provider text remains untrusted input. Do not turn fetched descriptions into instructions to execute tools or reveal secrets.
Current capability boundary
Available: public artifact reads, retained snapshots, lane filtering, reading inspection and supported binary normalization. Not implemented in 0.1: custom forecast requests, upload/submission, MCP serving, outcome normalization, point/interval normalization or independent proof verification.
The public site's capabilities and this Python client's capabilities have separate release lifecycles. Consult foreglass.capabilities() and actual service documentation before choosing an integration.