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)