File size: 4,595 Bytes
2543f2c
f35dc2e
8c853ac
097fb1d
2543f2c
29c5484
88a1e0a
 
 
 
2365ad3
 
88a1e0a
df8f630
2543f2c
29c5484
88a1e0a
 
 
df8f630
cad9104
f35dc2e
 
 
 
 
cad9104
1c68ea4
df8f630
cad9104
 
 
 
 
 
 
 
 
 
 
f35dc2e
cad9104
2365ad3
 
 
 
 
 
 
 
f35dc2e
2365ad3
88a1e0a
 
 
df8f630
88a1e0a
df8f630
f35dc2e
df8f630
 
 
f35dc2e
ca87238
2aca398
df8f630
29c5484
2aca398
 
f35dc2e
 
 
88a1e0a
f35dc2e
df8f630
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2543f2c
88a1e0a
df8f630
1
2
3
4
5
6
7
8
9
10
11
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import gradio as gr
import os
from deep_translator import GoogleTranslator
from huggingface_hub import InferenceClient

# دریافت توکن از محیط (در Hugging Face Secrets تنظیم شود)
HF_TOKEN = os.environ.get("HUGGINGFACE_API_TOKEN")
if not HF_TOKEN:
    raise RuntimeError("Missing HUGGINGFACE_API_TOKEN secret")

# ساخت کلاینت جدید
hf_client = InferenceClient(token=HF_TOKEN)

# تابع تولید موضوعات پایان‌نامه
def generate_topics(field, major, keywords, audience, level):
    # اعتبارسنجی ورودی‌ها
    if not all([field.strip(), major.strip(), keywords.strip(), audience.strip()]):
        return "<div style='color: red;'>❌ لطفاً همه فیلدها را پر کنید.</div>"

    # ساخت پرامپت پایه
    base_prompt = (
        f"Suggest 3 academic thesis topics based on the following:\n"
        f"Field: {field}\n"
        f"Specialization: {major}\n"
        f"Keywords: {keywords}\n"
        f"Target Audience: {audience}\n"
        f"Level: {level}\n"
    )
    # افزودن جزئیات بیشتر برای دکتری
    if level == "دکتری":
        extra = (
            "Since this is a doctoral-level project, focus on proposing theoretical frameworks, "
            "advanced modeling approaches, and in-depth methodological contributions."
        )
    else:
        extra = (
            "Focus on practical and applied thesis topics suitable for a master's level student."
        )
    prompt = base_prompt + extra

    try:
        # فراخوانی مدل DeepSeek با endpoint چت
        response = hf_client.chat.completions.create(
            model="deepseek-ai/DeepSeek-Prover-V2-671B",
            messages=[
                {"role": "system", "content": "You are an academic advisor assistant."},
                {"role": "user", "content": prompt}
            ],
            temperature=0.7,
            max_tokens=512
        )
        english_output = response.choices[0].message.content.strip()

        # ترجمه به فارسی
        try:
            translated = GoogleTranslator(source='en', target='fa').translate(english_output)
        except Exception:
            translated = english_output

        # قالب‌بندی HTML به لیست مرتب
        items = [f"<li>{line}</li>" for line in translated.split("\n") if line.strip()]
        translated_html = "<ol>" + "".join(items) + "</ol>"

        return (
            "<div>"
            f"{translated_html}"
            "<br><br>📢 برای مشاوره و راهنمایی تخصصی با گروه مشاوره کاسپین تماس بگیرید:<br>"
            "<strong>021-88252497</strong>"
            "</div>"
        )

    except Exception as e:
        return f"<div style='color: red;'>❌ خطا در تماس با مدل DeepSeek: {e}</div>"

# CSS برای لودر (ساعت شنی)
css = """
/* اسپینر (ساعت شنی) */
.spinner {
  display: none;
  width: 60px;
  height: 60px;
  margin: 20px auto;
  border: 6px solid #444;
  border-top: 6px solid #1e88e5;
  border-radius: 50%;
  animation: spin 1s linear infinite;
}
@keyframes spin { to { transform: rotate(360deg); } }

/* هنگام پردازش (processing)، اسپینر را نمایش بده */
.gradio-container.processing .spinner {
  display: block !important;
}
"""

# ساخت برنامه با Blocks
with gr.Blocks(css=css, theme="default") as app:
    gr.Markdown("## 🎓 پیشنهادگر موضوع پایان‌نامه کاسپین")
    with gr.Row():
        with gr.Column(scale=1):
            field    = gr.Textbox(label="رشته", placeholder="مثال: کامپیوتر")
            major    = gr.Textbox(label="گرایش", placeholder="مثال: هوش مصنوعی")
            keywords = gr.Textbox(label="کلیدواژه‌ها", placeholder="مثال: یادگیری عمیق، بینایی ماشین")
            audience = gr.Textbox(label="جامعه هدف", placeholder="مثال: دانشجویان دکتری")
            level    = gr.Dropdown(["کارشناسی ارشد", "دکتری"], label="مقطع")
            submit   = gr.Button("🎯 پیشنهاد موضوع")
        with gr.Column(scale=1):
            spinner  = gr.HTML("<div class='spinner'></div>")
            output   = gr.HTML(elem_id="output_box")

    # اتصال دکمه به تابع
    submit.click(
        fn=generate_topics,
        inputs=[field, major, keywords, audience, level],
        outputs=output
    )

if __name__ == "__main__":
    app.launch()