Files
20260327-c863ce53/app/data/factory.py
2026-04-25 19:25:22 +08:00

53 lines
1.6 KiB
Python

"""Data router factory — assembles the router with all available sources."""
from __future__ import annotations
import logging
from .router import DataRouter
from .sources.akshare_source import AKShareSource
from .sources.worldbank_source import WorldBankSource
from .sources.gpt_researcher_source import GPTResearcherSource
logger = logging.getLogger(__name__)
def create_data_router() -> DataRouter:
"""Create a DataRouter with all available data sources.
Priority order (lower = tried first):
10 AKShare — free, fast, covers Chinese macro/industry
20 World Bank — free, global macro
90 GPT Researcher — universal fallback (web research)
Future additions:
30 巨潮资讯 — free tier, Chinese public companies
40 天眼查 API — paid, company data
50 Choice API — paid, financial data
60 Statista API — paid, global industry stats
70 FRED API — free, US macro
80 UN Comtrade — free, global trade
"""
router = DataRouter()
# --- Free tier (always available) ---
router.register(AKShareSource(), priority=10)
router.register(WorldBankSource(), priority=20)
# --- Universal fallback ---
router.register(GPTResearcherSource(), priority=90)
logger.info(f"[data_factory] created router with {len(router.sources)} sources")
return router
# Singleton
_router: DataRouter | None = None
def get_data_router() -> DataRouter:
global _router
if _router is None:
_router = create_data_router()
return _router