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

Initial commit

Browse files
Files changed (1) hide show
  1. app.py +103 -974
app.py CHANGED
@@ -2,983 +2,112 @@ import os
2
  import logging
3
  import sqlite3
4
  from datetime import datetime
5
- import gradio as gr
6
- import gc
7
  import torch
 
 
 
8
 
9
- # تنظیم logging
10
- logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
11
  logger = logging.getLogger(__name__)
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
- """ایجاد دیتابیس"""
447
- logger.info("Initializing database")
448
- try:
449
- with sqlite3.connect(self.db_path) as conn:
450
- cursor = conn.cursor()
451
- cursor.execute('''
452
- CREATE TABLE IF NOT EXISTS conversations (
453
- id INTEGER PRIMARY KEY AUTOINCREMENT,
454
- user_input TEXT NOT NULL,
455
- task_type TEXT NOT NULL,
456
- programming_language TEXT,
457
- generated_code TEXT,
458
- timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
459
- )
460
- ''')
461
- conn.commit()
462
- logger.info("Database initialized successfully")
463
- except Exception as e:
464
- logger.error(f"Database initialization error: {e}")
465
-
466
- def save_conversation(self, user_input, task_type, language, response):
467
- """ذخیره مکالمه در دیتابیس"""
468
- try:
469
- with sqlite3.connect(self.db_path) as conn:
470
- cursor = conn.cursor()
471
- cursor.execute('''
472
- INSERT INTO conversations (user_input, task_type, programming_language, generated_code)
473
- VALUES (?, ?, ?, ?)
474
- ''', (user_input, task_type, language, response))
475
- conn.commit()
476
- except Exception as e:
477
- logger.error(f"Save conversation error: {e}")
478
-
479
- def get_history(self, limit=10):
480
- """دریافت تاریخچه مکالمات"""
481
- try:
482
- with sqlite3.connect(self.db_path) as conn:
483
- cursor = conn.cursor()
484
- cursor.execute('''
485
- SELECT user_input, task_type, programming_language, generated_code, timestamp
486
- FROM conversations
487
- ORDER BY timestamp DESC
488
- LIMIT ?
489
- ''', (limit,))
490
-
491
- records = cursor.fetchall()
492
- if not records:
493
- return "📋 هیچ تاریخچه‌ای یافت نشد."
494
-
495
- history_text = "📋 **تاریخچه درخواست‌های اخیر:**\n\n"
496
- for i, record in enumerate(records, 1):
497
- user_input, task_type, lang, code, timestamp = record
498
- history_text += f"**{i}. {timestamp.split('.')[0]}**\n"
499
- history_text += f"🔹 **نوع وظیفه:** {task_type}\n"
500
- history_text += f"🔹 **زبان:** {lang}\n"
501
- history_text += f"🔹 **درخواست:** {user_input[:100]}{'...' if len(user_input) > 100 else ''}\n"
502
- history_text += "─" * 50 + "\n\n"
503
-
504
- return history_text
505
-
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
- """پردازش درخواست کاربر"""
732
-
733
- # بررسی ورودی
734
- if not user_input or not user_input.strip():
735
- return "⚠️ لطفاً متن درخواست خود را وارد کنید."
736
-
737
- # نمایش تاریخچه
738
- if task_type == "نمایش تاریخچه":
739
- return self.get_history()
740
-
741
- # تنظیم زبان پیش‌فرض
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)
762
-
763
- return 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()
771
-
772
- def gradio_interface(user_input, task_type, programming_language):
773
- """رابط Gradio"""
774
- return christopher.process_request(user_input, task_type, programming_language)
775
-
776
- def main():
777
- """تابع اصلی برنامه"""
778
- try:
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():
836
- task_type = gr.Dropdown(
837
- choices=[
838
- "تولید کد جدید",
839
- "رفع اشکال کد",
840
- "توضیح کد",
841
- "بهبود کد",
842
- "اضافه کردن قابلیت",
843
- "تحلیل کد",
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(
942
- server_name="0.0.0.0",
943
- server_port=7860,
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
-
983
  if __name__ == "__main__":
984
- main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  import logging
3
  import sqlite3
4
  from datetime import datetime
 
 
5
  import torch
6
+ import gradio as gr
7
+ from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
8
+ from huggingface_hub import login
9
 
10
+ # تنظیم لاگ
11
+ logging.basicConfig(level=logging.INFO)
12
  logger = logging.getLogger(__name__)
13
 
14
+ # تنظیم توکن HuggingFace
15
+ hf_token = os.getenv("HF_TOKEN", "")
16
+ if not hf_token:
17
+ raise ValueError("❗ لطفاً HF_TOKEN را در محیط تنظیم کن.")
18
+ login(token=hf_token)
19
+ logger.info(" Hugging Face لاگین موفق.")
20
+
21
+ # بارگذاری مدل Qwen
22
+ model_id = "Qwen/Qwen1.5-1.8B" # می‌تونی "Qwen1.5-4B" هم بذاری اگر رم بیشتری داری
23
+ logger.info(f"📦 در حال بارگذاری مدل {model_id}")
24
+ tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
25
+ model = AutoModelForCausalLM.from_pretrained(model_id, trust_remote_code=True, torch_dtype=torch.float32)
26
+ generator = pipeline("text-generation", model=model, tokenizer=tokenizer, max_length=512)
27
+
28
+ # راه‌اندازی دیتابیس SQLite
29
+ def init_db():
30
+ with sqlite3.connect("chris.db") as conn:
31
+ cursor = conn.cursor()
32
+ cursor.execute("""
33
+ CREATE TABLE IF NOT EXISTS CHRIS (
34
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
35
+ user_input TEXT,
36
+ task_type TEXT,
37
+ prompt TEXT,
38
+ response TEXT,
39
+ timestamp TEXT
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  )
41
+ """)
42
+ conn.commit()
43
+ logger.info("📁 دیتابیس راه‌اندازی شد.")
44
+
45
+ def save_to_memory(user_input, task_type, prompt, response):
46
+ with sqlite3.connect("chris.db") as conn:
47
+ cursor = conn.cursor()
48
+ cursor.execute("""
49
+ INSERT INTO CHRIS (user_input, task_type, prompt, response, timestamp)
50
+ VALUES (?, ?, ?, ?, ?)
51
+ """, (user_input, task_type, prompt, response, datetime.now().isoformat()))
52
+ conn.commit()
53
+
54
+ # ساخت پرامپت از نوع ورودی
55
+ def build_prompt(task_type, user_input, language):
56
+ if task_type == "تولید کد":
57
+ return f"لطفاً یک کد کامل و دقیق در زبان {language} برای حل مسئله زیر بنویس:\n{user_input}"
58
+ elif task_type == "توضیح کد":
59
+ return f"کد زیر به زبان {language} نوشته شده. آن را به فارسی و دقیق توضیح بده:\n{user_input}"
60
+ elif task_type == "دیباگ کد":
61
+ return f"کد زیر در زبان {language} دارای خطاست. لطفاً آن را اصلاح کن و توضیح بده:\n{user_input}"
62
+ elif task_type == "پرومپت‌سازی":
63
+ return f"با توجه به توضیح زیر، یک پرامپت مناسب برای تولید کد در زبان {language} بساز:\n{user_input}"
64
+ else:
65
+ return user_input
66
+
67
+ # تولید پاسخ از مدل
68
+ def generate_response(prompt):
69
+ output = generator(prompt, num_return_sequences=1, do_sample=True)[0]['generated_text']
70
+ return output[len(prompt):].strip()
71
+
72
+ # عملکرد اصلی کریستوفر
73
+ def christopher(task_type, user_input, language):
74
+ prompt = build_prompt(task_type, user_input, language)
75
+ response = generate_response(prompt)
76
+ save_to_memory(user_input, task_type, prompt, response)
77
+ return response
78
+
79
+ # نمایش تاریخچه
80
+ def show_history():
81
+ with sqlite3.connect("chris.db") as conn:
82
+ cursor = conn.cursor()
83
+ cursor.execute("SELECT user_input, task_type, prompt, response, timestamp FROM CHRIS ORDER BY id DESC LIMIT 10")
84
+ records = cursor.fetchall()
85
+ return "\n\n".join([
86
+ f"{r[4]} | [{r[1]}]\n📌 ورودی: {r[0]}\n🧠 پرامپت:\n{r[2]}\n💡 پاسخ:\n{r[3]}"
87
+ for r in records
88
+ ])
89
+
90
+ # رابط گرافیکی Gradio
91
+ def gradio_ui(user_input, task_type, language):
92
+ if task_type == "نمایش تاریخچه":
93
+ return show_history()
94
+ return christopher(task_type, user_input, language)
95
+
96
+ # اجرای برنامه
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97
  if __name__ == "__main__":
98
+ init_db()
99
+ logger.info("🚀 اجرای رابط گرافیکی کریستوفر...")
100
+ gr.Interface(
101
+ fn=gradio_ui,
102
+ inputs=[
103
+ gr.Textbox(label="📝 ورودی یا کد شما"),
104
+ gr.Dropdown(
105
+ ["تولید کد", "توضیح کد", "دیباگ کد", "پرومپت‌سازی", "نمایش تاریخچه"],
106
+ label="🛠️ نوع عملکرد"
107
+ ),
108
+ gr.Textbox(label="🧑‍💻 زبان برنامه‌نویسی (مثل Python یا JavaScript)")
109
+ ],
110
+ outputs=gr.Textbox(label="📤 پاسخ کریستوفر"),
111
+ title="کریستوفر - دستیار هوشمند برنامه‌نویسی",
112
+ description="با ورودی فارسی کد بساز، دیباگ کن، توضیح بده یا تاریخچه رو ببین. مدل: Qwen1.5"
113
+ ).launch(server_name="0.0.0.0", server_port=7860)