add Eurostat + UK ONS sources; valuation/bubble/economy/bonds groups; aggregate read; market-open header
Three new data sources hooked into the existing SOURCES registry. All
open APIs, no keys:
- EUROSTAT: prefix EUROSTAT:dataset?dim=val&... — current EU bond
yields (Bund/OAT/BTP/EZ) and Eurozone economic indicators that
FRED's OECD-mirror series stopped updating in 2022-2023.
- ONS: prefix ONS:topic/cdid/dataset — current UK CPI, unemployment,
GDP, industrial production. Replaces the 5+ month-stale FRED
LRHUTTTTGBM156S mirror.
New indicator groups in default.toml feed the strategic/fundamental
lens we converged on: valuation (CAPE/Buffett anchors), bubble_watch
(SKEW/VVIX/RSP vs SPY/HYG vs TLT/IPO/crypto), economy (multi-region,
ALL current-or-stale-flagged), bonds (UK/EU/US/JPN sovereign yields).
Indicator panel now opens with an AI "read" interpretation per group
(generated hourly at :07 UTC alongside an aggregate cross-group read
shown in the dashboard header). The aggregate is grounded by a markets
strip — NYSE/LSE/Frankfurt/Tokyo/HK/Shanghai with open/closed LEDs and
next-open countdown, computed locally from each exchange's tz.
Other UX bits: indicator-row tooltips populated from TOML notes;
rows whose last observation is >90 days old get a 'stale' chip;
ghost symbols (in DB but no longer in TOML) filtered out of the
panel; Eurostat/ONS symbols display as short codes rather than the
full API path.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
a10409c02b
commit
1edf9cad41
15 changed files with 1156 additions and 10 deletions
|
|
@ -29,7 +29,7 @@ from app.db import Base, utcnow
|
|||
class Quote(Base):
|
||||
__tablename__ = "quotes"
|
||||
id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
|
||||
symbol: Mapped[str] = mapped_column(String(64), nullable=False)
|
||||
symbol: Mapped[str] = mapped_column(String(128), nullable=False)
|
||||
source: Mapped[str] = mapped_column(String(32), nullable=False)
|
||||
label: Mapped[str] = mapped_column(String(128), default="")
|
||||
group_name: Mapped[str] = mapped_column(String(64), nullable=False)
|
||||
|
|
@ -106,6 +106,25 @@ class StrategicLog(Base):
|
|||
cost_usd: Mapped[float | None] = mapped_column(Float)
|
||||
|
||||
|
||||
class IndicatorSummary(Base):
|
||||
"""Short AI-generated read for one indicator group, regenerated hourly.
|
||||
The latest row per group_name is what the dashboard renders."""
|
||||
__tablename__ = "indicator_summaries"
|
||||
id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
|
||||
group_name: Mapped[str] = mapped_column(String(64), nullable=False)
|
||||
generated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=utcnow)
|
||||
model: Mapped[str] = mapped_column(String(64), nullable=False)
|
||||
tone: Mapped[str | None] = mapped_column(String(16))
|
||||
analysis: Mapped[str | None] = mapped_column(String(16))
|
||||
prompt_version: Mapped[int] = mapped_column(Integer, default=1)
|
||||
content: Mapped[str] = mapped_column(Text, nullable=False)
|
||||
prompt_tokens: Mapped[int | None] = mapped_column(Integer)
|
||||
completion_tokens: Mapped[int | None] = mapped_column(Integer)
|
||||
cost_usd: Mapped[float | None] = mapped_column(Float)
|
||||
|
||||
__table_args__ = (Index("ix_indsumm_group_generated", "group_name", "generated_at"),)
|
||||
|
||||
|
||||
class AICall(Base):
|
||||
"""Cost ledger for OpenRouter calls. Feeds the monthly cap check."""
|
||||
__tablename__ = "ai_calls"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue