nicolaydef commited on
Commit
805eef5
·
verified ·
1 Parent(s): 94503ad

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +83 -83
app.py CHANGED
@@ -1,84 +1,84 @@
1
- import os
2
- import requests
3
- from fastapi import FastAPI, HTTPException
4
- from pydantic import BaseModel
5
- from typing import List, Dict, Optional
6
- import uuid
7
-
8
- app = FastAPI(title="Gemini Proxy Server")
9
-
10
- # Хранилище сессий (в памяти)
11
- chat_sessions: Dict[str, List[dict]] = {}
12
-
13
- class UserRequest(BaseModel):
14
- message: str
15
- session_id: Optional[str] = None
16
-
17
- # Берем ключ из Secret Variables на Hugging Face
18
- API_KEY = os.getenv("GEMINI_API_KEY")
19
- GEMINI_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent"
20
-
21
- @app.get("/")
22
- def home():
23
- return {"status": "running", "info": "Gemini Proxy for CLI is active"}
24
-
25
- @app.post("/newchat")
26
- def new_chat():
27
- new_id = str(uuid.uuid4())[:8]
28
- chat_sessions[new_id] = []
29
- return {"session_id": new_id, "message": "Новый чат создан."}
30
-
31
- @app.get("/chats")
32
- def list_chats():
33
- return {"active_sessions": list(chat_sessions.keys())}
34
-
35
- @app.post("/chat")
36
- def chat(req: UserRequest):
37
- if not API_KEY:
38
- raise HTTPException(status_code=500, detail="GEMINI_API_KEY не установлен в Secrets")
39
-
40
- sid = req.session_id
41
- if not sid or sid not in chat_sessions:
42
- sid = str(uuid.uuid4())[:8]
43
- chat_sessions[sid] = []
44
-
45
- # Добавляем сообщение юзера
46
- user_msg_obj = {"role": "user", "parts": [{"text": req.message}]}
47
- chat_sessions[sid].append(user_msg_obj)
48
-
49
- # Шлем историю в Gemini
50
- payload = {"contents": chat_sessions[sid]}
51
- headers = {"Content-Type": "application/json"}
52
-
53
- try:
54
- response = requests.post(
55
- f"{GEMINI_URL}?key={API_KEY}",
56
- json=payload,
57
- headers=headers,
58
- timeout=30
59
- )
60
- response.raise_for_status()
61
- data = response.json()
62
-
63
- # Парсим ответ
64
- try:
65
- ai_text = data["candidates"][0]["content"]["parts"][0]["text"]
66
- except (KeyError, IndexError):
67
- # Если Gemini вернул блок по безопасности или пустой ответ
68
- ai_text = "[Gemini не смог сгенерировать ответ (возможно, content filtering)]"
69
-
70
- # Сохраняем ответ модели
71
- ai_msg_obj = {"role": "model", "parts": [{"text": ai_text}]}
72
- chat_sessions[sid].append(ai_msg_obj)
73
-
74
- return {
75
- "response": ai_text,
76
- "session_id": sid
77
- }
78
-
79
- except requests.exceptions.RequestException as e:
80
- chat_sessions[sid].pop() # Удаляем последнее сообщение при ошибке
81
- raise HTTPException(status_code=502, detail=f"Google API Error: {str(e)}")
82
- except Exception as e:
83
- chat_sessions[sid].pop()
84
  raise HTTPException(status_code=500, detail=f"Server Error: {str(e)}")
 
1
+ import os
2
+ import requests
3
+ from fastapi import FastAPI, HTTPException
4
+ from pydantic import BaseModel
5
+ from typing import List, Dict, Optional
6
+ import uuid
7
+
8
+ app = FastAPI(title="Gemini Proxy Server")
9
+
10
+ # Хранилище сессий (в памяти)
11
+ chat_sessions: Dict[str, List[dict]] = {}
12
+
13
+ class UserRequest(BaseModel):
14
+ message: str
15
+ session_id: Optional[str] = None
16
+
17
+ # Берем ключ из Secret Variables на Hugging Face
18
+ API_KEY = os.getenv("GEMINI_API_KEY")
19
+ GEMINI_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent"
20
+
21
+ @app.get("/")
22
+ def home():
23
+ return {"status": "running", "info": "Gemini Proxy for CLI is active"}
24
+
25
+ @app.post("/newchat")
26
+ def new_chat():
27
+ new_id = str(uuid.uuid4())[:8]
28
+ chat_sessions[new_id] = []
29
+ return {"session_id": new_id, "message": "Новый чат создан."}
30
+
31
+ @app.get("/chats")
32
+ def list_chats():
33
+ return {"active_sessions": list(chat_sessions.keys())}
34
+
35
+ @app.post("/chat")
36
+ def chat(req: UserRequest):
37
+ if not API_KEY:
38
+ raise HTTPException(status_code=500, detail="GEMINI_API_KEY не установлен в Secrets")
39
+
40
+ sid = req.session_id
41
+ if not sid or sid not in chat_sessions:
42
+ sid = str(uuid.uuid4())[:8]
43
+ chat_sessions[sid] = []
44
+
45
+ # Добавляем сообщение юзера
46
+ user_msg_obj = {"role": "user", "parts": [{"text": req.message}]}
47
+ chat_sessions[sid].append(user_msg_obj)
48
+
49
+ # Шлем историю в Gemini
50
+ payload = {"contents": chat_sessions[sid]}
51
+ headers = {"Content-Type": "application/json"}
52
+
53
+ try:
54
+ response = requests.post(
55
+ f"{GEMINI_URL}?key={API_KEY}",
56
+ json=payload,
57
+ headers=headers,
58
+ timeout=30
59
+ )
60
+ response.raise_for_status()
61
+ data = response.json()
62
+
63
+ # Парсим ответ
64
+ try:
65
+ ai_text = data["candidates"][0]["content"]["parts"][0]["text"]
66
+ except (KeyError, IndexError):
67
+ # Если Gemini вернул блок по безопасности или пустой ответ
68
+ ai_text = "[Gemini не смог сгенерировать ответ (возможно, content filtering)]"
69
+
70
+ # Сохраняем ответ модели
71
+ ai_msg_obj = {"role": "model", "parts": [{"text": ai_text}]}
72
+ chat_sessions[sid].append(ai_msg_obj)
73
+
74
+ return {
75
+ "response": ai_text,
76
+ "session_id": sid
77
+ }
78
+
79
+ except requests.exceptions.RequestException as e:
80
+ chat_sessions[sid].pop() # Удаляем последнее сообщение при ошибке
81
+ raise HTTPException(status_code=502, detail=f"Google API Error: {str(e)}")
82
+ except Exception as e:
83
+ chat_sessions[sid].pop()
84
  raise HTTPException(status_code=500, detail=f"Server Error: {str(e)}")