Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 34 additions & 9 deletions Chatbot.py
Original file line number Diff line number Diff line change
@@ -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?"}]

Expand All @@ -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}")
24 changes: 24 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -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"]