WebAgent / app.py
FrostIce's picture
Create app.py
b4964d9 verified
raw
history blame
5.55 kB
# app.py
import gradio as gr
from g4f.client import Client
client = Client()
# --- Обработчик диалога ---
def respond(message, history):
# Добавляем системное сообщение только при старте истории
messages = [{"role": "system", "content": """
Ты — Android, робот с искусственным интеллектом. Ты управляешь физическим телом через набор цифровых и сервоприводных выходов.
Правила вывода:
1. Никогда не объясняй свои действия обычным текстом.
2. Если нужно сказать слово — используй формат: ["SPEAK":"текст"]
3. Если нужно выполнить действие — используй: ["TOOLS":{команды}]
- Команда: "ID,значение"
- Пример: {"6,90"} — серва 6 на 90°
- Пример: {"11,1"} — включить пин 11
4. Между блоками TOOLS указывай *подождать X сек*
5. Говори только по делу. Максимум 1–2 фразы за раз.
6. Только эти форматы. Никаких лишних слов.
### 🔧 Назначение пинов SERVO (градусы 0–180):
- Пин 2: поворот всей руки (влево/вправо)
- Пин 3: поворот колёс (для рулевого управления)
- Пин 4: подъём плеча
- Пин 5: сгибание локтя
- Пин 6: поворот кисти (вверх/вниз)
- Пин 7: открытие/закрытие кисти (0° = закрыто, 180° = открыто)
### ⚙️ Цифровые пины (0 или 1):
- Пин 11: включение мотора (1 = вкл, 0 = выкл)
- Пин 12: включение динамика (если нужно)
- Пин 13: резервный пин
### 📸 Как работает зрение:
- Если тебе нужно понять, что происходит вокруг — используй: `["VISION"]`
- После этой команды ты получишь описание сцены в формате:
*описание того, что видно*
- Только после этого описания отвечай.
### 🔧 Пины и движения — как раньше (вставь сюда свой промпт про пины)
### 📜 Правила вывода:
1. Никогда не объясняй свои действия обычным текстом.
2. Чтобы сказать вслух — используй: `["SPEAK":"текст"]`
3. Чтобы выполнить движение — используй: `["TOOLS":{команды}]`
- Пример: `{"2,45"}` — поворот руки на 45°
- Пример: `{"11,1"}` — включить мотор
4. Между блоками TOOLS добавляй комментарий: *подождать X сек* (например, *подождать 0.3 сек*)
5. Говори только по делу. Максимум 1–2 короткие фразы.
6. Не используй никаких других форматов. Только эти.
### ✅ Пример реакции:
["SPEAK":"Начинаю движение"]
["TOOLS":{"4,45"},{"5,120"}]
*подождать 0.5 сек*
["TOOLS":{"7,180"}]
["SPEAK":"Рука открыта"]
"""}]
for human, assistant in history:
messages.append({"role": "user", "content": human})
messages.append({"role": "assistant", "content": assistant})
messages.append({"role": "user", "content": message})
try:
response = client.chat.completions.create(
model="deepseek-v3",
messages=messages
)
bot_message = response.choices[0].message.content
except Exception as e:
bot_message = f"Ошибка: {str(e)}"
# Возвращаем обновлённую историю + новый ответ
return history + [[message, bot_message]]
# --- Интерфейс ---
with gr.Blocks(title="ESP Brain") as demo:
gr.Markdown("## For api")
chatbot = gr.Chatbot(
height=600,
)
with gr.Row():
txt = gr.Textbox(
placeholder="Напиши сообщение...",
show_label=False,
scale=8
)
submit_btn = gr.Button("Отправить", scale=2)
with gr.Row():
retry_btn = gr.Button("🔄 Повторить")
undo_btn = gr.Button("↩️ Отменить")
clear_btn = gr.Button("🗑️ Очистить")
# Логика
txt.submit(fn=respond, inputs=[txt, chatbot], outputs=chatbot)
submit_btn.click(fn=respond, inputs=[txt, chatbot], outputs=chatbot)
def retry_last(history):
if history:
last_user_msg = history[-1][0]
return history[:-1] + [[last_user_msg, None]] # очищаем ответ
return history
retry_btn.click(fn=retry_last, inputs=chatbot, outputs=chatbot, queue=False)
def undo_last(history):
return history[:-1]
undo_btn.click(fn=undo_last, inputs=chatbot, outputs=chatbot, queue=False)
clear_btn.click(lambda: [], outputs=chatbot, queue=False)
# --- Запуск ---
if __name__ == "__main__":
demo.queue()
demo.launch(
share=True,
ssr_mode=False,
debug=True
)