| |
| 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 |
| ) |