ten / proxy.py
3v324v23's picture
Fix TEN-Agent for HuggingFace Space: Replace Go server with Python wrapper
588adc0
#!/usr/bin/env python3
import http.server
import socketserver
import urllib.request
import urllib.error
import json
import os
import sys
from pathlib import Path
# Порты для сервисов
API_PORT = int(os.environ.get("API_PORT", 8080))
UI_PORT = int(os.environ.get("UI_PORT", 3000))
PROXY_PORT = int(os.environ.get("PROXY_PORT", 49483))
class ProxyHandler(http.server.SimpleHTTPRequestHandler):
def log_message(self, format, *args):
"""Переопределение логирования для вывода в stdout"""
print("%s - %s" % (self.address_string(), format % args))
def do_GET(self):
"""Обработка GET запросов с перенаправлением"""
print(f"GET request: {self.path}")
# Если путь начинается с /api, перенаправляем на API сервер
if self.path.startswith('/api/'):
self._proxy_request("GET", API_PORT)
else:
self.send_error(404, "Not Found")
def do_POST(self):
"""Обработка POST запросов с перенаправлением"""
print(f"POST request: {self.path}")
# Если путь начинается с /api, перенаправляем на API сервер
if self.path.startswith('/api/'):
self._proxy_request("POST", API_PORT)
elif self.path.startswith('/api/dev/v1/packages') or self.path.startswith('/api/designer/v1/packages'):
self._handle_packages_request()
else:
self.send_error(404, "Not Found")
def do_OPTIONS(self):
"""Обработка OPTIONS запросов"""
self.send_response(200)
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
self.send_header('Access-Control-Allow-Headers', 'Content-Type, Authorization')
self.end_headers()
def _proxy_request(self, method, port):
"""Прокси запрос на указанный порт"""
target_url = f"http://localhost:{port}{self.path}"
try:
# Читаем тело запроса, если есть
content_length = int(self.headers['Content-Length']) if 'Content-Length' in self.headers else 0
body = self.rfile.read(content_length) if content_length > 0 else None
# Создаем запрос
req = urllib.request.Request(
target_url,
data=body,
headers={k: v for k, v in self.headers.items() if k.lower() not in ('host', 'content-length')},
method=method
)
# Выполняем запрос
with urllib.request.urlopen(req) as response:
# Копируем заголовки ответа
self.send_response(response.status)
for key, val in response.getheaders():
if key.lower() not in ('transfer-encoding', 'content-encoding'):
self.send_header(key, val)
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
# Копируем тело ответа
self.wfile.write(response.read())
except urllib.error.HTTPError as e:
self.send_response(e.code)
for key, val in e.headers.items():
if key.lower() not in ('transfer-encoding', 'content-encoding'):
self.send_header(key, val)
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
self.wfile.write(e.read())
except Exception as e:
self.send_error(500, f"Proxy Error: {str(e)}")
def _handle_packages_request(self):
"""Обрабатывает запросы к пакетам"""
try:
# Читаем содержимое property.json
property_file = Path("/tmp/ten_user/agents/property.json")
if property_file.exists():
with open(property_file, 'r') as f:
property_data = json.load(f)
graphs = property_data.get("graphs", [])
# Формируем ответ
response = {
"data": graphs,
"status": 200,
"message": "Success"
}
# Отправляем ответ
self.send_response(200)
self.send_header('Content-Type', 'application/json')
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
self.wfile.write(json.dumps(response).encode('utf-8'))
else:
self.send_error(404, "Property file not found")
except Exception as e:
self.send_error(500, f"Error handling packages request: {str(e)}")
def run_proxy_server():
"""Запускает прокси-сервер на указанном порту"""
handler = ProxyHandler
with socketserver.TCPServer(("", PROXY_PORT), handler) as httpd:
print(f"Starting proxy server on port {PROXY_PORT}...")
httpd.serve_forever()
if __name__ == "__main__":
run_proxy_server()