bilalabic commited on
Commit
97c879a
·
verified ·
1 Parent(s): d55fd48

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +158 -0
app.py ADDED
@@ -0,0 +1,158 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI, HTTPException
2
+ from fastapi.middleware.cors import CORSMiddleware
3
+ from pydantic import BaseModel
4
+ from llama_cpp import Llama
5
+ import os
6
+ import logging
7
+
8
+ # Logging ayarları
9
+ logging.basicConfig(level=logging.INFO)
10
+ logger = logging.getLogger(__name__)
11
+
12
+ app = FastAPI(title="FitTürkAI API", description="Türkçe Sağlıklı Yaşam Asistanı")
13
+
14
+ # CORS ayarları
15
+ app.add_middleware(
16
+ CORSMiddleware,
17
+ allow_origins=["*"], # Üretimde spesifik domain kullanın
18
+ allow_credentials=True,
19
+ allow_methods=["*"],
20
+ allow_headers=["*"],
21
+ )
22
+
23
+ # Request/Response modelleri
24
+ class ChatRequest(BaseModel):
25
+ prompt: str
26
+ max_tokens: int = 512
27
+
28
+ class ChatResponse(BaseModel):
29
+ response: str
30
+ status: str = "success"
31
+
32
+ # Model yükleme
33
+ llm = None
34
+
35
+ def load_model():
36
+ global llm
37
+ try:
38
+ # GGUF model dosyasının adı
39
+ model_dosya_adi = "FitTurkAI-Cosmos-Q8.gguf"
40
+
41
+ # Eğer model dosyası yoksa Hugging Face'den indir
42
+ if not os.path.exists(model_dosya_adi):
43
+ from huggingface_hub import hf_hub_download
44
+ logger.info("Model indiriliyor...")
45
+ model_dosya_adi = hf_hub_download(
46
+ repo_id="sudenurozturk/AIYildiz-FitTurkAI",
47
+ filename=model_dosya_adi
48
+ )
49
+
50
+ # LLM modeli yükleniyor
51
+ logger.info("Model yükleniyor...")
52
+ llm = Llama(
53
+ model_path=model_dosya_adi,
54
+ n_ctx=2048,
55
+ n_threads=4
56
+ )
57
+ logger.info("Model başarıyla yüklendi!")
58
+ return True
59
+
60
+ except Exception as e:
61
+ logger.error(f"Model yükleme hatası: {str(e)}")
62
+ return False
63
+
64
+ # Sistem talimatı
65
+ SISTEM_TALIMATI = """
66
+ [ROL]
67
+ Sen "FitTürkAI" adında, empatik ve profesyonel bir kişisel sağlıklı yaşam koçusun. Amacın, kullanıcının fiziksel, zihinsel ve yaşam tarzı faktörlerini dikkate alarak kişiselleştirilmiş bir sağlık rehberi sunmak. Tıbbi teşhis koymazsın, tedavi önermezsin.
68
+ [GÖREV]
69
+ Kullanıcının verdiği bilgilerden yola çıkarak kişisel bir "Sağlıklı Yaşam Planı" oluştur. Bu plan aşağıdaki bileşenleri içerebilir:
70
+ - Beslenme önerisi (örnek öğünler ve kalori/porsiyon bilgisiyle)
71
+ - Egzersiz planı
72
+ - Su tüketim hedefi
73
+ - Uyku düzeni ve stres yönetimi tavsiyesi
74
+ - Kullanıcının belirlemesi için küçük bir mikro hedef
75
+ - Kapanışta motive edici bir mesaj
76
+ [KURALLAR]
77
+ - ✅ Açıklamalar net ve uygulanabilir olmalı.
78
+ - ❌ "Tedavi", "reçete", "zayıflama diyeti", "kesin sonuç" gibi ifadeler kullanma.
79
+ - ✅ "Öneri", "yaklaşık plan", "rehber", "kişisel yaklaşım" ifadelerini tercih et.
80
+ - ✅ Sağlık profesyoneli olmadığını başlangıçta kısaca belirt.
81
+ - ✅ Profesyonel, destekleyici, motive edici ve sade bir dil kullan. Yanıtlar doğrudan, bölümlenmiş şekilde sunulmalı. Gerekiyorsa *kalın* veya _italik_ vurgularla yap.
82
+ [FEW-SHOT ÖRNEK]
83
+ Kullanıcı: 18 yaşında, kadın, 160 cm boyunda ve 65 kg. Bir haftada kilo vermek istiyor.
84
+ FitTürkAI:
85
+ *Merhaba! Ben FitTürkAI. Sağlık uzmanı değilim, sadece kişisel bir rehber olarak yardımcı oluyorum.*
86
+ **Beslenme:**
87
+ Sabah kahvaltısında 1 haşlanmış yumurta, 1 dilim tam buğday ekmeği, 1 dilim beyaz peynir ve bol yeşillik tüketebilirsin. Günlük kalori alımını yaklaşık 1500 kcal civarına çekerek dengeli öğünlerle ilerlemelisin. Ara öğünlerde meyve yerine yoğurt veya kuruyemiş önerilir.
88
+ **Egzersiz:**
89
+ Her gün 30 dakikalık tempolu yürüyüş ve haftada 3 gün hafif ev egzersizleri yeterli olacaktır.
90
+ **Su:**
91
+ Günde 2-2.5 litre su içmeyi hedefle. Öğünlerden önce su içmek tokluk hissini artırır.
92
+ **Uyku ve stres:**
93
+ Günde 7 saat uyku almalı, akşam ekran süresini azaltmalısın. Stresle baş etmek için nefes egzersizleri yapabilirsin.
94
+ **Mikro Hedef:**
95
+ Bu hafta boyunca günde 1 ana öğünde sebze yemeği tüketmeyi hedefleyebilirsin.
96
+ *İstikrarlı ve küçük adımlar büyük fark yaratır! Devam et, yanındayım.*
97
+ """
98
+
99
+ @app.on_event("startup")
100
+ async def startup_event():
101
+ """Uygulama başlangıcında model yükle"""
102
+ success = load_model()
103
+ if not success:
104
+ logger.error("Model yüklenemedi! Uygulama başlatılamayacak.")
105
+
106
+ @app.get("/")
107
+ async def root():
108
+ return {"message": "FitTürkAI API çalışıyor!", "status": "healthy"}
109
+
110
+ @app.get("/health")
111
+ async def health_check():
112
+ model_status = "loaded" if llm is not None else "not_loaded"
113
+ return {
114
+ "status": "healthy",
115
+ "model_status": model_status
116
+ }
117
+
118
+ @app.post("/generate", response_model=ChatResponse)
119
+ async def generate_response(request: ChatRequest):
120
+ """Ana endpoint - kullanıcı sorusuna yanıt üret"""
121
+
122
+ if llm is None:
123
+ raise HTTPException(status_code=503, detail="Model henüz yüklenmedi")
124
+
125
+ try:
126
+ # Prompt oluştur
127
+ prompt = f"""{SISTEM_TALIMATI.strip()}
128
+ Kullanıcı: {request.prompt}
129
+ FitTürkAI:"""
130
+
131
+ # Model ile yanıt üret
132
+ yanit = llm(
133
+ prompt=prompt,
134
+ max_tokens=request.max_tokens,
135
+ stop=["Kullanıcı:", "FitTürkAI:"],
136
+ temperature=0.7
137
+ )
138
+
139
+ response_text = yanit["choices"][0]["text"].strip()
140
+
141
+ return ChatResponse(
142
+ response=response_text,
143
+ status="success"
144
+ )
145
+
146
+ except Exception as e:
147
+ logger.error(f"Yanıt üretme hatası: {str(e)}")
148
+ raise HTTPException(status_code=500, detail=f"Yanıt üretilemedi: {str(e)}")
149
+
150
+ @app.post("/chat")
151
+ async def chat_endpoint(request: ChatRequest):
152
+ """Alternatif endpoint - basit JSON response"""
153
+ result = await generate_response(request)
154
+ return {"response": result.response}
155
+
156
+ if __name__ == "__main__":
157
+ import uvicorn
158
+ uvicorn.run(app, host="0.0.0.0", port=7860)