muaadh019 commited on
Commit
f8a5d18
·
verified ·
1 Parent(s): d91fc93

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +184 -0
app.py ADDED
@@ -0,0 +1,184 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import anthropic
3
+ import os
4
+
5
+ # ======================
6
+ # إعداد العميل
7
+ # ======================
8
+ client = anthropic.Anthropic(api_key=os.environ["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"])
9
+
10
+ SYSTEM_PROMPT = """أنت مساعد متخصص في الأمن السيبراني باللغة العربية.
11
+ اسمك "درع" وأنت خبير في:
12
+
13
+ - تحليل التهديدات السيبرانية
14
+ - شرح الثغرات الأمنية وكيفية الحماية منها
15
+ - مفاهيم اختبار الاختراق الأخلاقي
16
+ - أمن الشبكات والأنظمة
17
+ - التوعية الأمنية
18
+ - معايير الأمن مثل ISO 27001 و NIST
19
+ - الاستجابة للحوادث الأمنية
20
+ - تحليل البرمجيات الخبيثة
21
+ - أمن التطبيقات OWASP
22
+
23
+ قواعد مهمة:
24
+ - أجب دائماً بالعربية الفصحى الواضحة
25
+ - قدم معلومات تعليمية وأخلاقية فقط
26
+ - لا تساعد في أي نشاط غير قانوني أو ضار
27
+ - عند شرح الثغرات، ركز على الحماية وليس الاستغلال
28
+ - استخدم أمثلة عملية وواضحة
29
+ - قسّم إجاباتك بشكل منظم عند الحاجة"""
30
+
31
+ # ======================
32
+ # دالة المحادثة
33
+ # ======================
34
+ def chat(message, history):
35
+ if not message.strip():
36
+ return "", history
37
+
38
+ # تحويل التاريخ لصيغة Anthropic
39
+ messages = []
40
+ for human, assistant in history:
41
+ messages.append({"role": "user", "content": human})
42
+ messages.append({"role": "assistant", "content": assistant})
43
+ messages.append({"role": "user", "content": message})
44
+
45
+ try:
46
+ response = client.messages.create(
47
+ model="claude-sonnet-4-20250514",
48
+ max_tokens=2048,
49
+ system=SYSTEM_PROMPT,
50
+ messages=messages
51
+ )
52
+ reply = response.content[0].text
53
+ history.append((message, reply))
54
+ return "", history
55
+
56
+ except Exception as e:
57
+ error_msg = f"❌ خطأ: {str(e)}"
58
+ history.append((message, error_msg))
59
+ return "", history
60
+
61
+ # ======================
62
+ # الواجهة
63
+ # ======================
64
+ css = """
65
+ .gradio-container {
66
+ font-family: 'Tajawal', sans-serif;
67
+ direction: rtl;
68
+ }
69
+ .main-header {
70
+ background: linear-gradient(135deg, #0a0a0a, #1a1a2e, #16213e);
71
+ padding: 30px;
72
+ border-radius: 16px;
73
+ text-align: center;
74
+ margin-bottom: 20px;
75
+ border: 1px solid #00ff88;
76
+ box-shadow: 0 0 30px rgba(0,255,136,0.2);
77
+ }
78
+ .tip-box {
79
+ background: #0d1117;
80
+ border: 1px solid #30363d;
81
+ border-right: 4px solid #00ff88;
82
+ border-radius: 10px;
83
+ padding: 15px;
84
+ margin-top: 10px;
85
+ }
86
+ footer { display: none !important; }
87
+ """
88
+
89
+ with gr.Blocks(
90
+ title="درع - المساعد الأمني العربي",
91
+ css=css,
92
+ theme=gr.themes.Soft(
93
+ primary_hue="green",
94
+ secondary_hue="blue",
95
+ neutral_hue="slate"
96
+ )
97
+ ) as demo:
98
+
99
+ # Header
100
+ gr.HTML("""
101
+ <link href="https://fonts.googleapis.com/css2?family=Tajawal:wght@400;700&display=swap" rel="stylesheet">
102
+ <div class="main-header">
103
+ <h1 style="color:#00ff88; margin:0; font-size:2.5em;">🛡️ درع</h1>
104
+ <h2 style="color:white; margin:10px 0 5px 0; font-size:1.3em;">
105
+ المساعد الذكي للأمن السيبراني
106
+ </h2>
107
+ <p style="color:#8b949e; margin:0;">
108
+ اسألني عن أي موضوع في الأمن السيبراني
109
+ </p>
110
+ </div>
111
+ """)
112
+
113
+ with gr.Row():
114
+ # المحادثة
115
+ with gr.Column(scale=3):
116
+ chatbot = gr.Chatbot(
117
+ label="",
118
+ height=500,
119
+ bubble_full_width=False,
120
+ show_label=False,
121
+ rtl=True,
122
+ avatar_images=(
123
+ "https://api.dicebear.com/7.x/avataaars/svg?seed=user",
124
+ "https://api.dicebear.com/7.x/bottts/svg?seed=shield"
125
+ )
126
+ )
127
+
128
+ with gr.Row():
129
+ msg_input = gr.Textbox(
130
+ label="",
131
+ placeholder="اسأل عن أي موضوع في الأمن السيبراني...",
132
+ scale=4,
133
+ rtl=True,
134
+ lines=2
135
+ )
136
+ send_btn = gr.Button("إرسال 🚀", scale=1, variant="primary")
137
+
138
+ clear_btn = gr.Button("🗑️ محادثة جديدة", variant="secondary")
139
+
140
+ # الشريط الجانبي
141
+ with gr.Column(scale=1):
142
+ gr.Markdown("### 💡 أسئلة مقترحة")
143
+ gr.HTML("""
144
+ <div class="tip-box" style="direction:rtl;">
145
+ <p style="color:#00ff88; margin:5px 0;">🔴 ما هي أخطر ثغرات OWASP؟</p>
146
+ <p style="color:#00ff88; margin:5px 0;">🔴 كيف أحمي شبكتي من الهجمات؟</p>
147
+ <p style="color:#00ff88; margin:5px 0;">🔴 ما هو الفرق بين IDS و IPS؟</p>
148
+ <p style="color:#00ff88; margin:5px 0;">🔴 كيف أبدأ تعلم اختبار الاختراق؟</p>
149
+ <p style="color:#00ff88; margin:5px 0;">🔴 ما هي أنواع هجمات التصيد؟</p>
150
+ <p style="color:#00ff88; margin:5px 0;">🔴 شرح هجوم SQL Injection</p>
151
+ <p style="color:#00ff88; margin:5px 0;">🔴 كيف أعمل تقرير أمني احترافي؟</p>
152
+ </div>
153
+ """)
154
+
155
+ gr.Markdown("### ⚠️ تنبيه")
156
+ gr.HTML("""
157
+ <div class="tip-box" style="direction:rtl;">
158
+ <p style="color:#ff6b6b; margin:0; font-size:0.9em;">
159
+ هذا المساعد للأغراض التعليمية والأخلاقية فقط.
160
+ لا يُستخدم في أي نشاط غير قانوني.
161
+ </p>
162
+ </div>
163
+ """)
164
+
165
+ # الأحداث
166
+ send_btn.click(
167
+ fn=chat,
168
+ inputs=[msg_input, chatbot],
169
+ outputs=[msg_input, chatbot]
170
+ )
171
+
172
+ msg_input.submit(
173
+ fn=chat,
174
+ inputs=[msg_input, chatbot],
175
+ outputs=[msg_input, chatbot]
176
+ )
177
+
178
+ clear_btn.click(
179
+ fn=lambda: ([], ""),
180
+ outputs=[chatbot, msg_input]
181
+ )
182
+
183
+ if __name__ == "__main__":
184
+ demo.launch()