Spaces:
Sleeping
Sleeping
| import os | |
| import httpx | |
| from fastapi import FastAPI, Request | |
| from fastapi.responses import StreamingResponse | |
| app = FastAPI() | |
| OR_BASE_URL = "https://api.openai.com/v1" | |
| # Создаем один асинхронный клиент на все приложение для переиспользования соединений | |
| client = httpx.AsyncClient(base_url=OR_BASE_URL) | |
| async def home(): | |
| return {"status": "ok", "message": "Async OpenRouter proxy is working :3"} | |
| async def proxy(endpoint: str, request: Request): | |
| # Копируем заголовки, кроме тех, что не должны пересылаться | |
| headers = {k: v for k, v in request.headers.items() if k.lower() not in ["host", "content-length", "content-encoding"]} | |
| try: | |
| # Асинхронно создаем запрос к удаленному серверу | |
| req = client.build_request( | |
| method=request.method, | |
| url=f"/{endpoint}", | |
| headers=headers, | |
| params=request.query_params, | |
| content=await request.body() # Асинхронно читаем тело входящего запроса | |
| ) | |
| # `stream=True` здесь работает по-настоящему асинхронно | |
| resp = await client.send(req, stream=True) | |
| # Асинхронный генератор для потоковой передачи ответа | |
| async def async_generator(): | |
| async for chunk in resp.aiter_bytes(): | |
| yield chunk | |
| # Копируем заголовки ответа | |
| response_headers = {k: v for k, v in resp.headers.items() if k.lower() not in ["content-encoding", "transfer-encoding", "connection"]} | |
| return StreamingResponse( | |
| async_generator(), | |
| status_code=resp.status_code, | |
| headers=response_headers, | |
| ) | |
| except httpx.RequestError as e: | |
| return {"error": f"HTTPX error: {str(e)}"}, 500 | |
| except Exception as e: | |
| return {"error": str(e)}, 500 | |
| # Для запуска: uvicorn your_file_name:app --host 0.0.0.0 --port 7860 |