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) @app.get("/") async def home(): return {"status": "ok", "message": "Async OpenRouter proxy is working :3"} @app.api_route("/{endpoint:path}", methods=["GET", "POST", "PUT", "PATCH", "DELETE"]) 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