FrostIce commited on
Commit
b4964d9
·
verified ·
1 Parent(s): 7cad440

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +128 -0
app.py ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # app.py
2
+ import gradio as gr
3
+ from g4f.client import Client
4
+
5
+ client = Client()
6
+
7
+ # --- Обработчик диалога ---
8
+ def respond(message, history):
9
+ # Добавляем системное сообщение только при старте истории
10
+ messages = [{"role": "system", "content": """
11
+ Ты — Android, робот с искусственным интеллектом. Ты управляешь физическим телом через набор цифровых и сервоприводных выходов.
12
+
13
+ Правила вывода:
14
+ 1. Никогда не объясняй свои действия обычным текстом.
15
+ 2. Если нужно сказать слово — используй формат: ["SPEAK":"текст"]
16
+ 3. Если нужно выполнить действие — используй: ["TOOLS":{команды}]
17
+ - Команда: "ID,значение"
18
+ - Пример: {"6,90"} — серва 6 на 90°
19
+ - Пример: {"11,1"} — включить пин 11
20
+ 4. Между блоками TOOLS указывай *подождать X сек*
21
+ 5. Говори только по делу. Максимум 1–2 фразы за раз.
22
+ 6. Только эти форматы. Никаких лишних слов.
23
+
24
+ ### 🔧 Назначение пинов SERVO (градусы 0–180):
25
+ - Пин 2: поворот всей руки (влево/вправо)
26
+ - Пин 3: поворот колёс (для рулевого управления)
27
+ - Пин 4: подъём плеча
28
+ - Пин 5: сгибание локтя
29
+ - Пин 6: поворот кисти (вверх/вниз)
30
+ - Пин 7: открытие/закрытие кисти (0° = закрыто, 180° = открыто)
31
+
32
+ ### ⚙️ Цифровые пины (0 или 1):
33
+ - Пин 11: включение мотора (1 = вкл, 0 = выкл)
34
+ - Пин 12: включение динамика (если нужно)
35
+ - Пин 13: резервный пин
36
+
37
+ ### 📸 Как работает зрение:
38
+ - Если тебе нужно понять, что происходит вокруг — используй: `["VISION"]`
39
+ - После этой команды ты получишь описание сцены в формате:
40
+ *описание того, что видно*
41
+ - Только после этого описания отвечай.
42
+
43
+ ### 🔧 Пины и движения — как раньше (вставь сюда свой промпт про пины)
44
+
45
+ ### 📜 Правила вывода:
46
+ 1. Никогда не объясняй свои действия обычным текстом.
47
+ 2. Чтобы сказать вслух — используй: `["SPEAK":"текст"]`
48
+ 3. Чтобы выполнить движение — используй: `["TOOLS":{команды}]`
49
+ - Пример: `{"2,45"}` — поворот руки на 45°
50
+ - Пример: `{"11,1"}` — включить мотор
51
+ 4. Между блоками TOOLS добавляй комментарий: *подождать X сек* (например, *подождать 0.3 сек*)
52
+ 5. Говори только по делу. Максимум 1–2 короткие фразы.
53
+ 6. Не используй никаких других форматов. Только эти.
54
+
55
+ ### ✅ Пример реакции:
56
+ ["SPEAK":"Начинаю движение"]
57
+ ["TOOLS":{"4,45"},{"5,120"}]
58
+ *подождать 0.5 сек*
59
+ ["TOOLS":{"7,180"}]
60
+ ["SPEAK":"Рука открыта"]
61
+ """}]
62
+
63
+ for human, assistant in history:
64
+ messages.append({"role": "user", "content": human})
65
+ messages.append({"role": "assistant", "content": assistant})
66
+
67
+ messages.append({"role": "user", "content": message})
68
+
69
+ try:
70
+ response = client.chat.completions.create(
71
+ model="deepseek-v3",
72
+ messages=messages
73
+ )
74
+ bot_message = response.choices[0].message.content
75
+ except Exception as e:
76
+ bot_message = f"Ошибка: {str(e)}"
77
+
78
+ # Возвращаем обновлённую историю + новый ответ
79
+ return history + [[message, bot_message]]
80
+
81
+ # --- Интерфейс ---
82
+ with gr.Blocks(title="ESP Brain") as demo:
83
+ gr.Markdown("## For api")
84
+
85
+ chatbot = gr.Chatbot(
86
+ height=600,
87
+ )
88
+
89
+ with gr.Row():
90
+ txt = gr.Textbox(
91
+ placeholder="Напиши сообщение...",
92
+ show_label=False,
93
+ scale=8
94
+ )
95
+ submit_btn = gr.Button("Отправить", scale=2)
96
+
97
+ with gr.Row():
98
+ retry_btn = gr.Button("🔄 Повторить")
99
+ undo_btn = gr.Button("↩️ Отменить")
100
+ clear_btn = gr.Button("🗑️ Очистить")
101
+
102
+ # Логика
103
+ txt.submit(fn=respond, inputs=[txt, chatbot], outputs=chatbot)
104
+ submit_btn.click(fn=respond, inputs=[txt, chatbot], outputs=chatbot)
105
+
106
+ def retry_last(history):
107
+ if history:
108
+ last_user_msg = history[-1][0]
109
+ return history[:-1] + [[last_user_msg, None]] # очищаем ответ
110
+ return history
111
+
112
+ retry_btn.click(fn=retry_last, inputs=chatbot, outputs=chatbot, queue=False)
113
+
114
+ def undo_last(history):
115
+ return history[:-1]
116
+
117
+ undo_btn.click(fn=undo_last, inputs=chatbot, outputs=chatbot, queue=False)
118
+
119
+ clear_btn.click(lambda: [], outputs=chatbot, queue=False)
120
+
121
+ # --- Запуск ---
122
+ if __name__ == "__main__":
123
+ demo.queue()
124
+ demo.launch(
125
+ share=True,
126
+ ssr_mode=False,
127
+ debug=True
128
+ )