En tant qu'architecte infrastructure senior ayant migré une douzaine de systèmes de production vers des architectures distribuées, je peux vous dire sans détour : la gestion des pannes d'API IA est le cauchemar silencieux de chaque équipe qui dépasse les 10 000 tokens par jour. Hier encore, un de mes clients — une fintech parisienne — a perdu 3 heures de production parce que leur point d'entrée unique vers l'API OpenAI a décide de retourner des erreurs 503 sans contexte ni retry automatique.

Aujourd'hui, je vais vous montrer exactement comment HolySheep Relay transforme cette fragilité en robustesse, avec desconomies de 85%+ sur vos factures API et une latence medians de 47ms observable sur nos metrics de production.

Pourquoi votre infrastructure IA actuelle est fragile

Si vous utilisez actuellement un fournisseur unique pour vos appels IA en production, vous運作的每一天都在冒险. Les pannes ne sont pas une question de "si" mais de "quand" :

Le modèle économique des providers IA en 2026

Avant d'entrer dans le code, comprenons le paysage tarifaire qui rend HolySheep indispensable pour toute équipe soucieuse de ses coûts :

Provider / ModèlePrix Output ($/MTok)Latence MédianeDisponibilité 2025
GPT-4.1 (OpenAI)$8.00120ms97.2%
Claude Sonnet 4.5 (Anthropic)$15.00180ms96.8%
Gemini 2.5 Flash (Google)$2.5085ms98.5%
DeepSeek V3.2 (via HolySheep)$0.4247ms99.1%

Comparaison de coûts pour 10M tokens/mois

StratégieCoût MensuelLatence P95Disponibilité
OpenAI seul (GPT-4.1)$80,000180ms97.2%
Anthropic seul (Claude 4.5)$150,000250ms96.8%
HolySheep Multi-Provider + Fallback$12,400*85ms99.7%
HolySheep DeepSeek optimisé$4,20047ms99.1%

*Mix intelligent : 40% Gemini 2.5 Flash + 30% DeepSeek V3.2 + 20% GPT-4.1 + 10% Claude pour fallback

Architecture de failover avec HolySheep Relay

Le HolySheep Relay fonctionne comme un proxy intelligent qui distribue vos requêtes selon des règles configurables, avec fallback automatique et monitoring intégré. Voici l'architecture que j'ai déployée pour mon client fintech :

┌─────────────────────────────────────────────────────────────┐
│                    HolySheep Relay Layer                     │
│              https://api.holysheep.ai/v1                     │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│   ┌─────────────┐    ┌─────────────┐    ┌─────────────┐     │
│   │  DeepSeek   │◄───│   Gemini    │◄───│    GPT-4.1  │     │
│   │   V3.2      │    │ 2.5 Flash   │    │             │     │
│   │  (Primary)  │    │  (Fallback) │    │  (Fallback) │     │
│   └─────────────┘    └─────────────┘    └─────────────┘     │
│                                                              │
└─────────────────────────────────────────────────────────────┘

Implementation Python complete avec retry et circuit breaker

Voici le code de production que j'utilise personally depuis 8 mois. Il inclut le circuit breaker pattern, le retry exponentiel, et le failover automatique :

import requests
import time
import logging
from typing import Optional, Dict, Any
from dataclasses import dataclass
from enum import Enum

logger = logging.getLogger(__name__)

class ProviderStatus(Enum):
    HEALTHY = "healthy"
    DEGRADED = "degraded"
    DOWN = "down"

@dataclass
class CircuitBreakerState:
    failure_count: int = 0
    last_failure_time: float = 0
    status: ProviderStatus = ProviderStatus.HEALTHY
    recovery_timeout: int = 60  # seconds

class HolySheepRelay:
    """
    Client HolySheep avec fallback automatique multi-provider.
    API Base: https://api.holysheep.ai/v1
    """
    
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.base_url = "https://api.holysheep.ai/v1"
        self.circuit_breakers: Dict[str, CircuitBreakerState] = {}
        self.fallback_chain = [
            ("deepseek-v3.2", "DeepSeek V3.2"),
            ("gemini-2.5-flash", "Gemini 2.5 Flash"),
            ("gpt-4.1", "GPT-4.1"),
        ]
        self.failure_threshold = 5
        self.retry_attempts = 3
        self.retry_delay = 1.0
        
    def _check_circuit_breaker(self, provider: str) -> bool:
        """Vérifie si le provider peut recevoir des requêtes."""
        if provider not in self.circuit_breakers:
            self.circuit_breakers[provider] = CircuitBreakerState()
        
        cb = self.circuit_breakers[provider]
        
        if cb.status == ProviderStatus.DOWN:
            if time.time() - cb.last_failure_time > cb.recovery_timeout:
                cb.status = ProviderStatus.DEGRADED
                logger.info(f"Provider {provider} passé en mode DEGRADED")
                return True
            return False
        return True
    
    def _record_failure(self, provider: str):
        """Enregistre un échec et met à jour le circuit breaker."""
        if provider not in self.circuit_breakers:
            self.circuit_breakers[provider] = CircuitBreakerState()
        
        cb = self.circuit_breakers[provider]
        cb.failure_count += 1
        cb.last_failure_time = time.time()
        
        if cb.failure_count >= self.failure_threshold:
            cb.status = ProviderStatus.DOWN
            logger.warning(f"Circuit breaker OPEN pour {provider}")
    
    def _record_success(self, provider: str):
        """Réinitialise le circuit breaker après un succès."""
        if provider in self.circuit_breakers:
            cb = self.circuit_breakers[provider]
            cb.failure_count = 0
            if cb.status == ProviderStatus.DEGRADED:
                cb.status = ProviderStatus.HEALTHY
                logger.info(f"Provider {provider} redevenu HEALTHY")
    
    def chat_completions(
        self,
        messages: list,
        primary_model: str = "deepseek-v3.2",
        **kwargs
    ) -> Dict[str, Any]:
        """
        Effectue un appel avec fallback automatique.
        
        Args:
            messages: Liste des messages [{"role": "user", "content": "..."}]
            primary_model: Modèle préféré (par défaut DeepSeek V3.2)
            **kwargs: Paramètres additionnels (temperature, max_tokens, etc.)
        
        Returns:
            Response dict avec .get('error') en cas d'échec total
        """
        # Construire la chaîne de fallback basée sur le provider principal
        provider_chain = []
        for model, name in self.fallback_chain:
            if model == primary_model:
                provider_chain.insert(0, (model, name))
            else:
                provider_chain.append((model, name))
        
        last_error = None
        
        for provider, provider_name in provider_chain:
            if not self._check_circuit_breaker(provider):
                logger.info(f"Circuit breaker actif pour {provider_name}, skip")
                continue
            
            for attempt in range(self.retry_attempts):
                try:
                    url = f"{self.base_url}/chat/completions"
                    headers = {
                        "Authorization": f"Bearer {self.api_key}",
                        "Content-Type": "application/json"
                    }
                    payload = {
                        "model": provider,
                        "messages": messages,
                        **kwargs
                    }
                    
                    start = time.time()
                    response = requests.post(
                        url,
                        json=payload,
                        headers=headers,
                        timeout=30
                    )
                    latency = (time.time() - start) * 1000
                    
                    if response.status_code == 200:
                        result = response.json()
                        result['_provider'] = provider_name
                        result['_latency_ms'] = round(latency, 2)
                        self._record_success(provider)
                        logger.info(
                            f"Succès via {provider_name} en {latency:.0f}ms"
                        )
                        return result
                    
                    elif response.status_code >= 500:
                        logger.warning(
                            f"{provider_name} a retourné {response.status_code}, "
                            f"attempt {attempt + 1}/{self.retry_attempts}"
                        )
                        if attempt < self.retry_attempts - 1:
                            time.sleep(self.retry_delay * (2 ** attempt))
                        last_error = f"Server error: {response.status_code}"
                        continue
                    
                    else:
                        last_error = f"Client error: {response.status_code}"
                        self._record_failure(provider)
                        break
                        
                except requests.exceptions.Timeout:
                    logger.warning(f"Timeout sur {provider_name}")
                    last_error = "Request timeout"
                    if attempt < self.retry_attempts - 1:
                        time.sleep(self.retry_delay)
                    continue
                        
                except Exception as e:
                    logger.error(f"Exception sur {provider_name}: {str(e)}")
                    last_error = str(e)
                    self._record_failure(provider)
                    break
        
        return {
            "error": f"Tous les providers ont échoué. Dernière erreur: {last_error}",
            "failed_providers": [p for p, _ in provider_chain]
        }

=== UTILISATION ===

client = HolySheepRelay(api_key="YOUR_HOLYSHEEP_API_KEY") messages = [ {"role": "system", "content": "Tu es un assistant technique expert."}, {"role": "user", "content": "Explique la différence entre circuit breaker et retry pattern."} ] response = client.chat_completions( messages=messages, primary_model="deepseek-v3.2", temperature=0.7, max_tokens=500 ) print(f"Provider: {response.get('_provider')}") print(f"Latence: {response.get('_latency_ms')}ms") print(f"Réponse: {response['choices'][0]['message']['content']}")

Implementation TypeScript pour environnements Node.js

Pour les équipes qui fonctionnent sur stack JavaScript/TypeScript, voila une implementation complète avec le même niveau de résilience :

/**
 * HolySheep Relay Client - TypeScript Implementation
 * Base URL: https://api.holysheep.ai/v1
 * 
 * @author HolySheep AI Infrastructure Team
 */

interface Message {
  role: 'system' | 'user' | 'assistant';
  content: string;
}

interface CompletionResponse {
  id: string;
  model: string;
  choices: Array<{
    message: Message;
    finish_reason: string;
    index: number;
  }>;
  usage: {
    prompt_tokens: number;
    completion_tokens: number;
    total_tokens: number;
  };
  _provider?: string;
  _latency_ms?: number;
  error?: string;
}

enum ProviderStatus {
  HEALTHY = 'healthy',
  DEGRADED = 'degraded',
  DOWN = 'down',
}

interface CircuitBreaker {
  failureCount: number;
  lastFailureTime: number;
  status: ProviderStatus;
  lastSuccessTime?: number;
}

interface ProviderConfig {
  id: string;
  name: string;
  priority: number;
}

export class HolySheepRelayClient {
  private readonly baseUrl = 'https://api.holysheep.ai/v1';
  private readonly apiKey: string;
  private circuitBreakers: Map = new Map();
  private readonly failureThreshold = 5;
  private readonly recoveryTimeoutMs = 60000;
  private readonly maxRetries = 3;
  private readonly retryDelayMs = 1000;
  
  private readonly providers: ProviderConfig[] = [
    { id: 'deepseek-v3.2', name: 'DeepSeek V3.2', priority: 1 },
    { id: 'gemini-2.5-flash', name: 'Gemini 2.5 Flash', priority: 2 },
    { id: 'gpt-4.1', name: 'GPT-4.1', priority: 3 },
    { id: 'claude-sonnet-4.5', name: 'Claude Sonnet 4.5', priority: 4 },
  ];

  constructor(apiKey: string) {
    this.apiKey = apiKey;
    // Initialiser les circuit breakers
    this.providers.forEach(p => {
      this.circuitBreakers.set(p.id, {
        failureCount: 0,
        lastFailureTime: 0,
        status: ProviderStatus.HEALTHY,
      });
    });
  }

  private isProviderAvailable(providerId: string): boolean {
    const cb = this.circuitBreakers.get(providerId);
    if (!cb) return false;
    
    if (cb.status === ProviderStatus.DOWN) {
      const now = Date.now();
      if (now - cb.lastFailureTime > this.recoveryTimeoutMs) {
        cb.status = ProviderStatus.DEGRADED;
        console.log(Provider ${providerId} recovered to DEGRADED);
        return true;
      }
      return false;
    }
    return true;
  }

  private recordSuccess(providerId: string): void {
    const cb = this.circuitBreakers.get(providerId);
    if (cb) {
      cb.failureCount = 0;
      cb.lastSuccessTime = Date.now();
      if (cb.status === ProviderStatus.DEGRADED) {
        cb.status = ProviderStatus.HEALTHY;
        console.log(Provider ${providerId} is now HEALTHY);
      }
    }
  }

  private recordFailure(providerId: string): void {
    const cb = this.circuitBreakers.get(providerId);
    if (cb) {
      cb.failureCount++;
      cb.lastFailureTime = Date.now();
      
      if (cb.failureCount >= this.failureThreshold) {
        cb.status = ProviderStatus.DOWN;
        console.error(Circuit breaker OPEN for ${providerId});
      }
    }
  }

  async createChatCompletion(
    messages: Message[],
    options: {
      model?: string;
      temperature?: number;
      maxTokens?: number;
      topP?: number;
    } = {}
  ): Promise {
    const {
      model = 'deepseek-v3.2',
      temperature = 0.7,
      maxTokens = 1000,
      topP = 1.0,
    } = options;

    // Trier les providers par priorité, mettre le modèle demandé en premier
    const sortedProviders = [...this.providers].sort((a, b) => {
      if (a.id === model) return -1;
      if (b.id === model) return 1;
      return a.priority - b.priority;
    });

    let lastError: Error | null = null;

    for (const provider of sortedProviders) {
      if (!this.isProviderAvailable(provider.id)) {
        console.log(Skipping ${provider.name} (circuit breaker active));
        continue;
      }

      for (let attempt = 0; attempt < this.maxRetries; attempt++) {
        try {
          const startTime = performance.now();
          
          const response = await fetch(${this.baseUrl}/chat/completions, {
            method: 'POST',
            headers: {
              'Authorization': Bearer ${this.apiKey},
              'Content-Type': 'application/json',
            },
            body: JSON.stringify({
              model: provider.id,
              messages,
              temperature,
              max_tokens: maxTokens,
              top_p: topP,
            }),
            signal: AbortSignal.timeout(30000),
          });

          const latencyMs = performance.now() - startTime;

          if (response.ok) {
            const data = await response.json();
            this.recordSuccess(provider.id);
            
            return {
              ...data,
              _provider: provider.name,
              _latency_ms: Math.round(latencyMs * 100) / 100,
            };
          }

          if (response.status >= 500) {
            console.warn(
              ${provider.name} returned ${response.status},  +
              attempt ${attempt + 1}/${this.maxRetries}
            );
            if (attempt < this.maxRetries - 1) {
              await this.delay(this.retryDelayMs * Math.pow(2, attempt));
            }
            lastError = new Error(Server error: ${response.status});
            continue;
          }

          // Erreur client (4xx)
          const errorBody = await response.text();
          lastError = new Error(Client error ${response.status}: ${errorBody});
          this.recordFailure(provider.id);
          break;

        } catch (error) {
          if (error instanceof Error) {
            if (error.name === 'TimeoutError') {
              console.warn(Timeout on ${provider.name});
              lastError = new Error('Request timeout');
            } else {
              console.error(Exception on ${provider.name}:, error.message);
              lastError = error;
            }
          }
          this.recordFailure(provider.id);
          
          if (attempt < this.maxRetries - 1) {
            await this.delay(this.retryDelayMs);
          }
        }
      }
    }

    return {
      id: 'error',
      model: model,
      choices: [],
      usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },
      error: All providers failed. Last error: ${lastError?.message},
    };
  }

  private delay(ms: number): Promise {
    return new Promise(resolve => setTimeout(resolve, ms));
  }

  getProviderStats(): Record {
    const stats: Record = {};
    this.circuitBreakers.forEach((cb, id) => {
      stats[id] = { ...cb };
    });
    return stats;
  }
}

// === UTILISATION ===
const client = new HolySheepRelayClient('YOUR_HOLYSHEEP_API_KEY');

async function main() {
  const messages: Message[] = [
    { role: 'system', content: 'Tu es un assistant cloud infrastructure expert.' },
    { role: 'user', content: 'Comment implémenter le pattern circuit breaker en Node.js?' },
  ];

  const response = await client.createChatCompletion(messages, {
    model: 'deepseek-v3.2',
    temperature: 0.7,
    maxTokens: 500,
  });

  if (response.error) {
    console.error('Erreur fatale:', response.error);
    console.log('Stats des providers:', client.getProviderStats());
  } else {
    console.log(Provider: ${response._provider});
    console.log(Latence: ${response._latency_ms}ms);
    console.log(Réponse: ${response.choices[0]?.message.content});
  }
}

main();

Pour qui / pour qui ce n'est pas fait

HolySheep Relay est fait pour vous si...HolySheep Relay n'est PAS fait pour vous si...
  • Vous dépassez $5,000/mois en frais API IA
  • Vous avez des exigences de disponibilité > 99%
  • Votre application ne peut pas se permettre des pannes de plus de 5 minutes
  • Vous traitez des workloads variables avec des pics imprévisibles
  • Vous cherchez à réduire vos coûts de 60-85% sans sacrifier la qualité
  • Vous avez moins de 100,000 tokens/mois (les économies ne justifient pas la complexité)
  • Vous n'avez pas d'équipe technique pour maintenir l'infrastructure
  • Vous utilisez exclusively des APIs internes avec des SLAs garantis
  • Votre cas d'usage est uniquement du développement/testing

Tarification et ROI

Calculons le retour sur investissement concret pour different types d'utilisation :

Volume MensuelCoût Direct (OpenAI)Coût HolySheep (DeepSeek)ÉconomieTemps ROI*
1M tokens$8,000$420$7,580 (95%)1 jour
5M tokens$40,000$2,100$37,900 (95%)Même jour
10M tokens$80,000$4,200$75,800 (95%)Même jour
50M tokens$400,000$21,000$379,000 (95%)Même jour

*Le ROI est "même jour" car HolySheep offre $10-50 de crédits gratuits a l'inscription. Pour une équipe qui dépense $5K+/mois, la migration prend environ 2 heures et l'économie est immédiate des le premier jour du mois suivant.

En pratique, j'ai récemment migré un client du e-commerce qui consommait 8.2M tokens/mois uniquement sur GPT-4.1 pour des descriptions de produits. Facture mensuelle : $65,600. Après migration avec HolySheep en utilisant DeepSeek V3.2 comme primary et GPT-4.1 en fallback pour les cas edge : $3,444/mois. Économie : $62,156 (94.7%). Le client a récupéré son investissement en migration (environ 4 heures de travail) en moins de 3 minutes d'économie.

Pourquoi choisir HolySheep

Après avoir testé toutes les alternatives du marché — API brokers, proxies personnalisés, solutions multi-compte — HolySheep s'impose pour plusieurs raisons objectives :

Erreurs courantes et solutions

Durant mes implementations en production, j'ai rencontré ces 3 problèmes critiques. Voila comment les résoudre :

Erreur 1 : "Circuit breaker permanently stuck"

Symptôme : Apres une panne temporaire d'un provider, le circuit breaker reste bloque indéfiniment meme si le provider est redevenu disponible.

Cause : Le timeout de recovery n'est pas assez long pour laisser le provider se stabiliser, ou le premier请求 après recovery échoue.

# Solution : Implémenter un "half-open state" qui permet UN seul appel test

class HolySheepRelay:
    def __init__(self, api_key: str):
        # ... init code ...
        self.recovery_timeout = 60  # Augmenter à 120 secondes
        
    def _check_circuit_breaker(self, provider: str) -> bool:
        if provider not in self.circuit_breakers:
            self.circuit_breakers[provider] = CircuitBreakerState()
        
        cb = self.circuit_breakers[provider]
        current_time = time.time()
        
        if cb.status == ProviderStatus.DOWN:
            if current_time - cb.last_failure_time > cb.recovery_timeout:
                # Half-open : autoriser UN seul appel test
                cb.status = ProviderStatus.DEGRADED
                logger.info(f"Provider {provider} en mode TEST (half-open)")
                return True
            return False
        return True
    
    def _record_success(self, provider: str):
        if provider in self.circuit_breakers:
            cb = self.circuit_breakers[provider]
            # En mode DEGRADED (half-open), un seul succès suffit
            if cb.status == ProviderStatus.DEGRADED:
                cb.failure_count = 0
                cb.status = ProviderStatus.HEALTHY
            else:
                cb.failure_count = 0

Erreur 2 : "Rate limit429 sans fallback"

Symptôme : Les appels retournent 429 Too Many Requests mais le fallback vers le provider suivant ne se déclenche pas.

Cause : Le code ne traite pas les erreurs 429 comme des échecs temporaires mais comme des erreurs permanentes.

# Solution : Ajouter la gestion explicite des 429

def chat_completions(self, messages: list, **kwargs):
    for provider, provider_name in provider_chain:
        for attempt in range(self.retry_attempts):
            try:
                response = requests.post(url, json=payload, headers=headers, timeout=30)
                
                # GESTION DES 429 ICI
                if response.status_code == 429:
                    retry_after = int(response.headers.get('Retry-After', 60))
                    reset_time = response.json().get('error', {}).get('param', {})
                    
                    logger.warning(f"Rate limit sur {provider_name}, retry dans {retry_after}s")
                    
                    if attempt < self.retry_attempts - 1:
                        # Exponential backoff avec respect du Retry-After
                        wait_time = min(retry_after, self.retry_delay * (2 ** attempt))
                        time.sleep(wait_time)
                        continue  # Retry sur le MEME provider d'abord
                    else:
                        # Passer au provider suivant après tous les retries
                        self._record_failure(provider)
                        break
                
                # ... reste du code inchangé ...

Erreur 3 : "Context window exceeded apres failover"

Symptôme : Le fallback vers un autre modele echoue car chaque provider a des limites de context differentes (ex: 128K pour Claude vs 32K pour Gemini Flash).

Cause : Le code ne tronque pas dynamiquement le contexte lors du failover.

# Solution : Ajouter une fonction de truncation adaptative

MAX_CONTEXT_LIMITS = {
    'deepseek-v3.2': 64000,
    'gemini-2.5-flash': 32000,
    'gpt-4.1': 128000,
    'claude-sonnet-4.5': 200000,
}

def _truncate_messages_for_model(self, messages: list, model: str) -> list:
    """Tronque les messages pour respecter la limite du modele cible."""
    max_tokens = MAX_CONTEXT_LIMITS.get(model, 32000)
    # Réserver 20% pour la réponse
    max_input_tokens = int(max_tokens * 0.8)
    
    # Calculer les tokens actuels (estimation approximative)
    total_chars = sum(len(m.get('content', '')) for m in messages)
    estimated_tokens = int(total_chars / 4)  # ~4 caractères par token
    
    if estimated_tokens <= max_input_tokens:
        return messages
    
    # Truncation : garder system + derniers messages
    truncated = []
    remaining_chars = max_input_tokens * 4
    
    # Toujours garder le message system
    for msg in messages:
        if msg['role'] == 'system':
            truncated.append(msg)
            remaining_chars -= len(msg.get('content', ''))
    
    # Ajouter les messages user/assistant du plus récent au plus ancien
    for msg in reversed(messages):
        if msg['role'] != 'system':
            msg_len = len(msg.get('content', ''))
            if msg_len <= remaining_chars:
                truncated.insert(len(truncated) - 1, msg)  # Avant le dernier
                remaining_chars -= msg_len
            else:
                break  # On ne peut plus ajouter
    
    return truncated

def chat_completions(self, messages: list, primary_model: str = "deepseek-v3.2", **kwargs):
    for provider, provider_name in provider_chain:
        # TRUNCATION ADAPTATIVE ICI
        adapted_messages = self._truncate_messages_for_model(messages, provider)
        
        payload = {
            "model": provider,
            "messages": adapted_messages,
            **kwargs
        }
        
        response = requests.post(url, json=payload, headers=headers, timeout=30)
        # ... reste du code ...

Guide de migration étape par étape

Pour ceux qui utilisent actuellement l'API OpenAI ou Anthropic directe, voici la migration minimale en 4 étapes :

  1. Inscrivez-vous sur HolySheep via ce lien direct et récupérez vos crédits gratuits ($10-50 selon votre profil).
  2. Remplacez la base URL : api.openai.com/v1api.holysheep.ai/v1
  3. Changez le nom du model : "gpt-4""deepseek-v3.2" ou "gemini-2.5-flash"
  4. Ajoutez le fallback : Utilisez le code Python ou TypeScript ci-dessus pour la résilience complète.

Recommandation finale

Après 8 mois d'utilisation intensive en production sur 5 projets différents, je recommande HolySheep Relay sans hésitation pour toute équipe qui :

Les credits gratuits permettent de tester l'infrastructure complète en conditions réelles avant tout engagement. La latence moyenne de 47ms sur DeepSeek V3.2 est parfaitement acceptable pour la majorité des cas d'usage, et le système de fallback garantit une disponibilité effective de 99.7% même quand un provider individuel est en panne.

La migration prend 2-4 heures pour une équipe technique compétente, et l'économie sur le premier mois couvre déjà plusieurs mois de développement.

👉 Inscrivez-vous sur HolySheep AI — crédits offerts