google / app.py
maylinejix's picture
Update app.py
c0ef6b2 verified
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import requests
import json
import re
import time
app = FastAPI()
class ChatRequest(BaseModel):
cookies: str
prompt: str
chat_id: str = None
class GeminiAPI:
def __init__(self, cookies_string):
self.cookies = self._parse_cookies(cookies_string)
self.session = requests.Session()
self.session.cookies.update(self.cookies)
self.headers = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Mobile Safari/537.36',
'Content-Type': 'application/json+protobuf',
'Accept': '*/*',
'Origin': 'https://aistudio.google.com',
'Referer': 'https://aistudio.google.com/',
'X-Goog-Api-Key': 'AIzaSyD0fP816MBRBSkj20Q04XbjsIcI0jGI0WOs',
'X-Client-Data': 'CJGVywE=',
}
def _parse_cookies(self, cookies_input):
cookies = {}
try:
cookie_list = json.loads(cookies_input)
if isinstance(cookie_list, list):
for cookie in cookie_list:
if 'name' in cookie and 'value' in cookie:
cookies[cookie['name']] = cookie['value']
return cookies
except:
pass
if isinstance(cookies_input, str):
parts = cookies_input.split(';')
for part in parts:
if '=' in part:
name, value = part.strip().split('=', 1)
cookies[name] = value
return cookies
def send_message(self, prompt, chat_id=None):
url = 'https://alkalimakersuite-pa.clients6.google.com/$rpc/google.internal.alkali.applications.makersuite.v1.MakerSuiteService/GenerateContent'
payload = [
"models/gemini-3-flash-preview",
[[[[None, prompt]], "user"]],
None,
0,
"models/gemini-3-flash-preview",
[None, None, None, 65536, 1, 0.95, 64, None, None, None, None, None, None, None],
"!GBu1G0PNAAZ19fabc_VClWQf4_wu6go7ADQBEArZ1NrXSqgcKEzmXhn1r70At0ogWMU1G6bOhL3",
None,
[[None, None, [[]]],
None,
None,
None,
None,
None,
None,
None,
None,
[[None, None, "Asia/Makassar"]]
]
try:
response = self.session.post(
url,
headers=self.headers,
json=payload,
timeout=30
)
if response.status_code != 200:
return None, f"HTTP Error: {response.status_code}"
data = response.json()
text_response = ""
if isinstance(data, list) and len(data) > 0:
for item in data:
if isinstance(item, list) and len(item) > 0:
for subitem in item:
if isinstance(subitem, list) and len(subitem) > 0:
for content in subitem:
if isinstance(content, list) and len(content) > 0:
for text_item in content:
if isinstance(text_item, list) and len(text_item) > 0:
if text_item[0] is None and len(text_item) > 1:
if isinstance(text_item[1], str):
text_response += text_item[1]
if text_response:
return {
'response': text_response.strip(),
'chat_id': chat_id,
'timestamp': int(time.time())
}, None
return None, "Tidak bisa parse response"
except Exception as e:
return None, str(e)
@app.post("/chat")
async def chat(request: ChatRequest):
try:
gemini = GeminiAPI(request.cookies)
result, error = gemini.send_message(request.prompt, request.chat_id)
if error:
raise HTTPException(status_code=400, detail=error)
return result
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/")
async def root():
return {
"message": "Gemini API",
"version": "2.0",
"endpoints": {
"POST /chat": {
"cookies": "string (JSON array atau cookie string)",
"prompt": "string",
"chat_id": "string (optional)"
}
}
}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=7860)