"""Base adapter interface for all external API integrations.""" from abc import ABC, abstractmethod from dataclasses import dataclass from datetime import datetime from typing import Any, Dict, List, Optional @dataclass class AdapterResult: source_type: str ticker: str items: List[Dict[str, Any]] raw_payload: bytes content_hash: str fetched_at: datetime error: Optional[str] = None class BaseAdapter(ABC): """Interface for all ingestion adapters.""" @abstractmethod async def fetch(self, ticker: str, config: Dict[str, Any]) -> AdapterResult: """Fetch data for a given ticker using source config.""" ... @abstractmethod def source_type(self) -> str: ...