Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/aflo59_comparemodelpoc.json
T

1 line
22 KiB
JSON

{"repo": "aflo59/comparemodelpoc", "files": {".env.example": {"db22d3900cfbc5a5883673130c34b40d9ac9527b": {"t": 1785745160.3250022, "n": 2227, "h": "99bc6e27c2838a09", "c": "# ================================\n# CONFIGURATION API - DnD AI GameMaster\n# ================================\n\n# === OPENAI (Requis pour GPT-4/GPT-4o) ===\nOPENAI_API_KEY=sk-your-openai-api-key-here\n\n# === ALTERNATIVES (Recommandées pour éviter les erreurs de quota) ===\n# Ajoutez au moins une de ces clés pour avoir des alternatives quand OpenAI a des problèmes\nANTHROPIC_API_KEY=sk-ant-your-anthropic-api-key-here\nDEEPSEEK_API_KEY=your-deepseek-api-key-here\n\n# === NOUVELLE FONCTIONNALITÉ : BASCULEMENT AUTOMATIQUE ===\n# Bascule automatiquement vers un modèle alternatif si OpenAI a des problèmes de quota\n# Valeurs : true/false (par défaut: false)\nAI_AUTO_FALLBACK=true\n\n# === BASE DE DONNÉES ===\nDATABASE_PATH=database.db\n\n# === LOGGING ===\nLOG_LEVEL=INFO\n\n# === PORTRAITS (Optionnel) ===\n# Modèle primaire pour les portraits (par défaut: dall-e-3)\nPORTRAIT_PRIMARY_IMAGE_MODEL=dall-e-3\n# Modèle de fallback pour les portraits (par défaut: dall-e-2)\nPORTRAIT_FALLBACK_IMAGE_MODEL=dall-e-2\n\n# === DEEPSEEK CONFIGURATION (Optionnel) ===\n# URL de base pour l'API DeepSeek (par défaut: https://api.deepseek.com/v1)\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\n\n# ================================\n# NOTES IMPORTANTES\n# ================================\n# \n# 1. OPENAI_API_KEY est requis pour GPT-4 et GPT-4o\n# \n# 2. Ajoutez ANTHROPIC_API_KEY et/ou DEEPSEEK_API_KEY pour avoir des alternatives\n# économiques en cas de problème avec OpenAI\n# \n# 3. AI_AUTO_FALLBACK=true permet un basculement automatique vers un modèle\n# alternatif en cas d'erreur de quota OpenAI\n# \n# 4. Coûts approximatifs (par 1K tokens) :\n# - GPT-4 : $0.03 entrée, $0.06 sortie\n# - GPT-4o : $0.005 entrée, $0.015 sortie \n# - Claude 3.5 Sonnet : $0.003 entrée, $0.015 sortie\n# - DeepSeek : $0.0001 entrée, $0.0002 sortie (très économique!)\n# \n# 5. Pour obtenir vos clés API :\n# - OpenAI : https://platform.openai.com/api-keys\n# - Anthropic : https://console.anthropic.com/account/keys\n# - DeepSeek : https://platform.deepseek.com/api_keys\n#\n# ================================\n\n# === INFORMATIONS VPS (Optionnel, pour scripts de déploiement) ===\nIPv4=your-server-ip\nIPv6=your-server-ipv6\nNAME=your-username\nPASSWORD=your-new-password\n"}, "56543854cdeb84bfc062596e68ccc27f658681d6": {"t": 1785748304.8484278, "n": 2227, "h": "99bc6e27c2838a09", "c": "# ================================\n# CONFIGURATION API - DnD AI GameMaster\n# ================================\n\n# === OPENAI (Requis pour GPT-4/GPT-4o) ===\nOPENAI_API_KEY=sk-your-openai-api-key-here\n\n# === ALTERNATIVES (Recommandées pour éviter les erreurs de quota) ===\n# Ajoutez au moins une de ces clés pour avoir des alternatives quand OpenAI a des problèmes\nANTHROPIC_API_KEY=sk-ant-your-anthropic-api-key-here\nDEEPSEEK_API_KEY=your-deepseek-api-key-here\n\n# === NOUVELLE FONCTIONNALITÉ : BASCULEMENT AUTOMATIQUE ===\n# Bascule automatiquement vers un modèle alternatif si OpenAI a des problèmes de quota\n# Valeurs : true/false (par défaut: false)\nAI_AUTO_FALLBACK=true\n\n# === BASE DE DONNÉES ===\nDATABASE_PATH=database.db\n\n# === LOGGING ===\nLOG_LEVEL=INFO\n\n# === PORTRAITS (Optionnel) ===\n# Modèle primaire pour les portraits (par défaut: dall-e-3)\nPORTRAIT_PRIMARY_IMAGE_MODEL=dall-e-3\n# Modèle de fallback pour les portraits (par défaut: dall-e-2)\nPORTRAIT_FALLBACK_IMAGE_MODEL=dall-e-2\n\n# === DEEPSEEK CONFIGURATION (Optionnel) ===\n# URL de base pour l'API DeepSeek (par défaut: https://api.deepseek.com/v1)\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\n\n# ================================\n# NOTES IMPORTANTES\n# ================================\n# \n# 1. OPENAI_API_KEY est requis pour GPT-4 et GPT-4o\n# \n# 2. Ajoutez ANTHROPIC_API_KEY et/ou DEEPSEEK_API_KEY pour avoir des alternatives\n# économiques en cas de problème avec OpenAI\n# \n# 3. AI_AUTO_FALLBACK=true permet un basculement automatique vers un modèle\n# alternatif en cas d'erreur de quota OpenAI\n# \n# 4. Coûts approximatifs (par 1K tokens) :\n# - GPT-4 : $0.03 entrée, $0.06 sortie\n# - GPT-4o : $0.005 entrée, $0.015 sortie \n# - Claude 3.5 Sonnet : $0.003 entrée, $0.015 sortie\n# - DeepSeek : $0.0001 entrée, $0.0002 sortie (très économique!)\n# \n# 5. Pour obtenir vos clés API :\n# - OpenAI : https://platform.openai.com/api-keys\n# - Anthropic : https://console.anthropic.com/account/keys\n# - DeepSeek : https://platform.deepseek.com/api_keys\n#\n# ================================\n\n# === INFORMATIONS VPS (Optionnel, pour scripts de déploiement) ===\nIPv4=your-server-ip\nIPv6=your-server-ipv6\nNAME=your-username\nPASSWORD=your-new-password\n"}, "a6f2ba46a0d60d2824ab667d4752d8d42bdf113e": {"t": 1785748308.5875182, "n": 2070, "h": "552bfca1ef471f63", "c": "# ================================\n# CONFIGURATION API - DnD AI GameMaster\n# ================================\n\n# === OPENAI (Requis pour GPT-4/GPT-4o) ===\nOPENAI_API_KEY=sk-your-openai-api-key-here\n\n# === ALTERNATIVES (Recommandées pour éviter les erreurs de quota) ===\n# Ajoutez au moins une de ces clés pour avoir des alternatives quand OpenAI a des problèmes\nANTHROPIC_API_KEY=sk-ant-your-anthropic-api-key-here\nDEEPSEEK_API_KEY=your-deepseek-api-key-here\n\n# === NOUVELLE FONCTIONNALITÉ : BASCULEMENT AUTOMATIQUE ===\n# Bascule automatiquement vers un modèle alternatif si OpenAI a des problèmes de quota\n# Valeurs : true/false (par défaut: false)\nAI_AUTO_FALLBACK=true\n\n# === BASE DE DONNÉES ===\nDATABASE_PATH=database.db\n\n# === LOGGING ===\nLOG_LEVEL=INFO\n\n# === PORTRAITS (Optionnel) ===\n# Modèle primaire pour les portraits (par défaut: dall-e-3)\nPORTRAIT_PRIMARY_IMAGE_MODEL=dall-e-3\n# Modèle de fallback pour les portraits (par défaut: dall-e-2)\nPORTRAIT_FALLBACK_IMAGE_MODEL=dall-e-2\n\n# === DEEPSEEK CONFIGURATION (Optionnel) ===\n# URL de base pour l'API DeepSeek (par défaut: https://api.deepseek.com/v1)\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\n\n# ================================\n# NOTES IMPORTANTES\n# ================================\n# \n# 1. OPENAI_API_KEY est requis pour GPT-4 et GPT-4o\n# \n# 2. Ajoutez ANTHROPIC_API_KEY et/ou DEEPSEEK_API_KEY pour avoir des alternatives\n# économiques en cas de problème avec OpenAI\n# \n# 3. AI_AUTO_FALLBACK=true permet un basculement automatique vers un modèle\n# alternatif en cas d'erreur de quota OpenAI\n# \n# 4. Coûts approximatifs (par 1K tokens) :\n# - GPT-4 : $0.03 entrée, $0.06 sortie\n# - GPT-4o : $0.005 entrée, $0.015 sortie \n# - Claude 3.5 Sonnet : $0.003 entrée, $0.015 sortie\n# - DeepSeek : $0.0001 entrée, $0.0002 sortie (très économique!)\n# \n# 5. Pour obtenir vos clés API :\n# - OpenAI : https://platform.openai.com/api-keys\n# - Anthropic : https://console.anthropic.com/account/keys\n# - DeepSeek : https://platform.deepseek.com/api_keys\n#\n# ================================\n"}, "35d09eb69eb896ad31994a920f157bb23134f7b8": {"t": 1785748310.154784, "n": 450, "h": "e36ecea8e3686f86", "c": "# Configuration des clés API - Copiez vers .env et remplissez vos vraies clés\n\n# Clé API OpenAI (obligatoire pour GPT-4 et GPT-4o)\nOPENAI_API_KEY=sk-your-openai-api-key-here\n\n# Clé API Anthropic (obligatoire pour Claude 3.5 Sonnet)\nANTHROPIC_API_KEY=sk-ant-your-anthropic-api-key-here\n\n# Clé API DeepSeek (optionnelle)\nDEEPSEEK_API_KEY=your-deepseek-api-key-here\n\n# Base de données (optionnel, par défaut : database.db)\n# DATABASE_PATH=./database.db\n"}}, "src/core/config.py": {"db22d3900cfbc5a5883673130c34b40d9ac9527b": {"t": 1785745449.2200003, "n": 4531, "h": "491652cec066ef50", "c": "\"\"\"\nConfiguration centralisée de l'application.\n\"\"\"\n\nimport os\nfrom pathlib import Path\nfrom typing import Any, Dict\n\nfrom dotenv import load_dotenv\n\n# Charger .env seulement s'il existe (pour le développement local)\nenv_file = Path(\".env\")\nif env_file.exists():\n load_dotenv()\nelse:\n # En production Docker, les variables sont déjà dans l'environnement\n print(\"Fichier .env non trouvé, utilisation des variables d'environnement Docker\")\n\n\nclass Config:\n \"\"\"Configuration de l'application.\"\"\"\n\n # Base de données\n DATABASE_PATH = os.getenv(\"DATABASE_PATH\", \"database.db\")\n\n # APIs\n OPENAI_API_KEY = os.getenv(\"OPENAI_API_KEY\")\n ANTHROPIC_API_KEY = os.getenv(\"ANTHROPIC_API_KEY\")\n DEEPSEEK_API_KEY = os.getenv(\"DEEPSEEK_API_KEY\")\n\n # Modèles supportés - TARIFS ACTUELS 2025\n SUPPORTED_MODELS = {\n \"GPT-4\": {\n \"provider\": \"openai\",\n \"model_name\": \"gpt-4\",\n \"description\": \"🚀 Le plus avancé, créatif et précis\",\n \"cost_per_1k_tokens\": {\"input\": 0.030, \"output\": 0.060}, # $30/$60 per 1M\n \"context_window\": 8192,\n },\n \"GPT-4o\": {\n \"provider\": \"openai\",\n \"model_name\": \"gpt-4o\",\n \"description\": \"⚡ Optimisé, 90% moins cher, contexte 128k\",\n \"cost_per_1k_tokens\": {\"input\": 0.0025, \"output\": 0.010}, # $2.50/$10 per 1M\n \"context_window\": 128000,\n },\n \"Claude 3.5 Sonnet\": {\n \"provider\": \"anthropic\",\n \"model_name\": \"claude-3-5-sonnet-20240620\",\n \"description\": \"🎭 Expert narrateur, contexte 200k tokens\",\n \"cost_per_1k_tokens\": {\"input\": 0.003, \"output\": 0.015}, # $3/$15 per 1M\n \"context_window\": 200000,\n },\n \"DeepSeek V3\": {\n \"provider\": \"deepseek\",\n \"model_name\": \"deepseek-chat\",\n \"description\": \"💰 Ultra-économique, 50x moins cher que GPT-4o\",\n \"cost_per_1k_tokens\": {\"input\": 0.00014, \"output\": 0.00028}, # $0.14/$0.28 per 1M\n \"context_window\": 64000,\n },\n }\n\n # Paramètres de génération d'images\n IMAGE_CONFIG = {\"model\": \"dall-e-3\", \"size\": \"1024x1024\", \"quality\": \"standard\"}\n\n # Paramètres de chat\n CHAT_CONFIG = {\"max_tokens\": 1000, \"temperature\": 0.8, \"max_history_length\": 50}\n\n # Interface utilisateur\n UI_CONFIG = {\n \"page_title\": \"DnD AI GameMaster\",\n \"page_icon\": \"🎲\",\n \"layout\": \"wide\",\n \"themes\": [\"Fantasy\", \"Horreur\", \"Science-Fiction\", \"Mystère\", \"Aventure\", \"Politique\", \"Romance\"],\n \"classes\": [\"Guerrier\", \"Magicien\", \"Voleur\", \"Clerc\", \"Paladin\", \"Rôdeur\", \"Barde\", \"Barbare\", \"Sorcier\", \"Druide\"],\n \"races\": [\"Humain\", \"Elfe\", \"Nain\", \"Orc\", \"Demi-elfe\", \"Halfelin\", \"Tieffelin\", \"Gnome\", \"Dragonide\"],\n \"languages\": [{\"code\": \"fr\", \"name\": \"Français\"}, {\"code\": \"en\", \"name\": \"English\"}],\n }\n\n # Logging\n LOG_LEVEL = os.getenv(\"LOG_LEVEL\", \"INFO\")\n LOG_FORMAT = \"%(asctime)s - %(name)s - %(levelname)s - %(message)s\"\n\n # Sécurité\n SECURITY_CONFIG = {\n \"min_password_length\": 8,\n \"require_uppercase\": True,\n \"require_lowercase\": True,\n \"require_digit\": True,\n \"bcrypt_rounds\": 12,\n }\n\n @classmethod\n def get_model_config(cls, model_name: str) -> Dict[str, Any]:\n \"\"\"Récupère la configuration d'un modèle.\"\"\"\n # Gestion de la rétrocompatibilité pour DeepSeek\n if model_name == \"DeepSeek\":\n model_name = \"DeepSeek V3\"\n return cls.SUPPORTED_MODELS.get(model_name, {})\n\n @classmethod\n def get_all_model_names(cls) -> list:\n \"\"\"Retourne tous les noms de modèles supportés.\"\"\"\n return list(cls.SUPPORTED_MODELS.keys())\n\n @classmethod\n def validate_api_keys(cls) -> Dict[str, bool]:\n \"\"\"Valide la présence des clés API.\"\"\"\n return {\n \"openai\": bool(cls.OPENAI_API_KEY),\n \"anthropic\": bool(cls.ANTHROPIC_API_KEY),\n \"deepseek\": bool(cls.DEEPSEEK_API_KEY),\n }\n\n @classmethod\n def get_available_models(cls) -> list:\n \"\"\"Retourne les modèles disponibles selon les clés API présentes.\"\"\"\n api_status = cls.validate_api_keys()\n available = []\n\n for model_name, config in cls.SUPPORTED_MODELS.items():\n provider = config.get(\"provider\")\n if api_status.get(provider, False):\n available.append(model_name)\n\n return available\n\n\n# Instance globale de configuration\nconfig = Config()\n"}, "c6ae27b155bbd87e2bec35be77d861d44d78b815": {"t": 1785748304.786235, "n": 4531, "h": "491652cec066ef50", "c": "\"\"\"\nConfiguration centralisée de l'application.\n\"\"\"\n\nimport os\nfrom pathlib import Path\nfrom typing import Any, Dict\n\nfrom dotenv import load_dotenv\n\n# Charger .env seulement s'il existe (pour le développement local)\nenv_file = Path(\".env\")\nif env_file.exists():\n load_dotenv()\nelse:\n # En production Docker, les variables sont déjà dans l'environnement\n print(\"Fichier .env non trouvé, utilisation des variables d'environnement Docker\")\n\n\nclass Config:\n \"\"\"Configuration de l'application.\"\"\"\n\n # Base de données\n DATABASE_PATH = os.getenv(\"DATABASE_PATH\", \"database.db\")\n\n # APIs\n OPENAI_API_KEY = os.getenv(\"OPENAI_API_KEY\")\n ANTHROPIC_API_KEY = os.getenv(\"ANTHROPIC_API_KEY\")\n DEEPSEEK_API_KEY = os.getenv(\"DEEPSEEK_API_KEY\")\n\n # Modèles supportés - TARIFS ACTUELS 2025\n SUPPORTED_MODELS = {\n \"GPT-4\": {\n \"provider\": \"openai\",\n \"model_name\": \"gpt-4\",\n \"description\": \"🚀 Le plus avancé, créatif et précis\",\n \"cost_per_1k_tokens\": {\"input\": 0.030, \"output\": 0.060}, # $30/$60 per 1M\n \"context_window\": 8192,\n },\n \"GPT-4o\": {\n \"provider\": \"openai\",\n \"model_name\": \"gpt-4o\",\n \"description\": \"⚡ Optimisé, 90% moins cher, contexte 128k\",\n \"cost_per_1k_tokens\": {\"input\": 0.0025, \"output\": 0.010}, # $2.50/$10 per 1M\n \"context_window\": 128000,\n },\n \"Claude 3.5 Sonnet\": {\n \"provider\": \"anthropic\",\n \"model_name\": \"claude-3-5-sonnet-20240620\",\n \"description\": \"🎭 Expert narrateur, contexte 200k tokens\",\n \"cost_per_1k_tokens\": {\"input\": 0.003, \"output\": 0.015}, # $3/$15 per 1M\n \"context_window\": 200000,\n },\n \"DeepSeek V3\": {\n \"provider\": \"deepseek\",\n \"model_name\": \"deepseek-chat\",\n \"description\": \"💰 Ultra-économique, 50x moins cher que GPT-4o\",\n \"cost_per_1k_tokens\": {\"input\": 0.00014, \"output\": 0.00028}, # $0.14/$0.28 per 1M\n \"context_window\": 64000,\n },\n }\n\n # Paramètres de génération d'images\n IMAGE_CONFIG = {\"model\": \"dall-e-3\", \"size\": \"1024x1024\", \"quality\": \"standard\"}\n\n # Paramètres de chat\n CHAT_CONFIG = {\"max_tokens\": 1000, \"temperature\": 0.8, \"max_history_length\": 50}\n\n # Interface utilisateur\n UI_CONFIG = {\n \"page_title\": \"DnD AI GameMaster\",\n \"page_icon\": \"🎲\",\n \"layout\": \"wide\",\n \"themes\": [\"Fantasy\", \"Horreur\", \"Science-Fiction\", \"Mystère\", \"Aventure\", \"Politique\", \"Romance\"],\n \"classes\": [\"Guerrier\", \"Magicien\", \"Voleur\", \"Clerc\", \"Paladin\", \"Rôdeur\", \"Barde\", \"Barbare\", \"Sorcier\", \"Druide\"],\n \"races\": [\"Humain\", \"Elfe\", \"Nain\", \"Orc\", \"Demi-elfe\", \"Halfelin\", \"Tieffelin\", \"Gnome\", \"Dragonide\"],\n \"languages\": [{\"code\": \"fr\", \"name\": \"Français\"}, {\"code\": \"en\", \"name\": \"English\"}],\n }\n\n # Logging\n LOG_LEVEL = os.getenv(\"LOG_LEVEL\", \"INFO\")\n LOG_FORMAT = \"%(asctime)s - %(name)s - %(levelname)s - %(message)s\"\n\n # Sécurité\n SECURITY_CONFIG = {\n \"min_password_length\": 8,\n \"require_uppercase\": True,\n \"require_lowercase\": True,\n \"require_digit\": True,\n \"bcrypt_rounds\": 12,\n }\n\n @classmethod\n def get_model_config(cls, model_name: str) -> Dict[str, Any]:\n \"\"\"Récupère la configuration d'un modèle.\"\"\"\n # Gestion de la rétrocompatibilité pour DeepSeek\n if model_name == \"DeepSeek\":\n model_name = \"DeepSeek V3\"\n return cls.SUPPORTED_MODELS.get(model_name, {})\n\n @classmethod\n def get_all_model_names(cls) -> list:\n \"\"\"Retourne tous les noms de modèles supportés.\"\"\"\n return list(cls.SUPPORTED_MODELS.keys())\n\n @classmethod\n def validate_api_keys(cls) -> Dict[str, bool]:\n \"\"\"Valide la présence des clés API.\"\"\"\n return {\n \"openai\": bool(cls.OPENAI_API_KEY),\n \"anthropic\": bool(cls.ANTHROPIC_API_KEY),\n \"deepseek\": bool(cls.DEEPSEEK_API_KEY),\n }\n\n @classmethod\n def get_available_models(cls) -> list:\n \"\"\"Retourne les modèles disponibles selon les clés API présentes.\"\"\"\n api_status = cls.validate_api_keys()\n available = []\n\n for model_name, config in cls.SUPPORTED_MODELS.items():\n provider = config.get(\"provider\")\n if api_status.get(provider, False):\n available.append(model_name)\n\n return available\n\n\n# Instance globale de configuration\nconfig = Config()\n"}, "07c5c2eb861d1b4cfab812061af2e427b197d436": {"t": 1785748308.3937032, "n": 4140, "h": "6d98a50f9e77071c", "c": "\"\"\"\nConfiguration centralisée de l'application.\n\"\"\"\n\nimport os\nfrom pathlib import Path\nfrom typing import Any, Dict\n\nfrom dotenv import load_dotenv\n\n# Charger .env seulement s'il existe (pour le développement local)\nenv_file = Path(\".env\")\nif env_file.exists():\n load_dotenv()\nelse:\n # En production Docker, les variables sont déjà dans l'environnement\n print(\"Fichier .env non trouvé, utilisation des variables d'environnement Docker\")\n\n\nclass Config:\n \"\"\"Configuration de l'application.\"\"\"\n\n # Base de données\n DATABASE_PATH = os.getenv(\"DATABASE_PATH\", \"database.db\")\n\n # APIs\n OPENAI_API_KEY = os.getenv(\"OPENAI_API_KEY\")\n ANTHROPIC_API_KEY = os.getenv(\"ANTHROPIC_API_KEY\")\n DEEPSEEK_API_KEY = os.getenv(\"DEEPSEEK_API_KEY\")\n\n # Modèles supportés\n SUPPORTED_MODELS = {\n \"GPT-4\": {\n \"provider\": \"openai\",\n \"model_name\": \"gpt-4\",\n \"description\": \"🚀 Le plus avancé, créatif et précis\",\n \"cost_per_1k_tokens\": {\"input\": 0.03, \"output\": 0.06},\n },\n \"GPT-4o\": {\n \"provider\": \"openai\",\n \"model_name\": \"gpt-4o\",\n \"description\": \"⚡ Optimisé, rapide et économique\",\n \"cost_per_1k_tokens\": {\"input\": 0.005, \"output\": 0.015},\n },\n \"Claude 3.5 Sonnet\": {\n \"provider\": \"anthropic\",\n \"model_name\": \"claude-3-5-sonnet-20240620\",\n \"description\": \"🎭 Excellent pour le roleplay et la narration\",\n \"cost_per_1k_tokens\": {\"input\": 0.003, \"output\": 0.015},\n },\n \"DeepSeek\": {\n \"provider\": \"deepseek\",\n \"model_name\": \"deepseek-chat\",\n \"description\": \"💰 Le plus économique, bon rapport qualité/prix\",\n \"cost_per_1k_tokens\": {\"input\": 0.00014, \"output\": 0.00028},\n },\n }\n\n # Paramètres de génération d'images\n IMAGE_CONFIG = {\"model\": \"dall-e-3\", \"size\": \"1024x1024\", \"quality\": \"standard\"}\n\n # Paramètres de chat\n CHAT_CONFIG = {\"max_tokens\": 1000, \"temperature\": 0.8, \"max_history_length\": 50}\n\n # Interface utilisateur\n UI_CONFIG = {\n \"page_title\": \"DnD AI GameMaster\",\n \"page_icon\": \"🎲\",\n \"layout\": \"wide\",\n \"themes\": [\"Fantasy\", \"Horreur\", \"Science-Fiction\", \"Mystère\", \"Aventure\", \"Politique\", \"Romance\"],\n \"classes\": [\"Guerrier\", \"Magicien\", \"Voleur\", \"Clerc\", \"Paladin\", \"Rôdeur\", \"Barde\", \"Barbare\", \"Sorcier\", \"Druide\"],\n \"races\": [\"Humain\", \"Elfe\", \"Nain\", \"Orc\", \"Demi-elfe\", \"Halfelin\", \"Tieffelin\", \"Gnome\", \"Dragonide\"],\n \"languages\": [{\"code\": \"fr\", \"name\": \"Français\"}, {\"code\": \"en\", \"name\": \"English\"}],\n }\n\n # Logging\n LOG_LEVEL = os.getenv(\"LOG_LEVEL\", \"INFO\")\n LOG_FORMAT = \"%(asctime)s - %(name)s - %(levelname)s - %(message)s\"\n\n # Sécurité\n SECURITY_CONFIG = {\n \"min_password_length\": 8,\n \"require_uppercase\": True,\n \"require_lowercase\": True,\n \"require_digit\": True,\n \"bcrypt_rounds\": 12,\n }\n\n @classmethod\n def get_model_config(cls, model_name: str) -> Dict[str, Any]:\n \"\"\"Récupère la configuration d'un modèle.\"\"\"\n return cls.SUPPORTED_MODELS.get(model_name, {})\n\n @classmethod\n def get_all_model_names(cls) -> list:\n \"\"\"Retourne tous les noms de modèles supportés.\"\"\"\n return list(cls.SUPPORTED_MODELS.keys())\n\n @classmethod\n def validate_api_keys(cls) -> Dict[str, bool]:\n \"\"\"Valide la présence des clés API.\"\"\"\n return {\n \"openai\": bool(cls.OPENAI_API_KEY),\n \"anthropic\": bool(cls.ANTHROPIC_API_KEY),\n \"deepseek\": bool(cls.DEEPSEEK_API_KEY),\n }\n\n @classmethod\n def get_available_models(cls) -> list:\n \"\"\"Retourne les modèles disponibles selon les clés API présentes.\"\"\"\n api_status = cls.validate_api_keys()\n available = []\n\n for model_name, config in cls.SUPPORTED_MODELS.items():\n provider = config.get(\"provider\")\n if api_status.get(provider, False):\n available.append(model_name)\n\n return available\n\n\n# Instance globale de configuration\nconfig = Config()\n"}}}}