"""Dashboard MidasBot — panneau « Insights IA ». Affiche les derniers biais de marché produits par Claude (lus depuis Redis) et un lien vers FreqUI (positions / P&L / trades). Volontairement minimal et autonome (pas de dépendance au package ai_analyzer). """ from __future__ import annotations import json import os from datetime import datetime, timezone import redis from fastapi import FastAPI from fastapi.responses import HTMLResponse, JSONResponse REDIS_URL = os.environ.get("REDIS_URL", "redis://localhost:6379/0") FREQUI_URL = os.environ.get("FREQUI_URL", "http://127.0.0.1:8080") app = FastAPI(title="MidasBot Dashboard") def _redis() -> redis.Redis: return redis.Redis.from_url(REDIS_URL, decode_responses=True) def _read_biases() -> list[dict]: r = _redis() out: list[dict] = [] try: for key in r.scan_iter("bias:*"): raw = r.get(key) if not raw: continue try: out.append(json.loads(raw)) except json.JSONDecodeError: continue except redis.RedisError: return [] out.sort(key=lambda b: b.get("pair", "")) return out @app.get("/api/biases") def api_biases() -> JSONResponse: return JSONResponse({"biases": _read_biases(), "generated_at": _now()}) @app.get("/api/health") def health() -> dict: try: _redis().ping() redis_ok = True except redis.RedisError: redis_ok = False return {"status": "ok", "redis": redis_ok} def _now() -> str: return datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S UTC") _COLORS = {"bullish": "#16a34a", "bearish": "#dc2626", "neutral": "#6b7280"} @app.get("/", response_class=HTMLResponse) def index() -> str: biases = _read_biases() if biases: rows = "\n".join( f""" {b.get('pair','?')} {b.get('direction','?')} {float(b.get('confidence',0)):.0%} {b.get('rationale','')} {b.get('key_support','—')} {b.get('key_resistance','—')} """ for b in biases ) else: rows = 'Aucun biais en cache. Lance l\'analyzer (ai-analyzer).' return f""" MidasBot — Insights IA

🪙 MidasBot — Insights IA

Biais de marché produits par Claude · {_now()} · rafraîchissement auto 30 s · DRY-RUN
{rows}
PaireBiaisConfianceJustificationSupportRésistance
"""