File size: 6,255 Bytes
58cec34 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
#!/usr/bin/env python3
import os
import subprocess
import threading
import time
import signal
import sys
from http.server import HTTPServer, SimpleHTTPRequestHandler
import socket
# Порт для Hugging Face Spaces
HF_PORT = int(os.environ.get("PORT", 7860))
# Порт для TEN Agent API
TEN_AGENT_PORT = 8080
def is_port_in_use(port):
"""Проверка занят ли порт"""
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
return s.connect_ex(('localhost', port)) == 0
def run_ten_agent():
"""Запуск TEN Agent сервера"""
print("Запуск TEN Agent...")
# Создаем директорию для логов, если её нет
os.makedirs("/tmp/ten_agent", exist_ok=True)
# Запускаем TEN Agent сервер
server_process = subprocess.Popen(
["/app/server/bin/api"],
env={
**os.environ,
"LOG_PATH": "/tmp/ten_agent",
"LOG_STDOUT": "true",
"SERVER_PORT": str(TEN_AGENT_PORT),
"WORKERS_MAX": "10",
"WORKER_QUIT_TIMEOUT_SECONDES": "60"
}
)
return server_process
# Простой обработчик для веб-сервера
class TenAgentHandler(SimpleHTTPRequestHandler):
def do_GET(self):
if self.path == '/':
self.send_response(200)
self.send_header('Content-type', 'text/html; charset=utf-8')
self.end_headers()
# Статус TEN Agent
ten_agent_status = "работает" if is_port_in_use(TEN_AGENT_PORT) else "не запущен"
html = f"""
<html>
<head>
<title>TEN Agent на Hugging Face</title>
<style>
body {{
font-family: Arial, sans-serif;
max-width: 800px;
margin: 0 auto;
padding: 20px;
line-height: 1.6;
}}
h1, h2 {{
color: #2563eb;
}}
pre {{
background-color: #f1f5f9;
padding: 15px;
border-radius: 5px;
overflow-x: auto;
}}
.status {{
padding: 8px 16px;
border-radius: 4px;
display: inline-block;
margin-bottom: 20px;
}}
.status.running {{
background-color: #dcfce7;
color: #166534;
}}
.status.stopped {{
background-color: #fee2e2;
color: #991b1b;
}}
</style>
</head>
<body>
<h1>TEN Agent на Hugging Face</h1>
<div class="status {{'running' if ten_agent_status == 'работает' else 'stopped'}}">
Статус TEN Agent: {ten_agent_status}
</div>
<h2>Информация о сервере</h2>
<ul>
<li>TEN Agent API доступен на порту: {TEN_AGENT_PORT}</li>
<li>Веб-интерфейс работает на порту: {HF_PORT}</li>
</ul>
<h2>Взаимодействие с API</h2>
<p>Для взаимодействия с TEN Agent API используйте следующий адрес:</p>
<pre>https://nitrox-ten.hf.space/api/</pre>
<h2>Документация</h2>
<p>Подробная информация о TEN Agent:</p>
<ul>
<li><a href="https://doc.theten.ai/ten-agent/overview" target="_blank">Официальная документация</a></li>
<li><a href="https://github.com/TEN-framework/TEN-Agent" target="_blank">Репозиторий на GitHub</a></li>
</ul>
</body>
</html>
"""
self.wfile.write(html.encode('utf-8'))
else:
self.send_error(404)
# Обработчик сигналов для корректного завершения
def signal_handler(sig, frame):
print("Получен сигнал завершения, останавливаю TEN Agent...")
if 'server_process' in globals() and server_process:
server_process.terminate()
server_process.wait(timeout=10)
sys.exit(0)
# Установка обработчиков сигналов
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
if __name__ == "__main__":
# Запуск TEN Agent в отдельном потоке
server_process = run_ten_agent()
# Ожидаем запуск TEN Agent
print(f"Ожидаем запуск TEN Agent на порту {TEN_AGENT_PORT}...")
timeout = 60
while timeout > 0 and not is_port_in_use(TEN_AGENT_PORT):
time.sleep(1)
timeout -= 1
if is_port_in_use(TEN_AGENT_PORT):
print(f"TEN Agent успешно запущен на порту {TEN_AGENT_PORT}")
else:
print(f"Не удалось дождаться запуска TEN Agent на порту {TEN_AGENT_PORT}")
# Запуск веб-сервера для Hugging Face
print(f"Запуск веб-сервера на порту {HF_PORT}...")
httpd = HTTPServer(('', HF_PORT), TenAgentHandler)
try:
httpd.serve_forever()
except KeyboardInterrupt:
pass
finally:
httpd.server_close()
signal_handler(None, None) |