3v324v23 commited on
Commit
2839144
·
1 Parent(s): 57b5794

Исправлена ошибка сборки TEN Agent для Hugging Face - проблема с отсутствием Taskfile.yml

Browse files
Files changed (2) hide show
  1. Dockerfile +38 -13
  2. app.py +143 -138
Dockerfile CHANGED
@@ -1,29 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  FROM ubuntu:22.04
2
 
3
- # Установка необходимых пакетов
4
  RUN apt-get clean && apt-get update && apt-get install -y --no-install-recommends \
 
 
 
 
 
5
  python3 \
 
6
  python3-pip \
 
7
  curl \
8
- wget \
 
9
  ca-certificates \
10
  && apt-get clean && rm -rf /var/lib/apt/lists/* && rm -rf /tmp/*
11
 
12
  WORKDIR /app
13
 
14
- # Копирование файлов
15
- COPY app.py /app/
16
- COPY README.md /app/
17
-
18
- # Создаем директорию для информации о TEN Agent
19
- RUN mkdir -p /app/info
20
- RUN echo "# TEN Agent Information\n\nThis is a simplified version of TEN Agent for Hugging Face Spaces." > /app/info/index.html
21
 
22
- # Установка Python зависимостей
23
- RUN pip3 install requests flask
24
 
25
  # Экспозиция порта
26
- EXPOSE 7860
27
 
28
- # Запуск Python скрипта
29
  CMD ["python3", "app.py"]
 
1
+ FROM ghcr.io/ten-framework/ten_agent_build:0.4.17 AS builder
2
+
3
+ ARG SESSION_CONTROL_CONF=session_control.conf
4
+ ARG USE_AGENT=agents/examples/default
5
+
6
+ WORKDIR /app
7
+
8
+ # Копируем Taskfile.yml отдельно, чтобы убедиться, что он существует
9
+ COPY Taskfile.yml /app/
10
+ # Копируем остальные файлы
11
+ COPY . /app/
12
+
13
+ # Проверка наличия Taskfile
14
+ RUN ls -la /app && \
15
+ # Настройка окружения и установка зависимостей
16
+ mkdir -p agents/out && \
17
+ echo '{"path": []}' > agents/session_control.conf && \
18
+ cd /app && \
19
+ task clean && task use AGENT=${USE_AGENT}
20
+
21
  FROM ubuntu:22.04
22
 
 
23
  RUN apt-get clean && apt-get update && apt-get install -y --no-install-recommends \
24
+ libasound2 \
25
+ libgstreamer1.0-dev \
26
+ libunwind-dev \
27
+ libc++1 \
28
+ libssl-dev \
29
  python3 \
30
+ python3-venv \
31
  python3-pip \
32
+ python3-dev \
33
  curl \
34
+ jq \
35
+ vim \
36
  ca-certificates \
37
  && apt-get clean && rm -rf /var/lib/apt/lists/* && rm -rf /tmp/*
38
 
39
  WORKDIR /app
40
 
41
+ # Копирование собранных файлов из builder
42
+ COPY --from=builder /app/agents/.release/ /app/agents/
43
+ COPY --from=builder /app/server/bin/api /app/server/bin/api
44
+ COPY --from=builder /usr/local/lib /usr/local/lib
45
+ COPY --from=builder /usr/lib/python3 /usr/lib/python3
 
 
46
 
47
+ # Добавление скрипта для запуска сервера
48
+ COPY app.py /app/
49
 
50
  # Экспозиция порта
51
+ EXPOSE 7860 8080
52
 
53
+ # Запуск Python скрипта для интеграции с Hugging Face
54
  CMD ["python3", "app.py"]
app.py CHANGED
@@ -1,154 +1,159 @@
1
  #!/usr/bin/env python3
2
  import os
3
- import requests
4
- from flask import Flask, render_template_string, send_from_directory, redirect, url_for, jsonify
 
 
 
 
 
5
 
6
  # Порт для Hugging Face Spaces
7
  HF_PORT = int(os.environ.get("PORT", 7860))
 
 
8
 
9
- # Создаем Flask приложение
10
- app = Flask(__name__, static_folder='info')
 
 
11
 
12
- # HTML шаблон для главной страницы
13
- index_html = """
14
- <!DOCTYPE html>
15
- <html lang="ru">
16
- <head>
17
- <meta charset="UTF-8">
18
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
19
- <title>TEN Agent на Hugging Face</title>
20
- <style>
21
- body {
22
- font-family: Arial, sans-serif;
23
- max-width: 800px;
24
- margin: 0 auto;
25
- padding: 20px;
26
- line-height: 1.6;
27
- }
28
- h1, h2 {
29
- color: #2563eb;
30
- }
31
- pre {
32
- background-color: #f1f5f9;
33
- padding: 15px;
34
- border-radius: 5px;
35
- overflow-x: auto;
36
- }
37
- .card {
38
- border: 1px solid #e5e7eb;
39
- border-radius: 8px;
40
- padding: 15px;
41
- margin-bottom: 20px;
42
- background-color: #fff;
43
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
44
- }
45
- .btn {
46
- display: inline-block;
47
- padding: 8px 16px;
48
- background-color: #2563eb;
49
- color: white;
50
- text-decoration: none;
51
- border-radius: 4px;
52
- margin-top: 10px;
53
- }
54
- .btn:hover {
55
- background-color: #1d4ed8;
56
- }
57
- .container {
58
- display: flex;
59
- flex-wrap: wrap;
60
- gap: 20px;
61
- }
62
- .feature {
63
- flex: 1 1 300px;
64
- border: 1px solid #e5e7eb;
65
- border-radius: 8px;
66
- padding: 15px;
67
- background-color: #f8fafc;
68
- }
69
- </style>
70
- </head>
71
- <body>
72
- <h1>TEN Agent на Hugging Face</h1>
73
 
74
- <div class="card">
75
- <h2>О проекте</h2>
76
- <p>TEN Agent - это разговорный голосовой ИИ-агент на базе TEN, интегрирующий Deepseek, Gemini, OpenAI, RTC и аппаратное обеспечение. Он обеспечивает возможности ИИ в реальном времени, такие как видение, слух и речь.</p>
77
- </div>
78
 
79
- <h2>Основные функции</h2>
80
-
81
- <div class="container">
82
- <div class="feature">
83
- <h3>Голосовой помощник</h3>
84
- <p>Создайте полнофункционального голосового помощника с возможностью реагировать на ваши запросы в реальном времени.</p>
85
- </div>
86
-
87
- <div class="feature">
88
- <h3>Интеграция с Dify и RAG</h3>
89
- <p>Интеграция с Dify для создания агентов с возможностями поиска и извлечения информации (RAG).</p>
90
- </div>
91
-
92
- <div class="feature">
93
- <h3>Gemini Multimodal</h3>
94
- <p>Поддержка Gemini Multimodal API с возможностями зрения и распознавания изображений экрана в реальном времени.</p>
95
- </div>
96
- </div>
97
-
98
- <h2>Документация</h2>
99
- <p>Для полноценной работы с TEN Agent, пожалуйста, обратитесь к официальной документации:</p>
100
- <ul>
101
- <li><a href="https://doc.theten.ai/ten-agent/overview" target="_blank">Обзор TEN Agent</a></li>
102
- <li><a href="https://doc.theten.ai/ten-agent/getting_started" target="_blank">Начало работы</a></li>
103
- <li><a href="https://github.com/TEN-framework/TEN-Agent" target="_blank">Репозиторий GitHub</a></li>
104
- </ul>
105
-
106
- <h2>API</h2>
107
- <p>Для взаимодействия с API TEN Agent через Hugging Face Spaces:</p>
108
- <pre>GET /api/info - Получить информацию о TEN Agent</pre>
109
 
110
- <a href="/api/info" class="btn">Проверить API</a>
111
- </body>
112
- </html>
113
- """
114
 
115
- @app.route('/')
116
- def index():
117
- """Главная страница"""
118
- return render_template_string(index_html)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
 
120
- @app.route('/api/info')
121
- def api_info():
122
- """API для получения информации о TEN Agent"""
123
- return jsonify({
124
- "name": "TEN Agent",
125
- "version": "0.8.0",
126
- "description": "Разговорный голосовой ИИ-агент с возможностями видения, слуха и речи.",
127
- "documentation": "https://doc.theten.ai/ten-agent/overview",
128
- "repository": "https://github.com/TEN-framework/TEN-Agent",
129
- "features": [
130
- "Голосовой помощник",
131
- "Интеграция с Dify и RAG",
132
- "Поддержка Gemini Multimodal API",
133
- "Рассказчик историй с генерацией изображений",
134
- "Интеграция с ESP32 для аппаратных решений"
135
- ]
136
- })
137
 
138
- @app.route('/static/<path:path>')
139
- def serve_static(path):
140
- """Обслуживание статических файлов"""
141
- return send_from_directory('info', path)
142
 
143
- if __name__ == '__main__':
144
- # Получаем информацию о TEN Agent с GitHub для актуализации данных
145
- try:
146
- github_url = "https://api.github.com/repos/TEN-framework/TEN-Agent"
147
- repo_info = requests.get(github_url).json()
148
- print(f"TEN Agent на GitHub: {repo_info.get('stargazers_count', '?')} звезд")
149
- except Exception as e:
150
- print(f"Не удалось получить информацию с GitHub: {e}")
 
 
151
 
152
- # Запускаем веб-сервер
 
 
 
 
 
153
  print(f"Запуск веб-сервера на порту {HF_PORT}...")
154
- app.run(host='0.0.0.0', port=HF_PORT)
 
 
 
 
 
 
 
 
1
  #!/usr/bin/env python3
2
  import os
3
+ import subprocess
4
+ import threading
5
+ import time
6
+ import signal
7
+ import sys
8
+ from http.server import HTTPServer, SimpleHTTPRequestHandler
9
+ import socket
10
 
11
  # Порт для Hugging Face Spaces
12
  HF_PORT = int(os.environ.get("PORT", 7860))
13
+ # Порт для TEN Agent API
14
+ TEN_AGENT_PORT = 8080
15
 
16
+ def is_port_in_use(port):
17
+ """Проверка занят ли порт"""
18
+ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
19
+ return s.connect_ex(('localhost', port)) == 0
20
 
21
+ def run_ten_agent():
22
+ """Запуск TEN Agent сервера"""
23
+ print("Запуск TEN Agent...")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
 
25
+ # Создаем директорию для логов, если её нет
26
+ os.makedirs("/tmp/ten_agent", exist_ok=True)
 
 
27
 
28
+ # Запускаем TEN Agent сервер
29
+ server_process = subprocess.Popen(
30
+ ["/app/server/bin/api"],
31
+ env={
32
+ **os.environ,
33
+ "LOG_PATH": "/tmp/ten_agent",
34
+ "LOG_STDOUT": "true",
35
+ "SERVER_PORT": str(TEN_AGENT_PORT),
36
+ "WORKERS_MAX": "10",
37
+ "WORKER_QUIT_TIMEOUT_SECONDES": "60"
38
+ }
39
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
 
41
+ return server_process
 
 
 
42
 
43
+ # Простой обработчик для веб-сервера
44
+ class TenAgentHandler(SimpleHTTPRequestHandler):
45
+ def do_GET(self):
46
+ if self.path == '/':
47
+ self.send_response(200)
48
+ self.send_header('Content-type', 'text/html; charset=utf-8')
49
+ self.end_headers()
50
+
51
+ # Статус TEN Agent
52
+ ten_agent_status = "работает" if is_port_in_use(TEN_AGENT_PORT) else "не запущен"
53
+
54
+ html = f"""
55
+ <html>
56
+ <head>
57
+ <title>TEN Agent на Hugging Face</title>
58
+ <style>
59
+ body {{
60
+ font-family: Arial, sans-serif;
61
+ max-width: 800px;
62
+ margin: 0 auto;
63
+ padding: 20px;
64
+ line-height: 1.6;
65
+ }}
66
+ h1, h2 {{
67
+ color: #2563eb;
68
+ }}
69
+ pre {{
70
+ background-color: #f1f5f9;
71
+ padding: 15px;
72
+ border-radius: 5px;
73
+ overflow-x: auto;
74
+ }}
75
+ .status {{
76
+ padding: 8px 16px;
77
+ border-radius: 4px;
78
+ display: inline-block;
79
+ margin-bottom: 20px;
80
+ }}
81
+ .status.running {{
82
+ background-color: #dcfce7;
83
+ color: #166534;
84
+ }}
85
+ .status.stopped {{
86
+ background-color: #fee2e2;
87
+ color: #991b1b;
88
+ }}
89
+ </style>
90
+ </head>
91
+ <body>
92
+ <h1>TEN Agent на Hugging Face</h1>
93
+
94
+ <div class="status {{'running' if ten_agent_status == 'работает' else 'stopped'}}">
95
+ Статус TEN Agent: {ten_agent_status}
96
+ </div>
97
+
98
+ <h2>Информация о сервере</h2>
99
+ <ul>
100
+ <li>TEN Agent API доступен на порту: {TEN_AGENT_PORT}</li>
101
+ <li>Веб-интерфейс работает на порту: {HF_PORT}</li>
102
+ </ul>
103
+
104
+ <h2>Взаимодействие с API</h2>
105
+ <p>Для взаимодействия с TEN Agent API используйте следующий адрес:</p>
106
+ <pre>https://nitrox-ten.hf.space/api/</pre>
107
+
108
+ <h2>Документация</h2>
109
+ <p>Подробная информация о TEN Agent:</p>
110
+ <ul>
111
+ <li><a href="https://doc.theten.ai/ten-agent/overview" target="_blank">Официальная документация</a></li>
112
+ <li><a href="https://github.com/TEN-framework/TEN-Agent" target="_blank">Репозиторий на GitHub</a></li>
113
+ </ul>
114
+ </body>
115
+ </html>
116
+ """
117
+
118
+ self.wfile.write(html.encode('utf-8'))
119
+ else:
120
+ self.send_error(404)
121
 
122
+ # Обработчик сигналов для корректного завершения
123
+ def signal_handler(sig, frame):
124
+ print("Пол��чен сигнал завершения, останавливаю TEN Agent...")
125
+ if 'server_process' in globals() and server_process:
126
+ server_process.terminate()
127
+ server_process.wait(timeout=10)
128
+ sys.exit(0)
 
 
 
 
 
 
 
 
 
 
129
 
130
+ # Установка обработчиков сигналов
131
+ signal.signal(signal.SIGINT, signal_handler)
132
+ signal.signal(signal.SIGTERM, signal_handler)
 
133
 
134
+ if __name__ == "__main__":
135
+ # Запуск TEN Agent в отдельном потоке
136
+ server_process = run_ten_agent()
137
+
138
+ # Ожидаем запуск TEN Agent
139
+ print(f"Ожидаем запуск TEN Agent на порту {TEN_AGENT_PORT}...")
140
+ timeout = 60
141
+ while timeout > 0 and not is_port_in_use(TEN_AGENT_PORT):
142
+ time.sleep(1)
143
+ timeout -= 1
144
 
145
+ if is_port_in_use(TEN_AGENT_PORT):
146
+ print(f"TEN Agent успешно запущен на порту {TEN_AGENT_PORT}")
147
+ else:
148
+ print(f"Не удалось дождаться запуска TEN Agent на порту {TEN_AGENT_PORT}")
149
+
150
+ # Запуск веб-сервера для Hugging Face
151
  print(f"Запуск веб-сервера на порту {HF_PORT}...")
152
+ httpd = HTTPServer(('', HF_PORT), TenAgentHandler)
153
+ try:
154
+ httpd.serve_forever()
155
+ except KeyboardInterrupt:
156
+ pass
157
+ finally:
158
+ httpd.server_close()
159
+ signal_handler(None, None)