astock-agent/backend/app/news/pipeline.py
2026-05-14 17:02:13 +08:00

51 lines
1.6 KiB
Python

"""新闻采集与催化归因流水线。"""
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