"""Schémas de données partagés (Pydantic) pour la couche IA.""" from __future__ import annotations from typing import Literal, Optional from pydantic import BaseModel, Field Direction = Literal["bullish", "bearish", "neutral"] class MarketBias(BaseModel): """Biais de marché produit par Claude pour une paire.""" pair: str = Field(..., description="Paire, ex. 'BTC/USDT'") direction: Direction = Field(..., description="Sens du biais") confidence: float = Field(..., ge=0.0, le=1.0, description="Confiance [0..1]") rationale: str = Field(..., description="Justification courte et factuelle") key_support: Optional[float] = Field(None, description="Support clé (prix)") key_resistance: Optional[float] = Field(None, description="Résistance clé (prix)") class MarketBiasBatch(BaseModel): """Lot de biais (un appel Claude couvre toutes les paires).""" biases: list[MarketBias] def by_pair(self) -> dict[str, MarketBias]: return {b.pair: b for b in self.biases} @staticmethod def json_schema() -> dict: """Schéma JSON passé à `claude -p --json-schema` (sous-ensemble supporté).""" return { "type": "object", "additionalProperties": False, "required": ["biases"], "properties": { "biases": { "type": "array", "items": { "type": "object", "additionalProperties": False, "required": ["pair", "direction", "confidence", "rationale"], "properties": { "pair": {"type": "string"}, "direction": { "type": "string", "enum": ["bullish", "bearish", "neutral"], }, "confidence": {"type": "number"}, "rationale": {"type": "string"}, "key_support": {"type": "number"}, "key_resistance": {"type": "number"}, }, }, } }, }