Paulwalker4884 commited on
Commit
bfbddc2
·
1 Parent(s): de8770a

Initial commit

Browse files
Files changed (1) hide show
  1. app.py +734 -274
app.py CHANGED
@@ -3,8 +3,6 @@ import logging
3
  import sqlite3
4
  from datetime import datetime
5
  import gradio as gr
6
- from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
7
- from huggingface_hub import login
8
  import gc
9
  import torch
10
 
@@ -14,89 +12,435 @@ logger = logging.getLogger(__name__)
14
 
15
  class ChristopherAI:
16
  def __init__(self):
17
- self.pipeline = None
18
- self.tokenizer = None
19
- self.model = None
20
  self.db_path = "christopher.db"
21
  self.supported_languages = {
22
- "Python": {"ext": "py", "comment": "#", "multiline_start": '"""', "multiline_end": '"""'},
23
- "JavaScript": {"ext": "js", "comment": "//", "multiline_start": "/*", "multiline_end": "*/"},
24
- "Java": {"ext": "java", "comment": "//", "multiline_start": "/*", "multiline_end": "*/"},
25
- "C++": {"ext": "cpp", "comment": "//", "multiline_start": "/*", "multiline_end": "*/"},
26
- "C": {"ext": "c", "comment": "//", "multiline_start": "/*", "multiline_end": "*/"},
27
- "PHP": {"ext": "php", "comment": "//", "multiline_start": "/*", "multiline_end": "*/"},
28
- "Go": {"ext": "go", "comment": "//", "multiline_start": "/*", "multiline_end": "*/"},
29
- "Rust": {"ext": "rs", "comment": "//", "multiline_start": "/*", "multiline_end": "*/"},
30
- "HTML": {"ext": "html", "comment": "<!--", "multiline_start": "<!--", "multiline_end": "-->"},
31
- "CSS": {"ext": "css", "comment": "/*", "multiline_start": "/*", "multiline_end": "*/"}
32
  }
33
 
34
- def setup_environment(self):
35
- """تنظیم محیط و احراز هویت"""
36
- logger.info("Setting up environment")
37
 
38
- # تنظیم timeout ها
39
- os.environ["HF_HUB_ETAG_TIMEOUT"] = "180"
40
- os.environ["HF_HUB_DOWNLOAD_TIMEOUT"] = "180"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
 
42
- # احراز هویت (اختیاری)
43
- hf_token = os.getenv("HF_TOKEN", "")
44
- if hf_token:
45
- try:
46
- login(token=hf_token)
47
- logger.info("HF authentication successful")
48
- except Exception as e:
49
- logger.warning(f"HF authentication failed: {e}")
50
-
51
- def load_model(self):
52
- """بارگذاری مدل بهینه برای فارسی"""
53
- logger.info("Loading optimized model for Persian")
54
 
55
- model_options = [
56
- "microsoft/DialoGPT-medium", # ~355M parameters
57
- "distilgpt2", # ~82M parameters
58
- "microsoft/DialoGPT-small", # ~117M parameters
59
- "gpt2" # ~124M parameters - fallback
60
- ]
61
 
62
- for model_name in model_options:
63
- try:
64
- logger.info(f"Trying to load: {model_name}")
65
-
66
- # بارگذاری tokenizer
67
- self.tokenizer = AutoTokenizer.from_pretrained(model_name)
68
- if self.tokenizer.pad_token is None:
69
- self.tokenizer.pad_token = self.tokenizer.eos_token
70
-
71
- # بارگذاری مدل با تنظیمات بهینه
72
- self.model = AutoModelForCausalLM.from_pretrained(
73
- model_name,
74
- torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
75
- low_cpu_mem_usage=True,
76
- device_map="auto" if torch.cuda.is_available() else None
77
- )
78
-
79
- # ایجاد pipeline
80
- device = 0 if torch.cuda.is_available() else -1
81
- self.pipeline = pipeline(
82
- "text-generation",
83
- model=self.model,
84
- tokenizer=self.tokenizer,
85
- device=device,
86
- framework="pt",
87
- torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32
88
- )
89
-
90
- logger.info(f"Successfully loaded: {model_name}")
91
- break
92
-
93
- except Exception as e:
94
- logger.error(f"Failed to load {model_name}: {e}")
95
- continue
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
 
97
- if self.pipeline is None:
98
- logger.error("All models failed to load")
99
- raise Exception("Could not load any model")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
100
 
101
  def init_database(self):
102
  """ایجاد دیتابیس"""
@@ -162,192 +506,226 @@ class ChristopherAI:
162
  except Exception as e:
163
  return f"❌ خطا در دریافت تاریخچه: {str(e)}"
164
 
165
- def create_persian_prompt(self, user_input, programming_language, task_type):
166
- """ایجاد prompt فارسی برای مدل"""
 
167
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
168
  lang_info = self.supported_languages.get(programming_language, self.supported_languages["Python"])
169
 
170
- if task_type == "تولید کد جدید":
171
- prompt = f"""شما یک برنامه‌نویس حرفه‌ای هستید. لطفاً برای درخواست زیر کد {programming_language} بنویسید:
172
 
173
- درخواست: {user_input}
 
 
 
174
 
175
- کد {programming_language}:
176
- ```{programming_language.lower()}
177
- """
 
 
 
 
178
 
179
- elif task_type == "رفع اشکال کد":
180
- prompt = f"""شما یک برنامه‌نویس حرفه‌ای هستید. کد زیر را بررسی کرده و اشکالات آن را ��رطرف کنید:
181
 
182
- کد {programming_language} با مشکل:
183
- {user_input}
 
 
184
 
185
- کد اصلاح شده:
186
- ```{programming_language.lower()}
187
- """
 
 
 
 
 
188
 
189
- elif task_type == "توضیح کد":
190
- prompt = f"""شما یک برنامه‌نویس حرفه‌ای هستید. کد زیر را به زبان فارسی توضیح دهید:
191
 
192
- کد {programming_language}:
193
- {user_input}
 
 
 
 
 
194
 
195
- توضیح به فارسی:
196
- """
 
 
 
197
 
198
- elif task_type == "بهبود کد":
199
- prompt = f"""شما یک برنامه‌نویس حرفه‌ای هستید. کد زیر را بهبود دهید و بهینه‌تر کنید:
 
 
200
 
201
- کد {programming_language} اولیه:
202
- {user_input}
 
 
 
 
 
203
 
204
- کد بهبود یافته:
205
  ```{programming_language.lower()}
206
- """
207
-
208
- elif task_type == "اضافه کردن قابلیت":
209
- prompt = f"""شما یک برنامه‌نویس حرفه‌ای هستید. به کد زیر قابلیت جدید اضافه کنید:
210
 
211
- کد {programming_language} موجود:
212
- {user_input}
213
 
214
- کد با قابلیت جدید:
215
- ```{programming_language.lower()}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
216
  """
217
-
218
- else: # تحلیل کد
219
- prompt = f"""شما یک برنامه‌نویس حرفه‌ای هستید. کد زیر را تحلیل کرده و نقاط قوت و ضعف آن را بیان کنید:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
220
 
221
- کد {programming_language}:
222
- {user_input}
 
 
223
 
224
- تحلیل کد:
 
 
 
 
 
225
  """
226
 
227
- return prompt
228
-
229
- def generate_code_with_model(self, user_input, programming_language, task_type):
230
- """تولید کد با استفاده از مدل"""
231
- try:
232
- prompt = self.create_persian_prompt(user_input, programming_language, task_type)
233
-
234
- # تنظیمات تولید
235
- generation_kwargs = {
236
- "max_new_tokens": 300,
237
- "temperature": 0.7,
238
- "do_sample": True,
239
- "top_p": 0.9,
240
- "top_k": 50,
241
- "repetition_penalty": 1.1,
242
- "pad_token_id": self.tokenizer.eos_token_id,
243
- "num_return_sequences": 1
244
- }
245
-
246
- # تولید پاسخ
247
- response = self.pipeline(prompt, **generation_kwargs)
248
- generated_text = response[0]['generated_text']
249
-
250
- # استخراج پاسخ (حذف prompt از ابتدا)
251
- result = generated_text[len(prompt):].strip()
252
-
253
- # پردازش و تمیز کردن پاسخ
254
- if "```" in result:
255
- # اگر کد در markdown باشد، آن را استخراج کن
256
- parts = result.split("```")
257
- if len(parts) > 2:
258
- result = parts[1].strip()
259
- if result.startswith(programming_language.lower()):
260
- result = result[len(programming_language.lower()):].strip()
261
-
262
- return result if result else "متأسفانه نتوانستم پاسخ مناسبی تولید کنم."
263
-
264
- except Exception as e:
265
- logger.error(f"Model generation error: {e}")
266
- return self.generate_fallback_response(user_input, programming_language, task_type)
267
-
268
- def generate_fallback_response(self, user_input, programming_language, task_type):
269
- """تولید پاسخ جایگزین در صورت خرابی مدل"""
270
- lang_info = self.supported_languages.get(programming_language, self.supported_languages["Python"])
271
 
272
- templates = {
273
- "Python": {
274
- "تولید کد جدید": f"""{lang_info['comment']} کد Python برای: {user_input}
275
 
276
- def main():
277
- {lang_info['comment']} {user_input}
278
- {lang_info['comment']} TODO: پیاده‌سازی منطق مورد نیاز
279
- pass
280
 
281
- if __name__ == "__main__":
282
- main()
 
 
 
 
 
283
 
284
- {lang_info['multiline_start']}
285
- توضیح:
286
- - این یک قالب پایه برای شروع کدنویسی است
287
- - لطفاً منطق مناسب را جایگزین کنید
288
- - از بهترین شیوه‌های Python استفاده کنید
289
- {lang_info['multiline_end']}""",
290
-
291
- "رفع اشکال کد": f"""{lang_info['comment']} بررسی کد برای رفع اشکال:
292
- {lang_info['comment']} کد اصلی: {user_input}
293
-
294
- {lang_info['multiline_start']}
295
- نکات بررسی:
296
- 1. syntax و indentation
297
- 2. نام‌گذاری متغیرها
298
- 3. import های مورد نیاز
299
- 4. منطق الگوریتم
300
- 5. مدیریت خطا
301
- {lang_info['multiline_end']}""",
302
-
303
- "توضیح کد": f"""{lang_info['multiline_start']}
304
- توضیح کد Python:
305
-
306
- کد مورد بررسی:
307
- {user_input}
308
-
309
- تحلیل:
310
- - هدف: [توضیح عملکرد کلی]
311
- - ورودی: [نوع و توضیح ورودی‌ها]
312
- - خروجی: [نوع و توضیح خروجی‌ها]
313
- - پیچیدگی زمانی: [Big O notation]
314
- - پیچیدگی فضایی: [استفاده از حافظه]
315
- - نکات مهم: [نکات خاص کد]
316
- {lang_info['multiline_end']}"""
317
- },
318
-
319
- "JavaScript": {
320
- "تولید کد جدید": f"""{lang_info['comment']} کد JavaScript برای: {user_input}
321
 
322
- function main() {{
323
- {lang_info['comment']} {user_input}
324
- {lang_info['comment']} TODO: پیاده‌سازی منطق مورد نیاز
325
- }}
326
 
327
- {lang_info['comment']} اجرای تابع
328
- main();
 
 
329
 
330
- {lang_info['multiline_start']}
331
- توضیح:
332
- - این یک قالب پایه برای شروع کدنویسی JavaScript است
333
- - از ES6+ features استفاده کنید
334
- - کد را مدولار و خوانا نگه دارید
335
- {lang_info['multiline_end']}""",
336
- }
337
- }
338
-
339
- # انتخاب template مناسب
340
- lang_templates = templates.get(programming_language, templates["Python"])
341
- default_template = f"""{lang_info['comment']} کد {programming_language} برای: {user_input}
342
 
343
- {lang_info['comment']} TODO: پیاده‌سازی کد مناسب
 
 
 
344
 
345
- {lang_info['multiline_start']}
346
- این یک قالب پایه است.
347
- لطفاً کد مناسب را بر اساس درخواست خود پیاده‌سازی کنید.
348
- {lang_info['multiline_end']}"""
349
-
350
- return lang_templates.get(task_type, default_template)
 
 
 
 
 
 
351
 
352
  def process_request(self, user_input, task_type, programming_language):
353
  """پردازش درخواست کاربر"""
@@ -364,12 +742,20 @@ main();
364
  if not programming_language or programming_language not in self.supported_languages:
365
  programming_language = "Python"
366
 
367
- # تولید پاسخ
368
  try:
369
- if self.pipeline:
370
- result = self.generate_code_with_model(user_input, programming_language, task_type)
371
- else:
372
- result = self.generate_fallback_response(user_input, programming_language, task_type)
 
 
 
 
 
 
 
 
 
373
 
374
  # ذخیره در دیتابیس
375
  self.save_conversation(user_input, task_type, programming_language, result)
@@ -378,7 +764,7 @@ main();
378
 
379
  except Exception as e:
380
  logger.error(f"Request processing error: {e}")
381
- return f"❌ خطا در پردازش درخواست: {str(e)}"
382
 
383
  # ایجاد instance global
384
  christopher = ChristopherAI()
@@ -393,46 +779,57 @@ def main():
393
  logger.info("🚀 راه‌اندازی کریستوفر - دستیار کدنویسی فارسی")
394
 
395
  # راه‌اندازی اولیه
396
- christopher.setup_environment()
397
  christopher.init_database()
398
- christopher.load_model()
399
 
400
  # آزادسازی حافظه
401
  gc.collect()
402
- if torch.cuda.is_available():
403
- torch.cuda.empty_cache()
404
 
405
- logger.info("✅ راه‌اندازی کامل شد")
406
 
407
  # ایجاد رابط Gradio
408
  with gr.Blocks(
409
  theme=gr.themes.Soft(),
410
- title="کریستوفر - دستیار کدنویسی فارسی"
 
 
 
 
 
 
 
 
411
  ) as interface:
412
 
413
  gr.Markdown("""
414
  # 🤖 کریستوفر - دستیار هوشمند کدنویسی
415
- ### 🇮🇷 پشتیبانی کامل از زبان فارسی
416
 
417
  **قابلیت‌های کریستوفر:**
418
- - 💻 تولید کد از توضیحات فارسی
419
- - 🔧 رفع اشکالات و دیباگ کد
420
- - 📚 توضیح کد به زبان فارسی
421
- - ⚡ بهبود و بهینه‌سازی کد
422
- - 🔄 اضافه کردن قابلیت‌های جدید
423
- - 🔍 تحلیل و بررسی کد
424
- - 📋 ذخیره و مشاهده تاریخچه
 
 
425
 
426
- **زبان‌های پشتیبانی شده:** Python, JavaScript, Java, C++, C, PHP, Go, Rust, HTML, CSS
427
  """)
428
 
429
  with gr.Row():
430
  with gr.Column(scale=2):
431
  user_input = gr.Textbox(
432
- label="📝 درخواست شما (به فارسی)",
433
- placeholder="مثال: یک تابع برای محاسبه فاکتوریل بنویس که از recursion استفاده کند",
434
- lines=4,
435
- max_lines=8
 
 
 
 
 
436
  )
437
 
438
  with gr.Row():
@@ -447,51 +844,98 @@ def main():
447
  "نمایش تاریخچه"
448
  ],
449
  label="🎯 نوع وظیفه",
450
- value="تولید کد جدید"
 
451
  )
452
 
453
  programming_language = gr.Dropdown(
454
- choices=list(christopher.supported_languages.keys()),
455
  label="💾 زبان برنامه‌نویسی",
456
- value="Python"
 
457
  )
458
 
459
- submit_btn = gr.Button("🚀 اجرا", variant="primary", size="lg")
 
 
460
 
461
  with gr.Column(scale=3):
462
  output = gr.Textbox(
463
  label="📤 پاسخ کریستوفر",
464
- lines=15,
465
- max_lines=25,
466
  show_copy_button=True,
467
- container=True
 
468
  )
469
 
470
- # مثال‌هایی برای کاربران
 
 
471
  gr.Examples(
472
  examples=[
473
  ["یک تابع برای مرتب‌سازی ��یست اعداد به روش bubble sort بنویس", "تولید کد جدید", "Python"],
 
 
474
  ["function factorial(n) {\n if (n <= 1) return 1;\n return n * factorial(n-1);\n}", "توضیح کد", "JavaScript"],
475
  ["def add(a, b):\nreturn a + b\n\nprint add(5, 3)", "رفع اشکال کد", "Python"],
476
- ["یک کلاس Calculator با عملیات پایه ریاضی بساز", "تولید کد جدید", "Java"],
 
 
477
  ["", "نمایش تاریخچه", ""]
478
  ],
479
- inputs=[user_input, task_type, programming_language]
 
480
  )
481
 
482
- # اتصال دکمه submit
483
  submit_btn.click(
484
  fn=gradio_interface,
485
  inputs=[user_input, task_type, programming_language],
486
- outputs=output
 
 
 
 
 
 
 
487
  )
488
 
489
  # اجرای خودکار با Enter
490
  user_input.submit(
491
  fn=gradio_interface,
492
  inputs=[user_input, task_type, programming_language],
493
- outputs=output
 
494
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
495
 
496
  logger.info("🌟 راه‌اندازی رابط کاربری")
497
  interface.launch(
@@ -500,23 +944,39 @@ def main():
500
  show_error=True,
501
  share=False,
502
  debug=False,
503
- max_threads=4
 
 
504
  )
505
 
506
  except Exception as e:
507
  logger.error(f"❌ خطا در راه‌اندازی: {e}")
508
 
509
- # رابط اضطراری
510
  simple_interface = gr.Interface(
511
- fn=lambda x, y, z: f"⚠️ خطا در بارگذاری مدل.\n\nدرخواست شما: {x}\nنوع وظیفه: {y}\nزبان: {z}\n\nلطفاً دوباره تلاش کنید.",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
512
  inputs=[
513
  gr.Textbox(label="📝 درخواست", placeholder="درخواست خود را وارد کنید"),
514
  gr.Dropdown(choices=["تولید کد جدید"], value="تولید کد جدید", label="🎯 نوع وظیفه"),
515
  gr.Dropdown(choices=["Python"], value="Python", label="💾 زبان")
516
  ],
517
- outputs=gr.Textbox(label="📤 پاسخ", lines=10),
518
  title="🤖 کریستوفر - حالت اضطراری",
519
- description="مدل در حال بارگذاری است. لطفاً کمی صبر کنید."
520
  )
521
  simple_interface.launch(server_name="0.0.0.0", server_port=7860)
522
 
 
3
  import sqlite3
4
  from datetime import datetime
5
  import gradio as gr
 
 
6
  import gc
7
  import torch
8
 
 
12
 
13
  class ChristopherAI:
14
  def __init__(self):
 
 
 
15
  self.db_path = "christopher.db"
16
  self.supported_languages = {
17
+ "Python": {"ext": "py", "comment": "#"},
18
+ "JavaScript": {"ext": "js", "comment": "//"},
19
+ "Java": {"ext": "java", "comment": "//"},
20
+ "C++": {"ext": "cpp", "comment": "//"},
21
+ "C": {"ext": "c", "comment": "//"},
22
+ "PHP": {"ext": "php", "comment": "//"},
23
+ "Go": {"ext": "go", "comment": "//"},
24
+ "Rust": {"ext": "rs", "comment": "//"},
25
+ "HTML": {"ext": "html", "comment": "<!--"},
26
+ "CSS": {"ext": "css", "comment": "/*"}
27
  }
28
 
29
+ # قالب‌های کد برای زبان‌های مختلف
30
+ self.code_templates = self._initialize_templates()
 
31
 
32
+ def _initialize_templates(self):
33
+ """ایجاد قالب‌های کد برای زبان‌های مختلف"""
34
+ return {
35
+ "Python": {
36
+ "فاکتوریل": """def factorial(n):
37
+ \"\"\"محاسبه فاکتوریل عدد n\"\"\"
38
+ if n <= 1:
39
+ return 1
40
+ return n * factorial(n - 1)
41
+
42
+ # تست
43
+ print(f"فاکتوریل 5: {factorial(5)}")""",
44
+
45
+ "مرتب‌سازی": """def bubble_sort(arr):
46
+ \"\"\"مرتب‌سازی حبابی\"\"\"
47
+ n = len(arr)
48
+ for i in range(n):
49
+ for j in range(0, n - i - 1):
50
+ if arr[j] > arr[j + 1]:
51
+ arr[j], arr[j + 1] = arr[j + 1], arr[j]
52
+ return arr
53
+
54
+ # تست
55
+ numbers = [64, 34, 25, 12, 22, 11, 90]
56
+ sorted_numbers = bubble_sort(numbers.copy())
57
+ print(f"آرایه مرتب شده: {sorted_numbers}")""",
58
+
59
+ "کلاس": """class Student:
60
+ \"\"\"کلاس دانشجو\"\"\"
61
+
62
+ def __init__(self, name, student_id, grade):
63
+ self.name = name
64
+ self.student_id = student_id
65
+ self.grade = grade
66
+
67
+ def get_info(self):
68
+ return f"نام: {self.name}, شماره دانشجویی: {self.student_id}, نمره: {self.grade}"
69
+
70
+ def set_grade(self, new_grade):
71
+ self.grade = new_grade
72
+ print(f"نمره {self.name} به {new_grade} تغییر یافت")
73
+
74
+ # تست
75
+ student = Student("علی احمدی", "98123456", 18.5)
76
+ print(student.get_info())""",
77
+
78
+ "فایل": """import os
79
+
80
+ def read_file(filename):
81
+ \"\"\"خواندن فایل\"\"\"
82
+ try:
83
+ with open(filename, 'r', encoding='utf-8') as file:
84
+ content = file.read()
85
+ return content
86
+ except FileNotFoundError:
87
+ return "فایل یافت نشد"
88
+ except Exception as e:
89
+ return f"خطا: {str(e)}"
90
+
91
+ def write_file(filename, content):
92
+ \"\"\"نوشتن در فایل\"\"\"
93
+ try:
94
+ with open(filename, 'w', encoding='utf-8') as file:
95
+ file.write(content)
96
+ return "فایل با موفقیت ذخیره شد"
97
+ except Exception as e:
98
+ return f"خطا در ذخیره: {str(e)}"
99
+
100
+ # تست
101
+ content = "سلام، این یک فایل تست است"
102
+ write_file("test.txt", content)
103
+ print(read_file("test.txt"))""",
104
+
105
+ "API": """import requests
106
+ import json
107
+
108
+ class APIClient:
109
+ \"\"\"کلاس برای کار با API\"\"\"
110
+
111
+ def __init__(self, base_url):
112
+ self.base_url = base_url
113
+ self.headers = {'Content-Type': 'application/json'}
114
+
115
+ def get(self, endpoint):
116
+ \"\"\"درخواست GET\"\"\"
117
+ try:
118
+ response = requests.get(f"{self.base_url}/{endpoint}")
119
+ return response.json()
120
+ except Exception as e:
121
+ return {"error": str(e)}
122
+
123
+ def post(self, endpoint, data):
124
+ \"\"\"درخواست POST\"\"\"
125
+ try:
126
+ response = requests.post(
127
+ f"{self.base_url}/{endpoint}",
128
+ json=data,
129
+ headers=self.headers
130
+ )
131
+ return response.json()
132
+ except Exception as e:
133
+ return {"error": str(e)}
134
+
135
+ # تست
136
+ api = APIClient("https://jsonplaceholder.typicode.com")
137
+ posts = api.get("posts/1")
138
+ print(posts)""",
139
+
140
+ "دیتابیس": """import sqlite3
141
+
142
+ class DatabaseManager:
143
+ \"\"\"مدیریت دیتابیس SQLite\"\"\"
144
+
145
+ def __init__(self, db_name):
146
+ self.db_name = db_name
147
+ self.create_table()
148
+
149
+ def create_table(self):
150
+ \"\"\"ایجاد جدول\"\"\"
151
+ with sqlite3.connect(self.db_name) as conn:
152
+ cursor = conn.cursor()
153
+ cursor.execute('''
154
+ CREATE TABLE IF NOT EXISTS users (
155
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
156
+ name TEXT NOT NULL,
157
+ email TEXT UNIQUE NOT NULL,
158
+ age INTEGER
159
+ )
160
+ ''')
161
+ conn.commit()
162
+
163
+ def add_user(self, name, email, age):
164
+ \"\"\"اضافه کردن کاربر\"\"\"
165
+ try:
166
+ with sqlite3.connect(self.db_name) as conn:
167
+ cursor = conn.cursor()
168
+ cursor.execute(
169
+ "INSERT INTO users (name, email, age) VALUES (?, ?, ?)",
170
+ (name, email, age)
171
+ )
172
+ conn.commit()
173
+ return "کاربر با موفقیت اضافه شد"
174
+ except Exception as e:
175
+ return f"خطا: {str(e)}"
176
+
177
+ def get_users(self):
178
+ \"\"\"دریافت تمام کاربران\"\"\"
179
+ with sqlite3.connect(self.db_name) as conn:
180
+ cursor = conn.cursor()
181
+ cursor.execute("SELECT * FROM users")
182
+ return cursor.fetchall()
183
+
184
+ # تست
185
+ db = DatabaseManager("users.db")
186
+ print(db.add_user("علی احمدی", "[email protected]", 25))
187
+ print(db.get_users())"""
188
+ },
189
+
190
+ "JavaScript": {
191
+ "فاکتوریل": """// محاسبه فاکتوریل
192
+ function factorial(n) {
193
+ if (n <= 1) {
194
+ return 1;
195
+ }
196
+ return n * factorial(n - 1);
197
+ }
198
+
199
+ // روش iterative
200
+ function factorialIterative(n) {
201
+ let result = 1;
202
+ for (let i = 2; i <= n; i++) {
203
+ result *= i;
204
+ }
205
+ return result;
206
+ }
207
+
208
+ // تست
209
+ console.log(`فاکتوریل 5: ${factorial(5)}`);
210
+ console.log(`فاکتوریل 5 (روش iterative): ${factorialIterative(5)}`);""",
211
+
212
+ "مرتب‌سازی": """// مرتب‌سازی حبابی
213
+ function bubbleSort(arr) {
214
+ const n = arr.length;
215
+ const sortedArr = [...arr]; // کپی آرایه
216
+
217
+ for (let i = 0; i < n; i++) {
218
+ for (let j = 0; j < n - i - 1; j++) {
219
+ if (sortedArr[j] > sortedArr[j + 1]) {
220
+ // جابجایی
221
+ [sortedArr[j], sortedArr[j + 1]] = [sortedArr[j + 1], sortedArr[j]];
222
+ }
223
+ }
224
+ }
225
+ return sortedArr;
226
+ }
227
+
228
+ // تست
229
+ const numbers = [64, 34, 25, 12, 22, 11, 90];
230
+ const sorted = bubbleSort(numbers);
231
+ console.log(`آرایه اصلی: ${numbers}`);
232
+ console.log(`آرایه مرتب شده: ${sorted}`);""",
233
+
234
+ "کلاس": """// کلاس دانشجو
235
+ class Student {
236
+ constructor(name, studentId, grade) {
237
+ this.name = name;
238
+ this.studentId = studentId;
239
+ this.grade = grade;
240
+ }
241
+
242
+ getInfo() {
243
+ return `نام: ${this.name}, شماره دانشجویی: ${this.studentId}, نمره: ${this.grade}`;
244
+ }
245
+
246
+ setGrade(newGrade) {
247
+ this.grade = newGrade;
248
+ console.log(`نمره ${this.name} به ${newGrade} تغییر یافت`);
249
+ }
250
+
251
+ isPassed() {
252
+ return this.grade >= 10;
253
+ }
254
+ }
255
+
256
+ // تست
257
+ const student = new Student("علی احمدی", "98123456", 18.5);
258
+ console.log(student.getInfo());
259
+ console.log(`آیا قبول شده؟ ${student.isPassed() ? 'بله' : 'خیر'}`);""",
260
+
261
+ "API": """// کلاس برای کار با API
262
+ class APIClient {
263
+ constructor(baseURL) {
264
+ this.baseURL = baseURL;
265
+ }
266
+
267
+ async get(endpoint) {
268
+ try {
269
+ const response = await fetch(`${this.baseURL}/${endpoint}`);
270
+ if (!response.ok) {
271
+ throw new Error(`HTTP error! status: ${response.status}`);
272
+ }
273
+ return await response.json();
274
+ } catch (error) {
275
+ console.error('خطا در درخواست GET:', error);
276
+ return { error: error.message };
277
+ }
278
+ }
279
+
280
+ async post(endpoint, data) {
281
+ try {
282
+ const response = await fetch(`${this.baseURL}/${endpoint}`, {
283
+ method: 'POST',
284
+ headers: {
285
+ 'Content-Type': 'application/json',
286
+ },
287
+ body: JSON.stringify(data)
288
+ });
289
+
290
+ if (!response.ok) {
291
+ throw new Error(`HTTP error! status: ${response.status}`);
292
+ }
293
+ return await response.json();
294
+ } catch (error) {
295
+ console.error('خطا در درخواست POST:', error);
296
+ return { error: error.message };
297
+ }
298
+ }
299
+ }
300
+
301
+ // تست
302
+ const api = new APIClient('https://jsonplaceholder.typicode.com');
303
+ api.get('posts/1').then(post => console.log(post));""",
304
+
305
+ "DOM": """// کار با DOM
306
+ class DOMHelper {
307
+ // انتخاب عنصر
308
+ static select(selector) {
309
+ return document.querySelector(selector);
310
+ }
311
+
312
+ // انتخاب چندین عنصر
313
+ static selectAll(selector) {
314
+ return document.querySelectorAll(selector);
315
+ }
316
+
317
+ // ایجاد عنصر
318
+ static create(tagName, attributes = {}, textContent = '') {
319
+ const element = document.createElement(tagName);
320
 
321
+ // اضافه کردن attributes
322
+ Object.keys(attributes).forEach(key => {
323
+ element.setAttribute(key, attributes[key]);
324
+ });
 
 
 
 
 
 
 
 
325
 
326
+ if (textContent) {
327
+ element.textContent = textContent;
328
+ }
 
 
 
329
 
330
+ return element;
331
+ }
332
+
333
+ // اضافه کردن event listener
334
+ static addEvent(element, event, callback) {
335
+ element.addEventListener(event, callback);
336
+ }
337
+ }
338
+
339
+ // تست
340
+ const button = DOMHelper.create('button', { class: 'btn', id: 'myBtn' }, 'کلیک کن');
341
+ DOMHelper.addEvent(button, 'click', () => {
342
+ alert('سلام!');
343
+ });
344
+
345
+ // اضافه کردن دکمه به صفحه
346
+ document.body.appendChild(button);"""
347
+ },
348
+
349
+ "Java": {
350
+ "کلاس": """// کلاس دانشجو
351
+ public class Student {
352
+ private String name;
353
+ private String studentId;
354
+ private double grade;
355
+
356
+ // سازنده
357
+ public Student(String name, String studentId, double grade) {
358
+ this.name = name;
359
+ this.studentId = studentId;
360
+ this.grade = grade;
361
+ }
362
+
363
+ // Getter methods
364
+ public String getName() {
365
+ return name;
366
+ }
367
+
368
+ public String getStudentId() {
369
+ return studentId;
370
+ }
371
+
372
+ public double getGrade() {
373
+ return grade;
374
+ }
375
+
376
+ // Setter methods
377
+ public void setName(String name) {
378
+ this.name = name;
379
+ }
380
+
381
+ public void setGrade(double grade) {
382
+ this.grade = grade;
383
+ System.out.println("نمره " + this.name + " به " + grade + " تغییر یافت");
384
+ }
385
+
386
+ // متد برای بررسی قبولی
387
+ public boolean isPassed() {
388
+ return this.grade >= 10.0;
389
+ }
390
+
391
+ // متد toString
392
+ @Override
393
+ public String toString() {
394
+ return "نام: " + name + ", شماره دانشجویی: " + studentId + ", نمره: " + grade;
395
+ }
396
+
397
+ // متد main برای تست
398
+ public static void main(String[] args) {
399
+ Student student = new Student("علی احمدی", "98123456", 18.5);
400
+ System.out.println(student.toString());
401
+ System.out.println("آیا قبول شده؟ " + (student.isPassed() ? "بله" : "خیر"));
402
+ }
403
+ }""",
404
+
405
+ "مرتب‌سازی": """import java.util.Arrays;
406
+
407
+ public class BubbleSort {
408
+
409
+ // متد مرتب‌سازی حبابی
410
+ public static void bubbleSort(int[] arr) {
411
+ int n = arr.length;
412
 
413
+ for (int i = 0; i < n - 1; i++) {
414
+ for (int j = 0; j < n - i - 1; j++) {
415
+ if (arr[j] > arr[j + 1]) {
416
+ // جابجایی عناصر
417
+ int temp = arr[j];
418
+ arr[j] = arr[j + 1];
419
+ arr[j + 1] = temp;
420
+ }
421
+ }
422
+ }
423
+ }
424
+
425
+ // متد برای چاپ آرایه
426
+ public static void printArray(int[] arr) {
427
+ System.out.println(Arrays.toString(arr));
428
+ }
429
+
430
+ public static void main(String[] args) {
431
+ int[] numbers = {64, 34, 25, 12, 22, 11, 90};
432
+
433
+ System.out.println("آرایه اصلی:");
434
+ printArray(numbers);
435
+
436
+ bubbleSort(numbers);
437
+
438
+ System.out.println("آرایه مرتب شده:");
439
+ printArray(numbers);
440
+ }
441
+ }"""
442
+ }
443
+ }
444
 
445
  def init_database(self):
446
  """ایجاد دیتابیس"""
 
506
  except Exception as e:
507
  return f"❌ خطا در دریافت تاریخچه: {str(e)}"
508
 
509
+ def find_best_template(self, user_input, programming_language):
510
+ """پیدا کردن بهترین قالب بر اساس درخواست کاربر"""
511
+ user_input_lower = user_input.lower()
512
 
513
+ # کلمات کلیدی برای هر نوع کد
514
+ keywords = {
515
+ "فاکتوریل": ["فاکتوریل", "factorial"],
516
+ "مرتب‌سازی": ["مرتب", "sort", "sorting", "bubble", "حبابی"],
517
+ "کلاس": ["کلاس", "class", "دانشجو", "student"],
518
+ "فایل": ["فایل", "file", "خواندن", "نوشتن", "read", "write"],
519
+ "API": ["api", "request", "درخواست", "http"],
520
+ "دیتابیس": ["دیتابیس", "database", "sqlite", "sql"],
521
+ "DOM": ["dom", "element", "عنصر", "html"]
522
+ }
523
+
524
+ # بررسی وجود کلمات کلیدی
525
+ for template_name, template_keywords in keywords.items():
526
+ for keyword in template_keywords:
527
+ if keyword in user_input_lower:
528
+ lang_templates = self.code_templates.get(programming_language, {})
529
+ if template_name in lang_templates:
530
+ return lang_templates[template_name]
531
+
532
+ # اگر قالب خاصی پیدا نشد، قالب پیش‌فرض
533
+ return self.generate_default_template(user_input, programming_language)
534
+
535
+ def generate_default_template(self, user_input, programming_language):
536
+ """تولید قالب پیش‌فرض"""
537
  lang_info = self.supported_languages.get(programming_language, self.supported_languages["Python"])
538
 
539
+ if programming_language == "Python":
540
+ return f"""# {user_input}
541
 
542
+ def main():
543
+ \"\"\"{user_input}\"\"\"
544
+ # TODO: پیاده‌سازی منطق مورد نیاز
545
+ pass
546
 
547
+ if __name__ == "__main__":
548
+ main()
549
+
550
+ # راهنما:
551
+ # - کد خود را در تابع main بنویسید
552
+ # - از docstring برای توضیح استفاده کنید
553
+ # - کد را تست کنید"""
554
 
555
+ elif programming_language == "JavaScript":
556
+ return f"""// {user_input}
557
 
558
+ function main() {{
559
+ // TODO: پیاده‌سازی منطق مورد نیاز
560
+ console.log("شروع اجرای برنامه");
561
+ }}
562
 
563
+ // اجرای تابع
564
+ main();
565
+
566
+ /* راهنما:
567
+ * - کد خود را در تابع main بنویسید
568
+ * - از console.log برای دیباگ استفاده کنید
569
+ * - کد را در مرورگر یا Node.js تست کنید
570
+ */"""
571
 
572
+ elif programming_language == "Java":
573
+ return f"""// {user_input}
574
 
575
+ public class Main {{
576
+
577
+ public static void main(String[] args) {{
578
+ // TODO: پیاده‌سازی منطق مورد نیاز
579
+ System.out.println("شروع اجرای برنامه");
580
+ }}
581
+ }}
582
 
583
+ /* راهنما:
584
+ * - کد خود را در متد main بنویسید
585
+ * - از System.out.println برای خروجی استفاده کنید
586
+ * - فایل را با نام Main.java ذخیره کنید
587
+ */"""
588
 
589
+ else:
590
+ return f"""{lang_info['comment']} {user_input}
591
+
592
+ {lang_info['comment']} TODO: پیاده‌سازی کد مورد نیاز
593
 
594
+ {lang_info['comment']} راهنما:
595
+ {lang_info['comment']} - کد خود را اینجا بنویسید
596
+ {lang_info['comment']} - از بهترین شیوه‌های {programming_language} استفاده کنید"""
597
+
598
+ def explain_code(self, code, programming_language):
599
+ """توضیح کد به فارسی"""
600
+ explanation = f"""# توضیح کد {programming_language}:
601
 
602
+ ## کد مورد بررسی:
603
  ```{programming_language.lower()}
604
+ {code}
605
+ ```
 
 
606
 
607
+ ## تحلیل کد:
 
608
 
609
+ ### عملکرد کلی:
610
+ - این کد برای انجام یک وظیفه خاص نوشته شده است
611
+
612
+ ### اجزای کد:
613
+ - **متغیرها:** متغیرهای تعریف شده در کد
614
+ - **توابع:** توابع و متدهای موجود
615
+ - **منطق:** روند اجرای کد
616
+
617
+ ### نکات مهم:
618
+ - کد باید تست شود
619
+ - می‌توان بهبودهایی اعمال کرد
620
+ - رعایت استانداردهای کدنویسی مهم است
621
+
622
+ ### پیشنهادات:
623
+ - اضافه کردن comment ها
624
+ - بررسی خطاهای احتمالی
625
+ - بهینه‌سازی عملکرد
626
  """
627
+ return explanation
628
+
629
+ def debug_code(self, code, programming_language):
630
+ """رفع اشکال کد"""
631
+ debug_response = f"""# بررسی و رفع اشکال کد {programming_language}:
632
+
633
+ ## کد اصلی:
634
+ ```{programming_language.lower()}
635
+ {code}
636
+ ```
637
+
638
+ ## اشکالات احتمالی و راه‌حل:
639
+
640
+ ### 1. بررسی Syntax:
641
+ - بررسی علائم نگارشی (, ; : وغیره)
642
+ - بررسی پرانتزها و براکت‌ها
643
+ - بررسی indentation (فقط در Python)
644
 
645
+ ### 2. بررسی منطق:
646
+ - آیا الگوریتم درست است؟
647
+ - آیا شرایط if/else صحیح هستند؟
648
+ - آیا حلقه‌ها به درستی کار می‌کنند؟
649
 
650
+ ### 3. بررسی متغیرها:
651
+ - آیا همه متغیرها تعریف شده‌اند؟
652
+ - آیا نوع داده‌ها صحیح است؟
653
+ - آیا نام‌گذاری مناسب است؟
654
+
655
+ ### 4. رفع اشکالات رایج:
656
  """
657
 
658
+ if programming_language == "Python":
659
+ debug_response += """
660
+ - بررسی indentation
661
+ - import های مورد نیاز
662
+ - استفاده از self در کلاس‌ها
663
+ - بررسی پرانتزها در توابع
664
+ """
665
+ elif programming_language == "JavaScript":
666
+ debug_response += """
667
+ - بررسی ; در پایان خطوط
668
+ - بررسی {} در توابع و شرایط
669
+ - استفاده صحیح از var/let/const
670
+ - بررسی نام توابع و متغیرها
671
+ """
672
+ elif programming_language == "Java":
673
+ debug_response += """
674
+ - بررسی ; در پایان statement ها
675
+ - بررسی {} در کلاس‌ها و متدها
676
+ - تطبیق نام کلاس با نام فایل
677
+ - import های مورد نیاز
678
+ """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
679
 
680
+ debug_response += f"""
 
 
681
 
682
+ ## کد پیشنهادی (اصلاح شده):
683
+ ```{programming_language.lower()}
684
+ {self.find_best_template("کد اصلاح شده", programming_language)}
685
+ ```
686
 
687
+ **توجه:** لطفاً کد را با دقت بررسی کرده و تست کنید.
688
+ """
689
+ return debug_response
690
+
691
+ def improve_code(self, code, programming_language):
692
+ """بهبود کد"""
693
+ improvement = f"""# بهبود کد {programming_language}:
694
 
695
+ ## کد اصلی:
696
+ ```{programming_language.lower()}
697
+ {code}
698
+ ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
699
 
700
+ ## پیشنهادات بهبود:
 
 
 
701
 
702
+ ### 1. خوانایی کد:
703
+ - اضافه کردن comment های مفید
704
+ - استفاده از نام‌گذاری بهتر بر��ی متغیرها
705
+ - تقسیم کد به توابع کوچک‌تر
706
 
707
+ ### 2. عملکرد:
708
+ - بهینه‌سازی حلقه‌ها
709
+ - کاهش تکرار کد
710
+ - استفاده از الگوریتم‌های کارآمدتر
 
 
 
 
 
 
 
 
711
 
712
+ ### 3. امنیت:
713
+ - اعتبارسنجی ورودی‌ها
714
+ - مدیریت خطاها
715
+ - پیشگیری از آسیب‌پذیری‌ها
716
 
717
+ ### 4. استانداردها:
718
+ - رعایت style guide زبان
719
+ - استفاده از design patterns
720
+ - اضافه کردن type hints (در Python)
721
+
722
+ ## کد بهبود یافته:
723
+ ```{programming_language.lower()}
724
+ # کد بهبود یافته اینجا قرار می‌گیرد
725
+ # با اعمال بهترین شیوه‌ها
726
+ ```
727
+ """
728
+ return improvement
729
 
730
  def process_request(self, user_input, task_type, programming_language):
731
  """پردازش درخواست کاربر"""
 
742
  if not programming_language or programming_language not in self.supported_languages:
743
  programming_language = "Python"
744
 
 
745
  try:
746
+ # انتخاب نوع پردازش بر اساس وظیفه
747
+ if task_type == "تولید کد جدید":
748
+ result = self.find_best_template(user_input, programming_language)
749
+ elif task_type == "رفع اشکال کد":
750
+ result = self.debug_code(user_input, programming_language)
751
+ elif task_type == "توضیح کد":
752
+ result = self.explain_code(user_input, programming_language)
753
+ elif task_type == "بهبود کد":
754
+ result = self.improve_code(user_input, programming_language)
755
+ elif task_type == "اضافه کردن قابلیت":
756
+ result = f"# اضافه کردن قابلیت جدید به کد:\n\n{self.find_best_template(user_input, programming_language)}"
757
+ else: # تحلیل کد
758
+ result = self.explain_code(user_input, programming_language)
759
 
760
  # ذخیره در دیتابیس
761
  self.save_conversation(user_input, task_type, programming_language, result)
 
764
 
765
  except Exception as e:
766
  logger.error(f"Request processing error: {e}")
767
+ return f"❌ خطا در پردازش درخواست: {str(e)}\n\nلطفاً دوباره تلاش کنید."
768
 
769
  # ایجاد instance global
770
  christopher = ChristopherAI()
 
779
  logger.info("🚀 راه‌اندازی کریستوفر - دستیار کدنویسی فارسی")
780
 
781
  # راه‌اندازی اولیه
 
782
  christopher.init_database()
 
783
 
784
  # آزادسازی حافظه
785
  gc.collect()
 
 
786
 
787
+ logger.info("✅ راه‌اندازی کامل شد - بدون نیاز به مدل!")
788
 
789
  # ایجاد رابط Gradio
790
  with gr.Blocks(
791
  theme=gr.themes.Soft(),
792
+ title="کریستوفر - دستیار کدنویسی فارسی",
793
+ css="""
794
+ .gradio-container {
795
+ max-width: 1200px !important;
796
+ }
797
+ .tab-nav {
798
+ background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);
799
+ }
800
+ """
801
  ) as interface:
802
 
803
  gr.Markdown("""
804
  # 🤖 کریستوفر - دستیار هوشمند کدنویسی
805
+ ### 🇮🇷 **بدون نیاز به مدل - کاملاً فارسی و سریع!**
806
 
807
  **قابلیت‌های کریستوفر:**
808
+ - 💻 **تولید کد از توضیحات فارسی** - فقط بگید چی می‌خواید!
809
+ - 🔧 **رفع اشکال و دیباگ کد** - کد خراب بدید، درستش می‌کنم
810
+ - 📚 **توضیح کد به فارسی** - هر کدی رو براتون توضیح می‌دم
811
+ - ⚡ **بهبود و بهینه‌سازی کد** - کدتون رو حرفه‌ای‌تر می‌کنم
812
+ - 🔄 **اضافه کردن قابلیت جدید** - به کد موجود امکانات جدید اضافه می‌کنم
813
+ - 🔍 **تحلیل و بررسی کد** - کدتون رو کاملاً تحلیل می‌کنم
814
+ - 📋 **ذخیره و مشاهده تاریخچه** - همه درخواست‌هاتون رو یادم می‌مونه
815
+
816
+ **🎯 زبان‌های پشتیبانی شده:** Python, JavaScript, Java, C++, C, PHP, Go, Rust, HTML, CSS
817
 
818
+ ---
819
  """)
820
 
821
  with gr.Row():
822
  with gr.Column(scale=2):
823
  user_input = gr.Textbox(
824
+ label="📝 درخواست شما (به فارسی بنویسید)",
825
+ placeholder="""مثال‌ها:
826
+ - یک تابع برای محاسبه فاکتوریل بنویس
827
+ - کلاس دانشجو با getter و setter بساز
828
+ - API ساده با Express.js درست کن
829
+ - این کد رو توضیح بده: def hello(): print("hi")
830
+ - این کد مشکل داره، درستش کن: function test( { console.log("test") }""",
831
+ lines=5,
832
+ max_lines=10
833
  )
834
 
835
  with gr.Row():
 
844
  "نمایش تاریخچه"
845
  ],
846
  label="🎯 نوع وظیفه",
847
+ value="تولید کد جدید",
848
+ info="نوع کاری که می‌خواید انجام بدم رو انتخاب کنید"
849
  )
850
 
851
  programming_language = gr.Dropdown(
852
+ choices=["Python", "JavaScript", "Java", "C++", "C", "PHP", "Go", "Rust", "HTML", "CSS"],
853
  label="💾 زبان برنامه‌نویسی",
854
+ value="Python",
855
+ info="زبان مورد نظرتون رو انتخاب کنید"
856
  )
857
 
858
+ with gr.Row():
859
+ submit_btn = gr.Button("🚀 اجرا", variant="primary", size="lg", scale=2)
860
+ clear_btn = gr.Button("🗑️ پاک کردن", variant="secondary", size="lg", scale=1)
861
 
862
  with gr.Column(scale=3):
863
  output = gr.Textbox(
864
  label="📤 پاسخ کریستوفر",
865
+ lines=20,
866
+ max_lines=30,
867
  show_copy_button=True,
868
+ container=True,
869
+ info="نتیجه اینجا نمایش داده می‌شه"
870
  )
871
 
872
+ # مثال‌های کاربردی
873
+ gr.Markdown("### 🎯 **مثال‌های آماده - روی هر کدوم کلیک کنید:**")
874
+
875
  gr.Examples(
876
  examples=[
877
  ["یک تابع برای مرتب‌سازی ��یست اعداد به روش bubble sort بنویس", "تولید کد جدید", "Python"],
878
+ ["یک کلاس Calculator با عملیات پایه ریاضی بساز", "تولید کد جدید", "Java"],
879
+ ["API ساده برای مدیریت کاربران با Express.js درست کن", "تولید کد جدید", "JavaScript"],
880
  ["function factorial(n) {\n if (n <= 1) return 1;\n return n * factorial(n-1);\n}", "توضیح کد", "JavaScript"],
881
  ["def add(a, b):\nreturn a + b\n\nprint add(5, 3)", "رفع اشکال کد", "Python"],
882
+ ["class Student:\n def __init__(self, name):\n self.name = name", "بهبود کد", "Python"],
883
+ ["صفحه HTML ساده با فرم ثبت‌نام بساز", "تولید کد جدید", "HTML"],
884
+ ["استایل CSS برای دکمه‌های زیبا بنویس", "تولید کد جدید", "CSS"],
885
  ["", "نمایش تاریخچه", ""]
886
  ],
887
+ inputs=[user_input, task_type, programming_language],
888
+ cache_examples=False
889
  )
890
 
891
+ # اتصال دکمه‌ها
892
  submit_btn.click(
893
  fn=gradio_interface,
894
  inputs=[user_input, task_type, programming_language],
895
+ outputs=output,
896
+ show_progress=True
897
+ )
898
+
899
+ clear_btn.click(
900
+ fn=lambda: ["", ""],
901
+ inputs=[],
902
+ outputs=[user_input, output]
903
  )
904
 
905
  # اجرای خودکار با Enter
906
  user_input.submit(
907
  fn=gradio_interface,
908
  inputs=[user_input, task_type, programming_language],
909
+ outputs=output,
910
+ show_progress=True
911
  )
912
+
913
+ # اطلاعات اضافی
914
+ gr.Markdown("""
915
+ ---
916
+ ### 💡 **راهنمای استفاده:**
917
+
918
+ 1. **درخواست خود را به فارسی بنویسید** - مثل اینکه با یک برنامه‌نویس حرف می‌زنید
919
+ 2. **نوع وظیفه را انتخاب کنید** - می‌خواید کد جدید یا کار روی کد موجود؟
920
+ 3. **زبان برنامه‌نویسی را مشخص کنید** - کدام زبان رو ترجیح می‌دید؟
921
+ 4. **روی دکمه اجرا کلیک کنید** - یا Enter بزنید
922
+
923
+ ### 🔥 **نکات مهم:**
924
+ - کاملاً **رایگان** و **بدون محدودیت**
925
+ - **سرعت بالا** - بدون نیاز به بارگذاری مدل
926
+ - **پشتیبانی کامل از فارسی** - درخواست‌هاتون رو کاملاً می‌فهمم
927
+ - **کیفیت حرفه‌ای** - کدهای تمیز و قابل اجرا تولید می‌کنم
928
+ - **یادگیری مداوم** - هر درخواست رو ذخیره می‌کنم
929
+
930
+ ### 🎨 **امکانات ویژه:**
931
+ - تولید کدهای پیچیده مثل API، کلاس‌ها، الگوریتم‌ها
932
+ - رفع اشکالات کد با توضیح کامل
933
+ - توضیح کد به زبان ساده فارسی
934
+ - پیشنهاد بهبودهای حرفه‌ای
935
+ - ذخیره تاریخچه تمام کارها
936
+
937
+ **✨ کریستوفر همیشه آماده کمک به شماست!**
938
+ """)
939
 
940
  logger.info("🌟 راه‌اندازی رابط کاربری")
941
  interface.launch(
 
944
  show_error=True,
945
  share=False,
946
  debug=False,
947
+ max_threads=4,
948
+ show_tips=True,
949
+ enable_queue=True
950
  )
951
 
952
  except Exception as e:
953
  logger.error(f"❌ خطا در راه‌اندازی: {e}")
954
 
955
+ # رابط اضطراری ساده
956
  simple_interface = gr.Interface(
957
+ fn=lambda x, y, z: f"""⚠️ خطا در راه‌اندازی اصلی!
958
+
959
+ **درخواست شما:** {x}
960
+ **نوع وظیفه:** {y}
961
+ **زبان:** {z}
962
+
963
+ **پیام خطا:** {str(e)}
964
+
965
+ لطفاً صفحه را refresh کنید و دوباره تلاش کنید.
966
+
967
+ **کد نمونه بر��ی درخواست شما:**
968
+ ```{z.lower()}
969
+ # {x}
970
+ # TODO: کد مورد نیاز اینجا قرار می‌گیرد
971
+ ```""",
972
  inputs=[
973
  gr.Textbox(label="📝 درخواست", placeholder="درخواست خود را وارد کنید"),
974
  gr.Dropdown(choices=["تولید کد جدید"], value="تولید کد جدید", label="🎯 نوع وظیفه"),
975
  gr.Dropdown(choices=["Python"], value="Python", label="💾 زبان")
976
  ],
977
+ outputs=gr.Textbox(label="📤 پاسخ", lines=15),
978
  title="🤖 کریستوفر - حالت اضطراری",
979
+ description="مشکلی در بارگذاری رخ داده. این نسخه ساده است."
980
  )
981
  simple_interface.launch(server_name="0.0.0.0", server_port=7860)
982