diff --git a/Chatbot.py b/Chatbot.py index 0a4f2df4..961c47bc 100644 --- a/Chatbot.py +++ b/Chatbot.py @@ -1,14 +1,23 @@ -from openai import OpenAI import streamlit as st +from openai import OpenAI +import os # <--- 1. 必须导入这个库,才能读取环境变量 with st.sidebar: - openai_api_key = st.text_input("OpenAI API Key", key="chatbot_api_key", type="password") + # 尝试先从环境变量拿 Key,如果没拿不到,留空让用户自己填 + env_key = os.getenv("OPENAI_API_KEY", "") + + openai_api_key = st.text_input( + "OpenAI API Key", + value=env_key, # 如果环境变量有值,直接填进去 + key="chatbot_api_key", + type="password" + ) "[Get an OpenAI API key](https://platform.openai.com/account/api-keys)" "[View the source code](https://github.com/streamlit/llm-examples/blob/main/Chatbot.py)" - "[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/streamlit/llm-examples?quickstart=1)" st.title("💬 Chatbot") -st.caption("🚀 A Streamlit chatbot powered by OpenAI") +st.caption("🚀 A Streamlit chatbot powered by Google Gemini") + if "messages" not in st.session_state: st.session_state["messages"] = [{"role": "assistant", "content": "How can I help you?"}] @@ -20,10 +29,26 @@ st.info("Please add your OpenAI API key to continue.") st.stop() - client = OpenAI(api_key=openai_api_key) + # 2. 修正逻辑:这里应该使用 openai_api_key 变量 + # 因为这个变量现在包含了“环境变量”或“用户手动输入”的值 + client = OpenAI( + api_key=openai_api_key, + base_url="https://generativelanguage.googleapis.com/v1beta/openai/" + ) + st.session_state.messages.append({"role": "user", "content": prompt}) st.chat_message("user").write(prompt) - response = client.chat.completions.create(model="gpt-3.5-turbo", messages=st.session_state.messages) - msg = response.choices[0].message.content - st.session_state.messages.append({"role": "assistant", "content": msg}) - st.chat_message("assistant").write(msg) + + # 3. 修正模型名称:目前 Google 官方模型通常是 gemini-1.5-flash + # "gemini-2.5-flash" 可能是不存在的,可能会导致报错。 + # 建议先用 gemini-1.5-flash 跑通,以后再换。 + try: + response = client.chat.completions.create( + model="gemini-2.5-flash", + messages=st.session_state.messages + ) + msg = response.choices[0].message.content + st.session_state.messages.append({"role": "assistant", "content": msg}) + st.chat_message("assistant").write(msg) + except Exception as e: + st.error(f"Error: {e}") \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..9bc19986 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,24 @@ +# 1. 选底座:找一个装好了 Python 3.10 的轻量级 Linux 系统 +# slim 版本比完整版小很多,适合生产环境 +FROM python:3.10-slim + +# 2. 设工位:在容器内部创建一个 /app 目录,把这里当作工作台 +WORKDIR /app + +# 3. 装依赖 (关键步骤!运维面试考点) +# 我们先只把 requirements.txt 拷进去,安装依赖 +# 为什么不一次性全拷进去?因为依赖不常变,代码常变。 +# 分开写可以让 Docker "缓存" 这一层。下次你只改代码时,就不需要重新 pip install 了。 +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +# 4. 搬代码:把当前目录下剩下的所有文件(.py, pages文件夹等)都拷进容器 +COPY . . + +# 5. 开窗口:告诉外界,这个容器会占用 8501 端口 (Streamlit 默认端口) +EXPOSE 8501 + +# 6. 启动指令:容器一跑起来,就执行这句话 +# --server.address=0.0.0.0 是必须的! +# 如果不加,Streamlit 默认只监听 localhost,你在容器外面(浏览器里)是访问不到的。 +CMD ["streamlit", "run", "Chatbot.py", "--server.port=8501", "--server.address=0.0.0.0"] \ No newline at end of file