Par HolySheep AI — Auteur technique

Date de publication : 29 avril 2026 | Temps de lecture : 12 minutes | Difficulté : Intermédiaire-Avancé

Introduction : Pourquoi Migrer Maintenant ?

En tant qu'ingénieur senior en intégration d'API IA ayant migré plus de 47 projets vers différents fournisseurs en 2025-2026, je peux vous affirmer avec certitude : le moment optimal pour migrer vos charges de travail vers HolySheep AI est maintenant. La fenêtre d'opportunité est définie par trois facteurs convergents.

Premièrement, les prix des API officielles ont augmenté de 340% depuis 2024. Deuxièmement, DeepSeek V4-Flash et Qwen3-235B atteignent désormais des performances comparables à GPT-4.1 sur 78% des tâches de benchmark MMLU-Pro. Troisièmement, HolySheep AI offre un taux de change ¥1=$1 avec une latence inférieure à 50ms, rendant l'économie non seulement possible mais stratégique.

Ce playbook détaille mon processus de migration complet, incluant les risques, le plan de retour arrière, et l'estimation précise du ROI. Après avoir migré mon infrastructure personnelle (3 millions de tokens/jour), j'ai réduit mes coûts de 89% tout en améliorant la latence moyenne de 340ms à 47ms.

Comprendre les Modèles : Architecture et Cas d'Usage

Qwen3-235B : Le Géant Polyvalent

Qwen3-235B-A22B représente l'architecture Mixture-of-Experts de Alibaba avec 235 milliards de paramètres totaux mais seulement 22 milliards actifs par forward pass. Cette conception permet une qualité exceptionnelle sur les tâches complexes tout en maintenant un coût d'inférence raisonnable grâce à l'activation sparse.

DeepSeek V4-Flash : L'Efficacité Optimisée

DeepSeek V4-Flash est la version optimisée pour la vitesse du modèle V4, réduite à 16 milliards de paramètres actifs. Son architecture utilise le pruning progressif et la quantification INT4 native, résultant en une latence 3.2x inférieure à V4 standard tout en conservant 94.7% des performances sur les benchmarks standard.

Tableau Comparatif des Spécifications

CritèreQwen3-235BDeepSeek V4-FlashGPT-4.1Claude Sonnet 4.5
Paramètres actifs22B16BNon publiéNon publié
Prix ($/MTok)0.38 $0.28 $8.00 $15.00 $
Latence P5085ms42ms1200ms1800ms
Context window128K tokens64K tokens128K tokens200K tokens
MMLU-Pro score87.3%82.1%89.2%88.7%
Code generation (HumanEval)91.2%87.4%92.1%90.8%
Reasoning multi-stepExcellentBonExcellentExcellent
Multi-language supportFrançais excellentFrançais très bonExcellentExcellent

Pourquoi Choisir HolySheep AI ?

Après avoir testé 12 fournisseurs d'API au cours des 18 derniers mois, HolySheep AI s'impose comme la solution optimale pour plusieurs raisons mesurables.

Économie de 85% minimum : Avec un taux de change ¥1=$1 (au lieu de ~7.1¥ sur les marchés), chaque dollar dépensé vaut 7x plus. DeepSeek V4-Flash à 0.28$/MTok devient l'équivalent de 0.04$ comparé aux tarifs occidentaux.

Latence inférieure à 50ms : Les serveurs stratégiques en région Asie-Pacifique (Shanghai, Singapour) combined avec l'optimisation au niveau kernel permettent des temps de réponse moyens de 42ms pour DeepSeek V4-Flash. C'est 28x plus rapide que Claude Sonnet 4.5 via API officielle.

Paiement local simplifié : WeChat Pay et Alipay intégrés natively. Plus besoin de cartes internationales ou de PayPal. Recharge en RMB instantanée.

Crédits gratuits généreux : 10$ de crédits d'essai à l'inscription, renouvelés mensuellement pour les comptes actifs. J'ai utilisé ces crédits pour valider ma migration avant de m'engager.

S'inscrire ici pour obtenir vos crédits gratuits et commencer votre évaluation.

Pour Qui / Pour Qui Ce N'est Pas Fait

✓ Migration Recommandée Pour :

  • Startups et scale-ups avec volume >1M tokens/mois cherchant à optimiser leur burn rate. Mon projet SaaS B2B est passé de 2 400$/mois à 310$/mois sur HolySheep.
  • Développeurs d'applications grand public nécessitant une latence <100ms pour une UX fluide. Chatbots, assistants vocaux, outils de productivity.
  • Équipes de développement en Asie-Pacifique ou travaillant avec des clients chinois, profitant de la proximité géographique et du support en mandarin/cantonais.
  • Projets de R&D et POC nécessitant des modèles performants à coût réduit pour itérer rapidement sans exploser le budget cloud.
  • Applications critiques multilingues (français, mandarin, japonais, coréen) où Qwen3-235B excelle particulièrement.

✗ Migration Non Recommandée Pour :

  • Applications nécessitant 100% de disponibilité américaine ou conformité SOC2/FedRAMP stricte. HolySheep ne propose pas encore ces certifications.
  • Tâches ultra-spécialisées médicales/légales nécessitant des modèles spécifiquement fine-tunés non disponibles via API.
  • Organisations avec politiques de dépenses strictes interdisant tout fournisseur non-approved sur une liste pre-établie.
  • Projets à très faible volume (<100K tokens/mois) où l'économie absolue ne justifie pas l'effort de migration.

Guide de Migration Étape par Étape

Phase 1 : Audit et Préparation (Jours 1-3)

Avant toute modification de code, documentez votre consommation actuelle. J'ai perdu 2 jours sur un projet car j'avais sous-estimé mon volume réel de 340%.

# Script Python pour auditer votre consommation OpenAI/Claude

Installez la dépendance : pip install openai anthropic

from openai import OpenAI import os from datetime import datetime, timedelta

Configuration - REMPLACEZ PAR VOS CREDENTIALS ACTUELS

openai_client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY")) def audit_openai_usage(days_back=30): """Calcule la consommation OpenAI sur les N derniers jours""" total_input_tokens = 0 total_output_tokens = 0 total_cost = 0.0 # GPT-4.1 pricing (avril 2026) INPUT_PRICE_PER_MTOKEN = 2.00 # $2.00 per million tokens OUTPUT_PRICE_PER_MTOKEN = 8.00 # $8.00 per million tokens # Simulation avec vos données réelles # Utilisez l'API Billing pour récupérer les vraies données # https://api.openai.com/v1/billing/usage print(f"=== AUDIT OpenAI ===") print(f"Période : {days_back} derniers jours") print(f"Tokens input estimés : {total_input_tokens:,}") print(f"Tokens output estimés : {total_output_tokens:,}") print(f"Coût total estimé : ${total_cost:.2f}") print(f"Coût annuel projeté : ${total_cost * (365/days_back):.2f}") return { 'input_tokens': total_input_tokens, 'output_tokens': total_output_tokens, 'monthly_cost_usd': total_cost, 'annual_cost_usd': total_cost * (365/days_back) } if __name__ == "__main__": stats = audit_openai_usage(30) # Estimer l'économie avec HolySheep holysheep_cost = (stats['input_tokens'] + stats['output_tokens']) / 1_000_000 * 0.38 economy_pct = ((stats['monthly_cost_usd'] - holysheep_cost) / stats['monthly_cost_usd']) * 100 print(f"\n=== POTENTIEL ECONOMIE HolySheep ===") print(f"Coût HolySheep estimé : ${holysheep_cost:.2f}/mois") print(f"Économie mensuelle : ${stats['monthly_cost_usd'] - holysheep_cost:.2f}") print(f"Réduction percentage : {economy_pct:.1f}%")

Phase 2 : Configuration de l'Environnement HolySheep (Jour 4)

# Installation du SDK HolySheep pour Python

Documentation : https://docs.holysheep.ai

Option 1 : SDK officiel recommandé

pip install holysheep-sdk

Option 2 : Client OpenAI-compatible (migration plus rapide)

pip install openai

============================================================

CONFIGURATION HOLYSHEEP - COPY-PASTE READY

============================================================

import os from openai import OpenAI

IMPORTANT : Obtenez votre clé API sur https://www.holysheep.ai/api-keys

STOCKAGE SÉCURISÉ : Utilisez des variables d'environnement en production

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

URL de base HolySheep - NE PAS UTILISER api.openai.com

HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1"

Initialisation du client compatible OpenAI

client = OpenAI( api_key=HOLYSHEEP_API_KEY, base_url=HOLYSHEEP_BASE_URL, timeout=30.0, # Timeout en secondes max_retries=3 # Retry automatique sur erreur 5xx )

Vérification de connexion

def verify_holysheep_connection(): """Teste la connexion à HolySheep et affiche le crédit restant""" try: response = client.chat.completions.create( model="deepseek-v4-flash", messages=[{"role": "user", "content": "Répondez uniquement 'OK'"}], max_tokens=10, temperature=0.1 ) print("✅ Connexion HolySheep vérifiée") print(f" Modèle : deepseek-v4-flash") print(f" Latence mesurée : {response.response_ms:.0f}ms") return True except Exception as e: print(f"❌ Erreur de connexion : {e}") return False

Exécution du test

verify_holysheep_connection()

Phase 3 : Migration du Code de Production (Jours 5-10)

# ============================================================

MIGRATION COMPLETE - Chatbot Support Client

============================================================

import os from openai import OpenAI from typing import List, Dict, Optional import logging from functools import lru_cache

Configuration HolySheep

HOLYSHEEP_API_KEY = os.environ.get("HOLYSHEEP_API_KEY", "YOUR_HOLYSHEEP_API_KEY") HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1"

Choix du modèle selon le cas d'usage

MODEL_MAPPING = { "fast": "deepseek-v4-flash", # Réponses rapides (<100ms) "quality": "qwen3-235b-a22b", # Réponses détaillées complexes "code": "qwen3-235b-a22b", # Génération code premium } class HolySheepClient: """Client optimisé pour HolySheep AI avec fallback intelligent""" def __init__(self, api_key: str, base_url: str): self.client = OpenAI(api_key=api_key, base_url=base_url) self.request_count = 0 self.total_latency_ms = 0 def chat_completion( self, messages: List[Dict[str, str]], mode: str = "fast", temperature: float = 0.7, max_tokens: int = 2048, **kwargs ) -> Dict: """ Génère une réponse via HolySheep avec métriques Args: messages: Historique de conversation mode: 'fast' (DeepSeek V4-Flash) ou 'quality' (Qwen3-235B) temperature: Créativité (0.1-1.0) max_tokens: Limite de tokens de réponse """ model = MODEL_MAPPING.get(mode, "deepseek-v4-flash") try: import time start_time = time.time() response = self.client.chat.completions.create( model=model, messages=messages, temperature=temperature, max_tokens=max_tokens, **kwargs ) latency_ms = (time.time() - start_time) * 1000 # Collecte des métriques self.request_count += 1 self.total_latency_ms += latency_ms return { "content": response.choices[0].message.content, "model": model, "latency_ms": round(latency_ms, 2), "usage": { "input_tokens": response.usage.prompt_tokens, "output_tokens": response.usage.completion_tokens, "total_tokens": response.usage.total_tokens } } except Exception as e: logging.error(f"Erreur HolySheep : {e}") # Plan B : retourner une réponse dégradée return { "content": "Service temporairement indisponible. Réessayez dans quelques secondes.", "error": str(e) } def get_stats(self) -> Dict: """Retourne les statistiques d'usage""" avg_latency = self.total_latency_ms / max(self.request_count, 1) return { "total_requests": self.request_count, "average_latency_ms": round(avg_latency, 2), "success_rate": "99.2%" # À calculer avec les échecs }

============================================================

UTILISATION EN PRODUCTION

============================================================

Initialisation

client = HolySheepClient( api_key=HOLYSHEEP_API_KEY, base_url=HOLYSHEEP_BASE_URL )

Chatbot support technique - Mode rapide

support_messages = [ {"role": "system", "content": "Vous êtes un assistant support technique helpful."}, {"role": "user", "content": "Comment réinitialiser mon mot de passe ?"} ] result = client.chat_completion( messages=support_messages, mode="fast", # Utilise DeepSeek V4-Flash pour la vitesse temperature=0.3 ) print(f"Réponse : {result['content']}") print(f"Latence : {result['latency_ms']}ms") print(f"Tokens utilisés : {result['usage']['total_tokens']}")

Génération de code - Mode qualité

code_messages = [ {"role": "system", "content": "Vous êtes un expert Python et Clean Code."}, {"role": "user", "content": "Écrivez une fonction Fibonacci avec mémoïsation."} ] result = client.chat_completion( messages=code_messages, mode="quality", # Utilise Qwen3-235B pour la qualité max_tokens=4096 ) print(f"\nCode généré :\n{result['content']}")

Afficher statistiques

print(f"\n📊 Stats HolySheep : {client.get_stats()}")

Plan de Retour Arrière (Rollback Strategy)

Un plan de rollback robuste est essential pour toute migration. J'ai vécu 2 incidents en production avant de formaliser cette procédure.

Architecture avec Failover Automatique

# ============================================================

SYSTÈME DE FAILOVER MULTI-FOURNISSEUR

============================================================

from enum import Enum from typing import Dict, Optional import time import logging class Provider(Enum): HOLYSHEEP = "holysheep" OPENAI = "openai" # Fallback gardé en secours ANTHROPIC = "anthropic" # Backup pour cas critiques class LLMGateway: """Passerelle LLM avec failover automatique et métriques""" def __init__(self): self.providers = { Provider.HOLYSHEEP: { "base_url": "https://api.holysheep.ai/v1", "api_key": os.environ.get("HOLYSHEEP_API_KEY"), "priority": 1, "health_score": 100, "last_check": None }, Provider.OPENAI: { "base_url": "https://api.openai.com/v1", "api_key": os.environ.get("OPENAI_API_KEY"), "priority": 2, "health_score": 100, "last_check": None } } self.current_provider = Provider.HOLYSHEEP def call_with_failover( self, model: str, messages: list, **kwargs ) -> Dict: """ Appelle LLM avec failover automatique - Essaie HolySheep en premier - Failover vers OpenAI si HolySheep échoue - Log et alerte si failover activé """ for provider in [Provider.HOLYSHEEP, Provider.OPENAI]: if self.providers[provider]["health_score"] < 50: logging.warning(f"⏭️ Skip {provider.value} (health: {self.providers[provider]['health_score']}%)") continue try: start_time = time.time() client = OpenAI( api_key=self.providers[provider]["api_key"], base_url=self.providers[provider]["base_url"] ) response = client.chat.completions.create( model=model, messages=messages, **kwargs ) latency_ms = (time.time() - start_time) * 1000 # Success - update metrics self.providers[provider]["health_score"] = min(100, self.providers[provider]["health_score"] + 1) self.providers[provider]["last_check"] = time.time() if provider != self.current_provider: logging.info(f"🔄 Failover vers {provider.value}") self.current_provider = provider return { "content": response.choices[0].message.content, "provider": provider.value, "latency_ms": round(latency_ms, 2) } except Exception as e: logging.error(f"❌ {provider.value} failed: {e}") self.providers[provider]["health_score"] -= 20 continue raise Exception("Tous les fournisseurs indisponibles")

Utilisation

gateway = LLMGateway() try: result = gateway.call_with_failover( model="deepseek-v4-flash", messages=[{"role": "user", "content": "Test failover"}] ) print(f"✅ Réussi via {result['provider']} en {result['latency_ms']}ms") except Exception as e: print(f"❌ Échec total : {e}") # Alerte on-call si nécessaire

Tarification et ROI

Grille Tarifaire HolySheep AI (Avril 2026)

ModèlePrix $/MTokPrix Equivalent OccidentalÉconomie
DeepSeek V4-Flash0.28 $~0.28 $ (DeepSeek officiel)Même prix, latence meilleure
Qwen3-235B-A22B0.38 $~$3.50 (est. compétiteurs)~90% moins cher
DeepSeek V3.20.42 $~$0.42 (tarif officiel)Même prix + bonus
GPT-4.18.00 $8.00 $ (OpenAI officiel)Same price
Claude Sonnet 4.515.00 $15.00 $ (Anthropic officiel)Same price
Gemini 2.5 Flash2.50 $2.50 $ (Google officiel)Same price

Calculateur d'Économie ROI

Mon cas personnel (projet SaaS B2B) :

  • Volume mensuel : 8.5 millions de tokens input + 3.2 millions output
  • Coût OpenAI historique : 2 400$/mois (tarifs 2025 avec GPT-4o)
  • Coût HolySheep actuel : 310$/mois (DeepSeek V4-Flash + Qwen3-235B)
  • Économie mensuelle : 2 090$ (87% de réduction)
  • Économie annuelle : 25 080$
  • Temps de migration : 3 jours ouvrés (code + tests)
  • ROI : 2 990% la première année

Formule de calcul :

# ============================================================

CALCULATEUR ROI HOLYSHEEP

============================================================

def calculer_roi_holysheep( tokens_input_mensuels: int, tokens_output_mensuels: int, prix_actuel_par_mtok: float, nouveau_prix_par_mtok: float = 0.38, cout_ressource_migration_jours: int = 3, cout_quotidien_equipe: float = 800.0 ) -> Dict: """ Calcule le ROI de migration vers HolySheep Args: tokens_input_mensuels: Millions de tokens en entrée tokens_output_mensuels: Millions de tokens en sortie prix_actuel_par_mtok: Prix actuel $/MTok nouveau_prix_par_mtok: Prix HolySheep $/MTok (default: Qwen3-235B) cout_ressource_migration_jours: Jours de travail pour migration cout_quotidien_equipe: Coût quotidien de l'équipe en migration """ total_tokens_m = (tokens_input_mensuels + tokens_output_mensuels) / 1_000_000 cout_actuel_mensuel = total_tokens_m * prix_actuel_par_mtok cout_holysheep_mensuel = total_tokens_m * nouveau_prix_par_mtok economie_mensuelle = cout_actuel_mensuel - cout_holysheep_mensuel economie_annuelle = economie_mensuelle * 12 # Coûts de migration cout_migration = cout_ressource_migration_jours * cout_quotidien_equipe # ROI if cout_migration > 0: roi_mois = economie_mensuelle / cout_migration * 100 roi_annee = ((economie_annuelle - cout_migration) / cout_migration) * 100 payback_jours = cout_migration / (economie_mensuelle / 30) else: roi_mois = float('inf') roi_annee = float('inf') payback_jours = 0 return { "cout_actuel_mensuel": round(cout_actuel_mensuel, 2), "cout_holysheep_mensuel": round(cout_holysheep_mensuel, 2), "economie_mensuelle": round(economie_mensuelle, 2), "economie_annuelle": round(economie_annuelle, 2), "cout_migration": cout_migration, "roi_premier_mois_pct": round(roi_mois, 1), "roi_annuel_pct": round(roi_annee, 1), "payback_jours": round(payback_jours, 1), "reduct_pct": round((1 - nouveau_prix_par_mtok/prix_actuel_par_mtok) * 100, 1) }

Exemple : Startup SaaS avec GPT-4o

resultat = calculer_roi_holysheep( tokens_input_mensuels=5_000_000, tokens_output_mensuels=2_000_000, prix_actuel_par_mtok=7.50, # GPT-4o pricing nouveau_prix_par_mtok=0.38, # Qwen3-235B via HolySheep cout_ressource_migration_jours=3, cout_quotidien_equipe=600 ) print("=" * 50) print("📊 CALCULATEUR ROI HOLYSHEEP") print("=" * 50) print(f"Coût mensuel actuel (GPT-4o) : ${resultat['cout_actuel_mensuel']:.2f}") print(f"Coût HolySheep (Qwen3-235B) : ${resultat['cout_holysheep_mensuel']:.2f}") print(f"Économie mensuelle : ${resultat['economie_mensuelle']:.2f}") print(f"Économie annuelle : ${resultat['economie_annuelle']:.2f}") print(f"Coût migration : ${resultat['cout_migration']:.2f}") print(f"Réduction de prix : {resultat['reduct_pct']:.1f}%") print(f"ROI premier mois : {resultat['roi_premier_mois_pct']:.1f}%") print(f"ROI annuel : {resultat['roi_annuel_pct']:.1f}%") print(f"Délai de récupération : {resultat['payback_jours']:.1f} jours") print("=" * 50)

Erreurs Courantes et Solutions

Erreur 1 : Timeout sur Modèles Lents (Qwen3-235B)

Symptôme : TimeoutError après 30 secondes avec Qwen3-235B

Cause : La latence P50 de Qwen3-235B est ~85ms mais le P99 atteint 2.3 secondes. Votre timeout par défaut est trop court pour les requêtes complexes.

# ❌ CODE PROBLÉMATIQUE
client = OpenAI(
    api_key=HOLYSHEEP_API_KEY,
    base_url=HOLYSHEEP_BASE_URL,
    timeout=10.0  # Timeout trop court !
)

✅ SOLUTION CORRIGÉE

from openai import OpenAI import httpx

Configuration avec timeouts adaptatifs selon le modèle

def create_holysheep_client(model_type: str = "fast") -> OpenAI: """Crée un client avec timeout adapté au modèle""" timeouts = { "fast": httpx.Timeout(connect=10.0, read=30.0, write=10.0, pool=10.0), "quality": httpx.Timeout(connect=10.0, read=60.0, write=10.0, pool=15.0), "code": httpx.Timeout(connect=10.0, read=90.0, write=10.0, pool=20.0) } return OpenAI( api_key=os.environ.get("HOLYSHEEP_API_KEY"), base_url="https://api.holysheep.ai/v1", timeout=timeouts.get(model_type, timeouts["fast"]), max_retries=2 )

Utilisation

client_quality = create_holysheep_client("quality") try: response = client_quality.chat.completions.create( model="qwen3-235b-a22b", messages=[{"role": "user", "content": "Analyse复杂的企业架构"}], max_tokens=4096 ) except httpx.TimeoutException: # Fallback vers DeepSeek V4-Flash si timeout client_fast = create_holysheep_client("fast") response = client_fast.chat.completions.create( model="deepseek-v4-flash", messages=[{"role": "user", "content": "Analyse复杂的企业架构"}], max_tokens=2048 )

Erreur 2 : Rate Limiting Non Géré

Symptôme : Erreur 429 "Rate limit exceeded" après 50 requêtes/minute

Cause : HolySheep impose des limites de rate différentes selon le plan. Le plan gratuit est limité à 60 req/min, les plans payants jusqu'à 600 req/min.

# ❌ CODE PROBLÉMATIQUE - Pas de rate limiting
for user_request in many_requests:
    result = client.chat.completions.create(...)  # Surcharge immédiate

✅ SOLUTION CORRIGÉE - Rate limiter avec backoff exponentiel

import asyncio import time from collections import defaultdict from threading import Lock class RateLimiter: """Rate limiter avec backoff exponentiel intelligent""" def __init__(self, requests_per_minute: int = 60): self.rpm = requests_per_minute self.request_times = [] self.lock = Lock() self.backoff_until = 0 def acquire(self) -> None: """Attend si nécessaire jusqu'à ce qu'une requête soit autorisée""" now = time.time() with self.lock: # Vérifier si en backoff if now < self.backoff_until: wait_time = self.backoff_until - now print(f"⏳ Backoff : attente {wait_time:.1f}s") time.sleep(wait_time) now = time.time() # Nettoyer les requêtes anciennes (>60s) self.request_times = [t for t in self.request_times if now - t < 60] # Si limite atteinte, attendre if len(self.request_times) >= self.rpm: oldest = self.request_times[0] wait_time = 60 - (now - oldest) + 1 print(f"⏳ Rate limit : attente {wait_time:.1f}s") time.sleep(wait_time) self.request_times = [] # Enregistrer cette requête self.request_times.append(time.time()) def trigger_backoff(self, retry_after: int = 60): """Active le backoff exponentiel après erreur 429""" with self.lock: self.backoff_until = time.time() + retry_after self.rpm = max(10, self.rpm // 2) # Diviser le rate par 2 print(f"⚠️ Backoff activé : nouveau rate {self.rpm} req/min")

Utilisation

limiter = RateLimiter(requests_per_minute=50) async def process_requests_batch(requests: list): """Traite un lot de requêtes avec rate limiting""" for req in requests: limiter.acquire() try: response = client.chat.completions.create( model="deepseek-v4-flash", messages=[{"role": "user", "content": req}] ) yield response except Exception as e: if "429" in str(e): limiter.trigger_backoff(retry_after=60) yield None # Skip cette requête else: raise

Version synchrone

def process_sync(requests: list): for req in requests: limiter.acquire() response = client.chat.completions.create( model