\Исправлен URL для подключения API и добавлены CORS заголовки\
Browse files
app.py
CHANGED
@@ -33,6 +33,10 @@ def main():
|
|
33 |
os.makedirs(log_dir, exist_ok=True)
|
34 |
# Даем всем права на запись в директорию логов
|
35 |
os.chmod(log_dir, 0o777)
|
|
|
|
|
|
|
|
|
36 |
|
37 |
# Запускаем API сервер с правильными переменными окружения
|
38 |
print("Starting TEN-Agent API server on port 8080...")
|
@@ -42,6 +46,8 @@ def main():
|
|
42 |
api_server_env["WORKERS_MAX"] = "4" # Устанавливаем значение для WORKERS_MAX
|
43 |
api_server_env["WORKER_QUIT_TIMEOUT_SECONDES"] = "30" # Добавляем timeout для воркеров
|
44 |
api_server_env["PORT"] = "8080" # Явно указываем порт
|
|
|
|
|
45 |
api_server_process = subprocess.Popen([str(api_binary)], env=api_server_env)
|
46 |
processes.append(api_server_process)
|
47 |
|
@@ -92,11 +98,15 @@ def main():
|
|
92 |
# Запускаем Playground UI на порту 3000
|
93 |
print("Starting Playground UI on port 3000...")
|
94 |
playground_env = os.environ.copy()
|
95 |
-
|
|
|
96 |
playground_env["NODE_ENV"] = "production" # Убедимся, что запускаем в production режиме
|
97 |
playground_env["PORT"] = "3000" # Указываем порт через переменную окружения
|
98 |
playground_env["HOST"] = "0.0.0.0" # Указываем привязку ко всем интерфейсам
|
99 |
|
|
|
|
|
|
|
100 |
# В standalone режиме используем дополнительные параметры
|
101 |
if is_standalone:
|
102 |
print("Using Next.js standalone mode...")
|
@@ -142,11 +152,16 @@ def main():
|
|
142 |
self._handle_request('DELETE')
|
143 |
|
144 |
def do_OPTIONS(self):
|
145 |
-
|
|
|
|
|
|
|
|
|
|
|
146 |
|
147 |
def _handle_request(self, method):
|
148 |
try:
|
149 |
-
# Определяем, какой сервер должен
|
150 |
target_host = container_ip # Используем IP контейнера вместо localhost
|
151 |
|
152 |
# При запросе статических файлов Next.js, если включен standalone режим,
|
@@ -233,6 +248,11 @@ def main():
|
|
233 |
if header.lower() != 'transfer-encoding': # Исключаем заголовок transfer-encoding
|
234 |
self.send_header(header, value)
|
235 |
|
|
|
|
|
|
|
|
|
|
|
236 |
# Завершаем заголовки
|
237 |
self.end_headers()
|
238 |
|
@@ -321,6 +341,7 @@ def main():
|
|
321 |
<p>Система пытается запустить все компоненты. Попробуйте обновить страницу через минуту.</p>
|
322 |
<p>Технические детали:</p>
|
323 |
<pre>
|
|
|
324 |
Container IP: {container_ip}
|
325 |
Method: {method}
|
326 |
Path: {self.path}
|
|
|
33 |
os.makedirs(log_dir, exist_ok=True)
|
34 |
# Даем всем права на запись в директорию логов
|
35 |
os.chmod(log_dir, 0o777)
|
36 |
+
|
37 |
+
# Определяем публичный URL для API в пространстве Hugging Face
|
38 |
+
public_url = os.environ.get('SPACE_URL', 'https://nitrox-ten.hf.space')
|
39 |
+
print(f"Using public URL: {public_url}")
|
40 |
|
41 |
# Запускаем API сервер с правильными переменными окружения
|
42 |
print("Starting TEN-Agent API server on port 8080...")
|
|
|
46 |
api_server_env["WORKERS_MAX"] = "4" # Устанавливаем значение для WORKERS_MAX
|
47 |
api_server_env["WORKER_QUIT_TIMEOUT_SECONDES"] = "30" # Добавляем timeout для воркеров
|
48 |
api_server_env["PORT"] = "8080" # Явно указываем порт
|
49 |
+
# Разрешаем CORS
|
50 |
+
api_server_env["GIN_MODE"] = "release"
|
51 |
api_server_process = subprocess.Popen([str(api_binary)], env=api_server_env)
|
52 |
processes.append(api_server_process)
|
53 |
|
|
|
98 |
# Запускаем Playground UI на порту 3000
|
99 |
print("Starting Playground UI on port 3000...")
|
100 |
playground_env = os.environ.copy()
|
101 |
+
# Подключаемся к API через внешний URL, доступный из браузера
|
102 |
+
playground_env["AGENT_SERVER_URL"] = public_url
|
103 |
playground_env["NODE_ENV"] = "production" # Убедимся, что запускаем в production режиме
|
104 |
playground_env["PORT"] = "3000" # Указываем порт через переменную окружения
|
105 |
playground_env["HOST"] = "0.0.0.0" # Указываем привязку ко всем интерфейсам
|
106 |
|
107 |
+
# Добавляем переменные для корректной работы Next.js с API
|
108 |
+
playground_env["NEXT_PUBLIC_API_URL"] = public_url
|
109 |
+
|
110 |
# В standalone режиме используем дополнительные параметры
|
111 |
if is_standalone:
|
112 |
print("Using Next.js standalone mode...")
|
|
|
152 |
self._handle_request('DELETE')
|
153 |
|
154 |
def do_OPTIONS(self):
|
155 |
+
# Для OPTIONS запросов всегда отвечаем с CORS заголовками
|
156 |
+
self.send_response(200)
|
157 |
+
self.send_header('Access-Control-Allow-Origin', '*')
|
158 |
+
self.send_header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
|
159 |
+
self.send_header('Access-Control-Allow-Headers', 'Content-Type, Authorization, x-requested-with')
|
160 |
+
self.end_headers()
|
161 |
|
162 |
def _handle_request(self, method):
|
163 |
try:
|
164 |
+
# Определяем, какой сервер должен обработить запрос
|
165 |
target_host = container_ip # Используем IP контейнера вместо localhost
|
166 |
|
167 |
# При запросе статических файлов Next.js, если включен standalone режим,
|
|
|
248 |
if header.lower() != 'transfer-encoding': # Исключаем заголовок transfer-encoding
|
249 |
self.send_header(header, value)
|
250 |
|
251 |
+
# Добавляем CORS заголовки
|
252 |
+
self.send_header('Access-Control-Allow-Origin', '*')
|
253 |
+
self.send_header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
|
254 |
+
self.send_header('Access-Control-Allow-Headers', 'Content-Type, Authorization, x-requested-with')
|
255 |
+
|
256 |
# Завершаем заголовки
|
257 |
self.end_headers()
|
258 |
|
|
|
341 |
<p>Система пытается запустить все компоненты. Попробуйте обновить страницу через минуту.</p>
|
342 |
<p>Технические детали:</p>
|
343 |
<pre>
|
344 |
+
Public URL: {public_url}
|
345 |
Container IP: {container_ip}
|
346 |
Method: {method}
|
347 |
Path: {self.path}
|