erictsaiyulin's picture
Update app.py
c2bc4f5 verified
import os, json, requests, gradio as gr
# --- 修補 Gradio‑client 5.0.1 bool‑schema bug ---------------------------
import gradio_client.utils as _gcu
if not getattr(_gcu, "_patched_bool", False):
_orig_get_type = _gcu.get_type
def _get_type_fixed(schema):
if isinstance(schema, bool):
return "boolean"
return _orig_get_type(schema)
_gcu.get_type = _get_type_fixed
_gcu._patched_bool = True
# === Secret & Backend Config ============================================
APP_PASSWORD = os.getenv("APP_PASSWORD", "") # 可在 Space Secrets 設定
RUNPOD_TOKEN = os.getenv("RUNPOD_BEARER_TOKEN")
RUNPOD_ENDPOINT_ID = os.getenv("RUNPOD_ENDPOINT_ID")
if RUNPOD_ENDPOINT_ID:
URL = f"https://api.runpod.ai/v2/{RUNPOD_ENDPOINT_ID}/runsync"
else:
URL = None
HEAD = {"Authorization": f"Bearer {RUNPOD_TOKEN}"} if RUNPOD_TOKEN else {}
# === 後端呼叫封裝 ========================================================
def call_backend(query: str) -> str:
if not URL or not RUNPOD_TOKEN:
return "❌ 未設定 RunPod 端點或 Bearer Token"
try:
r = requests.post(URL, json={"input": {"query": query}}, headers=HEAD, timeout=180)
r.raise_for_status()
data = r.json().get("output", r.json())
return data.get("answer") if isinstance(data, dict) else json.dumps(data, ensure_ascii=False)
except Exception as e:
return f"❌ 後端錯誤:{e}"
# === Gradio Blocks 介面 ===================================================
def auth(password_entered):
if password_entered == APP_PASSWORD:
return gr.update(visible=False), gr.update(visible=True), "" # hide pwd, show chat
else:
return gr.update(value="❌ 密碼錯誤,請再試一次", visible=True), gr.update(visible=False), ""
def respond(msg, history):
answer = call_backend(msg)
history = history or []
history.append({"role": "user", "content": msg})
history.append({"role": "assistant", "content": answer})
return "", history
with gr.Blocks(title="RAG Demo – RunPod") as demo:
gr.Markdown("""# 📚 私有 RAG Demo (需密碼)""")
pwd_box = gr.Textbox(type="password", placeholder="輸入密碼…", label="Password")
pwd_err = gr.Markdown(visible=False)
unlock = gr.Button("Unlock")
with gr.Column(visible=False) as chat_col:
chatbot = gr.Chatbot(value=[], type="messages", show_copy_button=True)
txt = gr.Textbox(placeholder="輸入問題…", show_label=False)
send = gr.Button("送出", variant="primary")
clear = gr.Button("清空對話")
unlock.click(auth, inputs=pwd_box, outputs=[pwd_err, chat_col, pwd_box])
send.click(respond, [txt, chatbot], [txt, chatbot])
clear.click(lambda: [], None, chatbot, queue=False)
if __name__ == "__main__":
demo.launch()