File size: 5,752 Bytes
58cec34
 
2839144
 
d7f0eff
 
3c7d3b0
86f3bf2
58cec34
d7f0eff
3c7d3b0
d7f0eff
3c7d3b0
d7f0eff
3c7d3b0
d7f0eff
3c7d3b0
d7f0eff
 
 
 
3c7d3b0
 
 
2455e56
 
 
 
 
 
 
 
3c7d3b0
2455e56
 
 
 
 
 
 
 
 
 
 
 
d7f0eff
2455e56
 
d7f0eff
2455e56
d7f0eff
2455e56
 
 
 
 
 
 
 
 
2839144
2455e56
 
 
 
 
 
 
 
2839144
2455e56
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86f3bf2
2455e56
 
 
 
 
 
 
86f3bf2
 
2455e56
86f3bf2
2455e56
 
 
d7f0eff
2455e56
 
 
 
 
2839144
d7f0eff
2839144
d7f0eff
2839144
3c7d3b0
 
 
 
 
 
 
d7f0eff
 
 
 
3c7d3b0
 
 
 
d7f0eff
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
#!/usr/bin/env python3
import os
import subprocess
import sys
import time
from pathlib import Path
import signal
import shutil

def main():
    processes = []
    try:
        # Пути к исполняемым файлам
        api_binary = Path("/app/server/bin/api")
        playground_dir = Path("/app/playground")
        
        # Проверяем существование файлов
        if not api_binary.exists():
            print(f"ERROR: API binary not found at {api_binary}", file=sys.stderr)
            return 1
        
        if not playground_dir.exists():
            print(f"ERROR: Playground directory not found at {playground_dir}", file=sys.stderr)
            return 1
            
        # Запускаем API сервер
        print("Starting TEN-Agent API server on port 8080...")
        api_server_process = subprocess.Popen([str(api_binary)])
        processes.append(api_server_process)
        
        # Даем время API серверу запуститься
        time.sleep(3)
        
        # Запускаем Playground UI
        print("Starting Playground UI on port 3000...")
        playground_env = os.environ.copy()
        playground_env["AGENT_SERVER_URL"] = "http://localhost:8080"  # Подключаемся к локальному API серверу
        playground_process = subprocess.Popen(
            ["pnpm", "start", "--", "-p", "3000"],
            cwd=str(playground_dir),
            env=playground_env
        )
        processes.append(playground_process)
        
        # Запускаем прокси для Hugging Face
        from http.server import HTTPServer, SimpleHTTPRequestHandler
        import http.client
        import socketserver
        
        class ProxyHandler(SimpleHTTPRequestHandler):
            def do_GET(self):
                # Направляем запросы к Playground UI
                if self.path == '/' or self.path.startswith('/about') or self.path.startswith('/_next') or self.path.startswith('/favicon.ico'):
                    self._proxy_request('localhost', 3000, self.path)
                # Направляем API запросы к API серверу
                elif self.path.startswith('/health') or self.path.startswith('/list') or self.path.startswith('/graphs'):
                    self._proxy_request('localhost', 8080, self.path)
                else:
                    # По умолчанию отправляем на Playground
                    self._proxy_request('localhost', 3000, self.path)
                    
            def do_POST(self):
                # Все POST запросы направляем в API
                self._proxy_request('localhost', 8080, self.path)
                
            def _proxy_request(self, host, port, path):
                try:
                    # Создаем соединение с целевым сервером
                    conn = http.client.HTTPConnection(host, port)
                    
                    # Копируем заголовки запроса
                    headers = {}
                    for header in self.headers:
                        headers[header] = self.headers[header]
                    
                    # Получаем данные запроса
                    content_length = int(self.headers.get('Content-Length', 0))
                    body = self.rfile.read(content_length) if content_length > 0 else None
                    
                    # Отправляем запрос на целевой сервер
                    conn.request(self.command, path, body=body, headers=headers)
                    resp = conn.getresponse()
                    
                    # Отправляем ответ клиенту
                    self.send_response(resp.status)
                    for header in resp.headers:
                        self.send_header(header, resp.headers[header])
                    self.end_headers()
                    
                    # Отправляем тело ответа
                    self.wfile.write(resp.read())
                    conn.close()
                except Exception as e:
                    print(f"Proxy error: {e}", file=sys.stderr)
                    self.send_response(500)
                    self.send_header('Content-type', 'text/plain; charset=utf-8')
                    self.end_headers()
                    self.wfile.write(f"Proxy error: {e}".encode('utf-8'))
        
        # Запускаем HTTP прокси-сервер
        port = 7860  # Hugging Face Space ожидает сервер на этом порту
        print(f"Starting proxy server on port {port}, forwarding to Playground UI and API...")
        
        # Разрешаем повторное использование адреса и порта
        class ReuseAddressServer(socketserver.TCPServer):
            allow_reuse_address = True
            
        httpd = ReuseAddressServer(('0.0.0.0', port), ProxyHandler)
        httpd.serve_forever()
    
    except KeyboardInterrupt:
        print("Shutting down...")
    finally:
        # Завершаем все процессы при выходе
        for proc in processes:
            try:
                proc.terminate()
                proc.wait(timeout=5)
            except:
                proc.kill()
    
    return 0

if __name__ == "__main__":
    # Корректная обработка сигналов завершения
    signal.signal(signal.SIGINT, lambda sig, frame: sys.exit(0))
    signal.signal(signal.SIGTERM, lambda sig, frame: sys.exit(0))
    
    sys.exit(main())