From d2bf55183c844fd085a493d9bbdfa68c94f42635 Mon Sep 17 00:00:00 2001 From: Sirius DevOps Date: Fri, 28 Aug 2026 00:02:51 -0400 Subject: [PATCH] fix: let Settings model reach summarizer; cap map pins at 20 --- .env.example | 5 ++++- app/keystore.py | 2 +- app/main.py | 2 +- docker-compose.yml | 2 +- docs/news.md | 2 +- news/summerizer/intel.py | 3 +++ news/summerizer/tests/test_intel.py | 9 +++++++++ 7 files changed, 20 insertions(+), 5 deletions(-) diff --git a/.env.example b/.env.example index ad2d4ee..ac898a9 100644 --- a/.env.example +++ b/.env.example @@ -76,7 +76,10 @@ INGEST_FIRES=1 NOUS_API_KEY= NOUS_BASE_URL=https://inference-api.nousresearch.com/v1 # Optional LLM knobs -SUMMARY_MODEL=Hermes-4.3-36B +# SUMMARY_MODEL is an optional override. Leave unset so Settings +# (app_settings.SUMMARY_MODEL) can reach the summarizer. Code default +# Hermes-4.3-36B remains after a Postgres miss. Env wins when set. +# SUMMARY_MODEL= NEWS_BATCH_SIZE=50 SUMMARY_WINDOW_HOURS=1 # Futures/markets coupling from the upstream pipeline is OFF by default diff --git a/app/keystore.py b/app/keystore.py index 44c76d6..0eb49a4 100644 --- a/app/keystore.py +++ b/app/keystore.py @@ -214,7 +214,7 @@ async def get_api_key(name: str) -> str | None: """Read a stored key value — used by ingest services, never by the API. Returns the raw value (or None when unset) so producers can pass it to - external APIs (FIRMS, Gemini, Telegram, …). Reads live from Postgres, so a + external APIs (FIRMS, Nous, Telegram, …). Reads live from Postgres, so a key set via the dashboard is picked up on the next poll — no restart. """ await ensure_api_keys_table() diff --git a/app/main.py b/app/main.py index f08c0a7..a2e47ee 100644 --- a/app/main.py +++ b/app/main.py @@ -605,7 +605,7 @@ async def list_documents( async def list_api_keys(): """List known API keys with set/missing status — masked, never raw. - Registered keys (FIRMS_MAP_KEY, GEMINI_API_KEY, TELEGRAM_TOKEN) + Registered keys (FIRMS_MAP_KEY, NOUS_API_KEY, TELEGRAM_TOKEN) are always included. Any extra stored keys are appended. """ return await list_keys() diff --git a/docker-compose.yml b/docker-compose.yml index a34365c..aa674f7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -226,7 +226,7 @@ services: DB_NAME: ${DB_NAME:-osint_data} NOUS_API_KEY: ${NOUS_API_KEY:-} NOUS_BASE_URL: ${NOUS_BASE_URL:-https://inference-api.nousresearch.com/v1} - SUMMARY_MODEL: ${SUMMARY_MODEL:-Hermes-4.3-36B} + SUMMARY_MODEL: ${SUMMARY_MODEL:-} OSINT_USER_AGENT: ${OSINT_USER_AGENT:-osint-dashboard-news-summarizer} BATCH_SIZE: ${NEWS_BATCH_SIZE:-50} SUMMARY_WINDOW_HOURS: ${SUMMARY_WINDOW_HOURS:-1} diff --git a/docs/news.md b/docs/news.md index 93084d0..43a39c0 100644 --- a/docs/news.md +++ b/docs/news.md @@ -270,7 +270,7 @@ language is gated behind `INCLUDE_FUTURES=1`. PYTHONPATH=news/summerizer pytest news/summerizer/tests -v # intel + nous_client tests PASS (no network) -PYTHONPATH=app pytest tests/test_api_news.py tests/test_api_news_intel.py \ +PYTHONPATH=app pytest tests/test_api_news.py \ tests/test_api_settings.py tests/test_api_live_layers.py -v # DB-marked tests skip without Postgres; live_layers must still PASS # /api/map/layers overlays key set UNCHANGED diff --git a/news/summerizer/intel.py b/news/summerizer/intel.py index d4bb1b7..d404f44 100644 --- a/news/summerizer/intel.py +++ b/news/summerizer/intel.py @@ -13,6 +13,7 @@ _FENCE_RE = re.compile(r"```(?:json)?", re.IGNORECASE) TICKER_HEADLINE_MAX = 140 MAP_HEADLINE_MAX = 160 TICKER_CAP = 12 +MAP_CAP = 20 def parse_reduce_json(raw: str) -> dict: @@ -87,4 +88,6 @@ def select_map(items: list) -> list: item["headline"] = headline item["lat"], item["lon"] = coords out.append(item) + if len(out) >= MAP_CAP: + break return out diff --git a/news/summerizer/tests/test_intel.py b/news/summerizer/tests/test_intel.py index 74f74c3..dde2b5c 100644 --- a/news/summerizer/tests/test_intel.py +++ b/news/summerizer/tests/test_intel.py @@ -40,3 +40,12 @@ def test_select_map_requires_valid_coords_and_flag(): ] out = select_map(items) assert [r["headline"] for r in out] == ["A"] + +def test_select_map_caps_20(): + items = [ + {"headline": f"h{i}", "importance": "critical", "lat": 1.0, "lon": 2.0} + for i in range(25) + ] + out = select_map(items) + assert len(out) == 20 + assert all(r["importance"] in ("critical", "high") for r in out)