000 / app.py
Seunggg's picture
Update app.py
e8510b9 verified
import gradio as gr
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import PeftModel
import torch
import requests
import json
import time
def auto_refresh_sensor():
while True:
sensor_box.value = sensor_display_text()
time.sleep(5)
demo.load(auto_refresh_sensor, None, None)
model_id = "deepseek-ai/deepseek-coder-1.3b-base"
lora_id = "Seunggg/lora-plant"
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
base = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.float32, # Hugging Face Spaces 一般用 float32
trust_remote_code=True
)
model = PeftModel.from_pretrained(
base,
lora_id,
torch_dtype=torch.float32
)
model.eval()
from transformers import pipeline
pipe = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
max_new_tokens=256
)
def get_sensor_data():
try:
res = requests.get("https://arduino-realtime.onrender.com/api/data", timeout=5)
sensor_data = res.json().get("sensorData", None)
return sensor_data if sensor_data else {}
except Exception as e:
return {"错误": str(e)}
def sensor_display_text():
sensor_data = get_sensor_data()
return json.dumps(sensor_data, ensure_ascii=False, indent=2) if sensor_data else "暂无传感器数据"
def generate_answer(user_input):
if not user_input.strip():
return "请输入植物相关的问题 😊"
prompt = f"用户提问:{user_input}\n请用更人性化的语言生成建议,并推荐相关植物文献或资料。\n回答:"
try:
result = pipe(prompt)
output = result[0]["generated_text"]
return output.replace(prompt, "").strip()
except Exception as e:
return f"生成建议时出错:{str(e)}"
def update_chart():
sensor_data = get_sensor_data()
if not sensor_data or "温度" not in sensor_data:
return gr.LinePlot.update(value=None)
return {
"data": [
{"x": [0], "y": [sensor_data.get("温度", 0)], "name": "温度"},
{"x": [0], "y": [sensor_data.get("湿度", 0)], "name": "湿度"}
],
"layout": {"title": "实时传感器数据"}
}
# 在 Blocks 里这样写:
with gr.Blocks() as demo:
gr.Markdown("# 🌱 植物助手 - 实时传感器联动")
with gr.Row():
sensor_box = gr.Textbox(label="🧪 当前传感器数据", lines=6, interactive=False)
chart = gr.LinePlot(label="📈 实时数据图表", x="x", y="y", overlay=True)
question = gr.Textbox(label="🌿 植物问题", lines=4, placeholder="请输入植物相关的问题 😊")
answer_box = gr.Textbox(label="🤖 回答建议", lines=8, interactive=False)
send_btn = gr.Button("发送")
send_btn.click(fn=generate_answer, inputs=question, outputs=answer_box)
# 启动后台线程更新数据
demo.launch()