| |
| """ |
| 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( |
| """ |
| <div class="info-box"> |
| <strong>للحصول على محتوى مميز:</strong><br><br> |
| 🎯 <strong>كن محدداً</strong> في وصف منتجك أو خدمتك<br> |
| 👥 <strong>حدد الجمهور بدقة</strong> (العمر، المنطقة، الاهتمامات)<br> |
| 🗣️ <strong>اختر صوت العلامة</strong> بعناية (مرح، رسمي، ودود)<br> |
| 🇸🇦 <strong>فكر محلياً</strong> - استخدم مصطلحات سعودية مناسبة<br> |
| </div> |
| """, |
| elem_classes=["rtl"] |
| ) |
| |
| |
| model_status = gr.Markdown( |
| agent.get_model_status(), |
| elem_classes=["rtl", "status-box"] |
| ) |
| |
| refresh_btn = gr.Button("🔄 تحديث حالة النموذج", size="sm") |
| |
| |
| gr.Markdown("## ✨ المحتوى الإبداعي المُنشأ") |
| output_content = gr.Markdown( |
| """ |
| <div class="info-box"> |
| سيظهر المحتوى الإبداعي هنا بعد الضغط على زر الإنشاء...<br><br> |
| <strong>ما ستحصل عليه:</strong><br> |
| • نص إعلاني مخصص لعلامتك التجارية<br> |
| • أسلوب يناسب جمهورك المستهدف<br> |
| • لغة عربية طبيعية ومقنعة<br> |
| • لمسة محلية تناسب السوق السعودي<br> |
| </div> |
| """, |
| elem_classes=["rtl"] |
| ) |
| |
| |
| generate_btn.click( |
| fn=agent.generate_creative_content, |
| inputs=[client_name, product_description, target_audience, brand_voice], |
| outputs=output_content, |
| show_progress=True |
| ) |
| |
| refresh_btn.click( |
| fn=agent.get_model_status, |
| outputs=model_status |
| ) |
| |
| |
| gr.Markdown( |
| """ |
| --- |
| <div style="text-align: center; color: #666; font-size: 14px;"> |
| 🎨 <strong>Creative Agent</strong> - الوكيل الإبداعي<br> |
| مطور باستخدام نموذج علام من الذكاء الاصطناعي السعودي 🇸🇦<br> |
| <em>تطوير: فريق الوكالة الإبداعية | الرياض 2024</em> |
| </div> |
| """, |
| elem_classes=["rtl"] |
| ) |
| |
| |
| gr.Markdown( |
| """ |
| <div class="info-box"> |
| <strong>أمثلة سريعة للتجربة:</strong><br><br> |
| |
| <strong>مطعم:</strong><br> |
| العميل: مطعم الأصالة<br> |
| المنتج: مطعم تراثي يقدم الأكلات السعودية الشعبية<br> |
| الجمهور: العائلات السعودية ومحبو التراث<br> |
| الصوت: تراثي - دافئ - أصيل - عائلي<br><br> |
| |
| <strong>متجر إلكتروني:</strong><br> |
| العميل: متجر التقنية<br> |
| المنتج: متجر إلكتروني للأجهزة التقنية والإكسسوارات<br> |
| الجمهور: الشباب التقني (18-35 سنة)<br> |
| الصوت: عصري - ذكي - سريع - مفيد<br> |
| </div> |
| """, |
| elem_classes=["rtl"] |
| ) |
| |
| return demo |
|
|
| def main(): |
| """تشغيل التطبيق""" |
| demo = create_gradio_interface() |
| |
| |
| demo.launch( |
| share=True, |
| server_port=int(os.environ.get("GRADIO_SERVER_PORT", 7860)), |
| show_api=False, |
| show_error=True |
| ) |
|
|
| if __name__ == "__main__": |
| main() |