Spaces:
Sleeping
Sleeping
Commit
·
bfbddc2
1
Parent(s):
de8770a
Initial commit
Browse files
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": "#"
|
| 23 |
-
"JavaScript": {"ext": "js", "comment": "//"
|
| 24 |
-
"Java": {"ext": "java", "comment": "//"
|
| 25 |
-
"C++": {"ext": "cpp", "comment": "//"
|
| 26 |
-
"C": {"ext": "c", "comment": "//"
|
| 27 |
-
"PHP": {"ext": "php", "comment": "//"
|
| 28 |
-
"Go": {"ext": "go", "comment": "//"
|
| 29 |
-
"Rust": {"ext": "rs", "comment": "//"
|
| 30 |
-
"HTML": {"ext": "html", "comment": "<!--"
|
| 31 |
-
"CSS": {"ext": "css", "comment": "/*"
|
| 32 |
}
|
| 33 |
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
logger.info("Setting up environment")
|
| 37 |
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 41 |
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 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 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
"microsoft/DialoGPT-small", # ~117M parameters
|
| 59 |
-
"gpt2" # ~124M parameters - fallback
|
| 60 |
-
]
|
| 61 |
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 96 |
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|
| 166 |
-
"""
|
|
|
|
| 167 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 168 |
lang_info = self.supported_languages.get(programming_language, self.supported_languages["Python"])
|
| 169 |
|
| 170 |
-
if
|
| 171 |
-
|
| 172 |
|
| 173 |
-
|
|
|
|
|
|
|
|
|
|
| 174 |
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 178 |
|
| 179 |
-
elif
|
| 180 |
-
|
| 181 |
|
| 182 |
-
|
| 183 |
-
|
|
|
|
|
|
|
| 184 |
|
| 185 |
-
|
| 186 |
-
|
| 187 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 188 |
|
| 189 |
-
elif
|
| 190 |
-
|
| 191 |
|
| 192 |
-
|
| 193 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 194 |
|
| 195 |
-
|
| 196 |
-
|
|
|
|
|
|
|
|
|
|
| 197 |
|
| 198 |
-
|
| 199 |
-
|
|
|
|
|
|
|
| 200 |
|
| 201 |
-
|
| 202 |
-
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 203 |
|
| 204 |
-
کد
|
| 205 |
```{programming_language.lower()}
|
| 206 |
-
|
| 207 |
-
|
| 208 |
-
elif task_type == "اضافه کردن قابلیت":
|
| 209 |
-
prompt = f"""شما یک برنامهنویس حرفهای هستید. به کد زیر قابلیت جدید اضافه کنید:
|
| 210 |
|
| 211 |
-
|
| 212 |
-
{user_input}
|
| 213 |
|
| 214 |
-
|
| 215 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 216 |
"""
|
| 217 |
-
|
| 218 |
-
|
| 219 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 220 |
|
| 221 |
-
|
| 222 |
-
|
|
|
|
|
|
|
| 223 |
|
| 224 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 225 |
"""
|
| 226 |
|
| 227 |
-
|
| 228 |
-
|
| 229 |
-
|
| 230 |
-
|
| 231 |
-
|
| 232 |
-
|
| 233 |
-
|
| 234 |
-
|
| 235 |
-
|
| 236 |
-
|
| 237 |
-
|
| 238 |
-
|
| 239 |
-
|
| 240 |
-
|
| 241 |
-
|
| 242 |
-
|
| 243 |
-
|
| 244 |
-
|
| 245 |
-
|
| 246 |
-
|
| 247 |
-
|
| 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 |
-
|
| 273 |
-
"Python": {
|
| 274 |
-
"تولید کد جدید": f"""{lang_info['comment']} کد Python برای: {user_input}
|
| 275 |
|
| 276 |
-
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
| 280 |
|
| 281 |
-
|
| 282 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 283 |
|
| 284 |
-
|
| 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 |
-
|
| 323 |
-
{lang_info['comment']} {user_input}
|
| 324 |
-
{lang_info['comment']} TODO: پیادهسازی منطق مورد نیاز
|
| 325 |
-
}}
|
| 326 |
|
| 327 |
-
|
| 328 |
-
|
|
|
|
|
|
|
| 329 |
|
| 330 |
-
|
| 331 |
-
|
| 332 |
-
-
|
| 333 |
-
- از
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
| 344 |
|
| 345 |
-
|
| 346 |
-
|
| 347 |
-
|
| 348 |
-
|
| 349 |
-
|
| 350 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 370 |
-
|
| 371 |
-
|
| 372 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 427 |
""")
|
| 428 |
|
| 429 |
with gr.Row():
|
| 430 |
with gr.Column(scale=2):
|
| 431 |
user_input = gr.Textbox(
|
| 432 |
-
label="📝 درخواست شما (به فارسی)",
|
| 433 |
-
placeholder="
|
| 434 |
-
|
| 435 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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=
|
| 455 |
label="💾 زبان برنامهنویسی",
|
| 456 |
-
value="Python"
|
|
|
|
| 457 |
)
|
| 458 |
|
| 459 |
-
|
|
|
|
|
|
|
| 460 |
|
| 461 |
with gr.Column(scale=3):
|
| 462 |
output = gr.Textbox(
|
| 463 |
label="📤 پاسخ کریستوفر",
|
| 464 |
-
lines=
|
| 465 |
-
max_lines=
|
| 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 |
-
["
|
|
|
|
|
|
|
| 477 |
["", "نمایش تاریخچه", ""]
|
| 478 |
],
|
| 479 |
-
inputs=[user_input, task_type, programming_language]
|
|
|
|
| 480 |
)
|
| 481 |
|
| 482 |
-
# اتصال
|
| 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"⚠️ خطا در
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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=
|
| 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 |
|