import logging from core.ai_client import chat_completion_text, get_ai_settings logger = logging.getLogger("ONYX") class ContentEngine: def __init__(self): self.settings = get_ai_settings() def _call_openai( self, system_prompt: str, user_prompt: str, temperature: float = 0.5, max_tokens: int = 220 ): return chat_completion_text( messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_prompt}, ], model=self.settings.text_model, temperature=temperature, max_tokens=max_tokens, engine_name="ContentEngine", ) def chat(self, message: str) -> str: system_prompt = """ Tu es Onyx, un assistant intelligent naturel. Règles : - Réponds uniquement en français. - Réponse claire, directe et utile. - Ton humain. - Pas d'histoire. - Pas de narration cinématique. - Pas d'invention inutile. - Si la question est simple, réponds simplement. """ user_prompt = f""" Réponds à ce message de manière utile et naturelle : {message} """ result = self._call_openai( system_prompt=system_prompt, user_prompt=user_prompt, temperature=0.5, max_tokens=180 ) return result or "Je n’ai pas pu générer une réponse claire." def business(self, message: str) -> str: system_prompt = """ Tu es Onyx, un assistant business et marketing. Règles : - Réponds uniquement en français. - Ne raconte pas d'histoire. - Ne crée pas de scènes narratives. - Donne une réponse concrète, utile et professionnelle. - Va droit au but. - Structure en 3 à 5 points maximum si utile. - Donne des actions simples, réalistes et directement applicables. """ user_prompt = f""" Question business : {message} """ result = self._call_openai( system_prompt=system_prompt, user_prompt=user_prompt, temperature=0.4, max_tokens=260 ) return result or "Je n’ai pas pu générer une réponse business." def script(self, message: str) -> str: system_prompt = """ Tu es Onyx, un assistant expert en script court et viral. Règles : - Réponds uniquement en français. - Crée un script court. - Format très visuel et accrocheur. - Style moderne. - Impact rapide. """ user_prompt = f""" Crée un script court à partir de cette demande : {message} """ result = self._call_openai( system_prompt=system_prompt, user_prompt=user_prompt, temperature=0.8, max_tokens=240 ) return result or "Je n’ai pas pu générer de script." def latest_info_guard(self, message: str) -> str: return ( "Je ne peux pas garantir une information à jour en temps réel dans ce mode. " "Pour les dernières sorties, dates précises ou actualités récentes, il faut utiliser une source web en direct." ) def generate(self, message=None, theme=None, vision_description=None): try: if message: msg = message.lower() if any(k in msg for k in [ "dernière sortie", "derniere sortie", "à jour", "a jour", "actualité", "actualite", "latest", "news" ]): return { "mode": "latest_info", "script": self.latest_info_guard(message), "image": None } if any(k in msg for k in [ "business", "vente", "marketing", "client", "rentable", "attirer plus de clients", "magasin", "réparation téléphone", "reparation telephone" ]): return { "mode": "business", "script": self.business(message), "image": None } if any(k in msg for k in ["script", "tiktok", "short", "hook"]): return { "mode": "script", "script": self.script(message), "image": None } return { "mode": "chat", "script": self.chat(message), "image": None } if theme: return { "mode": "script", "script": self.script(theme), "image": None } return { "mode": "chat", "script": "Je suis prêt.", "image": None } except Exception as e: logger.error(f"ContentEngine generate error: {e}") return { "mode": "error", "script": "Erreur génération.", "image": None }