ソースを参照

docs: add v0.3.0 release notes, update PROJECT.md and OUTLOOK.md

Lukas Goldschmidt 1 週間 前
コミット
e69903374e
3 ファイル変更36 行追加1 行削除
  1. 2 0
      OUTLOOK.md
  2. 13 1
      PROJECT.md
  3. 21 0
      RELEASE_NOTES.md

+ 2 - 0
OUTLOOK.md

@@ -1,6 +1,8 @@
 
 # 📰 News MCP Server — Requirements Spec
 
+> **Current version: v0.3.0** — see [RELEASE_NOTES.md](RELEASE_NOTES.md) for changelog.
+
 ## 🎯 Goal
 
 Provide **structured, deduplicated, topic-aware news signals**

+ 13 - 1
PROJECT.md

@@ -3,7 +3,19 @@
 ## Goal
 Provide a signal-extraction MCP server that converts RSS into **deduplicated, enriched news clusters** that are easy for agents to use.
 
-## Current architecture (v1)
+## Current architecture (v2)
+- FastMCP SSE server mounted at `/mcp`
+- SQLite cache for clusters + entity metadata + feed state + LLM summary caches
+- Concurrent RSS fetch (async `asyncio.gather` + `httpx`, bounded semaphore)
+- Composite dedup via fuzzy title + token Jaccard + Ollama embedding cosine
+- Concurrent Ollama embeddings (pre-computed before clustering loop)
+- Concurrent LLM enrichment (entity extraction, topic classification, sentiment) with per-provider semaphore
+- Per-cluster retry with exponential backoff (3 retries, 2s/4s/8s) + cross-cycle failure recovery
+- All concurrency limits configurable via env vars (`NEWS_RSS_MAX_CONCURRENCY`, `NEWS_OLLAMA_MAX_CONCURRENCY`, `NEWS_LLM_CONCURRENCY_<PROVIDER>`)
+- Dashboard REST API (`/api/v1/*`) for clusters, sentiment series, entity frequencies
+- `get_latest_events()` defaults to all topics (omit `topic` for unfiltered)
+
+## Previous: v1 architecture
 - FastMCP SSE server mounted at `/mcp`
 - SQLite cache for clusters + Groq summary caches
 - RSS fetch (breakingthenews.net)

+ 21 - 0
RELEASE_NOTES.md

@@ -1,5 +1,26 @@
 # news-mcp release notes
 
+## v0.3.0 — concurrent polling, enrichment retry, all-topics default
+
+### Highlights
+- **Async concurrent RSS fetching** — all feeds fetched in parallel with `asyncio.gather` + `httpx`, bounded by semaphore (default 10 concurrent). Previously sequential: ~40 feeds × 2-5s each = minutes. Now ~10 at a time.
+- **Concurrent Ollama embeddings** — embedding vectors for all articles pre-computed in parallel before the clustering loop (bounded by semaphore, default 4). Previously one-by-one during clustering.
+- **Concurrent LLM enrichment** — entity extraction / topic classification / sentiment calls run concurrently across all clusters, bounded by per-provider semaphore:
+  - `openrouter`: 2 free tier
+  - `openai`: 5
+  - `groq`: 8
+  - Override via `NEWS_LLM_CONCURRENCY_<PROVIDER>` env var
+- **Per-cluster retry with backoff** — failed LLM calls retry up to 3 times (2s, 4s, 8s backoff) before marking the cluster as failed. Failed clusters are automatically retried on the next polling cycle.
+- **Cross-cycle failure recovery** — `get_failed_enrichment_clusters()` queries the DB for clusters with `enrichment_failed_at` set but below the retry threshold, so transient failures self-heal.
+- **LLM provider retries** — `_call_groq` and `_call_openai` now have the same retry logic as `_call_openrouter` (2 retries, exponential backoff on 429/500/502/503, empty response handling).
+- **`get_latest_events()` default changed** — omitting `topic` now returns clusters from **all** topics instead of defaulting to `"crypto"`. Pass `topic="crypto"` (or macro/regulation/ai/other) to filter.
+- **Configuration** — all concurrency limits configurable via env vars; see `config.py` for `NEWS_RSS_MAX_CONCURRENCY`, `NEWS_OLLAMA_MAX_CONCURRENCY`, `NEWS_LLM_CONCURRENCY_<PROVIDER>`.
+
+### Migration notes
+- No database schema changes.
+- If you relied on `get_latest_events()` without a topic argument returning only crypto clusters, pass `topic="crypto"` explicitly.
+- Concurrency defaults are conservative for free-rate-limit providers. Tune up via env vars if you have paid plans.
+
 ## v0.2.0 — embedding-aware clustering and richer agent tools
 
 ### Highlights