FrostIce commited on
Commit
8ed172b
·
verified ·
1 Parent(s): 71f1554

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +127 -0
app.py ADDED
@@ -0,0 +1,127 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # app.py
2
+ import gradio as gr
3
+ from g4f.client import Client
4
+
5
+ client = Client()
6
+
7
+ # --- Функции для очистки ответов ---
8
+ import re
9
+ from typing import List, Tuple, Any
10
+
11
+ def strip_md_refs(text: str) -> str:
12
+ """
13
+ Удаляет из строки все конструкции вида [[N]](URL),
14
+ где N – произвольное число (может быть и несколько цифр).
15
+ Возвращает «чистый» текст без ссылок.
16
+ """
17
+ # Шаблон: [[ любые цифры ]]( любой URL )
18
+ pattern = r'\[\[\d+\]\]\([^\)]*\)'
19
+ return re.sub(pattern, '', text)
20
+
21
+ def strip_citations(text: str) -> str:
22
+ """
23
+ Удаляет из текста все строки вида:
24
+ > [0] … (ссылка)
25
+ [1] … (ссылка)
26
+ а также любые блоки, начинающиеся с символа '>' (цитаты).
27
+ Возвращает «чистый» текст без «концовки».
28
+ """
29
+ # 1️⃣ Убираем строки, начинающиеся с '>' (включая возможный пробел после него)
30
+ text = re.sub(r'^\s*>.*(?:\n|$)', '', text, flags=re.MULTILINE)
31
+
32
+ # 2️⃣ Удаляем строки вида '[0] https://…' (любое число в квадратных скобках)
33
+ text = re.sub(r'^\s*\[\d+\]\s*.+(?:\n|$)', '', text, flags=re.MULTILINE)
34
+
35
+ # 3️⃣ Убираем лишние пустые строки, оставшиеся после вырезания
36
+ text = re.sub(r'\n{2,}', '\n\n', text).strip()
37
+ return text
38
+
39
+ # --- Обработчик диалога ---
40
+ def respond(message, history, system_prompt):
41
+ # Используем пользовательский промт из интерфейса
42
+ messages = [{"role": "system", "content": system_prompt}]
43
+
44
+ # Добавляем историю диалога
45
+ for human, assistant in history:
46
+ messages.append({"role": "user", "content": human})
47
+ messages.append({"role": "assistant", "content": assistant})
48
+
49
+ # Добавляем текущее сообщение
50
+ messages.append({"role": "user", "content": message})
51
+
52
+ try:
53
+ # Убрана опция web_search
54
+ responsed = client.chat.completions.create(
55
+ model="deepseek-v3",
56
+ messages=messages,
57
+ temperature=0.8,
58
+ top_p=0.95,
59
+ max_tokens=581691,
60
+ presence_penalty=0.2,
61
+ frequency_penalty=0.1,
62
+ )
63
+ bot_message = strip_citations(f"{strip_md_refs(responsed.choices[0].message.content)}")
64
+
65
+ except Exception as e:
66
+ bot_message = f"Ошибка: {str(e)}"
67
+ return history + [[message, bot_message]]
68
+
69
+ # --- Интерфейс ---
70
+ with gr.Blocks(title="ESP Brain") as demo:
71
+ gr.Markdown("## ESP Brain - Настраиваемый ассистент")
72
+
73
+ # Поле для ввода системного промта
74
+ system_prompt_input = gr.Textbox(
75
+ label="Системный промт",
76
+ value=""" """,
77
+ lines=5,
78
+ max_lines=10,
79
+ placeholder="Введите системный промт для настройки поведения ассистента..."
80
+ )
81
+
82
+ chatbot = gr.Chatbot(
83
+ height=600,
84
+ )
85
+
86
+ with gr.Row():
87
+ txt = gr.Textbox(
88
+ placeholder="Напиши сообщение...",
89
+ show_label=False,
90
+ scale=8
91
+ )
92
+ submit_btn = gr.Button("Отправить", scale=2)
93
+
94
+ with gr.Row():
95
+ retry_btn = gr.Button("🔄 Повторить")
96
+ undo_btn = gr.Button("↩️ Отменить")
97
+ clear_btn = gr.Button("🗑️ Очистить")
98
+
99
+ # Логика
100
+ def submit_message(message, history, system_prompt):
101
+ return respond(message, history, system_prompt)
102
+
103
+ txt.submit(fn=submit_message, inputs=[txt, chatbot, system_prompt_input], outputs=chatbot)
104
+ submit_btn.click(fn=submit_message, inputs=[txt, chatbot, system_prompt_input], outputs=chatbot)
105
+
106
+ def retry_last(history, system_prompt):
107
+ if history:
108
+ last_user_msg = history[-1][0]
109
+ new_history = history[:-1]
110
+ return respond(last_user_msg, new_history, system_prompt)
111
+ return history
112
+
113
+ def undo_last(history):
114
+ return history[:-1]
115
+
116
+ retry_btn.click(fn=retry_last, inputs=[chatbot, system_prompt_input], outputs=chatbot, queue=False)
117
+ undo_btn.click(fn=undo_last, inputs=chatbot, outputs=chatbot, queue=False)
118
+ clear_btn.click(lambda: [], outputs=chatbot, queue=False)
119
+
120
+ # --- Запуск ---
121
+ if __name__ == "__main__":
122
+ demo.queue()
123
+ demo.launch(
124
+ share=True,
125
+ ssr_mode=False,
126
+ debug=True
127
+ )