Chat with AI
session_state
記錄使用者與AI的對話
document路徑
API reference/Caching and state/st.session_state

1
2
3
4
5
6
7
# 初始化messages
if "messages" not in st.session_state:
st.session_state.messages = []
# 將之前的對話匯入chat_message
for message in st.session_state.messages:
st.chat_message(message["role"]).write(message["content"])

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import streamlit as st
from openai import OpenAI
st.set_page_config(
page_title="Streamlit Example",
page_icon="😁",
layout="wide",
initial_sidebar_state="expanded",
menu_items={
"About": "This is a example page.",
"Get Help": "https://streamlit.io/",
}
)
system_prompt = "You are a helpful assistant."
client = OpenAI(
# Gemini 提供的 OpenAI 兼容 Base URL
base_url="https://generativelanguage.googleapis.com/v1beta/openai/"
)
if "messages" not in st.session_state:
st.session_state.messages = []
for message in st.session_state.messages:
st.chat_message(message["role"]).write(message["content"])
prompt = st.chat_input("請問你要問什麼問題")
if prompt:
st.chat_message("user").write(prompt)
# 儲存user的prompt
st.session_state.messages.append({"role": "user", "content": prompt})
print([
{"role": "system", "content": system_prompt},
*st.session_state.messages
])
response = client.chat.completions.create(
# 使用 Gemini 的模型名稱
model="gemini-3-flash-preview",
messages=[
{"role": "system", "content": system_prompt},
*st.session_state.messages
],
stream=False # 串流輸出, 注意是大寫的True
)
st.chat_message("assistant").write(response.choices[0].message.content)
# 儲存ai回覆
st.session_state.messages.append({"role": "assistant", "content": response.choices[0].message.content})
stream為True
當輸出方式為邊回答邊輸出,需要使用到empty()空容器
https://docs.streamlit.io/develop/api-reference/layout/st.empty
位置在 API reference/Layouts and containers/st.empty
使用方法如下:
1
2
st.empty()
response_message.chat_message("assistant").write(full_response)
完整程式碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import streamlit as st
from openai import OpenAI
st.set_page_config(
page_title="Streamlit Example",
page_icon="😁",
layout="wide",
initial_sidebar_state="expanded",
menu_items={
"About": "This is a example page.",
"Get Help": "https://streamlit.io/",
}
)
system_prompt = "You are a helpful assistant."
client = OpenAI(
# Gemini 提供的 OpenAI 兼容 Base URL
base_url="https://generativelanguage.googleapis.com/v1beta/openai/"
)
if "messages" not in st.session_state:
st.session_state.messages = []
for message in st.session_state.messages:
st.chat_message(message["role"]).write(message["content"])
prompt = st.chat_input("請問你要問什麼問題")
if prompt:
st.chat_message("user").write(prompt)
# 儲存user的prompt
st.session_state.messages.append({"role": "user", "content": prompt})
print([
{"role": "system", "content": system_prompt},
*st.session_state.messages
])
response = client.chat.completions.create(
# 使用 Gemini 的模型名稱
model="gemini-3-flash-preview",
messages=[
{"role": "system", "content": system_prompt},
*st.session_state.messages
],
stream=True # 串流輸出, 注意是大寫的True
)
# 使用空容器
response_message = st.empty()
full_response = ""
for chunk in response:
if chunk.choices[0].delta.content:
content = chunk.choices[0].delta.content
full_response += content
# 使用空容器
response_message.chat_message("assistant").write(full_response)
# 儲存ai回覆
st.session_state.messages.append({"role": "assistant", "content": full_response})