Chat with AI

session_state

記錄使用者與AI的對話

document路徑

API reference/Caching and state/st.session_state

img

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"])

img

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})

results matching ""

    No results matching ""