|
|
"""Data models for the HuggingFace Crypto Data Engine""" |
|
|
from __future__ import annotations |
|
|
from typing import List, Optional |
|
|
from pydantic import BaseModel, Field |
|
|
from datetime import datetime |
|
|
|
|
|
|
|
|
class OHLCV(BaseModel): |
|
|
"""OHLCV candlestick data model""" |
|
|
timestamp: int = Field(..., description="Unix timestamp in milliseconds") |
|
|
open: float = Field(..., description="Opening price") |
|
|
high: float = Field(..., description="Highest price") |
|
|
low: float = Field(..., description="Lowest price") |
|
|
close: float = Field(..., description="Closing price") |
|
|
volume: float = Field(..., description="Trading volume") |
|
|
|
|
|
|
|
|
class OHLCVResponse(BaseModel): |
|
|
"""Response model for OHLCV endpoint""" |
|
|
success: bool = True |
|
|
data: List[OHLCV] |
|
|
symbol: str |
|
|
interval: str |
|
|
count: int |
|
|
source: str |
|
|
timestamp: Optional[int] = None |
|
|
|
|
|
|
|
|
class Price(BaseModel): |
|
|
"""Price data model""" |
|
|
symbol: str |
|
|
name: str |
|
|
price: float |
|
|
priceUsd: float |
|
|
change1h: Optional[float] = None |
|
|
change24h: Optional[float] = None |
|
|
change7d: Optional[float] = None |
|
|
volume24h: Optional[float] = None |
|
|
marketCap: Optional[float] = None |
|
|
rank: Optional[int] = None |
|
|
lastUpdate: str |
|
|
|
|
|
|
|
|
class PricesResponse(BaseModel): |
|
|
"""Response model for prices endpoint""" |
|
|
success: bool = True |
|
|
data: List[Price] |
|
|
timestamp: int |
|
|
source: str |
|
|
|
|
|
|
|
|
class FearGreedIndex(BaseModel): |
|
|
"""Fear & Greed Index model""" |
|
|
value: int = Field(..., ge=0, le=100) |
|
|
classification: str |
|
|
timestamp: str |
|
|
|
|
|
|
|
|
class NewsSentiment(BaseModel): |
|
|
"""News sentiment aggregation""" |
|
|
bullish: int = 0 |
|
|
bearish: int = 0 |
|
|
neutral: int = 0 |
|
|
total: int = 0 |
|
|
|
|
|
|
|
|
class OverallSentiment(BaseModel): |
|
|
"""Overall sentiment score""" |
|
|
sentiment: str |
|
|
score: int = Field(..., ge=0, le=100) |
|
|
confidence: float = Field(..., ge=0, le=1) |
|
|
|
|
|
|
|
|
class SentimentData(BaseModel): |
|
|
"""Sentiment data model""" |
|
|
fearGreed: FearGreedIndex |
|
|
news: NewsSentiment |
|
|
overall: OverallSentiment |
|
|
|
|
|
|
|
|
class SentimentResponse(BaseModel): |
|
|
"""Response model for sentiment endpoint""" |
|
|
success: bool = True |
|
|
data: SentimentData |
|
|
timestamp: int |
|
|
|
|
|
|
|
|
class MarketOverview(BaseModel): |
|
|
"""Market overview data model""" |
|
|
totalMarketCap: float |
|
|
totalVolume24h: float |
|
|
btcDominance: float |
|
|
ethDominance: float |
|
|
activeCoins: int |
|
|
topGainers: List[Price] = [] |
|
|
topLosers: List[Price] = [] |
|
|
trending: List[Price] = [] |
|
|
|
|
|
|
|
|
class MarketOverviewResponse(BaseModel): |
|
|
"""Response model for market overview endpoint""" |
|
|
success: bool = True |
|
|
data: MarketOverview |
|
|
timestamp: int |
|
|
|
|
|
|
|
|
class ProviderHealth(BaseModel): |
|
|
"""Provider health status""" |
|
|
name: str |
|
|
status: str |
|
|
latency: Optional[int] = None |
|
|
lastCheck: str |
|
|
errorMessage: Optional[str] = None |
|
|
|
|
|
|
|
|
class CacheInfo(BaseModel): |
|
|
"""Cache statistics""" |
|
|
size: int |
|
|
hitRate: float |
|
|
|
|
|
|
|
|
class HealthResponse(BaseModel): |
|
|
"""Response model for health endpoint""" |
|
|
status: str |
|
|
uptime: int |
|
|
version: str |
|
|
providers: List[ProviderHealth] |
|
|
cache: CacheInfo |
|
|
|
|
|
|
|
|
class ErrorResponse(BaseModel): |
|
|
"""Error response model""" |
|
|
success: bool = False |
|
|
error: ErrorDetail |
|
|
timestamp: int |
|
|
|
|
|
|
|
|
class ErrorDetail(BaseModel): |
|
|
"""Error detail""" |
|
|
code: str |
|
|
message: str |
|
|
details: Optional[dict] = None |
|
|
retryAfter: Optional[int] = None |
|
|
|