File size: 2,916 Bytes
08ee52a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | from fastapi import FastAPI, UploadFile, File
from fastapi.middleware.cors import CORSMiddleware
import httpx, io, json, os
from googleapiclient.discovery import build
from googleapiclient.http import MediaIoBaseUpload
from google.oauth2 import service_account
app = FastAPI()
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"])
DRIVE_FOLDER_ID = os.environ.get("DRIVE_FOLDER_ID", "")
_creds = None
drive = None
def get_drive():
global _creds, drive
if drive is None:
_creds = service_account.Credentials.from_service_account_info(
json.loads(os.environ["GOOGLE_SERVICE_ACCOUNT_JSON"]),
scopes=["https://www.googleapis.com/auth/drive"]
)
drive = build("drive", "v3", credentials=_creds)
return drive
@app.get("/")
def root():
return {"status": "Dolor D Prince API Gateway running"}
@app.post("/v1/chat/completions")
async def chat_completions(body: dict):
api_key = os.environ.get("OPENROUTER_API_KEY", "")
async with httpx.AsyncClient(timeout=60) as client:
res = await client.post(
"https://openrouter.ai/api/v1/chat/completions",
headers={"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"},
json=body,
)
return res.json()
@app.post("/v1/projects/{page_id}")
async def save_project(page_id: str, body: dict):
d = get_drive()
fname = f"{page_id}.json"
media = MediaIoBaseUpload(io.BytesIO(json.dumps(body).encode()), mimetype="application/json")
existing = d.files().list(q=f"name='{fname}' and '{DRIVE_FOLDER_ID}' in parents").execute()
if existing["files"]:
d.files().update(fileId=existing["files"][0]["id"], media_body=media).execute()
else:
d.files().create(body={"name": fname, "parents": [DRIVE_FOLDER_ID]}, media_body=media).execute()
return {"status": "ok"}
@app.get("/v1/projects/{page_id}")
async def load_project(page_id: str):
d = get_drive()
fname = f"{page_id}.json"
res = d.files().list(q=f"name='{fname}' and '{DRIVE_FOLDER_ID}' in parents").execute()
if not res["files"]:
return {"data": {}}
content = d.files().get_media(fileId=res["files"][0]["id"]).execute()
return {"data": json.loads(content)}
@app.post("/v1/assets/upload")
async def upload_asset(files: list[UploadFile] = File(...)):
d = get_drive()
urls = []
for f in files:
media = MediaIoBaseUpload(io.BytesIO(await f.read()), mimetype=f.content_type)
created = d.files().create(
body={"name": f.filename, "parents": [DRIVE_FOLDER_ID]}, media_body=media, fields="id"
).execute()
d.permissions().create(fileId=created["id"], body={"role": "reader", "type": "anyone"}).execute()
urls.append(f"https://drive.google.com/uc?id={created['id']}")
return {"data": [{"src": u} for u in urls]}
|