Paulwalker4884 commited on
Commit
8aec53f
·
1 Parent(s): 578030a

Initial commit

Browse files
Files changed (2) hide show
  1. app.py +225 -51
  2. requirements.txt +0 -1
app.py CHANGED
@@ -2,7 +2,7 @@ import os
2
  import logging
3
  import sqlite3
4
  from datetime import datetime
5
- import streamlit as st
6
  from openai import OpenAI
7
 
8
  # تنظیم logging
@@ -36,7 +36,7 @@ try:
36
  "X-Title": "Christopher Streamlit App"
37
  }
38
  )
39
- logger.info("✅ Initialized OpenAI client and API key validated for model qwen/qwen3-coder:free")
40
  except Exception as e:
41
  logger.error(f"❌ Failed to initialize OpenAI client or validate API key: {e}")
42
  raise
@@ -82,20 +82,20 @@ def get_history():
82
  try:
83
  with sqlite3.connect("chris.db") as conn:
84
  cursor = conn.cursor()
85
- cursor.execute("SELECT id, user_input, language, generated_code, prompt_used, timestamp, success FROM code_history ORDER BY timestamp DESC")
86
  rows = cursor.fetchall()
87
  if not rows:
88
  return "هیچ تاریخچه‌ای موجود نیست."
89
- history_text = "=== تاریخچه ===\n"
 
90
  for row in rows:
91
- history_text += f"ID: {row[0]}\n"
92
- history_text += f"ورودی کاربر: {row[1]}\n"
93
- history_text += f"زبان: {row[2]}\n"
94
- history_text += f"پرامپت: {row[4] or 'بدون پرامپت'}\n"
95
- history_text += f"کد تولیدشده: {row[3]}\n"
96
- history_text += f"زمان: {row[5]}\n"
97
- history_text += f"موفقیت: {'بله' if row[6] else 'خیر'}\n"
98
- history_text += "-" * 50 + "\n"
99
  return history_text
100
  except Exception as e:
101
  logger.error(f"❌ History retrieval error: {e}")
@@ -108,10 +108,11 @@ def generate_code(user_input, language):
108
  # پرامپت مستقیماً ورودی کاربر با زبان
109
  prompt = f"{user_input} in {language}"
110
  logger.info(f"Generated prompt: {prompt}")
 
111
  response = client.chat.completions.create(
112
  model="qwen/qwen3-coder:free",
113
  messages=[
114
- {"role": "system", "content": f"You are a coding assistant that generates complete and well-explained code in {language}."},
115
  {"role": "user", "content": prompt}
116
  ],
117
  max_tokens=1024,
@@ -119,10 +120,11 @@ def generate_code(user_input, language):
119
  top_p=0.8,
120
  extra_headers={
121
  "HTTP-Referer": "https://huggingface.co/spaces",
122
- "X-Title": "Christopher Streamlit App"
123
  },
124
  extra_body={}
125
  )
 
126
  code_output = response.choices[0].message.content.strip()
127
 
128
  # استخراج کد از خروجی (در صورت وجود بلاک کد)
@@ -137,59 +139,231 @@ def generate_code(user_input, language):
137
  code.append(line)
138
 
139
  final_code = "\n".join(code).strip() if code else code_output
 
140
  if not final_code:
141
  logger.warning("Generated code is empty")
142
  final_code = "خطا: کد تولیدشده خالی است"
143
  save_to_memory(user_input, language, prompt, final_code, success=False)
144
- return prompt, final_code
145
 
146
  logger.info(f"Generated code: {final_code}")
147
  save_to_memory(user_input, language, prompt, final_code)
148
- return prompt, final_code
 
149
  except Exception as e:
150
  logger.error(f"❌ Code generation error: {e}")
151
- save_to_memory(user_input, language, prompt, str(e), success=False)
152
- return prompt, f"خطا در تولید کد: {e}"
 
153
 
154
- # تابع اصلی
155
- def christopher(user_input, language, show_history):
156
  logger.info(f"Processing input: {user_input}, language: {language}, show_history: {show_history}")
 
 
 
 
157
  try:
158
- prompt, generated_code = generate_code(user_input, language)
159
- history = get_history() if show_history else ""
 
 
 
 
 
 
160
  return generated_code, history
 
161
  except Exception as e:
162
  logger.error(f"❌ Processing error: {e}")
 
163
  history = get_history() if show_history else ""
164
- return f"خطا: {e}", history
165
 
166
- # Initialize database and start application
167
- try:
168
- init_db()
169
- logger.info("🚀 Launching Streamlit interface")
170
-
171
- # Streamlit UI
172
- st.title("کریستوفر - دستیار کدنویسی")
173
- st.write("توضیح برنامه را به فارسی وارد کنید و زبان برنامه‌نویسی را انتخاب کنید. برای نمایش تاریخچه، گزینه مربوطه را تیک بزنید.")
 
 
 
 
 
 
 
 
 
 
 
 
 
174
 
175
- user_input = st.text_area("توضیح برنامه به فارسی (مثال: یک تابع اعداد زوج)", height=100)
176
- language = st.selectbox("زبان برنامه‌نویسی", ["Python", "JavaScript", "Java", "C++"])
177
- show_history = st.checkbox("نمایش تاریخچه درخواست‌ها")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
178
 
179
- if st.button("تولید کد"):
180
- if user_input.strip():
181
- with st.spinner("در حال تولید کد..."):
182
- generated_code, history = christopher(user_input, language, show_history)
183
-
184
- st.subheader("کد تولیدشده:")
185
- st.code(generated_code, language=language.lower())
186
-
187
- if show_history and history:
188
- st.subheader("تاریخچه درخواست‌ها:")
189
- st.text_area("تاریخچه", value=history, height=300)
190
- else:
191
- st.error("لطفاً توضیح برنامه را وارد کنید.")
192
-
193
- except Exception as e:
194
- logger.error(f"❌ Startup error: {e}")
195
- st.error(f"خطا در راه‌اندازی: {e}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  import logging
3
  import sqlite3
4
  from datetime import datetime
5
+ import gradio as gr
6
  from openai import OpenAI
7
 
8
  # تنظیم logging
 
36
  "X-Title": "Christopher Streamlit App"
37
  }
38
  )
39
+ logger.info("✅ Initialized OpenAI client and API key validated")
40
  except Exception as e:
41
  logger.error(f"❌ Failed to initialize OpenAI client or validate API key: {e}")
42
  raise
 
82
  try:
83
  with sqlite3.connect("chris.db") as conn:
84
  cursor = conn.cursor()
85
+ cursor.execute("SELECT id, user_input, language, generated_code, prompt_used, timestamp, success FROM code_history ORDER BY timestamp DESC LIMIT 10")
86
  rows = cursor.fetchall()
87
  if not rows:
88
  return "هیچ تاریخچه‌ای موجود نیست."
89
+
90
+ history_text = "=== آخرین 10 درخواست ===\n\n"
91
  for row in rows:
92
+ history_text += f"🆔 شناسه: {row[0]}\n"
93
+ history_text += f"📝 درخواست: {row[1]}\n"
94
+ history_text += f"💻 زبان: {row[2]}\n"
95
+ history_text += f" زمان: {row[5]}\n"
96
+ history_text += f" وضعیت: {'موفق' if row[6] else 'ناموفق'}\n"
97
+ history_text += f"📋 کد:\n```{row[2].lower()}\n{row[3][:200]}{'...' if len(row[3]) > 200 else ''}\n```\n"
98
+ history_text += "-" * 80 + "\n\n"
 
99
  return history_text
100
  except Exception as e:
101
  logger.error(f"❌ History retrieval error: {e}")
 
108
  # پرامپت مستقیماً ورودی کاربر با زبان
109
  prompt = f"{user_input} in {language}"
110
  logger.info(f"Generated prompt: {prompt}")
111
+
112
  response = client.chat.completions.create(
113
  model="qwen/qwen3-coder:free",
114
  messages=[
115
+ {"role": "system", "content": f"You are a coding assistant that generates complete and well-explained code in {language}. Always provide clean, working code with comments in Persian when needed."},
116
  {"role": "user", "content": prompt}
117
  ],
118
  max_tokens=1024,
 
120
  top_p=0.8,
121
  extra_headers={
122
  "HTTP-Referer": "https://huggingface.co/spaces",
123
+ "X-Title": "Christopher Gradio App"
124
  },
125
  extra_body={}
126
  )
127
+
128
  code_output = response.choices[0].message.content.strip()
129
 
130
  # استخراج کد از خروجی (در صورت وجود بلاک کد)
 
139
  code.append(line)
140
 
141
  final_code = "\n".join(code).strip() if code else code_output
142
+
143
  if not final_code:
144
  logger.warning("Generated code is empty")
145
  final_code = "خطا: کد تولیدشده خالی است"
146
  save_to_memory(user_input, language, prompt, final_code, success=False)
147
+ return final_code
148
 
149
  logger.info(f"Generated code: {final_code}")
150
  save_to_memory(user_input, language, prompt, final_code)
151
+ return final_code
152
+
153
  except Exception as e:
154
  logger.error(f"❌ Code generation error: {e}")
155
+ error_msg = f"خطا در تولید کد: {e}"
156
+ save_to_memory(user_input, language, prompt, error_msg, success=False)
157
+ return error_msg
158
 
159
+ # تابع اصلی برای Gradio
160
+ def christopher_interface(user_input, language, show_history):
161
  logger.info(f"Processing input: {user_input}, language: {language}, show_history: {show_history}")
162
+
163
+ if not user_input.strip():
164
+ return "❌ لطفاً توضیح برنامه را وارد کنید.", ""
165
+
166
  try:
167
+ # تولید کد
168
+ generated_code = generate_code(user_input, language)
169
+
170
+ # دریافت تاریخچه در صورت درخواست
171
+ history = ""
172
+ if show_history:
173
+ history = get_history()
174
+
175
  return generated_code, history
176
+
177
  except Exception as e:
178
  logger.error(f"❌ Processing error: {e}")
179
+ error_msg = f"خطا: {e}"
180
  history = get_history() if show_history else ""
181
+ return error_msg, history
182
 
183
+ # پاک کردن تاریخچه
184
+ def clear_history():
185
+ try:
186
+ with sqlite3.connect("chris.db") as conn:
187
+ cursor = conn.cursor()
188
+ cursor.execute("DELETE FROM code_history")
189
+ conn.commit()
190
+ logger.info(" History cleared")
191
+ return "تاریخچه با موفقیت پاک شد."
192
+ except Exception as e:
193
+ logger.error(f"❌ Clear history error: {e}")
194
+ return f"خطا در پاک کردن تاریخچه: {e}"
195
+
196
+ # ایجاد رابط کاربری Gradio
197
+ def create_interface():
198
+ # تم سفارشی
199
+ theme = gr.themes.Soft(
200
+ primary_hue="blue",
201
+ secondary_hue="gray",
202
+ neutral_hue="slate",
203
+ )
204
 
205
+ with gr.Blocks(
206
+ theme=theme,
207
+ title="کریستوفر - دستیار کدنویسی",
208
+ css="""
209
+ .main-header {
210
+ text-align: center;
211
+ background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);
212
+ color: white;
213
+ padding: 20px;
214
+ border-radius: 10px;
215
+ margin-bottom: 20px;
216
+ }
217
+ .code-output {
218
+ direction: ltr;
219
+ text-align: left;
220
+ }
221
+ """
222
+ ) as interface:
223
+
224
+ # هدر
225
+ gr.HTML("""
226
+ <div class="main-header">
227
+ <h1>🤖 کریستوفر - دستیار کدنویسی</h1>
228
+ <p>با هوش مصنوعی کد خود را تولید کنید</p>
229
+ </div>
230
+ """)
231
+
232
+ with gr.Row():
233
+ with gr.Column(scale=2):
234
+ # ورودی‌ها
235
+ user_input = gr.Textbox(
236
+ label="📝 توضیح برنامه به فارسی",
237
+ placeholder="مثال: یک برنامه برای محاسبه فاکتوریل عدد بنویس",
238
+ lines=3,
239
+ rtl=True
240
+ )
241
+
242
+ with gr.Row():
243
+ language = gr.Dropdown(
244
+ choices=["Python", "JavaScript", "Java", "C++", "C#", "Go", "Rust", "PHP"],
245
+ value="Python",
246
+ label="💻 زبان برنامه‌نویسی",
247
+ interactive=True
248
+ )
249
+
250
+ show_history = gr.Checkbox(
251
+ label="📋 نمایش تاریخچه",
252
+ value=False
253
+ )
254
+
255
+ with gr.Row():
256
+ generate_btn = gr.Button("🚀 تولید کد", variant="primary", size="lg")
257
+ clear_btn = gr.Button("🗑️ پاک کردن تاریخچه", variant="secondary")
258
+
259
+ with gr.Column(scale=3):
260
+ # خروجی‌ها
261
+ generated_code = gr.Code(
262
+ label="💡 کد تولیدشده",
263
+ language="python",
264
+ lines=20,
265
+ elem_classes=["code-output"]
266
+ )
267
+
268
+ # تاریخچه
269
+ with gr.Row():
270
+ history_output = gr.Textbox(
271
+ label="📚 تاریخچه درخواست‌ها",
272
+ lines=10,
273
+ max_lines=15,
274
+ visible=False,
275
+ rtl=True
276
+ )
277
+
278
+ # رویدادها
279
+ def update_code_language(lang):
280
+ return gr.Code(language=lang.lower() if lang.lower() in ["python", "javascript", "java", "cpp", "go", "rust", "php"] else "text")
281
+
282
+ def handle_generate(user_input, language, show_history):
283
+ code, history = christopher_interface(user_input, language, show_history)
284
+ return (
285
+ code,
286
+ gr.Textbox(value=history, visible=bool(history.strip())),
287
+ gr.Code(language=language.lower() if language.lower() in ["python", "javascript", "java", "cpp", "go", "rust", "php"] else "text")
288
+ )
289
+
290
+ def handle_clear():
291
+ result = clear_history()
292
+ return gr.Textbox(value="", visible=False), result
293
+
294
+ # اتصال رویدادها
295
+ language.change(
296
+ fn=update_code_language,
297
+ inputs=[language],
298
+ outputs=[generated_code]
299
+ )
300
+
301
+ generate_btn.click(
302
+ fn=handle_generate,
303
+ inputs=[user_input, language, show_history],
304
+ outputs=[generated_code, history_output, generated_code]
305
+ )
306
+
307
+ clear_btn.click(
308
+ fn=handle_clear,
309
+ outputs=[history_output, gr.Textbox(visible=False)]
310
+ ).then(
311
+ fn=lambda: "تاریخچه پاک شد",
312
+ outputs=gr.Textbox(visible=True)
313
+ )
314
+
315
+ # نمونه‌ها
316
+ gr.Examples(
317
+ examples=[
318
+ ["یک برنامه برای محاسبه فاکتوریل عدد بنویس", "Python", False],
319
+ ["یک تابع برای مرتب کردن آرایه بنویس", "JavaScript", False],
320
+ ["یک کلاس برای مدیریت لیست دانشجو بنویس", "Java", False],
321
+ ["یک برنامه برای پیدا کردن اعداد اول بنویس", "C++", False],
322
+ ],
323
+ inputs=[user_input, language, show_history],
324
+ )
325
+
326
+ # راهنما
327
+ gr.HTML("""
328
+ <div style="margin-top: 20px; padding: 15px; background-color: #f0f8ff; border-radius: 10px; border-left: 4px solid #007bff;">
329
+ <h3>🔍 راهنمای استفاده:</h3>
330
+ <ul style="text-align: right; direction: rtl;">
331
+ <li>توضیح دقیق و واضح از برنامه مورد نظر خود ارائه دهید</li>
332
+ <li>زبان برنامه‌نویسی مناسب را انتخاب کنید</li>
333
+ <li>برای مشاهده درخواست‌های قبلی، گزینه "نمایش تاریخچه" را فعال کنید</li>
334
+ <li>کد تولیدشده را کپی کرده و در محیط توسعه خود استفاده کنید</li>
335
+ </ul>
336
+ </div>
337
+ """)
338
 
339
+ return interface
340
+
341
+ # راه‌اندازی برنامه
342
+ def main():
343
+ try:
344
+ # مقداردهی اولیه دیتابیس
345
+ init_db()
346
+ logger.info("🚀 Christopher Gradio Interface Started")
347
+
348
+ # ایجاد و راه‌اندازی رابط کاربری
349
+ interface = create_interface()
350
+
351
+ # راه‌اندازی سرور
352
+ interface.launch(
353
+ server_name="0.0.0.0",
354
+ server_port=7860,
355
+ share=True,
356
+ show_error=True,
357
+ favicon_path=None,
358
+ auth=None, # می‌توانید اینجا احراز هویت اضافه کنید
359
+ show_tips=True,
360
+ enable_queue=True,
361
+ max_threads=10
362
+ )
363
+
364
+ except Exception as e:
365
+ logger.error(f"❌ Startup error: {e}")
366
+ print(f"❌ خطا در راه‌اندازی: {e}")
367
+
368
+ if __name__ == "__main__":
369
+ main()
requirements.txt CHANGED
@@ -11,4 +11,3 @@ transformers
11
  accelerate
12
  gradio
13
  openai
14
- streamlit
 
11
  accelerate
12
  gradio
13
  openai