#!/usr/bin/env python3 """ Creative Agent - HuggingFace Space التطبيق البسيط لإنشاء المحتوى الإبداعي باستخدام نموذج علام """ import gradio as gr import torch from transformers import AutoModelForCausalLM, AutoTokenizer from typing import Optional import os class AllamCreativeAgent: """الوكيل الإبداعي باستخدام نموذج علام""" def __init__(self): self.model_name = "ALLaM-AI/ALLaM-7B-Instruct-preview" self.model: Optional[AutoModelForCausalLM] = None self.tokenizer: Optional[AutoTokenizer] = None self.device = "cuda" if torch.cuda.is_available() else "cpu" self.is_loaded = False print(f"🔄 تهيئة النظام على {self.device}") def load_model(self, progress=gr.Progress()): """تحميل نموذج علام""" if self.is_loaded: return try: progress(0.1, desc="تحميل التوكينايزر...") self.tokenizer = AutoTokenizer.from_pretrained( self.model_name, trust_remote_code=True ) progress(0.4, desc="تحميل نموذج علام...") self.model = AutoModelForCausalLM.from_pretrained( self.model_name, torch_dtype=torch.float16 if self.device == "cuda" else torch.float32, device_map="auto" if self.device == "cuda" else None, trust_remote_code=True, low_cpu_mem_usage=True ) if self.device == "cpu": self.model = self.model.to(self.device) progress(1.0, desc="تم تحميل النموذج بنجاح!") self.is_loaded = True print(f"✅ تم تحميل نموذج علام على {self.device}") except Exception as e: print(f"❌ خطأ في تحميل نموذج علام: {str(e)}") raise def generate_creative_content(self, client_name: str, product_description: str, target_audience: str, brand_voice: str, progress=gr.Progress()) -> str: """إنشاء محتوى إبداعي""" if not all([client_name, product_description, target_audience, brand_voice]): return "⚠️ يرجى ملء جميع الحقول المطلوبة" progress(0.1, desc="تحضير النموذج...") try: # تحميل النموذج إذا لم يكن محمل if not self.is_loaded: self.load_model(progress) progress(0.6, desc="إنشاء المحتوى الإبداعي...") # تحضير النص التوجيهي prompt = f"""أنت مبدع إعلاني محترف في وكالة إبداعية بالرياض. مهمتك إنشاء محتوى إبداعي للعملاء. معلومات العميل: - اسم العميل: {client_name} - وصف المنتج: {product_description} - الجمهور المستهدف: {target_audience} - صوت العلامة التجارية: {brand_voice} المطلوب: أنشئ نصاً إعلانياً جذاباً باللغة العربية يتناسب مع صوت العلامة التجارية، يستخدم أسلوباً سردياً مقنعاً يربط بين المنتج وحياة الجمهور اليومية، ويثير المشاعر ويحفز على الفعل، مع استخدام عبارات تفاعلية ومحلية تناسب الجمهور السعودي. النص الإعلاني:""" # تحضير الرسائل messages = [ {"role": "system", "content": "أنت مبدع إعلاني محترف متخصص في السوق السعودي وخبير في كتابة المحتوى الإبداعي باللغة العربية"}, {"role": "user", "content": prompt} ] # تطبيق قالب المحادثة inputs = self.tokenizer.apply_chat_template( messages, tokenize=False, add_generation_prompt=True ) # تحضير المدخلات inputs = self.tokenizer( inputs, return_tensors='pt', return_token_type_ids=False ) # نقل للجهاز المناسب inputs = {k: v.to(self.device) for k, v in inputs.items()} progress(0.8, desc="معالجة النص...") # توليد المحتوى with torch.no_grad(): response = self.model.generate( **inputs, max_new_tokens=1024, do_sample=True, top_k=50, top_p=0.95, temperature=0.7, pad_token_id=self.tokenizer.eos_token_id ) # استخراج النص المولد if inputs['input_ids'].shape[1] > 0: original_length = inputs['input_ids'].shape[1] generated_tokens = response[:, original_length:] generated_text = self.tokenizer.batch_decode( generated_tokens, skip_special_tokens=True )[0] else: generated_text = self.tokenizer.batch_decode( response, skip_special_tokens=True )[0] progress(1.0, desc="تم إنشاء المحتوى!") # تنظيف الذاكرة if self.device == "cuda": torch.cuda.empty_cache() return f"""# 🎨 المحتوى الإبداعي لـ {client_name} {generated_text.strip()} --- ✨ تم إنشاء هذا المحتوى بواسطة نموذج علام - مطور محلياً في السعودية 🤖 نموذج: ALLaM-7B-Instruct-preview 🔗 Creative Agent | الوكيل الإبداعي """ except Exception as e: progress(1.0, desc="حدث خطأ!") return f"❌ حدث خطأ في إنشاء المحتوى: {str(e)}" def get_model_status(self) -> str: """حالة النموذج""" cuda_available = torch.cuda.is_available() gpu_name = torch.cuda.get_device_name(0) if cuda_available else "غير متوفر" status = f"""## 📊 حالة النموذج **النموذج**: ALLaM-7B-Instruct-preview **الجهاز**: {self.device.upper()} **GPU**: {gpu_name} **حالة التحميل**: {"✅ محمل" if self.is_loaded else "⏳ غير محمل"} **CUDA متوفر**: {"✅ نعم" if cuda_available else "❌ لا"} """ return status def create_gradio_interface(): """إنشاء واجهة Gradio""" agent = AllamCreativeAgent() # تصميم الواجهة with gr.Blocks( title="Creative Agent - الوكيل الإبداعي", theme=gr.themes.Soft(), css=""" .rtl { direction: rtl; text-align: right; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } .main-title { text-align: center; color: #2E7D32; margin-bottom: 20px; } .info-box { background: #f5f5f5; padding: 15px; border-radius: 10px; margin: 10px 0; border-right: 4px solid #4CAF50; } .status-box { background: #e3f2fd; padding: 10px; border-radius: 8px; margin: 10px 0; } """ ) as demo: # العنوان الرئيسي gr.Markdown( """ # 🎨 Creative Agent - الوكيل الإبداعي ### مساعدك الذكي في إنشاء المحتوى الإبداعي باستخدام نموذج علام #### مطور باستخدام نموذج ALLaM-7B من الذكاء الاصطناعي السعودي """, elem_classes=["main-title"] ) with gr.Row(): with gr.Column(scale=2): gr.Markdown("## 📝 معلومات الحملة الإعلانية") client_name = gr.Textbox( label="اسم العميل *", placeholder="مثال: مقهى الرياض الذهبي", elem_classes=["rtl"] ) product_description = gr.Textbox( label="وصف المنتج أو الخدمة *", placeholder="مثال: مقهى عصري يقدم القهوة السعودية الأصيلة مع لمسة حديثة، يقع في حي الملز", lines=3, elem_classes=["rtl"] ) target_audience = gr.Textbox( label="الجمهور المستهدف *", placeholder="مثال: الشباب والمهنيون في الرياض (25-40 سنة)، محبو القهوة المميزة والأجواء العصرية", lines=3, elem_classes=["rtl"] ) brand_voice = gr.Textbox( label="صوت العلامة التجارية *", placeholder="مثال: عصري - دافئ - أصيل - مميز - مضياف", elem_classes=["rtl"] ) generate_btn = gr.Button( "🚀 إنشاء المحتوى الإبداعي", variant="primary", size="lg" ) with gr.Column(scale=1): gr.Markdown("## 💡 نصائح للحصول على أفضل النتائج") gr.Markdown( """