eman324/kawkabi
0
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)