"""新闻采集与催化归因流水线。""" from __future__ import annotations import logging from app.config import settings from app.catalyst.service import analyze_pending_news, ingest_news_items from app.news.collector import collect_news_sources logger = logging.getLogger(__name__) async def refresh_news_catalysts( lookback_hours: int | None = None, limit_per_source: int | None = None, analyze_limit: int | None = None, use_llm: bool = True, ) -> dict: if not settings.news_collection_enabled: return { "enabled": False, "fetched": 0, "inserted": 0, "duplicates": 0, "analyzed": 0, "skipped": 0, "failed": 0, } items = await collect_news_sources( lookback_hours=lookback_hours or settings.news_fetch_lookback_hours, limit_per_source=limit_per_source or settings.news_fetch_limit_per_source, ) ingest_result = await ingest_news_items(items) remaining_result = await analyze_pending_news( limit=analyze_limit or settings.news_analyze_limit_per_run, use_llm=use_llm, ) result = { "enabled": True, "fetched": len(items), "inserted": ingest_result.get("inserted", 0), "duplicates": ingest_result.get("duplicates", 0), "analyzed": ingest_result.get("analyzed", 0) + remaining_result.get("analyzed", 0), "skipped": remaining_result.get("skipped", 0), "failed": ingest_result.get("failed", 0) + remaining_result.get("failed", 0), } logger.info("新闻催化刷新完成: %s", result) return result