Spaces:
Sleeping
Sleeping
Commit
·
f2f02ad
1
Parent(s):
bfbddc2
Initial commit
Browse files
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 |
-
# تنظیم
|
| 10 |
-
logging.basicConfig(level=logging.INFO
|
| 11 |
logger = logging.getLogger(__name__)
|
| 12 |
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 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 |
-
|
| 906 |
-
|
| 907 |
-
|
| 908 |
-
|
| 909 |
-
|
| 910 |
-
|
| 911 |
-
|
| 912 |
-
|
| 913 |
-
|
| 914 |
-
|
| 915 |
-
|
| 916 |
-
|
| 917 |
-
|
| 918 |
-
|
| 919 |
-
|
| 920 |
-
|
| 921 |
-
|
| 922 |
-
|
| 923 |
-
|
| 924 |
-
|
| 925 |
-
|
| 926 |
-
|
| 927 |
-
|
| 928 |
-
|
| 929 |
-
|
| 930 |
-
|
| 931 |
-
|
| 932 |
-
|
| 933 |
-
|
| 934 |
-
|
| 935 |
-
|
| 936 |
-
|
| 937 |
-
|
| 938 |
-
|
| 939 |
-
|
| 940 |
-
|
| 941 |
-
|
| 942 |
-
|
| 943 |
-
|
| 944 |
-
|
| 945 |
-
|
| 946 |
-
|
| 947 |
-
|
| 948 |
-
|
| 949 |
-
|
| 950 |
-
|
| 951 |
-
|
| 952 |
-
|
| 953 |
-
|
| 954 |
-
|
| 955 |
-
|
| 956 |
-
|
| 957 |
-
|
| 958 |
-
|
| 959 |
-
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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)
|