static_chatbot / main.py
magicwenli's picture
Upload folder using huggingface_hub
12b9272 verified
Raw
History Blame Contribute Delete
4.08 kB
import os
import gradio as gr
import google.generativeai as genai
# --- 代理设置 ---
# 如果您所在的地区无法直接访问Gemini API,请取消下面两行的注释,
# 并将 'http://your-proxy-host:port' 替换为您的代理服务器地址和端口。
# 例如: 'http://127.0.0.1:7890'
# os.environ['HTTPS_PROXY'] = 'http://your-proxy-host:port'
# os.environ['HTTP_PROXY'] = 'http://your-proxy-host:port'
# ------------------
# 从环境变量中获取API密钥
try:
api_key = os.environ["apikey"]
except KeyError:
raise RuntimeError("apikey not set in environment. Please get a key from https://aistudio.google.com/app/apikey and set it as an environment variable.")
genai.configure(api_key=api_key)
model = genai.GenerativeModel('gemini-2.5-flash-preview-05-20')
# 预设字典,key为shortcut,value为实际prompt
PRESETS = {
"why": "请帮我解释用户输入的名词或短语,尽量通俗简短。1. 请使用纯文本格式,不要有任何markdown文本标记。公式尽量使用unicode编码 2.不要输出额外问候语和与结果无关的内容。",
"coder": "请你扮演一名高级Python开发者,回答时只给出代码和简要注释,不要多余解释。",
"summarizer": "请你扮演一名专业的内容摘要员,将输入内容压缩为50字以内的中文摘要。",
# 可继续添加更多预设
}
with gr.Blocks() as demo:
preset_state = gr.State("")
with gr.Row():
chatbot = gr.Chatbot(label="Gemini Flash Chatbot", scale=4)
with gr.Column(scale=1):
last_bot_response = gr.Textbox(visible=False, label="Last response")
copy_btn = gr.Button("Copy Last Response")
msg = gr.Textbox(label="What do you want to ask?")
clear = gr.ClearButton([msg, chatbot])
def user(user_message, history):
return gr.update(value="", interactive=False), history + [[user_message, None]]
def bot(history, preset_key):
if not history or not history[-1][0]:
yield history, ""
return
preset = PRESETS.get(preset_key, None)
gemini_history = []
if preset:
gemini_history.append({'role': 'system', 'parts': [preset]})
for user_msg, model_msg in history[:-1]:
gemini_history.append({'role': 'user', 'parts': [user_msg]})
if model_msg:
gemini_history.append({'role': 'model', 'parts': [model_msg]})
current_question = history[-1][0]
gemini_history.append({'role': 'user', 'parts': [current_question]})
try:
response = model.generate_content(gemini_history, stream=True)
answer = ""
for chunk in response:
if hasattr(chunk, 'text') and chunk.text:
answer += chunk.text
history[-1][1] = answer
yield history, answer
except Exception as e:
history[-1][1] = f"Error: {e}"
yield history, history[-1][1]
msg.submit(user, [msg, chatbot], [msg, chatbot], queue=False).then(
bot, [chatbot, preset_state], [chatbot, last_bot_response]
)
copy_btn.click(
None,
last_bot_response,
None,
js="(text) => {navigator.clipboard.writeText(text); return null;}"
)
def load_from_url(request: gr.Request):
preset_key = request.query_params.get("p", "")
q = request.query_params.get("q")
final_history = None
last_answer = ""
if q:
initial_history = [[q, None]]
final_history, last_answer = bot(initial_history, preset_key)
return {
preset_state: preset_key,
chatbot: gr.update(value=final_history) if final_history else None,
last_bot_response: last_answer,
msg: gr.update(value="")
}
demo.load(load_from_url, None, [preset_state, chatbot, last_bot_response, msg])
if __name__ == "__main__":
demo.launch(debug=True, server_name="0.0.0.0", server_port=8000)