|
|
| 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"]} |
|
|