#!/usr/bin/env python3 import os import subprocess import sys import time from pathlib import Path import signal 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) # Запускаем простой HTTP сервер для Hugging Face from http.server import HTTPServer, SimpleHTTPRequestHandler class CustomHandler(SimpleHTTPRequestHandler): def do_GET(self): # Перенаправляем корневой запрос на Playground if self.path == '/': self.send_response(301) self.send_header('Location', 'http://localhost:3000') self.end_headers() else: self.send_response(200) self.send_header('Content-type', 'text/html; charset=utf-8') self.end_headers() html_content = """ TEN Agent - Hugging Face Space

TEN Agent запущен успешно!

TEN Agent API сервер работает на порту 8080.

Playground UI доступен на порту 3000.

API эндпоинты:

См. документацию TEN Agent для получения дополнительной информации.

""" self.wfile.write(html_content.encode('utf-8')) # Запускаем HTTP сервер для Hugging Face port = 7860 # Hugging Face Space обычно ожидает сервер на порту 7860 print(f"Starting HTTP server on port {port}...") httpd = HTTPServer(('0.0.0.0', port), CustomHandler) 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())