admin1 / app.py
yash184's picture
Upload 5 files
016e45e verified
Raw
History Blame Contribute Delete
1.98 kB
from fastapi import FastAPI
from fastapi.responses import HTMLResponse
from pydantic import BaseModel
import json, requests
app=FastAPI()
CFG="config.json"
class Config(BaseModel):
base_url:str
api_key:str
model:str
class Prompt(BaseModel):
prompt:str
def load():
try:
return json.load(open(CFG))
except:
return {"base_url":"https://openrouter.ai/api/v1","api_key":"","model":"google/gemma-3-27b-it"}
HTML="""<!doctype html><html><body><h2>Simple AI Backend</h2>
Base URL<br><input id=b size=70><br><br>
API Key<br><input id=k size=70><br><br>
Model<br><input id=m size=70><br><br>
<button onclick='saveCfg()'>Save</button><hr>
<textarea id=p rows=10 cols=100></textarea><br>
<button onclick='gen()'>Generate</button><pre id=o></pre>
<script>
fetch('/config').then(r=>r.json()).then(c=>{b.value=c.base_url||'';k.value=c.api_key||'';m.value=c.model||'';});
async function saveCfg(){await fetch('/save',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({base_url:b.value,api_key:k.value,model:m.value})});alert('Saved');}
async function gen(){o.innerText='Generating...';let r=await fetch('/generate',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({prompt:p.value})});let j=await r.json();o.innerText=j.text||JSON.stringify(j);}
</script></body></html>"""
@app.get("/")
def home(): return HTMLResponse(HTML)
@app.get("/config")
def config(): return load()
@app.post("/save")
def save(cfg:Config):
json.dump(cfg.model_dump(),open(CFG,"w"),indent=2)
return {"success":True}
@app.post("/generate")
def generate(data:Prompt):
c=load()
r=requests.post(c["base_url"].rstrip("/")+"/chat/completions",
headers={"Authorization":"Bearer "+c["api_key"],"Content-Type":"application/json"},
json={"model":c["model"],"messages":[{"role":"user","content":data.prompt}]},timeout=300)
r.raise_for_status()
return {"text":r.json()["choices"][0]["message"]["content"]}