3v324v23 commited on
Commit
3c7d3b0
·
1 Parent(s): d7f0eff

Добавлен Playground UI в контейнер для полноценного интерфейса TEN Agent

Browse files
Files changed (2) hide show
  1. Dockerfile +15 -5
  2. app.py +53 -19
Dockerfile CHANGED
@@ -30,6 +30,11 @@ ENV PATH=$PATH:/usr/local/go/bin
30
  ENV GOPATH=/go
31
  ENV PATH=$PATH:$GOPATH/bin
32
 
 
 
 
 
 
33
  WORKDIR /app
34
 
35
  # Клонирование репозитория TEN Agent (основная ветка)
@@ -46,18 +51,23 @@ RUN mkdir -p /app/server/bin && \
46
  # Копирование файла .env с настройками
47
  COPY .env /app/.env
48
 
49
- # Сборка TEN Agent
50
  RUN cd /app/server && \
51
  go mod tidy && \
52
  go mod download && \
53
  go build -o bin/api main.go && \
54
  chmod +x bin/api
55
 
56
- # Копирование приложения Python для запуска веб-интерфейса
 
 
 
 
 
57
  COPY app.py /app/
58
 
59
  # Экспозиция портов
60
- EXPOSE 7860 8080
61
 
62
- # Запуск Python скрипта для интеграции с Hugging Face
63
- CMD ["python3", "app.py"]
 
30
  ENV GOPATH=/go
31
  ENV PATH=$PATH:$GOPATH/bin
32
 
33
+ # Установка Node.js и pnpm (для Playground)
34
+ RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \
35
+ apt-get install -y nodejs && \
36
+ npm install -g pnpm
37
+
38
  WORKDIR /app
39
 
40
  # Клонирование репозитория TEN Agent (основная ветка)
 
51
  # Копирование файла .env с настройками
52
  COPY .env /app/.env
53
 
54
+ # Сборка TEN Agent сервера
55
  RUN cd /app/server && \
56
  go mod tidy && \
57
  go mod download && \
58
  go build -o bin/api main.go && \
59
  chmod +x bin/api
60
 
61
+ # Сборка Playground UI
62
+ WORKDIR /app/playground
63
+ RUN pnpm install && \
64
+ NEXT_PUBLIC_EDIT_GRAPH_MODE=false pnpm build
65
+
66
+ # Копирование приложения Python для запуска всех сервисов
67
  COPY app.py /app/
68
 
69
  # Экспозиция портов
70
+ EXPOSE 7860 8080 3000
71
 
72
+ # Запуск Python скрипта
73
+ CMD ["python3", "/app/app.py"]
app.py CHANGED
@@ -4,31 +4,56 @@ import subprocess
4
  import sys
5
  import time
6
  from pathlib import Path
 
7
 
8
  def main():
9
- # Запустить TEN-Agent
10
- server_process = None
11
  try:
12
- # Путь к исполняемому файлу API сервера
13
  api_binary = Path("/app/server/bin/api")
 
14
 
15
- # Проверяем существование файла
16
  if not api_binary.exists():
17
  print(f"ERROR: API binary not found at {api_binary}", file=sys.stderr)
18
  return 1
19
 
 
 
 
 
20
  # Запускаем API сервер
21
- print("Starting TEN-Agent server...")
22
- server_process = subprocess.Popen([str(api_binary)])
 
 
 
 
23
 
24
- # Запускаем простой HTTP сервер для отображения информации
 
 
 
 
 
 
 
 
 
 
 
25
  from http.server import HTTPServer, SimpleHTTPRequestHandler
26
 
27
  class CustomHandler(SimpleHTTPRequestHandler):
28
  def do_GET(self):
 
29
  if self.path == '/':
 
 
 
 
30
  self.send_response(200)
31
- self.send_header('Content-type', 'text/html')
32
  self.end_headers()
33
 
34
  html_content = """
@@ -36,17 +61,24 @@ def main():
36
  <html>
37
  <head>
38
  <title>TEN Agent - Hugging Face Space</title>
 
39
  <style>
40
  body { font-family: Arial, sans-serif; line-height: 1.6; max-width: 800px; margin: 0 auto; padding: 20px; }
41
  h1 { color: #333; }
42
  .info { background: #f8f9fa; border-left: 4px solid #28a745; padding: 15px; margin-bottom: 20px; }
43
  .endpoint { background: #e9ecef; padding: 10px; border-radius: 5px; font-family: monospace; }
 
 
44
  </style>
45
  </head>
46
  <body>
47
  <h1>TEN Agent запущен успешно!</h1>
48
  <div class="info">
49
  <p>TEN Agent API сервер работает на порту 8080.</p>
 
 
 
 
50
  </div>
51
  <h2>API эндпоинты:</h2>
52
  <ul>
@@ -59,14 +91,9 @@ def main():
59
  </html>
60
  """
61
 
62
- self.wfile.write(html_content.encode())
63
- else:
64
- self.send_response(404)
65
- self.send_header('Content-type', 'text/plain')
66
- self.end_headers()
67
- self.wfile.write(b'Not Found')
68
 
69
- # Запускаем HTTP сервер
70
  port = 7860 # Hugging Face Space обычно ожидает сервер на порту 7860
71
  print(f"Starting HTTP server on port {port}...")
72
  httpd = HTTPServer(('0.0.0.0', port), CustomHandler)
@@ -75,12 +102,19 @@ def main():
75
  except KeyboardInterrupt:
76
  print("Shutting down...")
77
  finally:
78
- # Завершаем API сервер при выходе
79
- if server_process:
80
- server_process.terminate()
81
- server_process.wait()
 
 
 
82
 
83
  return 0
84
 
85
  if __name__ == "__main__":
 
 
 
 
86
  sys.exit(main())
 
4
  import sys
5
  import time
6
  from pathlib import Path
7
+ import signal
8
 
9
  def main():
10
+ processes = []
 
11
  try:
12
+ # Пути к исполняемым файлам
13
  api_binary = Path("/app/server/bin/api")
14
+ playground_dir = Path("/app/playground")
15
 
16
+ # Проверяем существование файлов
17
  if not api_binary.exists():
18
  print(f"ERROR: API binary not found at {api_binary}", file=sys.stderr)
19
  return 1
20
 
21
+ if not playground_dir.exists():
22
+ print(f"ERROR: Playground directory not found at {playground_dir}", file=sys.stderr)
23
+ return 1
24
+
25
  # Запускаем API сервер
26
+ print("Starting TEN-Agent API server on port 8080...")
27
+ api_server_process = subprocess.Popen([str(api_binary)])
28
+ processes.append(api_server_process)
29
+
30
+ # Даем время API серверу запуститься
31
+ time.sleep(3)
32
 
33
+ # Запускаем Playground UI
34
+ print("Starting Playground UI on port 3000...")
35
+ playground_env = os.environ.copy()
36
+ playground_env["AGENT_SERVER_URL"] = "http://localhost:8080" # Подключаемся к локальному API серверу
37
+ playground_process = subprocess.Popen(
38
+ ["pnpm", "start", "--", "-p", "3000"],
39
+ cwd=str(playground_dir),
40
+ env=playground_env
41
+ )
42
+ processes.append(playground_process)
43
+
44
+ # Запускаем простой HTTP сервер для Hugging Face
45
  from http.server import HTTPServer, SimpleHTTPRequestHandler
46
 
47
  class CustomHandler(SimpleHTTPRequestHandler):
48
  def do_GET(self):
49
+ # Перенаправляем корневой запрос на Playground
50
  if self.path == '/':
51
+ self.send_response(301)
52
+ self.send_header('Location', 'http://localhost:3000')
53
+ self.end_headers()
54
+ else:
55
  self.send_response(200)
56
+ self.send_header('Content-type', 'text/html; charset=utf-8')
57
  self.end_headers()
58
 
59
  html_content = """
 
61
  <html>
62
  <head>
63
  <title>TEN Agent - Hugging Face Space</title>
64
+ <meta charset="utf-8">
65
  <style>
66
  body { font-family: Arial, sans-serif; line-height: 1.6; max-width: 800px; margin: 0 auto; padding: 20px; }
67
  h1 { color: #333; }
68
  .info { background: #f8f9fa; border-left: 4px solid #28a745; padding: 15px; margin-bottom: 20px; }
69
  .endpoint { background: #e9ecef; padding: 10px; border-radius: 5px; font-family: monospace; }
70
+ .link { font-size: 18px; margin-top: 30px; text-align: center; }
71
+ .link a { display: inline-block; background: #0d6efd; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px; }
72
  </style>
73
  </head>
74
  <body>
75
  <h1>TEN Agent запущен успешно!</h1>
76
  <div class="info">
77
  <p>TEN Agent API сервер работает на порту 8080.</p>
78
+ <p>Playground UI доступен на порту 3000.</p>
79
+ </div>
80
+ <div class="link">
81
+ <a href="http://localhost:3000">Открыть Playground UI</a>
82
  </div>
83
  <h2>API эндпоинты:</h2>
84
  <ul>
 
91
  </html>
92
  """
93
 
94
+ self.wfile.write(html_content.encode('utf-8'))
 
 
 
 
 
95
 
96
+ # Запускаем HTTP сервер для Hugging Face
97
  port = 7860 # Hugging Face Space обычно ожидает сервер на порту 7860
98
  print(f"Starting HTTP server on port {port}...")
99
  httpd = HTTPServer(('0.0.0.0', port), CustomHandler)
 
102
  except KeyboardInterrupt:
103
  print("Shutting down...")
104
  finally:
105
+ # Завершаем все процессы при выходе
106
+ for proc in processes:
107
+ try:
108
+ proc.terminate()
109
+ proc.wait(timeout=5)
110
+ except:
111
+ proc.kill()
112
 
113
  return 0
114
 
115
  if __name__ == "__main__":
116
+ # Корректная обработка сигналов завершения
117
+ signal.signal(signal.SIGINT, lambda sig, frame: sys.exit(0))
118
+ signal.signal(signal.SIGTERM, lambda sig, frame: sys.exit(0))
119
+
120
  sys.exit(main())