Bienvenue dans ce guide complet sur la configuration des règles de monitoring et d'alertes pour l'API HolySheep. Si vous cherchez une solution d'API IA performante avec une latence inférieure à 50 millisecondes et des tarifs compétitifs, vous êtes au bon endroit. Commençons par analyser pourquoi HolySheep représente une alternative stratégique face aux grands acteurs du marché.

Comparatif des prix des APIs IA en 2026

Avant d'aborder la configuration technique, voici une comparaison précise des coûts(unit: $MTok output):

Modèle IA Prix ($/MTok) Latence moyenne Disponibilité
GPT-4.1 8,00 $ ~120 ms Haute
Claude Sonnet 4.5 15,00 $ ~95 ms Haute
Gemini 2.5 Flash 2,50 $ ~65 ms Très haute
DeepSeek V3.2 0,42 $ ~45 ms Très haute

Calcul du coût pour 10 millions de tokens/mois

Fournisseur Coût mensuel Économie vs GPT-4.1
OpenAI (GPT-4.1) 80,00 $ Référence
Anthropic (Claude Sonnet 4.5) 150,00 $ -87% plus cher
Google (Gemini 2.5 Flash) 25,00 $ 69% moins cher
HolySheep (DeepSeek V3.2) 4,20 $ 95% moins cher

Ces chiffres démontrent l'avantage compétitif majeur de HolySheep. Pour une entreprise traitant 10 millions de tokens mensuellement, passer par HolySheep représente une économie annuelle de plus de 900 dollars compared aux tarifs OpenAI, tout en bénéficiant d'une latence réduite de 60%.

Pour qui / pour qui ce n'est pas fait

Cette solution de monitoring et d'alertes API est particulièrement adaptée aux développeurs et équipes techniques qui souhaitent optimiser leurs coûts d'API IA. C'est fait pour les startups et PME cherchant à réduire leurs dépenses cloud, les équipes DevOps nécessitant une surveillance proactive, et les entreprises wanting to migrate from expensive providers like Anthropic or OpenAI. En revanche, ce n'est pas fait pour les projets hobby sans contraintes budgétaires, les entreprises nécessitant un support 24/7 dedicated account manager, ou les cas d'usage nécessitant une conformité HIPAA ou SOC2 spécifique que HolySheep ne supporte pas encore.

Tarification et ROI

HolySheep propose un modèle de tarification transparent avec un taux de change avantageux de ¥1 pour $1, offrant une économie de plus de 85% pour les utilisateurs internationaux. Les options de paiement incluent WeChat Pay et Alipay, facilitant les transactions pour les utilisateurs chinois. Les nouveaux utilisateurs reçoivent des crédits gratuits pour tester la plateforme. Le ROI se calcule simplement : pour une utilisation mensuelle de 100 millions de tokens, l'économie annuelle atteint 45 600 $ par rapport à Claude Sonnet 4.5 d'Anthropic. La latence moyenne de 45 millisecondes améliore également l'expérience utilisateur final, réduisant le temps de chargement des applications de manière mesurable.

Pourquoi choisir HolySheep

HolySheep se distingue par plusieurs avantages compétitifs déterminants. La latence inférieure à 50 millisecondes garantit des temps de réponse exceptionnels, surpassant les 120 millisecondes typiques de GPT-4.1. Le support natif pour DeepSeek V3.2 à seulement 0,42 $ le million de tokens démocratise l'accès aux modèles performants. L'intégration de méthodes de paiement locales comme WeChat et Alipay simplifie considérablement le processus pour les développeurs asiatiques. Les crédits gratuits permettent une évaluation sans risque avant tout engagement financier. L'API reste compatible avec le format OpenAI, facilitant la migration depuis n'importe quel provider existant.

Configuration des règles de monitoring HolySheep API

Introduction au système d'alertes

Le monitoring des APIs IA représente un enjeu critique pour maintenir la qualité de service et contrôler les coûts. HolySheep propose un système de règles d'alertes configurable permettant de surveiller les métriques essentielles de vos appels API. Dans ce tutoriel, je vais vous guider à travers chaque étape de configuration, depuis l'authentification jusqu'à la mise en place d'alertes personnalisées. Cette configuration s'adresse aux développeurs souhaitant implémenter une surveillance proactive de leurs intégrations HolySheep.

Pour commencer à utiliser HolySheep, vous devez d'abord créer un compte sur la plateforme HolySheep et récupérer votre clé API. Cette clé sera nécessaire pour toutes les requêtes ultérieures.

Configuration de base de la connexion

Avant de configurer les règles de monitoring, établissez une connexion stable avec l'API HolySheep. L'URL de base est https://api.holysheep.ai/v1, et vous devez utiliser votre clé API personnelle pour l'authentification. Voici comment initialiser le client en Python avec une gestion d'erreurs appropriée pour capturer les problèmes de connexion.


import requests
import time
from datetime import datetime

Configuration HolySheep API

BASE_URL = "https://api.holysheep.ai/v1" API_KEY = "YOUR_HOLYSHEEP_API_KEY" class HolySheepMonitor: def __init__(self, api_key): self.api_key = api_key self.headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } self.session = requests.Session() self.session.headers.update(self.headers) self.metrics = [] def test_connection(self): """Vérifie la connectivité avec l'API HolySheep""" try: response = self.session.get( f"{BASE_URL}/models", timeout=10 ) if response.status_code == 200: print(f"✓ Connexion réussie à HolySheep API") print(f" Latence mesurée: {response.elapsed.total_seconds()*1000:.2f}ms") return True else: print(f"✗ Erreur: Code {response.status_code}") return False except requests.exceptions.Timeout: print("✗ Timeout: L'API ne répond pas dans les 10 secondes") return False except requests.exceptions.ConnectionError: print("✗ Erreur de connexion: Vérifiez votre connexion internet") return False

Initialisation et test

monitor = HolySheepMonitor("YOUR_HOLYSHEEP_API_KEY") monitor.test_connection()

Ce code initialise une classe de monitoring avec une session persistante pour optimiser les performances. La méthode test_connection vérifie que votre clé API est valide et mesure la latence réelle de votre connexion. Une latence supérieure à 100 millisecondes devrait déclencher une investigation sur la qualité de votre connexion réseau.

Collecte des métriques d'utilisation

Le monitoring efficace repose sur la collecte précise des métriques. Vous devez tracker le nombre de tokens consommés, les temps de réponse, les codes d'erreur et les modèles utilisés. Cette collecte permet ensuite de définir des règles d'alertes pertinentes adaptées à vos besoins spécifiques.


import json
from typing import Dict, List, Optional
from dataclasses import dataclass, asdict
from collections import defaultdict

@dataclass
class APIMetrics:
    """Structure de données pour les métriques API"""
    timestamp: str
    model: str
    prompt_tokens: int
    completion_tokens: int
    total_tokens: int
    latency_ms: float
    status_code: int
    error_message: Optional[str] = None

class MetricsCollector:
    def __init__(self, monitor: HolySheepMonitor):
        self.monitor = monitor
        self.history: List[APIMetrics] = []
        self.aggregated = defaultdict(lambda: {
            "total_requests": 0,
            "total_tokens": 0,
            "total_cost": 0.0,
            "avg_latency": 0.0,
            "error_count": 0,
            "latencies": []
        })
    
    def make_request(self, model: str, messages: List[Dict]) -> Optional[APIMetrics]:
        """Effectue une requête et enregistre les métriques"""
        start_time = time.time()
        
        try:
            response = self.monitor.session.post(
                f"{BASE_URL}/chat/completions",
                json={
                    "model": model,
                    "messages": messages
                },
                timeout=30
            )
            
            latency = (time.time() - start_time) * 1000
            
            if response.status_code == 200:
                data = response.json()
                usage = data.get("usage", {})
                metrics = APIMetrics(
                    timestamp=datetime.now().isoformat(),
                    model=model,
                    prompt_tokens=usage.get("prompt_tokens", 0),
                    completion_tokens=usage.get("completion_tokens", 0),
                    total_tokens=usage.get("total_tokens", 0),
                    latency_ms=latency,
                    status_code=200
                )
            else:
                metrics = APIMetrics(
                    timestamp=datetime.now().isoformat(),
                    model=model,
                    prompt_tokens=0,
                    completion_tokens=0,
                    total_tokens=0,
                    latency_ms=latency,
                    status_code=response.status_code,
                    error_message=response.text
                )
            
            self.history.append(metrics)
            self._update_aggregated(metrics)
            return metrics
            
        except Exception as e:
            metrics = APIMetrics(
                timestamp=datetime.now().isoformat(),
                model=model,
                prompt_tokens=0,
                completion_tokens=0,
                total_tokens=0,
                latency_ms=(time.time() - start_time) * 1000,
                status_code=0,
                error_message=str(e)
            )
            self.history.append(metrics)
            self._update_aggregated(metrics)
            return metrics
    
    def _update_aggregated(self, metrics: APIMetrics):
        """Met à jour les statistiques agrégées par modèle"""
        model_stats = self.aggregated[metrics.model]
        model_stats["total_requests"] += 1
        model_stats["total_tokens"] += metrics.total_tokens
        model_stats["error_count"] += 1 if metrics.status_code != 200 else 0
        model_stats["latencies"].append(metrics.latency_ms)
        
        # Calcul du coût (tarifs HolySheep 2026)
        pricing = {
            "gpt-4.1": 8.0,
            "claude-sonnet-4.5": 15.0,
            "gemini-2.5-flash": 2.5,
            "deepseek-v3.2": 0.42
        }
        rate = pricing.get(metrics.model, 1.0)
        model_stats["total_cost"] += (metrics.total_tokens / 1_000_000) * rate
        
        # Moyenne mobile de latence
        latencies = model_stats["latencies"]
        model_stats["avg_latency"] = sum(latencies) / len(latencies)
    
    def get_summary(self, model: Optional[str] = None) -> Dict:
        """Retourne un résumé des métriques"""
        if model:
            return asdict(self.aggregated[model])
        return {k: {kk: vv for kk, vv in v.items() if kk != "latencies"} 
                for k, v in self.aggregated.items()}

Utilisation

collector = MetricsCollector(monitor) test_response = collector.make_request( "deepseek-v3.2", [{"role": "user", "content": "Explain API monitoring in French"}] ) print(json.dumps(collector.get_summary("deepseek-v3.2"), indent=2))

Cette implémentation capture chaque détail de vos requêtes API. Le coût est calculé automatiquement selon les tarifs HolySheep 2026, vous permettant de suivre vos dépenses en temps réel. La latence moyenne et le nombre d'erreurs sont des indicateurs essentiels pour évaluer la santé de votre intégration.

Système de règles d'alertes configurables

Maintenant que nous collectons les métriques, implémentons un système de règles d'alertes flexible. Chaque règle définit une condition, un seuil, et une action à exécuter lorsque la condition est remplie. Cette architecture permet une personnalisation complète selon vos exigences opérationnelles.


from enum import Enum
from typing import Callable, Dict, Any, List
import threading
import schedule
import time as time_module

class AlertSeverity(Enum):
    INFO = "info"
    WARNING = "warning"
    CRITICAL = "critical"

class AlertRule:
    def __init__(
        self,
        name: str,
        condition: Callable[[Dict], bool],
        threshold: float,
        severity: AlertSeverity,
        message_template: str,
        cooldown_seconds: int = 300
    ):
        self.name = name
        self.condition = condition
        self.threshold = threshold
        self.severity = severity
        self.message_template = message_template
        self.cooldown_seconds = cooldown_seconds
        self.last_triggered = None
        self.trigger_count = 0
    
    def should_fire(self, metrics: Dict) -> bool:
        """Vérifie si la règle doit déclencher une alerte"""
        if not self.condition(metrics):
            return False
        
        # Vérifie le cooldown
        if self.last_triggered:
            elapsed = time_module.time() - self.last_triggered
            if elapsed < self.cooldown_seconds:
                return False
        
        self.last_triggered = time_module.time()
        self.trigger_count += 1
        return True
    
    def format_message(self, metrics: Dict) -> str:
        return self.message_template.format(**metrics)

class AlertManager:
    def __init__(self, collector: MetricsCollector):
        self.collector = collector
        self.rules: List[AlertRule] = []
        self.handlers: List[Callable] = []
        self._lock = threading.Lock()
        self._setup_default_rules()
    
    def _setup_default_rules(self):
        """Configure les règles d'alertes par défaut"""
        
        # Règle 1: Latence excessive
        self.add_rule(AlertRule(
            name="high_latency",
            condition=lambda m: m.get("avg_latency", 0) > 100,
            threshold=100,
            severity=AlertSeverity.WARNING,
            message_template=(
                "⚠️ Latence élevée détectée: {avg_latency:.2f}ms "
                "(seuil: 100ms). Dernière mesure il y a quelques secondes."
            ),
            cooldown_seconds=300
        ))
        
        # Règle 2: Taux d'erreur élevé
        self.add_rule(AlertRule(
            name="high_error_rate",
            condition=lambda m: (
                m["total_requests"] > 10 and 
                (m["error_count"] / m["total_requests"]) > 0.05
            ),
            threshold=0.05,
            severity=AlertSeverity.CRITICAL,
            message_template=(
                "🚨 Taux d'erreur critique: {error_rate:.1%} "
                "({error_count} erreurs sur {total_requests} requêtes)"
            ),
            cooldown_seconds=600
        ))
        
        # Règle 3: Dépassement de budget
        self.add_rule(AlertRule(
            name="budget_exceeded",
            condition=lambda m: m.get("total_cost", 0) > 50,
            threshold=50,
            severity=AlertSeverity.CRITICAL,
            message_template=(
                "💰 Budget mensuel dépassé: ${total_cost:.2f} "
                "sur le modèle {model_name}"
            ),
            cooldown_seconds=3600
        ))
        
        # Règle 4: quota tokens excessif
        self.add_rule(AlertRule(
            name="high_token_usage",
            condition=lambda m: m.get("total_tokens", 0) > 1_000_000,
            threshold=1_000_000,
            severity=AlertSeverity.INFO,
            message_template=(
                "📊 Consommation tokens: {total_tokens:,} "
                "(coût: ${total_cost:.2f})"
            ),
            cooldown_seconds=1800
        ))
    
    def add_rule(self, rule: AlertRule):
        """Ajoute une règle de monitoring"""
        with self._lock:
            self.rules.append(rule)
    
    def add_handler(self, handler: Callable):
        """Ajoute un handler pour traiter les alertes"""
        self.handlers.append(handler)
    
    def check_all_rules(self, model: str = None):
        """Vérifie toutes les règles actives"""
        summary = self.collector.get_summary(model)
        
        for model_name, metrics in summary.items():
            metrics["model_name"] = model_name
            metrics["error_rate"] = (
                metrics["error_count"] / metrics["total_requests"]
                if metrics["total_requests"] > 0 else 0
            )
            
            for rule in self.rules:
                if rule.should_fire(metrics):
                    alert = {
                        "rule": rule.name,
                        "severity": rule.severity.value,
                        "message": rule.format_message(metrics),
                        "model": model_name,
                        "timestamp": datetime.now().isoformat()
                    }
                    self._dispatch_alert(alert)
    
    def _dispatch_alert(self, alert: Dict):
        """Envoie l'alerte à tous les handlers"""
        print(f"[{alert['severity'].upper()}] {alert['message']}")
        for handler in self.handlers:
            try:
                handler(alert)
            except Exception as e:
                print(f"Erreur handler: {e}")
    
    def start_monitoring(self, interval_seconds: int = 60):
        """Démarre le monitoring continu"""
        def run():
            while True:
                self.check_all_rules()
                time_module.sleep(interval_seconds)
        
        thread = threading.Thread(target=run, daemon=True)
        thread.start()
        print(f"Monitoring démarré (intervalle: {interval_seconds}s)")

Configuration complète

alert_manager = AlertManager(collector)

Handler pour notifications webhook (exemple)

def webhook_handler(alert: Dict): """Envoie les alertes vers un endpoint webhook""" try: webhook_url = "https://votre-webhook.com/alerts" requests.post( webhook_url, json=alert, headers={"Content-Type": "application/json"}, timeout=5 ) except Exception: pass # Ne pas bloquer le monitoring alert_manager.add_handler(webhook_handler)

Démarrer le monitoring

alert_manager.start_monitoring(interval_seconds=60)

Ce système de règles offre une flexibilité totale pour adapter les seuils à votre infrastructure. Les règles par défaut couvrent les scénarios les plus critiques : latence excessive au-delà de 100 millisecondes, taux d'erreur dépassant 5%, dépassement de budget et consommation anormale de tokens. Le mécanisme de cooldown empêche la saturation d'alertes identiques pendant une période configurable.

Intégration avancée: Webhooks et notifications

Pour une surveillance professionnelle, configurez des intégrations avec vos outils de notification. L'intégration avec Slack, Discord ou PagerDuty permet une réactivité immédiate face aux incidents. Voici comment structurer ces intégrations pour une réponse efficace aux alertes critiques.


import json
import hashlib
import hmac
from urllib.parse import urlencode

class NotificationService:
    def __init__(self):
        self.channels = []
    
    def add_slack_channel(self, webhook_url: str, channel: str = "#alerts"):
        """Configure un canal Slack"""
        self.channels.append({
            "type": "slack",
            "url": webhook_url,
            "channel": channel
        })
    
    def add_discord_webhook(self, webhook_url: str, username: str = "HolySheep Monitor"):
        """Configure un webhook Discord"""
        self.channels.append({
            "type": "discord",
            "url": webhook_url,
            "username": username
        })
    
    def send_alert(self, alert: Dict):
        """Envoie l'alerte vers tous les canaux configurés"""
        for channel in self.channels:
            try:
                if channel["type"] == "slack":
                    self._send_slack(channel["url"], alert)
                elif channel["type"] == "discord":
                    self._send_discord(channel["url"], channel["username"], alert)
            except Exception as e:
                print(f"Échec envoi {channel['type']}: {e}")
    
    def _send_slack(self, webhook_url: str, alert: Dict):
        """Envoie un message Slack formaté"""
        severity_emojis = {
            "info": "ℹ️",
            "warning": "⚠️",
            "critical": "🚨"
        }
        
        payload = {
            "channel": "#alerts",
            "username": "HolySheep Monitor",
            "icon_emoji": ":satellite:",
            "attachments": [{
                "color": {
                    "info": "#36a64f",
                    "warning": "#ff9900",
                    "critical": "#ff0000"
                }.get(alert["severity"], "#cccccc"),
                "title": f"{severity_emojis.get(alert['severity'], '📢')} Alerte {alert['severity']}",
                "text": alert["message"],
                "fields": [
                    {"title": "Règle", "value": alert["rule"], "short": True},
                    {"title": "Modèle", "value": alert["model"], "short": True},
                    {"title": "Horodatage", "value": alert["timestamp"], "short": True}
                ],
                "footer": "HolySheep API Monitor",
                "ts": time_module.time()
            }]
        }
        
        response = requests.post(webhook_url, json=payload, timeout=10)
        response.raise_for_status()
    
    def _send_discord(self, webhook_url: str, username: str, alert: Dict):
        """Envoie un embed Discord formaté"""
        severity_colors = {
            "info": 3447003,      # Vert
            "warning": 16763904,  # Orange
            "critical": 15158332  # Rouge
        }
        
        payload = {
            "username": username,
            "embeds": [{
                "title": f"Alerte {alert['severity'].upper()}",
                "description": alert["message"],
                "color": severity_colors.get(alert["severity"], 9807270),
                "fields": [
                    {"name": "Règle", "value": alert["rule"], "inline": True},
                    {"name": "Modèle", "value": alert["model"], "inline": True}
                ],
                "timestamp": alert["timestamp"],
                "footer": {"text": "HolySheep API Monitor"}
            }]
        }
        
        response = requests.post(webhook_url, json=payload, timeout=10)
        response.raise_for_status()

Exemple d'utilisation

notifier = NotificationService() notifier.add_slack_channel("https://hooks.slack.com/services/VOTRE/WEBHOOK/URL") notifier.add_discord_webhook("https://discord.com/api/webhooks/VOTRE/WEBHOOK")

Intégration avec le système d'alertes

alert_manager.add_handler(notifier.send_alert)

Dashboard de visualisation des métriques

Pour une analyse visuelle de vos métriques, générez un rapport HTML dynamique. Ce dashboard présente l'évolution temporelle des performances, les répartition par modèle et les alertes récentes. L'export au format JSON permet également une ingestion dans des outils comme Grafana ou Datadog.


from datetime import datetime, timedelta
import base64

class MetricsDashboard:
    def __init__(self, collector: MetricsCollector, alert_manager: AlertManager):
        self.collector = collector
        self.alert_manager = alert_manager
    
    def generate_html_report(self) -> str:
        """Génère un rapport HTML complet"""
        summary = self.collector.get_summary()
        
        # Calcul des statistiques globales
        total_requests = sum(m["total_requests"] for m in summary.values())
        total_cost = sum(m["total_cost"] for m in summary.values())
        total_tokens = sum(m["total_tokens"] for m in summary.values())
        avg_latency = sum(m["avg_latency"] * m["total_requests"] 
                         for m in summary.values()) / max(total_requests, 1)
        
        html = f"""
        
        
        
            
            HolySheep API Dashboard
            
        
        
            

📊 Dashboard HolySheep API

Généré le {datetime.now().strftime('%d/%m/%Y à %H:%M')}

{total_requests:,}
Requêtes totales
${total_cost:.2f}
Coût total
{total_tokens:,}
Tokens consommés
{avg_latency:.0f}ms
Latence moyenne

Répartition par modèle

""" for model, stats in summary.items(): error_rate = stats["error_count"] / max(stats["total_requests"], 1) row_class = "critical" if error_rate > 0.1 else "" html += f""" """ html += """
Modèle Requêtes Tokens Coût Latence Avg Erreurs
{model} {stats['total_requests']:,} {stats['total_tokens']:,} ${stats['total_cost']:.2f} {stats['avg_latency']:.0f}ms {stats['error_count']} ({error_rate:.1%})
""" return html def export_json(self) -> str: """Exporte les métriques au format JSON""" data = { "generated_at": datetime.now().isoformat(), "summary": self.collector.get_summary(), "rules": [ {"name": r.name, "severity": r.severity.value, "trigger_count": r.trigger_count} for r in self.alert_manager.rules ] } return json.dumps(data, indent=2)

Génération du rapport

dashboard = MetricsDashboard(collector, alert_manager) html_report = dashboard.generate_html_report() json_data = dashboard.export_json()

Sauvegarde

with open("dashboard.html", "w") as f: f.write(html_report) with open("metrics.json", "w") as f: f.write(json_data) print("✓ Dashboard généré: dashboard.html") print("✓ Métriques exportées: metrics.json")

Optimisation des coûts avec HolySheep

En configurant correctement vos règles de monitoring, vous pouvez identifier les opportunités d'optimisation. Par exemple, les modèles économiques comme DeepSeek V3.2 à 0,42 $ le million de tokens permettent des économies massives. Voici une stratégie d'optimisation recommandée :

Erreurs courantes et solutions

Erreur 401: Clé API invalide

Symptôme : Les requêtes retournent systématiquement le code 401 Unauthorized avec le message "Invalid API key".

Cause : La clé API est incorrecte, expiré, ou mal formatée dans les headers d'authentification.


Solution: Vérification et correction de la clé API

import os def validate_api_key(api_key: str) -> bool: """Valide le format et la présence de la clé API""" # Vérifie que la clé n'est pas vide ou par défaut if not api_key or api_key == "YOUR_HOLYSHEEP_API_KEY": print("❌ Erreur: Clé API non configurée") print(" 1. Créez un compte sur https://www.holysheep.ai/register") print(" 2. Générez une clé API dans votre tableau de bord") print(" 3. Remplacez 'YOUR_HOLYSHEEP_API_KEY' par votre vraie clé") return False # Vérifie le format (devrait commencer par 'hs-' ou 'sk-') if not (api_key.startswith("hs-") or api_key.startswith("sk-")): print("⚠️ Avertissement: Format de clé inhabituel") print(" Les clés HolySheep commencent généralement par 'hs-'") # Test de connexion response = requests.get( "https://api.holysheep.ai/v1/models", headers={"Authorization": f"Bearer {api_key}"}, timeout=10 ) if response.status_code == 200: print("✅ Clé API validée avec succès") return True else: print(f"❌ Erreur: Code {response.status_code}") print(f" Message: {response.text}") return False

Utilisation

API_KEY = os.environ.get("HOLYSHEEP_API_KEY", "YOUR_HOLYSHEEP_API_KEY") validate_api_key(API_KEY)

Erreur 429: Rate limit dépassé

Symptôme : Les requêtes échouent avec le code 429 Too Many Requests après quelques appels successifs.

Cause : Le nombre de requêtes par minute dépasse les limites imposées par HolySheep.


import time
from threading import Lock

class RateLimitedClient:
    """Client avec gestion intelligente du rate limiting"""
    
    def __init__(self, api_key: str, max_requests_per_minute: int = 60):
        self.api_key = api_key
        self.max_rpm = max_requests_per_minute
        self.request_times = []
        self.lock = Lock()
    
    def _wait_for_rate_limit(self):
        """Attend intelligemment si nécessaire"""
        with self.lock:
            now = time.time()
            # Retire les requêtes plus anciennes que 60 secondes
            self.request_times = [t for t in self.request_times if now - t < 60]
            
            if len(self.request_times) >= self.max_rpm:
                # Attend jusqu'à ce qu'une slot se libère
                oldest = self.request_times[0]
                wait_time = 60 - (now - oldest) + 0.1
                print(f"⏳ Rate limit atteint, attente de {wait_time:.1f}s...")
                time.sleep(wait_time)
            
            self.request_times.append(time.time())
    
    def make_request(self, model: str, messages: list) -> dict:
        """Effectue une requête avec gestion du rate limit"""
        self._wait_for_rate_limit()