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

Upload 3 files

Browse files
Files changed (3) hide show
  1. Dockerfile +11 -16
  2. app.py +84 -0
  3. requirements.txt +3 -3
Dockerfile CHANGED
@@ -1,16 +1,11 @@
1
- FROM python:3.10
2
-
3
- WORKDIR /code
4
-
5
- COPY ./requirements.txt /code/requirements.txt
6
- RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
7
-
8
- COPY . .
9
-
10
- # Создаем пользователя, чтобы Hugging Face был доволен
11
- RUN useradd -m -u 1000 user
12
- USER user
13
- ENV HOME=/home/user \
14
- PATH=/home/user/.local/bin:$PATH
15
-
16
- CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]
 
1
+ FROM python:3.9
2
+
3
+ WORKDIR /code
4
+
5
+ COPY ./requirements.txt /code/requirements.txt
6
+
7
+ RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
8
+
9
+ COPY . .
10
+
11
+ CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
 
 
 
 
 
app.py ADDED
@@ -0,0 +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)}")
requirements.txt CHANGED
@@ -1,4 +1,4 @@
1
- fastapi
2
- uvicorn
3
- google-generativeai>=0.7.2
4
  pydantic
 
1
+ fastapi
2
+ uvicorn
3
+ requests
4
  pydantic