Rooni commited on
Commit
6ea66c7
·
verified ·
1 Parent(s): 9e23a59

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +39 -28
app.py CHANGED
@@ -1,43 +1,54 @@
1
  import os
2
- import requests
3
- from flask import Flask, request, Response
 
4
 
5
- app = Flask(__name__)
6
 
7
  OR_BASE_URL = "https://api.openai.com/v1"
8
 
 
 
9
 
10
- @app.route("/", methods=["GET"])
11
- def home():
12
- return {"status": "ok", "message": "OpenRouter proxy is working :3"}
13
 
14
 
15
- @app.route("/<path:endpoint>", methods=["GET", "POST", "PUT", "PATCH", "DELETE"])
16
- def proxy(endpoint):
17
- url = f"{OR_BASE_URL}/{endpoint}"
18
-
19
- # Копируем все заголовки, кроме host и content-length
20
- headers = {k: v for k, v in request.headers if k.lower() not in ["host", "content-length"]}
21
-
22
  try:
23
- resp = requests.request(
 
24
  method=request.method,
25
- url=url,
26
  headers=headers,
27
- params=request.args,
28
- data=request.get_data(),
29
- allow_redirects=False,
30
- stream=True,
31
  )
32
-
33
- excluded_headers = ["content-encoding", "transfer-encoding", "connection"]
34
- response_headers = [(k, v) for k, v in resp.raw.headers.items() if k.lower() not in excluded_headers]
35
-
36
- return Response(resp.content, resp.status_code, response_headers)
37
-
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  except Exception as e:
39
  return {"error": str(e)}, 500
40
 
41
-
42
- if __name__ == "__main__":
43
- app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 7860)))
 
1
  import os
2
+ import httpx
3
+ from fastapi import FastAPI, Request
4
+ from fastapi.responses import StreamingResponse
5
 
6
+ app = FastAPI()
7
 
8
  OR_BASE_URL = "https://api.openai.com/v1"
9
 
10
+ # Создаем один асинхронный клиент на все приложение для переиспользования соединений
11
+ client = httpx.AsyncClient(base_url=OR_BASE_URL)
12
 
13
+ @app.get("/")
14
+ async def home():
15
+ return {"status": "ok", "message": "Async OpenRouter proxy is working :3"}
16
 
17
 
18
+ @app.api_route("/{endpoint:path}", methods=["GET", "POST", "PUT", "PATCH", "DELETE"])
19
+ async def proxy(endpoint: str, request: Request):
20
+ # Копируем заголовки, кроме тех, что не должны пересылаться
21
+ headers = {k: v for k, v in request.headers.items() if k.lower() not in ["host", "content-length", "content-encoding"]}
22
+
 
 
23
  try:
24
+ # Асинхронно создаем запрос к удаленному серверу
25
+ req = client.build_request(
26
  method=request.method,
27
+ url=f"/{endpoint}",
28
  headers=headers,
29
+ params=request.query_params,
30
+ content=await request.body() # Асинхронно читаем тело входящего запроса
 
 
31
  )
32
+
33
+ # `stream=True` здесь работает по-настоящему асинхронно
34
+ resp = await client.send(req, stream=True)
35
+
36
+ # Асинхронный генератор для потоковой передачи ответа
37
+ async def async_generator():
38
+ async for chunk in resp.aiter_bytes():
39
+ yield chunk
40
+
41
+ # Копируем заголовки ответа
42
+ response_headers = {k: v for k, v in resp.headers.items() if k.lower() not in ["content-encoding", "transfer-encoding", "connection"]}
43
+
44
+ return StreamingResponse(
45
+ async_generator(),
46
+ status_code=resp.status_code,
47
+ headers=response_headers,
48
+ )
49
+ except httpx.RequestError as e:
50
+ return {"error": f"HTTPX error: {str(e)}"}, 500
51
  except Exception as e:
52
  return {"error": str(e)}, 500
53
 
54
+ # Для запуска: uvicorn your_file_name:app --host 0.0.0.0 --port 7860