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

Упрощённая версия TEN Agent для Hugging Face с использованием Flask

Browse files
Files changed (2) hide show
  1. Dockerfile +13 -33
  2. app.py +138 -143
Dockerfile CHANGED
@@ -1,49 +1,29 @@
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
- COPY . .
9
-
10
- # Настройка окружения и установка зависимостей
11
- RUN mkdir -p agents/out && \
12
- echo '{"path": []}' > agents/session_control.conf && \
13
- cd /app && \
14
- task clean && task use AGENT=${USE_AGENT}
15
-
16
  FROM ubuntu:22.04
17
 
 
18
  RUN apt-get clean && apt-get update && apt-get install -y --no-install-recommends \
19
- libasound2 \
20
- libgstreamer1.0-dev \
21
- libunwind-dev \
22
- libc++1 \
23
- libssl-dev \
24
  python3 \
25
- python3-venv \
26
  python3-pip \
27
- python3-dev \
28
  curl \
29
- jq \
30
- vim \
31
  ca-certificates \
32
  && apt-get clean && rm -rf /var/lib/apt/lists/* && rm -rf /tmp/*
33
 
34
  WORKDIR /app
35
 
36
- # Копирование собранных файлов из builder
37
- COPY --from=builder /app/agents/.release/ /app/agents/
38
- COPY --from=builder /app/server/bin/api /app/server/bin/api
39
- COPY --from=builder /usr/local/lib /usr/local/lib
40
- COPY --from=builder /usr/lib/python3 /usr/lib/python3
41
-
42
- # Добавление скрипта для запуска сервера
43
  COPY app.py /app/
 
 
 
 
 
 
 
 
44
 
45
  # Экспозиция порта
46
- EXPOSE 7860 8080
47
 
48
- # Запуск Python скрипта для интеграции с Hugging Face
49
  CMD ["python3", "app.py"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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"]
app.py CHANGED
@@ -1,159 +1,154 @@
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)
 
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)