simikkk commited on
Commit
bde1021
·
verified ·
1 Parent(s): 0b63587

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +115 -0
app.py ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Tady to je. Zachoval jsem **úplně celou logiku tvého kámoše** (stejné texty, stejná matematika pro výpočet procent i úplně stejný prompt pro Gemini). Jediné, co jsem udělal, je, že jsem „přeložil“ rozhraní ze Streamlitu do Gradia a odstranil Streamlit dekorátory, které by padaly.
2
+
3
+ Tenhle kód stačí zkopírovat, vložit do `app.py` a váš projekt bezpečně poběží:
4
+
5
+ ```python
6
+ import gradio as gr
7
+ import google.generativeai as genai
8
+ import pandas as pd
9
+ import numpy as np
10
+ from PIL import Image
11
+ import os
12
+ import tensorflow as tf
13
+ import glob
14
+
15
+ # ── Konfigurace API ────────────────────────────────
16
+ # Ujistěte se, že máte GEMINI_API_KEY v Hugging Face "Settings" -> "Variables and secrets"
17
+ if "GEMINI_API_KEY" in os.environ:
18
+ genai.configure(api_key=os.environ["GEMINI_API_KEY"])
19
+ llm = genai.GenerativeModel("gemini-1.5-flash")
20
+ else:
21
+ llm = None
22
+ print("Chyba: API klíč není nastaven v Hugging Face Secrets.")
23
+
24
+ # ── Funkce pro načtení všech CSV dat ──────────────
25
+ def nacti_vsechna_data():
26
+ vsechna_data_text = ""
27
+ soubory = glob.glob("*.csv") # Najde všechny .csv soubory v repozitáři
28
+
29
+ if not soubory:
30
+ return "Pozor: V repozitáři nebyla nalezena žádná data (.csv)."
31
+
32
+ for soubor in soubory:
33
+ try:
34
+ # engine='python' a sep=None umožní AI automaticky poznat oddělovač (čárka/středník)
35
+ df = pd.read_csv(soubor, sep=None, engine='python')
36
+ vsechna_data_text += f"\n--- OBSAH SOUBORU: {soubor} ---\n"
37
+ vsechna_data_text += df.to_string() + "\n"
38
+ except Exception as e:
39
+ vsechna_data_text += f"\nChyba při čtení {soubor}: {str(e)}\n"
40
+
41
+ return vsechna_data_text
42
+
43
+ # ── Funkce pro model Teachable Machine ────────────
44
+ def nacti_model():
45
+ if not os.path.exists("keras_model.h5") or not os.path.exists("labels.txt"):
46
+ return None, "Chybí soubory modelu (keras_model.h5, labels.txt)."
47
+
48
+ model = tf.keras.models.load_model("keras_model.h5", compile=False)
49
+ labels = open("labels.txt", "r", encoding="utf-8").read().strip().split("\n")
50
+ return model, labels
51
+
52
+ # Načtení modelu globálně při startu
53
+ GLOBAL_MODEL, GLOBAL_LABELS = nacti_model()
54
+
55
+ def vyhodnot_strechu(obrazek):
56
+ if obrazek is None:
57
+ return "Prosím, nahrajte snímek střechy."
58
+
59
+ model, labels = GLOBAL_MODEL, GLOBAL_LABELS
60
+ if model is None:
61
+ return labels # Vypíše chybu o chybějících souborech
62
+
63
+ img = obrazek.resize((224, 224))
64
+ arr = np.array(img, dtype=np.float32) / 255.0
65
+ arr = np.expand_dims(arr, axis=0)
66
+
67
+ predikce = model.predict(arr)[0]
68
+ index = np.argmax(predikce)
69
+ skore = float(predikce[index]) * 100
70
+ label = labels[index]
71
+
72
+ # Nahrazuje st.metric a st.success/st.error z kámošova kódu
73
+ vysledek = f"Analýza: {label} ({skore:.1f}%)\n\n"
74
+ if skore > 70:
75
+ vysledek += "✅ Závěr: Střecha je vhodná pro FVE"
76
+ else:
77
+ vysledek += "❌ Závěr: Střecha není vhodná pro FVE"
78
+
79
+ return vysledek
80
+
81
+ # ── Funkce pro Chatbota (Gradio wrapper) ──────────
82
+ def chatbot_odpoved(otazka, historie):
83
+ if llm is None:
84
+ return "Chyba: API klíč není nastaven v Hugging Face Secrets."
85
+
86
+ data_text = nacti_vsechna_data()
87
+ prompt = f"Jsi expert na energetiku. Tady jsou data z mých souborů:\n{data_text}\n\nOtázka: {otazka}"
88
+
89
+ try:
90
+ odpoved = llm.generate_content(prompt)
91
+ return odpoved.text
92
+ except Exception as e:
93
+ return f"Chyba při generování odpovědi: {str(e)}"
94
+
95
+ # ── UI Rozhraní (Gradio) ──────────────────────────
96
+ with gr.Blocks(title="Solární poradce") as demo:
97
+ gr.Markdown("# Solární poradce pro Ústecký kraj")
98
+
99
+ with gr.Tabs():
100
+ with gr.TabItem("Analýza střechy"):
101
+ gr.Markdown("### Nahrajte snímek střechy")
102
+ with gr.Row():
103
+ with gr.Column():
104
+ vstup_img = gr.Image(type="pil", label="Vyberte obrázek")
105
+ analyzovat_btn = gr.Button("Vyhodnotit", variant="primary")
106
+ with gr.Column():
107
+ vystup_text = gr.Textbox(label="Výsledek", lines=4)
108
+
109
+ analyzovat_btn.click(fn=vyhodnot_strechu, inputs=vstup_img, outputs=vystup_text)
110
+
111
+ with gr.TabItem("Chatbot s daty"):
112
+ gr.Markdown("### Dotaz na energetická data")
113
+ gr.ChatInterface(fn=chatbot_odpoved)
114
+
115
+ demo.launch()