Spaces:
Runtime error
Runtime error
| 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) | |