"""Smoke-Test: beide Voter liefern valides JSON.""" from __future__ import annotations from aitrader.ai.ensemble import combine from aitrader.ai.prompt import build_user_prompt from aitrader.ai.registry import make_voter from aitrader.config import get_settings from aitrader.logging_setup import configure_logging, get_logger def main() -> None: configure_logging() log = get_logger("smoke_ai") s = get_settings() fake_features = { "15m": {"close": 65000.0, "rsi14": 58.0, "macd": 12.0, "macd_signal": 8.0, "macd_hist": 4.0, "ema20": 64900, "ema50": 64000, "ema200": 60000, "atr14": 350.0, "pct_change_24": 1.8}, "1h": {"close": 65000.0, "rsi14": 60.0, "macd": 50.0, "macd_signal": 30.0, "macd_hist": 20.0, "ema20": 64500, "ema50": 63000, "ema200": 58000, "atr14": 800.0, "pct_change_24": 2.3}, "4h": {"close": 65000.0, "rsi14": 65.0, "macd": 200.0, "macd_signal": 150.0, "macd_hist": 50.0, "ema20": 63000, "ema50": 60000, "ema200": 55000, "atr14": 1500.0, "pct_change_24": 5.0}, } ob = {"best_bid": 64995.0, "best_ask": 65005.0, "spread_bps": 1.5, "depth_imbalance": 0.12} prompt = build_user_prompt("BTC/EUR", fake_features, ob, [], 0.0, None, 10000.0) voter_a = make_voter(s.ai.voter_a, s) a = voter_a.decide(prompt) log.info("voter_a", provider=voter_a.provider, model=voter_a.model, action=a.action, conf=a.confidence, size=a.suggested_size_pct, reason=a.reasoning[:160]) voter_b = make_voter(s.ai.voter_b, s) b = voter_b.decide(prompt) log.info("voter_b", provider=voter_b.provider, model=voter_b.model, action=b.action, conf=b.confidence, size=b.suggested_size_pct, reason=b.reasoning[:160]) r = combine(a, b, s.ai.min_confidence) log.info("ensemble", action=r.action, rationale=r.rationale) if __name__ == "__main__": main()