3v324v23 commited on
Commit
db0df50
·
1 Parent(s): 9f18430

Восстановление Playground UI в контейнере с сохранением исправления для /go

Browse files
Files changed (2) hide show
  1. Dockerfile +9 -56
  2. app.py +50 -58
Dockerfile CHANGED
@@ -69,66 +69,19 @@ RUN cd /app/server && \
69
  go build -o bin/api main.go && \
70
  chmod +x bin/api
71
 
72
- # Создаем простой HTML-шаблон для информационной страницы
73
- RUN mkdir -p /app/static && \
74
- echo '<!DOCTYPE html>\n\
75
- <html lang="en">\n\
76
- <head>\n\
77
- <meta charset="UTF-8">\n\
78
- <meta name="viewport" content="width=device-width, initial-scale=1.0">\n\
79
- <title>TEN Agent API</title>\n\
80
- <style>\n\
81
- body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }\n\
82
- h1 { color: #333; }\n\
83
- .container { border: 1px solid #ddd; padding: 20px; border-radius: 5px; }\n\
84
- code { background-color: #f5f5f5; padding: 2px 5px; border-radius: 3px; }\n\
85
- pre { background-color: #f5f5f5; padding: 10px; border-radius: 5px; overflow-x: auto; }\n\
86
- .endpoint { margin-bottom: 20px; }\n\
87
- .method { font-weight: bold; color: #0066cc; }\n\
88
- </style>\n\
89
- </head>\n\
90
- <body>\n\
91
- <h1>TEN Agent API Server</h1>\n\
92
- <div class="container">\n\
93
- <p>Сервер TEN Agent API успешно запущен!</p>\n\
94
- <p>Вы можете взаимодействовать с API через следующие эндпоинты:</p>\n\
95
- \n\
96
- <div class="endpoint">\n\
97
- <span class="method">GET</span> <code>/health</code>\n\
98
- <p>Проверка состояния API сервера</p>\n\
99
- </div>\n\
100
- \n\
101
- <div class="endpoint">\n\
102
- <span class="method">GET</span> <code>/list</code>\n\
103
- <p>Получение списка доступных графов и модулей</p>\n\
104
- </div>\n\
105
- \n\
106
- <div class="endpoint">\n\
107
- <span class="method">GET</span> <code>/graphs</code>\n\
108
- <p>Получение списка графов</p>\n\
109
- </div>\n\
110
- \n\
111
- <div class="endpoint">\n\
112
- <span class="method">POST</span> <code>/run</code>\n\
113
- <p>Запуск графа или модуля</p>\n\
114
- </div>\n\
115
- </div>\n\
116
- \n\
117
- <h2>Локальный запуск Playground UI</h2>\n\
118
- <div class="container">\n\
119
- <p>Для использования полноценного интерфейса TEN Agent Playground локально:</p>\n\
120
- <pre>git clone https://github.com/TEN-framework/TEN-Agent.git\ncd TEN-Agent/playground\npnpm install\nAGENT_SERVER_URL=https://nitrox-ten.hf.space pnpm dev</pre>\n\
121
- <p>Затем откройте <code>http://localhost:3000</code> в браузере.</p>\n\
122
- </div>\n\
123
- </body>\n\
124
- </html>' > /app/static/index.html
125
 
126
  # Установка точки входа
127
  COPY app.py /app/app.py
128
  RUN chmod +x /app/app.py
129
 
130
- # Открываем порт
131
- EXPOSE 8080
132
 
133
- # Запускаем API сервер
134
  ENTRYPOINT ["python3", "/app/app.py"]
 
69
  go build -o bin/api main.go && \
70
  chmod +x bin/api
71
 
72
+ # Сборка Playground UI
73
+ ENV PNPM_HOME="/app/.pnpm-store"
74
+ ENV PATH="$PNPM_HOME:$PATH"
75
+ RUN cd /app/playground && \
76
+ pnpm install --no-frozen-lockfile && \
77
+ NEXT_PUBLIC_EDIT_GRAPH_MODE=false pnpm build
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
 
79
  # Установка точки входа
80
  COPY app.py /app/app.py
81
  RUN chmod +x /app/app.py
82
 
83
+ # Открываем порты
84
+ EXPOSE 7860 8080 3000
85
 
86
+ # Запускаем API сервер и Playground
87
  ENTRYPOINT ["python3", "/app/app.py"]
app.py CHANGED
@@ -5,74 +5,66 @@ import sys
5
  import time
6
  from pathlib import Path
7
  import signal
8
- import http.server
9
- import socketserver
10
  import threading
11
 
12
- # Настройка путей
13
- API_BINARY = Path("/app/server/bin/api")
14
- STATIC_DIR = Path("/app/static")
15
-
16
- # Проверка наличия файлов
17
- if not API_BINARY.exists():
18
- print(f"ERROR: API binary not found at {API_BINARY}", file=sys.stderr)
19
- sys.exit(1)
20
-
21
- # Класс для обработки HTTP запросов
22
- class RequestHandler(http.server.SimpleHTTPRequestHandler):
23
- def __init__(self, *args, **kwargs):
24
- # Устанавливаем корневую директорию для статических файлов
25
- super().__init__(*args, directory=STATIC_DIR, **kwargs)
26
-
27
- def do_GET(self):
28
- # Перенаправление корневого пути на статическую страницу
29
- if self.path == '/':
30
- self.path = '/index.html'
31
-
32
- # Передача всех остальных запросов в SimpleHTTPRequestHandler
33
- return super().do_GET()
34
-
35
- # Запуск API сервера в отдельном потоке
36
- def run_api_server():
37
- print("Starting TEN-Agent API server on port 8080...")
38
- api_process = subprocess.Popen([str(API_BINARY)])
39
- return api_process
40
-
41
- # Запуск HTTP сервера для статических файлов
42
- def run_http_server():
43
- try:
44
- # Сначала пытаемся запустить на порте 7860 (для HuggingFace)
45
- PORT = 7860
46
- httpd = socketserver.TCPServer(("", PORT), RequestHandler)
47
- print(f"Serving static files on port {PORT}")
48
- httpd.serve_forever()
49
- except OSError:
50
- # Если порт 7860 занят, используем 8000
51
- PORT = 8000
52
- httpd = socketserver.TCPServer(("", PORT), RequestHandler)
53
- print(f"Serving static files on port {PORT}")
54
- httpd.serve_forever()
55
-
56
  def main():
57
- # Запуск API сервера
58
- api_process = run_api_server()
59
-
60
- # Запуск HTTP сервера в отдельном потоке
61
- http_thread = threading.Thread(target=run_http_server, daemon=True)
62
- http_thread.start()
63
-
64
  try:
65
- # Ожидание сигнала остановки
66
- api_process.wait()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
  except KeyboardInterrupt:
68
  print("Shutting down...")
 
 
69
  finally:
70
  # Завершение процессов
71
- if api_process and api_process.poll() is None:
72
- api_process.terminate()
73
- api_process.wait(timeout=5)
 
 
 
 
74
 
75
  return 0
76
 
77
  if __name__ == "__main__":
 
 
 
 
78
  sys.exit(main())
 
5
  import time
6
  from pathlib import Path
7
  import signal
 
 
8
  import threading
9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  def main():
11
+ processes = []
 
 
 
 
 
 
12
  try:
13
+ # Пути к исполняемым файлам
14
+ api_binary = Path("/app/server/bin/api")
15
+ playground_dir = Path("/app/playground")
16
+
17
+ # Проверяем существование файлов
18
+ if not api_binary.exists():
19
+ print(f"ERROR: API binary not found at {api_binary}", file=sys.stderr)
20
+ return 1
21
+
22
+ if not playground_dir.exists():
23
+ print(f"ERROR: Playground directory not found at {playground_dir}", file=sys.stderr)
24
+ return 1
25
+
26
+ # Запускаем API сервер
27
+ print("Starting TEN-Agent API server on port 8080...")
28
+ api_process = subprocess.Popen([str(api_binary)])
29
+ processes.append(api_process)
30
+
31
+ # Даем API серверу время на запуск
32
+ time.sleep(3)
33
+
34
+ # Запускаем Playground UI на порту 7860 (порт Hugging Face)
35
+ print("Starting Playground UI on port 7860...")
36
+ os.environ["PORT"] = "7860"
37
+ os.environ["AGENT_SERVER_URL"] = "http://localhost:8080"
38
+ playground_process = subprocess.Popen(
39
+ ["pnpm", "start"],
40
+ cwd=str(playground_dir),
41
+ env=os.environ
42
+ )
43
+ processes.append(playground_process)
44
+
45
+ # Ожидаем завершения процессов
46
+ for proc in processes:
47
+ proc.wait()
48
+
49
  except KeyboardInterrupt:
50
  print("Shutting down...")
51
+ except Exception as e:
52
+ print(f"Error: {e}", file=sys.stderr)
53
  finally:
54
  # Завершение процессов
55
+ for proc in processes:
56
+ if proc and proc.poll() is None:
57
+ proc.terminate()
58
+ try:
59
+ proc.wait(timeout=5)
60
+ except subprocess.TimeoutExpired:
61
+ proc.kill()
62
 
63
  return 0
64
 
65
  if __name__ == "__main__":
66
+ # Корректная обработка сигналов
67
+ signal.signal(signal.SIGINT, lambda sig, frame: sys.exit(0))
68
+ signal.signal(signal.SIGTERM, lambda sig, frame: sys.exit(0))
69
+
70
  sys.exit(main())