| import streamlit as st |
| import subprocess |
| import threading |
| import queue |
| import os |
| import sys |
| import time |
|
|
| |
| sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "."))) |
|
|
| st.set_page_config(page_title="OpenManus Web UI", page_icon="🤖") |
|
|
| st.title("🤖 OpenManus Web UI") |
| st.markdown("Déploiement persistant avec Qwen2.5-Coder-7B (GGUF)") |
|
|
| if "messages" not in st.session_state: |
| st.session_state.messages = [] |
|
|
| for message in st.session_state.messages: |
| with st.chat_message(message["role"]): |
| st.markdown(message["content"]) |
|
|
| def run_openmanus(prompt, output_queue): |
| |
| |
| process = subprocess.Popen( |
| [sys.executable, "main.py"], |
| stdin=subprocess.PIPE, |
| stdout=subprocess.PIPE, |
| stderr=subprocess.STDOUT, |
| text=True, |
| bufsize=1, |
| env=os.environ |
| ) |
| |
| |
| process.stdin.write(prompt + "\n") |
| process.stdin.flush() |
| |
| |
| for line in iter(process.stdout.readline, ""): |
| output_queue.put(line) |
| |
| process.stdout.close() |
| process.wait() |
| output_queue.put(None) |
|
|
| prompt = st.chat_input("Que puis-je faire pour vous ?") |
|
|
| if prompt: |
| st.session_state.messages.append({"role": "user", "content": prompt}) |
| with st.chat_message("user"): |
| st.markdown(prompt) |
|
|
| with st.chat_message("assistant"): |
| response_placeholder = st.empty() |
| full_response = "" |
| output_queue = queue.Queue() |
| |
| |
| thread = threading.Thread(target=run_openmanus, args=(prompt, output_queue)) |
| thread.start() |
| |
| while True: |
| try: |
| line = output_queue.get(timeout=1) |
| if line is None: |
| break |
| full_response += line |
| response_placeholder.markdown(full_response + "▌") |
| except queue.Empty: |
| if not thread.is_alive(): |
| break |
| continue |
| |
| response_placeholder.markdown(full_response) |
| st.session_state.messages.append({"role": "assistant", "content": full_response}) |
|
|