menno3213/shadowai-api
0
1from fastapi import FastAPI2from fastapi.middleware.cors import CORSMiddleware3from pydantic import BaseModel4import httpx, json, re, uuid, asyncio5 6MODEL_API = "https://menno3213-shadowai.hf.space"7 8app = FastAPI(title="ShadowAI API")9app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"])10 11class GenerateRequest(BaseModel):12 prompt: str13 language: str = "typescript"14 model: str = "shadowai"15 sessionId: str | None = None16 platform: str = "web"17 18@app.get("/")19def root():20 return {"status": "ok", "model": "ShadowAI 42M"}21 22@app.post("/api/generate")23@app.post("/api/ai/generate")24async def generate(req: GenerateRequest):25 session_id = req.sessionId or f"sess_{int(asyncio.get_event_loop().time())}_{uuid.uuid4().hex[:6]}"26 payload = {"data": [req.prompt, [], 0.4, 512]}27 async with httpx.AsyncClient(timeout=120) as client:28 r = await client.post(f"{MODEL_API}/gradio_api/call/respond", json=payload)29 r.raise_for_status()30 event_id = r.json()["event_id"]31 raw = ""32 for _ in range(60):33 await asyncio.sleep(1)34 r2 = await client.get(f"{MODEL_API}/gradio_api/call/respond/{event_id}")35 text = r2.text36 if "event: complete" in text:37 for line in text.split("\n"):38 if line.startswith("data:"):39 try:40 data = json.loads(line[5:])41 if isinstance(data, list) and len(data) > 1:42 msgs = data[1]43 if msgs and len(msgs) > 0:44 last = msgs[-1]45 if "content" in last and len(last["content"]) > 0:46 raw = last["content"][-1].get("text", "")47 except: pass48 break49 raw = raw.split("# User:")[0].split("# Assistant:")[-1].strip()50 raw = re.sub(r"\s+", " ", raw).strip()51 return {52 "sessionId": session_id,53 "files": [],54 "model": "shadowai",55 "rawResponse": raw or "(no response generated)"56 }57 