import gradio as gr from huggingface_hub import InferenceClient def shader_agent(prompt, token): if not token: yield "⚠️ يرجى إدخال التوكن (Hugging Face Token) الخاص بك للبدء." return try: client = InferenceClient(model="Qwen/Qwen2.5-Coder-32B-Instruct", token=token) system_message = ( "أنت خبير محرك Godot 4 في قسم Visual Shaders. مهمتك هي شرح بناء الشيدر بالخطوات التالية:\n\n" "1. اذكر أسماء العقد (Nodes) المطلوبة بالإنجليزية (كما تظهر في قائمة البحث في جودوت).\n" "2. اشرح 'خريطة التوصيل' (Connection Graph) بوضوح تام، مثال: 'اربط [مخرج X] من [عقدة A] بـ [مدخل Y] في [عقدة B]'.\n" "3. اذكر القيم التي يجب ضبطها في الـ Inspector لكل عقدة.\n" "4. في النهاية، قدم كود .gdshader موازي لهذه العقد للتصدير المباشر.\n\n" "اجعل الشرح بالعربية والأسماء التقنية بالإنجليزية." ) full_prompt = f"{system_message}\n\nالمطلوب: {prompt}" response = "" for message in client.chat_completion( messages=[{"role": "user", "content": full_prompt}], max_tokens=4000, stream=True, ): token_content = message.choices.delta.content if token_content: response += token_content yield response except Exception as e: yield f"⚠️ حدث خطأ: {str(e)}" # واجهة المستخدم (UI) with gr.Blocks() as demo: gr.Markdown("# 🎨 Godot Visual Shader Architect") gr.Markdown("اطلب أي تأثير (مثلاً: ماء، نار، تآكل) وسأعطيك خريطة العقد (Nodes) وكيفية توصيلها.") with gr.Row(): with gr.Column(scale=1): tk = gr.Textbox(label="HF Token (Write Access)", type="password", placeholder="hf_...") msg = gr.Textbox(label="صف الشيدر الذي تريده", placeholder="مثلاً: شيدر درع طاقة يلمع عند الحواف...", lines=8) generate_btn = gr.Button("🛠️ إنشاء خريطة العمل", variant="primary") with gr.Column(scale=2): gr.Markdown("### 📜 مخطط العقد وكود التصدير:") out = gr.Markdown() gr.Markdown("---") gr.Markdown("💡 **نصيحة:** بعد الحصول على المخطط، يمكنك سحب العقد في جودوت وتوصيلها كما يشرح الوكيل تماماً.") # تشغيل التطبيق مع تمرير الـ theme هنا لتجنب التحذيرات if __name__ == "__main__": demo.launch(theme=gr.themes.Default(primary_hue="orange", secondary_hue="blue"))