CoolFace
Apppublic

eman324/kawkabi

sourceHugging Faceupdated 12d agoView on Hugging Face
0likes
api.py163 linesDownload Raw Back to root
1"""2api.py - كوكبي Kawkabi3============================4FastAPI Backend 5 python api.py6"""7 8from fastapi import FastAPI, HTTPException9from fastapi.middleware.cors import CORSMiddleware10from pydantic import BaseModel11from typing import List, Optional12import uvicorn13 14from config import (15    PROVIDER,16    GROQ_API_KEY,17    MODEL,18    MAX_TOKENS,19    TEMPERATURE,20    SYSTEM_PROMPT,21    API_HOST,22    API_PORT,23)24 25# ── AI Client ─────────────────────────────────────────────────────────────────26if PROVIDER == "groq":27    from groq import Groq28    ai_client = Groq(api_key=GROQ_API_KEY)29 30 31 32def call_ai(message: str, history: list) -> str:33    clean_history = []34    for m in history:35        role = m.get("role", "")36        content = m.get("content", "")37        if role in ("user", "assistant") and content:38            clean_history.append({"role": role, "content": content})39    clean_history.append({"role": "user", "content": message})40 41    if PROVIDER == "groq":42        response = ai_client.chat.completions.create(43            model=MODEL,44            max_tokens=MAX_TOKENS,45            temperature=TEMPERATURE,46            messages=[{"role": "system", "content": SYSTEM_PROMPT}] + clean_history,47        )48        return response.choices[0].message.content49    else:50        response = ai_client.messages.create(51            model=MODEL,52            max_tokens=MAX_TOKENS,53            system=SYSTEM_PROMPT,54            messages=clean_history,55        )56        return response.content[0].text57 58 59# ── FastAPI App ────────────────────────────────────────────────────────────────60app = FastAPI(61    title="Kawkabi Task Builder API",62    description="ADHD Task Builder Chatbot for children (6-12) - كوكبي",63    version="1.0.0",64)65 66app.add_middleware(67    CORSMiddleware,68    allow_origins=["*"],69    allow_methods=["*"],70    allow_headers=["*"],71)72 73 74# ── Schemas ───────────────────────────────────────────────────────────────────75class ChatMessage(BaseModel):76    role: str77    content: str78 79 80class ChatRequest(BaseModel):81    message: str82    history: Optional[List[ChatMessage]] = []83 84    model_config = {85        "json_schema_extra": {86            "example": {87                "message": "عندي واجب رياضيات مش عارف ابدا",88                "history": []89            }90        }91    }92 93 94class ChatResponse(BaseModel):95    reply: str96    history: List[ChatMessage]97 98 99# ── Endpoints ─────────────────────────────────────────────────────────────────100@app.get("/", tags=["Info"])101def root():102    return {103        "app": "كوكبي - Kawkabi",104        "feature": "Task Builder Chatbot",105        "provider": PROVIDER,106        "model": MODEL,107        "status": "running",108        "endpoints": {"chat": "POST /chat", "reset": "POST /reset", "docs": "/docs"}109    }110 111 112@app.post("/chat", response_model=ChatResponse, tags=["Chat"])113def chat(payload: ChatRequest):114    """115    ابعت رسالة واستقبل الرد.116 117    **Request:** `{ "message": "عندي واجب", "history": [] }`118 119    **Response:** `{ "reply": "يلا نحله...", "history": [...] }`120    """121    try:122        reply = call_ai(payload.message, [m.model_dump() for m in (payload.history or [])])123    except Exception as e:124        err = str(e)125        if "401" in err or "auth" in err.lower() or "invalid" in err.lower():126            raise HTTPException(status_code=401, detail="API Key غلط - تاكد من config.py")127        raise HTTPException(status_code=500, detail=f"AI Error: {err}")128 129    updated_history = list(payload.history or []) + [130        ChatMessage(role="user", content=payload.message),131        ChatMessage(role="assistant", content=reply),132    ]133    return ChatResponse(reply=reply, history=updated_history)134 135 136@app.post("/reset", tags=["Chat"])137def reset():138    return {"status": "محادثة جديدة - New conversation started"}139 140 141# ── Run ───────────────────────────────────────────────────────────────────────142if __name__ == "__main__":143    import webbrowser144    import threading145    import time146 147    def open_browser():148        time.sleep(1.5)149        webbrowser.open("http://localhost:" + str(API_PORT) + "/docs")150 151    threading.Thread(target=open_browser, daemon=True).start()152 153    print("\n" + "=" * 50)154    print("Kawkabi - Task Builder API")155    print("=" * 50)156    print("Provider : " + PROVIDER.upper())157    print("Model    : " + MODEL)158    print("API      : http://localhost:" + str(API_PORT))159    print("Docs     : http://localhost:" + str(API_PORT) + "/docs")160    print("بيفتح المتصفح اوتوماتيك على Swagger...")161    print("=" * 50 + "\n")162 163    uvicorn.run(app, host=API_HOST, port=API_PORT)