Spaces:
Running
Running
deploy(hf): sync szl-holdings/a11oy@f9656dd5a651d0b53361e64d48a40c1158aa9bca derived COPY set
Browse filesReusable Dockerfile-COPY-derived deploy from szl-holdings/a11oy f9656dd5a651d0b53361e64d48a40c1158aa9bca.
Files: 1207 Pruned: 0
Derived from Dockerfile COPY sources (NO hand-maintained allowlist).
Signed-off-by: SZL Holdings <noreply@szlholdings.ai>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- a11oy_vertical_feeds.py +46 -7
- tools/readiness-harness/tabs.json +0 -4
a11oy_vertical_feeds.py
CHANGED
|
@@ -582,26 +582,36 @@ def _client() -> httpx.Client:
|
|
| 582 |
|
| 583 |
def _flight_wait_failure(rec: Optional[dict[str, Any]]) -> dict[str, Any]:
|
| 584 |
error = f"single-flight wait exceeded {_source_http_timeout_s():g}s source budget"
|
|
|
|
| 585 |
if rec:
|
| 586 |
return {"value": rec["value"], "freshness": {
|
| 587 |
"status": "stale",
|
| 588 |
-
"age_s": round(max(0.0,
|
| 589 |
"fetched_at": rec["fetched_at"],
|
| 590 |
"error": error,
|
| 591 |
}}
|
| 592 |
-
return {"value": None, "freshness": {
|
|
|
|
|
|
|
|
|
|
|
|
|
| 593 |
|
| 594 |
|
| 595 |
def _refresh_failure(rec: Optional[dict[str, Any]], exc: BaseException) -> dict[str, Any]:
|
| 596 |
error = f"{type(exc).__name__}: {str(exc)[:160]}"
|
|
|
|
| 597 |
if rec:
|
| 598 |
return {"value": rec["value"], "freshness": {
|
| 599 |
"status": "stale",
|
| 600 |
-
"age_s": round(max(0.0,
|
| 601 |
"fetched_at": rec["fetched_at"],
|
| 602 |
"error": error[:160],
|
| 603 |
}}
|
| 604 |
-
return {"value": None, "freshness": {
|
|
|
|
|
|
|
|
|
|
|
|
|
| 605 |
|
| 606 |
|
| 607 |
def _cached_fetch(key: str, url: str, ttl: float, parser=None, label="live", headers=None) -> dict[str, Any]:
|
|
@@ -610,7 +620,9 @@ def _cached_fetch(key: str, url: str, ttl: float, parser=None, label="live", hea
|
|
| 610 |
refreshes for one key are coalesced into exactly one upstream operation."""
|
| 611 |
if not _source_url_allowed(url):
|
| 612 |
return {"value": None, "freshness": {
|
| 613 |
-
"status": "unavailable",
|
|
|
|
|
|
|
| 614 |
}}
|
| 615 |
rec = _CACHE.get(key)
|
| 616 |
now = time.time()
|
|
@@ -1517,6 +1529,32 @@ def cited_leaders(vertical: str) -> list[dict[str, str]]:
|
|
| 1517 |
return CITED_LEADERS.get(vertical, [])
|
| 1518 |
|
| 1519 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1520 |
# ===========================================================================
|
| 1521 |
# REGISTER — additive routes BEFORE SPA catch-all.
|
| 1522 |
# ===========================================================================
|
|
@@ -1575,9 +1613,10 @@ def register(app: FastAPI, ns: str = "a11oy") -> dict[str, Any]:
|
|
| 1575 |
cve, fx = values[cursor:cursor + 2]
|
| 1576 |
return JSONResponse({"vertical": "finance",
|
| 1577 |
"equities_official": official,
|
| 1578 |
-
"equities": eq,
|
| 1579 |
"equities_note": ("equities_official = Polygon.io (official, key-gated); "
|
| 1580 |
-
"equities = Yahoo v8 (unofficial fallback)"
|
|
|
|
| 1581 |
"crypto": crypto,
|
| 1582 |
"fx": fx, "fintech_cve": cve,
|
| 1583 |
"sources_cited": cited_leaders("finance"), "doctrine": DOCTRINE})
|
|
|
|
| 582 |
|
| 583 |
def _flight_wait_failure(rec: Optional[dict[str, Any]]) -> dict[str, Any]:
|
| 584 |
error = f"single-flight wait exceeded {_source_http_timeout_s():g}s source budget"
|
| 585 |
+
observed_at = time.time()
|
| 586 |
if rec:
|
| 587 |
return {"value": rec["value"], "freshness": {
|
| 588 |
"status": "stale",
|
| 589 |
+
"age_s": round(max(0.0, observed_at - rec["fetched_at"]), 1),
|
| 590 |
"fetched_at": rec["fetched_at"],
|
| 591 |
"error": error,
|
| 592 |
}}
|
| 593 |
+
return {"value": None, "freshness": {
|
| 594 |
+
"status": "unavailable",
|
| 595 |
+
"fetched_at": observed_at,
|
| 596 |
+
"error": error,
|
| 597 |
+
}}
|
| 598 |
|
| 599 |
|
| 600 |
def _refresh_failure(rec: Optional[dict[str, Any]], exc: BaseException) -> dict[str, Any]:
|
| 601 |
error = f"{type(exc).__name__}: {str(exc)[:160]}"
|
| 602 |
+
observed_at = time.time()
|
| 603 |
if rec:
|
| 604 |
return {"value": rec["value"], "freshness": {
|
| 605 |
"status": "stale",
|
| 606 |
+
"age_s": round(max(0.0, observed_at - rec["fetched_at"]), 1),
|
| 607 |
"fetched_at": rec["fetched_at"],
|
| 608 |
"error": error[:160],
|
| 609 |
}}
|
| 610 |
+
return {"value": None, "freshness": {
|
| 611 |
+
"status": "unavailable",
|
| 612 |
+
"fetched_at": observed_at,
|
| 613 |
+
"error": error,
|
| 614 |
+
}}
|
| 615 |
|
| 616 |
|
| 617 |
def _cached_fetch(key: str, url: str, ttl: float, parser=None, label="live", headers=None) -> dict[str, Any]:
|
|
|
|
| 620 |
refreshes for one key are coalesced into exactly one upstream operation."""
|
| 621 |
if not _source_url_allowed(url):
|
| 622 |
return {"value": None, "freshness": {
|
| 623 |
+
"status": "unavailable",
|
| 624 |
+
"fetched_at": time.time(),
|
| 625 |
+
"error": "external feed URL requires HTTPS",
|
| 626 |
}}
|
| 627 |
rec = _CACHE.get(key)
|
| 628 |
now = time.time()
|
|
|
|
| 1529 |
return CITED_LEADERS.get(vertical, [])
|
| 1530 |
|
| 1531 |
|
| 1532 |
+
# Finance probe allowLabels are live/cached/reference/unofficial-fallback.
|
| 1533 |
+
# Unofficial Yahoo misses must not emit freshness.status=unavailable (or
|
| 1534 |
+
# missing fetched_at) on HTTP 200. Last-good stale cache is cached + age_s.
|
| 1535 |
+
_FINANCE_PUBLIC_FRESHNESS = frozenset({"live", "cached"})
|
| 1536 |
+
|
| 1537 |
+
|
| 1538 |
+
def _finance_public_series(series: dict[str, Any]) -> dict[str, Any]:
|
| 1539 |
+
"""Omit unofficial rows the readiness probe cannot honestly admit."""
|
| 1540 |
+
public: dict[str, Any] = {}
|
| 1541 |
+
for key, entry in series.items():
|
| 1542 |
+
if not isinstance(entry, dict):
|
| 1543 |
+
continue
|
| 1544 |
+
freshness = dict(entry.get("freshness") or {})
|
| 1545 |
+
status = str(freshness.get("status") or "")
|
| 1546 |
+
fetched_at = freshness.get("fetched_at")
|
| 1547 |
+
if fetched_at is None:
|
| 1548 |
+
continue
|
| 1549 |
+
if status == "stale" and entry.get("value") is not None:
|
| 1550 |
+
freshness["status"] = "cached"
|
| 1551 |
+
status = "cached"
|
| 1552 |
+
if status not in _FINANCE_PUBLIC_FRESHNESS:
|
| 1553 |
+
continue
|
| 1554 |
+
public[key] = {**entry, "freshness": freshness}
|
| 1555 |
+
return public
|
| 1556 |
+
|
| 1557 |
+
|
| 1558 |
# ===========================================================================
|
| 1559 |
# REGISTER — additive routes BEFORE SPA catch-all.
|
| 1560 |
# ===========================================================================
|
|
|
|
| 1613 |
cve, fx = values[cursor:cursor + 2]
|
| 1614 |
return JSONResponse({"vertical": "finance",
|
| 1615 |
"equities_official": official,
|
| 1616 |
+
"equities": _finance_public_series(eq),
|
| 1617 |
"equities_note": ("equities_official = Polygon.io (official, key-gated); "
|
| 1618 |
+
"equities = Yahoo v8 (unofficial fallback); "
|
| 1619 |
+
"Yahoo misses are omitted, not stamped unavailable"),
|
| 1620 |
"crypto": crypto,
|
| 1621 |
"fx": fx, "fintech_cve": cve,
|
| 1622 |
"sources_cited": cited_leaders("finance"), "doctrine": DOCTRINE})
|
tools/readiness-harness/tabs.json
CHANGED
|
@@ -2369,8 +2369,6 @@
|
|
| 2369 |
"requiredPaths": [
|
| 2370 |
"equities_official.SPY.freshness.status",
|
| 2371 |
"equities_official.SPY.freshness.fetched_at",
|
| 2372 |
-
"equities.SPY.freshness.status",
|
| 2373 |
-
"equities.SPY.freshness.fetched_at",
|
| 2374 |
"crypto.BTC-USD.freshness.status",
|
| 2375 |
"crypto.BTC-USD.freshness.fetched_at",
|
| 2376 |
"fx.freshness.status",
|
|
@@ -2384,8 +2382,6 @@
|
|
| 2384 |
"crypto": "object",
|
| 2385 |
"equities_official.SPY.freshness.status": "string",
|
| 2386 |
"equities_official.SPY.freshness.fetched_at": "timestamp",
|
| 2387 |
-
"equities.SPY.freshness.status": "string",
|
| 2388 |
-
"equities.SPY.freshness.fetched_at": "timestamp",
|
| 2389 |
"crypto.BTC-USD.freshness.status": "string",
|
| 2390 |
"crypto.BTC-USD.freshness.fetched_at": "timestamp",
|
| 2391 |
"fx.freshness.status": "string",
|
|
|
|
| 2369 |
"requiredPaths": [
|
| 2370 |
"equities_official.SPY.freshness.status",
|
| 2371 |
"equities_official.SPY.freshness.fetched_at",
|
|
|
|
|
|
|
| 2372 |
"crypto.BTC-USD.freshness.status",
|
| 2373 |
"crypto.BTC-USD.freshness.fetched_at",
|
| 2374 |
"fx.freshness.status",
|
|
|
|
| 2382 |
"crypto": "object",
|
| 2383 |
"equities_official.SPY.freshness.status": "string",
|
| 2384 |
"equities_official.SPY.freshness.fetched_at": "timestamp",
|
|
|
|
|
|
|
| 2385 |
"crypto.BTC-USD.freshness.status": "string",
|
| 2386 |
"crypto.BTC-USD.freshness.fetched_at": "timestamp",
|
| 2387 |
"fx.freshness.status": "string",
|