ogaa12 commited on
Commit
4ec9d10
·
verified ·
1 Parent(s): e50a078

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +74 -31
app.py CHANGED
@@ -4,15 +4,16 @@ from fastapi.middleware.cors import CORSMiddleware
4
  import os
5
  import google.generativeai as genai
6
  from typing import List, Optional
 
7
 
8
- # Konfigurasi API Gemini
9
  genai.configure(api_key=os.environ["GEMINI_API_KEY"])
10
  model = genai.GenerativeModel("gemini-1.5-flash")
11
 
12
- # Inisialisasi FastAPI
13
  app = FastAPI()
14
 
15
- # Setup CORS
16
  app.add_middleware(
17
  CORSMiddleware,
18
  allow_origins=["*"],
@@ -21,21 +22,54 @@ app.add_middleware(
21
  allow_headers=["*"],
22
  )
23
 
24
- # Model request
25
  class PromptRequest(BaseModel):
26
  prompt: str
27
  max_new_tokens: int = 300
28
  temperature: float = 0.7
29
  history: Optional[List[str]] = []
30
 
31
- # Endpoint untuk generate teks
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  @app.post("/generate")
33
  async def generate_text(req: PromptRequest):
34
  try:
35
- # Bentuk ulang system prompt terstruktur
36
  system_prompt = f"""
37
  Berikut ini adalah hasil dari model LLaMA:
38
-
39
  --- MULAI ---
40
  {req.prompt}
41
  --- SELESAI ---
@@ -43,33 +77,16 @@ Berikut ini adalah hasil dari model LLaMA:
43
  Tugas kamu adalah:
44
  1. Perbaiki tata bahasa dan struktur kalimat jika perlu.
45
  2. Ubah seluruh jawaban ke dalam Bahasa Indonesia dengan gaya bahasa edukatif dan mudah dipahami.
46
- 3. Jika ada terdapat contoh kalimat yang di sertakan, jangan terjemahkan itu.
47
- 4. Jangan terjemahkan kalimat atau kata yang ada tanda petik.
48
- 5. Jika ada konsep konsep yang berhubungan dengan tata bahasa inggris jangan di terjemahkan.
49
- 6. Jika jawaban tidak relevan atau terlalu pendek, lengkapi agar lebih informatif dan sesuai konteks grammar bahasa Inggris.
50
-
51
- Jangan ubah maksud dari jawaban, hanya sempurnakan dan terjemahkan.
52
- Jawab langsung tanpa menjelaskan prosesnya.
53
  """
54
-
55
- # Buat format pesan
56
- messages = [
57
- {
58
- "role": "user",
59
- "parts": [{"text": system_prompt.strip()}],
60
- }
61
- ]
62
-
63
- # Tambahkan history jika ada
64
  for msg in req.history or []:
65
  role = "user" if msg.startswith("User:") else "model"
66
  text = msg.replace("User: ", "").replace("Bot: ", "")
67
- messages.append({
68
- "role": role,
69
- "parts": [{"text": text}]
70
- })
71
 
72
- # Kirim ke Gemini
73
  result = model.generate_content(
74
  messages,
75
  generation_config={
@@ -77,13 +94,39 @@ Jawab langsung tanpa menjelaskan prosesnya.
77
  "max_output_tokens": req.max_new_tokens,
78
  }
79
  )
80
-
81
  return {"generated_text": result.text}
82
 
83
  except Exception as e:
84
  raise HTTPException(status_code=500, detail=str(e))
85
 
86
- # Root endpoint
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
  @app.get("/")
88
  async def root():
89
  return {"message": "Gemini endpoint aktif bro! 🚀"}
 
4
  import os
5
  import google.generativeai as genai
6
  from typing import List, Optional
7
+ from uuid import uuid4
8
 
9
+ # Konfigurasi Gemini API
10
  genai.configure(api_key=os.environ["GEMINI_API_KEY"])
11
  model = genai.GenerativeModel("gemini-1.5-flash")
12
 
13
+ # Init FastAPI
14
  app = FastAPI()
15
 
16
+ # CORS biar frontend bebas akses
17
  app.add_middleware(
18
  CORSMiddleware,
19
  allow_origins=["*"],
 
22
  allow_headers=["*"],
23
  )
24
 
25
+ # === MODEL UNTUK REQUEST ===
26
  class PromptRequest(BaseModel):
27
  prompt: str
28
  max_new_tokens: int = 300
29
  temperature: float = 0.7
30
  history: Optional[List[str]] = []
31
 
32
+ class GenerateSoalRequest(BaseModel):
33
+ topic: str
34
+ level: Optional[int] = 1
35
+ tipe_pertanyaan: Optional[str] = None # "pilihan_ganda", "isian_kosong", "benar_salah"
36
+
37
+ # === HELPER FUNCTION ===
38
+ def format_prompt_soal(topic, tipe=None, level=1):
39
+ tipe_instruksi = f"Tipe soal yang diminta adalah '{tipe}'." if tipe else "Tipe soal boleh bebas."
40
+ return f"""
41
+ Buatkan satu soal latihan grammar Bahasa Inggris untuk topik: "{topic}".
42
+ {tipe_instruksi}
43
+ Level kesulitan: {level}/5.
44
+
45
+ Format keluaran harus dalam JSON seperti berikut:
46
+ {{
47
+ "text_pertanyaan": "Tulis pertanyaan di sini...",
48
+ "tipe_pertanyaan": "pilihan_ganda | isian_kosong | benar_salah",
49
+ "opsi": {{
50
+ "a": "Pilihan A",
51
+ "b": "Pilihan B",
52
+ "c": "Pilihan C",
53
+ "d": "Pilihan D"
54
+ }},
55
+ "jawaban_benar": "b",
56
+ "penjelasan": "Berikan penjelasan edukatif tentang jawaban yang benar."
57
+ }}
58
+
59
+ Catatan:
60
+ - Jika tipe soal bukan "pilihan_ganda", sesuaikan struktur 'opsi' (bisa null atau objek true/false).
61
+ - Jangan tambahkan teks selain JSON.
62
+ - Jangan tambahkan penjelasan tambahan di luar JSON.
63
+
64
+ Mulai sekarang, buat 1 soal untuk topik di atas dan jawab dalam format JSON!
65
+ """
66
+
67
+ # === ENDPOINT UNTUK PERBAIKAN KELUARAN MODEL (EXISTING) ===
68
  @app.post("/generate")
69
  async def generate_text(req: PromptRequest):
70
  try:
 
71
  system_prompt = f"""
72
  Berikut ini adalah hasil dari model LLaMA:
 
73
  --- MULAI ---
74
  {req.prompt}
75
  --- SELESAI ---
 
77
  Tugas kamu adalah:
78
  1. Perbaiki tata bahasa dan struktur kalimat jika perlu.
79
  2. Ubah seluruh jawaban ke dalam Bahasa Indonesia dengan gaya bahasa edukatif dan mudah dipahami.
80
+ 3. Jangan terjemahkan contoh kalimat, kata yang diapit tanda petik, atau istilah grammar.
81
+ 4. Jika jawaban tidak relevan, lengkapi sesuai konteks grammar.
82
+ Langsung berikan hasil perbaikan. Jangan jelaskan prosesnya.
 
 
 
 
83
  """
84
+ messages = [{"role": "user", "parts": [{"text": system_prompt.strip()}]}]
 
 
 
 
 
 
 
 
 
85
  for msg in req.history or []:
86
  role = "user" if msg.startswith("User:") else "model"
87
  text = msg.replace("User: ", "").replace("Bot: ", "")
88
+ messages.append({"role": role, "parts": [{"text": text}]})
 
 
 
89
 
 
90
  result = model.generate_content(
91
  messages,
92
  generation_config={
 
94
  "max_output_tokens": req.max_new_tokens,
95
  }
96
  )
 
97
  return {"generated_text": result.text}
98
 
99
  except Exception as e:
100
  raise HTTPException(status_code=500, detail=str(e))
101
 
102
+
103
+ # === ENDPOINT BARU UNTUK GENERATE SOAL DARI AI ===
104
+ @app.post("/generate-soal")
105
+ async def generate_soal(req: GenerateSoalRequest):
106
+ try:
107
+ prompt = format_prompt_soal(req.topic, req.tipe_pertanyaan, req.level)
108
+ result = model.generate_content(
109
+ prompt,
110
+ generation_config={"temperature": 0.8, "max_output_tokens": 512}
111
+ )
112
+
113
+ # Bersihkan & parsing response (anggap Gemini kasih string JSON langsung)
114
+ import json
115
+ json_text = result.text.strip().split("```")[-1].strip() # Bersihin kalau ada blok kode
116
+ soal_data = json.loads(json_text)
117
+
118
+ soal_data["id"] = str(uuid4())
119
+ soal_data["topic_id"] = req.topic
120
+ soal_data["level"] = req.level or 1
121
+ soal_data["is_ai_generated"] = True
122
+ soal_data["created_at"] = str(os.getenv("TZ") or "2025-07-12T00:00:00Z")
123
+
124
+ return {"soal": soal_data}
125
+ except Exception as e:
126
+ raise HTTPException(status_code=500, detail=f"Gagal generate soal: {e}")
127
+
128
+
129
+ # === ROOT TEST ===
130
  @app.get("/")
131
  async def root():
132
  return {"message": "Gemini endpoint aktif bro! 🚀"}