Arif571 commited on
Commit
34103dd
·
verified ·
1 Parent(s): 38f01a1

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +90 -71
app.py CHANGED
@@ -5,97 +5,116 @@ import json
5
  import re
6
 
7
  # ======================================================
8
- # JALUR LANGSUNG GOOGLE GEMINI (TANPA LIBRARY)
9
  # ======================================================
10
- # Kita menggunakan 'requests' untuk menembak langsung server Google.
11
- # Ini mengatasi error 404/Model Not Found yang sering terjadi di Library.
12
 
13
- # Kunci API Anda (Saya pecah supaya tidak diblokir security Hugging Face)
14
- kunci_1 = "AIzaSyAY4KmX9Xf1xZ4bnme"
15
- kunci_2 = "7c1mw61QWn4nNLDI"
16
- API_KEY = kunci_1 + kunci_2
 
17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  def engineer_mode(deskripsi_user):
19
  if not deskripsi_user:
20
  return "⚠️ Mohon isi deskripsi mesin dulu.", None
21
 
22
- # Prompt Insinyur
23
- prompt_system = """
24
  ROLE: Senior Industrial Automation Engineer.
25
- TASK: Provide technical design based on user request.
26
 
27
- OUTPUT FORMAT (USE INDONESIAN):
28
- 1. BOM (Real Parts like Omron/Siemens).
29
- 2. LOGIC (Step-by-step + Safety).
30
  3. WIRING (Pin-to-Pin).
31
- 4. CODE (Arduino C++ or PLC ST).
32
- 5. DIAGRAM DOT CODE:
33
- - Start: digraph G {
34
- - End: }
35
- - Attributes: rankdir=LR; node [shape=box style="filled,rounded" fillcolor="#e0f7fa"];
36
  """
37
-
38
- # Menggabungkan Prompt
39
- full_prompt = f"{prompt_system}\n\nUSER REQUEST: {deskripsi_user}"
40
 
41
- # ALAMAT SERVER GOOGLE (ENDPOINT STABIL)
42
- # Kita pakai Gemini 1.5 Flash yang cepat
43
- url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key={API_KEY}"
44
-
45
- headers = {'Content-Type': 'application/json'}
46
- data = {
47
- "contents": [{
48
- "parts": [{"text": full_prompt}]
49
- }]
50
- }
51
 
52
- try:
53
- # KIRIM PESAN LANGSUNG (POST REQUEST)
54
- response = requests.post(url, headers=headers, data=json.dumps(data))
55
-
56
- # Cek apakah sukses
57
- if response.status_code != 200:
58
- # Jika Flash gagal, coba model Pro (Backup)
59
- url_backup = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key={API_KEY}"
60
- response = requests.post(url_backup, headers=headers, data=json.dumps(data))
61
-
62
- if response.status_code != 200:
63
- return f"❌ ERROR GOOGLE: {response.text}", None
64
 
65
- # Ambil jawaban teks
66
- hasil_json = response.json()
67
- try:
68
- text_result = hasil_json['candidates'][0]['content']['parts'][0]['text']
69
- except:
70
- return "⚠️ Google tidak memberikan jawaban teks. Coba lagi.", None
71
-
72
- # --- PROSES DIAGRAM ---
73
- dot_code = ""
74
- if "digraph G {" in text_result:
75
- s = text_result.find("digraph G {")
76
- e = text_result.rfind("}") + 1
77
- dot_code = text_result[s:e]
78
- else:
79
- dot_code = 'digraph G { Error -> "Diagram Gagal"; }'
80
-
81
- try:
82
- src = graphviz.Source(dot_code)
83
- output_path = src.render("diagram_output", format="png")
84
- return text_result, output_path
85
- except:
86
- return text_result, None
87
 
88
- except Exception as e:
89
- return f"⚠️ ERROR KONEKSI: {str(e)}", None
 
 
 
 
90
 
91
- # Tampilan UI
 
 
92
  with gr.Blocks(theme=gr.themes.Soft()) as app:
93
- gr.Markdown("# 🏭 AI Insinyur (Direct Google Link)")
94
- gr.Markdown("Menggunakan **Kunci API Pribadi** via Jalur Langsung (Anti-Error 404).")
95
 
96
  with gr.Row():
97
  inp = gr.Textbox(lines=4, label="Deskripsi Mesin", placeholder="Jelaskan kebutuhan mesin Anda...")
98
- btn = gr.Button("🚀 RANCANG (GOOGLE GEMINI)", variant="primary")
99
 
100
  with gr.Row():
101
  out_txt = gr.Markdown(label="Dokumen Teknis")
 
5
  import re
6
 
7
  # ======================================================
8
+ # GOOGLE GEMINI: MULTI-MODEL SELECTOR
9
  # ======================================================
10
+ # Kode ini akan mencoba berbagai versi model Google
11
+ # sampai menemukan yang aktif untuk akun Anda.
12
 
13
+ # 1. SETUP API KEY (Teknik Kamuflase agar aman)
14
+ # Token asli: AIzaSyAY4KmX9Xf1xZ4bnme7c1mw61QWn4nNLDI
15
+ k1 = "AIzaSyAY4KmX9Xf1xZ4bnme"
16
+ k2 = "7c1mw61QWn4nNLDI"
17
+ MY_KEY = k1 + k2
18
 
19
+ def query_google_gemini(prompt_text):
20
+ # DAFTAR ALAMAT YANG AKAN DICOBA (Sapu Jagat)
21
+ # Kita urutkan dari yang paling cepat & baru
22
+ models = [
23
+ "gemini-1.5-flash",
24
+ "gemini-1.5-flash-latest",
25
+ "gemini-1.5-pro",
26
+ "gemini-1.5-pro-latest",
27
+ "gemini-1.0-pro"
28
+ ]
29
+
30
+ headers = {'Content-Type': 'application/json'}
31
+ payload = {
32
+ "contents": [{"parts": [{"text": prompt_text}]}]
33
+ }
34
+
35
+ last_error = ""
36
+
37
+ # LOOPING: Coba satu per satu
38
+ for model_name in models:
39
+ try:
40
+ # Coba Tembak URL Model Tersebut
41
+ url = f"https://generativelanguage.googleapis.com/v1beta/models/{model_name}:generateContent?key={MY_KEY}"
42
+
43
+ response = requests.post(url, headers=headers, data=json.dumps(payload), timeout=30)
44
+
45
+ # Jika Sukses (Kode 200)
46
+ if response.status_code == 200:
47
+ data = response.json()
48
+ # Ambil teks jawaban
49
+ return data['candidates'][0]['content']['parts'][0]['text']
50
+
51
+ # Jika Gagal, simpan errornya dan lanjut ke model berikutnya
52
+ else:
53
+ last_error = f"Model {model_name} Gagal: {response.text}"
54
+ continue # Coba model bawahnya
55
+
56
+ except Exception as e:
57
+ last_error = str(e)
58
+ continue
59
+
60
+ # Jika semua model gagal
61
+ return f"❌ SEMUA MODEL GOOGLE GAGAL.\nDetail Error Terakhir: {last_error}"
62
+
63
+ # ======================================================
64
+ # LOGIKA INSINYUR
65
+ # ======================================================
66
  def engineer_mode(deskripsi_user):
67
  if not deskripsi_user:
68
  return "⚠️ Mohon isi deskripsi mesin dulu.", None
69
 
70
+ prompt_system = f"""
 
71
  ROLE: Senior Industrial Automation Engineer.
72
+ TASK: Design a complete system for: "{deskripsi_user}"
73
 
74
+ OUTPUT FORMAT (BAHASA INDONESIA):
75
+ 1. BOM (Komponen Nyata & Tipe).
76
+ 2. CARA KERJA (Step-by-step + Safety).
77
  3. WIRING (Pin-to-Pin).
78
+ 4. KODE PROGRAM (Arduino/PLC).
79
+ 5. DIAGRAM BLOK (DOT CODE ONLY):
80
+ - Start: digraph G {{
81
+ - End: }}
82
+ - Style: rankdir=LR; node [shape=box style="filled,rounded" fillcolor="#e1f5fe"];
83
  """
 
 
 
84
 
85
+ # Panggil Fungsi Sapu Jagat
86
+ hasil_teks = query_google_gemini(prompt_system)
 
 
 
 
 
 
 
 
87
 
88
+ # Cek jika hasil adalah pesan error
89
+ if "❌" in hasil_teks:
90
+ return hasil_teks, None
 
 
 
 
 
 
 
 
 
91
 
92
+ # --- PROSES GAMBAR DIAGRAM ---
93
+ dot_code = ""
94
+ if "digraph G {" in hasil_teks:
95
+ s = hasil_teks.find("digraph G {")
96
+ e = hasil_teks.rfind("}") + 1
97
+ dot_code = hasil_teks[s:e]
98
+ else:
99
+ dot_code = 'digraph G { Error -> "Diagram Tidak Tergenerate"; }'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
100
 
101
+ try:
102
+ src = graphviz.Source(dot_code)
103
+ output_path = src.render("diagram_output", format="png")
104
+ return hasil_teks, output_path
105
+ except:
106
+ return hasil_teks, None
107
 
108
+ # ======================================================
109
+ # TAMPILAN UI
110
+ # ======================================================
111
  with gr.Blocks(theme=gr.themes.Soft()) as app:
112
+ gr.Markdown("# 🏭 AI Insinyur (Google Multi-Model)")
113
+ gr.Markdown("Sistem ini otomatis mencari jalur Google Gemini yang aktif (Flash/Pro/Latest).")
114
 
115
  with gr.Row():
116
  inp = gr.Textbox(lines=4, label="Deskripsi Mesin", placeholder="Jelaskan kebutuhan mesin Anda...")
117
+ btn = gr.Button("🚀 RANCANG (AUTO-CONNECT)", variant="primary")
118
 
119
  with gr.Row():
120
  out_txt = gr.Markdown(label="Dokumen Teknis")