NewOpenAiProxy / app.py
Rooni's picture
Update app.py
6ea66c7 verified
raw
history blame
2.26 kB
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