- Streamlit ialah cara pantas untuk membina UI chatbot AI tersuai tetapi memerlukan fleksibiliti melangkaui komponen sembang terbina dalam.
- Botpress Chat API kuasa logik chatbot, perolehan semula dan aliran kerja, didedahkan melalui klien Python tersuai.
- Apl Streamlit mengurus perbualan, menstrim respons dan menyepadukan dengan sesi pengguna dinamik.
Setakat yang saya tahu, Streamlit ialah cara terpantas untuk mendapatkan apl web yang boleh disesuaikan dari awal. Jika anda ingin membina chatbot AI dan menggunakan ia pada bahagian hadapan anda sendiri, saya tidak dapat memikirkan pilihan yang lebih baik.
Satu-satunya penahanan ialah perpustakaan elemen sembang. Mereka ditala secara khusus OpenAI API dan klien Python
Mana yang bagus– beberapa baris kod untuk berinteraksi dengan beberapa teknologi paling berprestij yang ada, ya… bagus.
Tetapi ia bukan segala-galanya.
Bagaimana jika anda mahukan lebih kawalan ke atas bot anda? Sebagai contoh, anda mungkin mahu aliran kerja berbilang langkah, atau penjanaan dipertingkatkan semula (RAG). Lapisan kefungsian tambahan ini secara amnya bermaksud menyatukan perpustakaan dengan semua jenis kebergantungan.
Atau adakah ia?
Dalam tutorial ini, saya akan membina pelanggan chatbot yang dihoskan oleh Streamlit. Saya akan menunjukkan kepada anda antara muka untuk lelaran pantas dan chatbots yang sangat disesuaikan. Kemudian, anda akan belajar cara menyepadukan chatbot menggunakan tersuai terbina OpenAI -gaya klien Python.
Jika anda membuat prototaip, kebergantungan dan teknikal tidak seharusnya menghalang anda.
Dan, atas semangat prototaip pantas, jika anda ingin melangkau tutorial dan mula bermain-main, kod itu ada pada GitHub .
Bom pergi 💣
Langkah 1: Bina Logik Chatbot
Sama ada untuk automasi aliran kerja atau chatbot tempahan janji temu , dunia adalah tiram anda di sini.
Saya menggesa anda untuk meneroka keluasan kes penggunaan untuk chatbot GenAI jika anda mencari inspirasi. Demi kesederhanaan, saya akan kembali kepada anda dengan sommelier saya yang diharapkan-kini terkenal, Winona .
Bot kecil kami yang canggih dan berguna boleh dicapai dalam beberapa langkah sahaja. Saya akan ringkas, tetapi terdapat banyak tutorial yang panjang lebar dan sangat membantu anda boleh menyemak imbas.
1. Beri Arahan
Di studio, kami akan menavigasi ke Laman Utama di bar sisi sebelah kiri.

Anda seharusnya melihat bahagian Arahan di hadapan dan di tengah. Klik padanya untuk menambah atau mengubah suai arahan dalam teks biasa.

Ini memberikan arahan bot kami, personaliti dan pagar. Menggunakan bahasa biasa, anda boleh mengemudi bot anda dengan cukup berkesan ke arah tingkah laku yang diingini. Jadikan ia terdengar lebih manusiawi, dan
2. Bina Aliran
Di sinilah nat dan bolt personaliti bot hidup: akses kepada maklumat tertentu, langkah demi langkah yang tegar, pelaksanaan kod, dsb.
Jangan memandang rendah kuasa kesederhanaan. Satu nod autonomi menyaingi fungsi ejen penaakulan . Saya mempunyai satu yang disambungkan ke Pangkalan Pengetahuan (KB) saya.

3. Tambah Pangkalan Pengetahuan
Jika arahan adalah mengenai getaran, KB adalah mengenai fakta yang dingin dan keras. Dalam kes saya, fakta yang dimaksudkan ialah wain dalam set data Ulasan Wain , senarai wain, perihalan dan harga. Saya akan menganggap ini sebagai inventori wain de-facto untuk bot kami kepada Sommelier-ize.
Saya akan mengklik pada Jadual di panel kiri dan tekan Jadual Baharu di bahagian atas sebelah kiri halaman, dan memberikannya nama deskriptif.

Klik pada elipsis menegak (⋮) di bahagian atas sebelah kanan, dan tekan Import.

Seret .csv anda ke dalam modal yang muncul dan ikut langkah pada skrin.
Untuk menjadikan jadual boleh diakses oleh bot anda, navigasi ke Pangkalan Pengetahuan dalam bar sisi sebelah kiri anda.

Klik ikon meja hijau kecil dan pilih sumber yang berkaitan. Klik Tambah jadual .

Pastikan aliran anda mempunyai akses kepada Pangkalan Pengetahuan dan anda bersedia untuk pergi.

Langkah 2: Tambah Chat Integrasi API
Titik hubungan antara bot dan pelanggan tempatan kami ialah Chat API. Untuk menambahkannya pada bot kami, saya akan menatal ke Saluran Komunikasi dan tekan … Lagi .

Teliti melalui penyepaduan jika anda mahu. Kami selepas Chat . Saya terpaksa menatal sedikit untuk mencarinya.

Klik integrasi dan tekan Install Integration dalam mod yang muncul.

Setelah dipasang, anda akan melihat ID API Chat pada penghujung webhook URL. Anda akan memerlukannya untuk kemudian.
Langkah 3: Tulis Pelanggan Python
The Chat API mendedahkan beberapa titik akhir untuk melaksanakan operasi kasar pada pengguna, perbualan dan mesej. Seperti yang dijanjikan, saya akan membungkusnya ke dalam klien Python yang boleh menggantikan an OpenAI pelanggan.
1. Tambahkan kelayakan anda
class BotpressClient:
def __init__(self, api_id=None, user_key=None):
self.api_id = api_id or os.getenv("CHAT_API_ID")
self.user_key = user_key or os.getenv("USER_KEY")
self.base_url = f"{BASE_URI}/{self.api_id}"
self.headers = {
**HEADERS,
"x-user-key": self.user_key,
}
Anda bebas untuk menambah anda Chat ID API ke fail .env– ia membantu dengan penyahpepijatan, tetapi ia tidak begitu diperlukan. Kami akan menangani ID API dan kunci pengguna apabila kami membina apl Streamlit.
saya simpan BASE_URI
dan TAJUK
secara berasingan pemalar.py
fail, untuk kekacauan.
# constants.py
BASE_URI = "https://chat.botpress.cloud"
HEADERS = {
"accept": "application/json",
"Content-Type": "application/json",
}
2. Cipta kaedah Permintaan
def _request(self, method, path, json=None):
url = f"{self.base_url}{path}"
try:
response = requests.request(method, url, headers=self.headers, json=json)
response.raise_for_status()
return response.json()
except requests.HTTPError:
return response.status_code, response.text
# --- Core API Methods ---
def get_user(self):
return self._request("GET", "/users/me")
def create_user(self, name, id):
user_data = {"name": name, "id": id}
return self._request("POST", "/users", json=user_data)
def set_user_key(self, key):
self.user_key = key
self.headers["x-user-key"] = key
def create_and_set_user(self, name, id):
new_user = self.create_user(name, id)
self.set_user_key(new_user["key"])
def create_conversation(self):
return self._request("POST", "/conversations", json={"body": {}})
def list_conversations(self):
return self._request("GET", "/conversations")
def get_conversation(self, conversation_id):
return self._request("GET", f"/conversations/{conversation_id}")
def create_message(self, message, conversation_id):
payload = {
"payload": {"type": "text", "text": message},
"conversationId": conversation_id,
}
return self._request("POST", "/messages", json=payload)
def list_messages(self, conversation_id):
return self._request("GET", f"/conversations/{conversation_id}/messages")
Seperti yang dinyatakan, hampir semua peta ini ke titik akhir dalam API. Saya hanya membungkus mereka dalam kelas.
3. Buat Pendengar SSE
Ini adalah tahap penggodam. Untuk mendengar kemas kini perbualan dan menyambung ke bahagian hadapan Streamlit, pelanggan memerlukan kaedah untuk mendengar– dan menghasilkan– peristiwa yang dihantar pelayan daripada bot kami.
def listen_conversation(self, conversation_id):
url = f"{self.base_url}/conversations/{conversation_id}/listen"
for event in sseclient.SSEClient(url, headers=self.headers):
print(event.data)
if event.data == "ping":
continue
data = json.loads(event.data)["data"]
yield {"id": data["id"], "text": data["payload"]["text"]}
Fungsi ini mengambil conversation_id (yang akan diakses secara pengaturcaraan dalam apl) dan menghasilkan data masuk apabila ia berlaku.
Langkah 4: Cipta Apl Streamlit
Dengan itik kami berturut-turut, sudah tiba masanya untuk membina chatbot. Ambil perhatian bahawa saya mengikuti panduan Streamlit untuk membina apl sembang LLM – dengan beberapa ciri tambahan.
1. Sesuaikan kod boilerplate
Secara teori, anda boleh mendapatkan apl berfungsi dengan perubahan minimum pada boilerplate dalam contoh Streamlit.
# app.py
from client import BotpressClient
import streamlit as st
from constants import CONVERSATION_ID
st.title("Botpress Front-end for Streamlit")
client = BotpressClient(
api_id=st.secrets["CHAT_API_ID"], user_key=st.secrets["USER_KEY"]
)
if "messages" not in st.session_state:
messages = client.list_messages(CONVERSATION_ID)
next_token = messages["meta"]["nextToken"]
st.session_state.messages = messages["messages"][::-1]
for message in st.session_state.messages:
with st.chat_message(message["userId"]):
st.markdown(message["payload"]["text"])
if prompt := st.chat_input("*wine*-d it up"):
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)
client.create_message(prompt, conversation_id=CONVERSATION_ID)
with st.chat_message("assistant"):
response_box = st.empty()
last_rendered = ""
for message in client.listen_conversation(CONVERSATION_ID):
message_id = message["id"]
message_text = message["text"]
if message_id != last_rendered:
last_rendered = message_id
response_box.markdown(message_text)
st.session_state.messages.append(
{"role": "assistant", "content": message_text}
)
Kami sedang membaca pembolehubah rahsia di sini. Jadi buat fail .streamlit/secrets.toml dan letakkan pembolehubah anda di dalam:
CHAT_API_ID = ”ID_API_ANDA”
USER_KEY = ”KUNCI_Pengguna_ANDA”
Pengangkatan berat berlaku di:
with st.chat_message("assistant"):
response_box = st.empty()
last_rendered = ""
for message in client.listen_conversation(CONVERSATION_ID):
message_id = message["id"]
message_text = message["text"]
if message_id != last_rendered:
last_rendered = message_id
response_box.markdown(message_text)
st.session_state.messages.append(
{"role": "assistant", "content": message_text}
)
di mana pelanggan melekat pada elemen sembang untuk menghantar dan menerima mesej.
Ini berfungsi, tetapi ini tidak sesuai untuk beberapa sebab:
- Anda mesti mencipta perbualan baharu secara berasingan.
- Mesej lama akan diformatkan secara berbeza daripada yang baharu, kerana mesej tersebut tidak mempunyai penetapan peranan (pengguna atau pembantu).
- Anda tidak boleh menogol perbualan.
2. Cipta perbualan secara dinamik
Bermula dari awal, saya akan membuat perbualan baharu secara automatik atau membuka perbualan terbaharu:
# app.py
from client import BotpressClient
import streamlit as st
st.title("Botpress Front-end for Streamlit")
client = BotpressClient(
api_id=st.secrets["CHAT_API_ID"], user_key=st.secrets["users"][0]["key"]
)
# user info
user = client.get_user()
user_id = user["user"]["id"]
conversations = client.list_conversations()["conversations"]
conversation_ids = [conv["id"] for conv in conversations]
# conversation
def create_conversation():
res = client.create_conversation()
print(f"Created new conversation: {res}")
conversation_id = res["conversation"]["id"]
st.session_state.active_conversation = conversation_id
st.session_state.messages = []
st.rerun()
if not conversations:
create_conversation()
if "active_conversation" not in st.session_state:
st.session_state["active_conversation"] = conversations[0]["id"]
Ambil perhatian bahawa saya telah mengubah suai kunci rahsia untuk dapat menyimpan berbilang pengguna. Anda akan mahu mengubah suai anda .streamlit/secrets.toml
fail untuk mencerminkan bahawa:
Kunci [[pengguna]] = "kunci_pengguna_anda"
Anda boleh mengulangi blok ini seberapa banyak yang anda mahu, menyimpan pengguna sebagai susunan jadual .
3. Benarkan pengguna membuat dan menogol antara perbualan
Seperti yang dikatakan tajuk, ini mencipta lungsur turun di bahagian atas dengan butang untuk membolehkan anda memilih perbualan anda.
col1, col2 = st.columns([5, 1])
with col1:
conversation_id = st.selectbox(
"Select Conversation",
options=[conv["id"] for conv in conversations],
index=conversation_ids.index(st.session_state.active_conversation),
)
with col2:
st.markdown("<div style='height: 1.9em'></div>", unsafe_allow_html=True)
if st.button("➕"):
create_conversation()
selected_conversation = client.get_conversation(conversation_id)
4. Berikan peranan yang betul untuk mesej lepas
Kami akan menyelesaikan isu pemformatan dari atas dengan memberikan peranan pengguna atau pembantu kepada setiap mesej yang lalu:
if (
"messages" not in st.session_state
or st.session_state.get("active_conversation") != conversation_id
):
st.session_state.active_conversation = conversation_id
st.session_state.messages = []
messages = client.list_messages(conversation_id)
next_token = messages["meta"].get("nextToken")
for message in messages["messages"][::-1]:
role = "user" if message["userId"] == user_id else "assistant"
text = message["payload"]["text"]
st.session_state.messages.append({"role": role, "content": text})
Ini mematuhi kod kami dengan struktur yang diharapkan oleh Streamlit.
5. Tambah logik pemesejan
Ini lebih kurang sama seperti sebelumnya, disesuaikan untuk struktur baharu.
# display chat history
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
if prompt := st.chat_input("*wine*-d it up"):
st.session_state.messages.append({"role": "user", "content": prompt})
client.create_message(prompt, conversation_id=conversation_id)
with st.chat_message("user"):
st.markdown(prompt)
with st.chat_message("assistant"):
stream = client.listen_conversation(conversation_id=conversation_id)
response = st.write_stream(stream)
st.session_state.messages.append({"role": "assistant", "content": response})
5. Buat pengguna
Logiknya sudah sedia, tetapi anda perlu mencipta pengguna untuk menjalankan apl. Saya memilih untuk menambah ini secara berasingan untuk mensimulasikan pengalaman mendaftar untuk perkhidmatan. Nasib baik untuk anda, saya juga menulis skrip:
# create_user.py
import argparse
from pathlib import Path
from client import *
from constants import *
secrets_path = Path(".streamlit") / "secrets.toml"
template = """[[users]]
key="{}"
"""
client = BotpressClient()
def create_user(name, id, add_to_secrets=True):
res = client.create_user(name, id)
if not add_to_secrets:
return res
secrets_path.touch(exist_ok=True)
with open(secrets_path, "a") as f:
f.write(template.format(res["user"]["id"], res["key"]))
return res
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Create a Botpress user and optionally store secrets."
)
parser.add_argument("--name", required=True, help="Display name of the user.")
parser.add_argument(
"--id", required=True, help="User ID. If omitted, one is generated by the API."
)
parser.add_argument("--chat_api_id", help="ID for the Botpress Chat API integration. Taken from `.env` file if not provided.")
parser.add_argument(
"--no-secrets",
action="store_true",
help="Do not append to .streamlit/secrets.toml.",
)
args = parser.parse_args()
print(f"Creating user: {args.name} (ID: {args.id or 'auto-generated'})")
result = create_user(name=args.name, id=args.id, add_to_secrets=not args.no_secrets)
print("✅ User created:")
print(result)
Dengan syarat anda mempunyai Chat ID API, anda boleh menjalankan:
python create_user.py –nama YOUR_NAME –id SOME_USER_ID –chat_api_id YOUR_CHAT_API_ID
Ini akan berurusan dengan mencipta pengguna dan menambahkannya pada fail rahsia anda.
Langkah 5: Jalankan aplikasi
Dengan logik anda dibina dan pengguna anda dicipta, sudah tiba masanya untuk mengambil aplikasi ini untuk berputar. Pasang kebergantungan, dan jalankan:
streamlit run app.py
Dan seperti itu, anda akan melihat bot kami dalam semua kemuliaannya.

Jalankan bot sembang Streamlit hari ini
Jika anda membuat prototaip dengan Streamlit, anda tahu kebolehsesuaian tidak sepatutnya melibatkan kos kemudahan. Chatbots ada untuk menyelesaikan masalah– bukan menciptanya.
Botpress datang dengan pembina seret dan lepas visual, berpuluh-puluh penyepaduan rasmi dan titik akhir API yang boleh diakses. Dengan cara ini anda boleh membina, mengulang dan menggunakan merentasi banyak saluran komunikasi.
Mula membina hari ini . Ia percuma.
Soalan lazim
Mengapa saya memilih Streamlit berbanding rangka kerja hadapan yang lain untuk membina chatbot?
Anda akan memilih Streamlit untuk membina chatbot jika anda mahukan penyelesaian berasaskan Python yang pantas yang membolehkan anda membuat prototaip apl interaktif dengan cepat tanpa memerlukan kepakaran bahagian hadapan, kerana ia mengendalikan elemen UI seperti komponen sembang dan pengurusan negeri dengan kod minimum.
Adakah chatbot Streamlit sesuai untuk kegunaan pengeluaran atau hanya untuk prototaip?
Bot sembang Streamlit bagus untuk prototaip dan alatan dalaman, tetapi untuk apl pengeluaran yang menghadap awam dengan trafik padat atau penggayaan lanjutan, anda mungkin memerlukan lapisan tambahan seperti proksi terbalik, pengerasan keselamatan dan mungkin rangka kerja bahagian hadapan yang lebih mantap untuk mengendalikan skala.
Sejauh manakah rupa dan rasa chatbot yang dibina dengan Streamlit boleh disesuaikan?
Walaupun Streamlit membolehkan anda melaraskan penggayaan asas seperti warna, fon dan reka letak, ia kurang fleksibel berbanding rangka kerja web tradisional; untuk reka bentuk yang benar-benar tersuai, anda perlu membenamkan HTML/CSS atau JavaScript tersuai, yang boleh dilakukan tetapi menambah kerumitan berbanding menggunakan widget terbina dalam Streamlit.
Bolehkah saya menyepadukan chatbot Streamlit ke dalam tapak web sedia ada, atau adakah ia perlu berjalan sendiri?
Bot sembang Streamlit biasanya berjalan sebagai apl web kendiri pada URLnya sendiri, tetapi anda boleh membenamkannya ke dalam tapak web sedia ada melalui iframe, walaupun ini memerlukan pengendalian penggayaan dan pertimbangan keselamatan untuk menjadikan pengalaman terbenam itu lancar untuk pengguna.
Berapakah kos untuk menggunakan bot sembang Streamlit untuk kegunaan awam?
Menggunakan bot sembang Streamlit boleh menjadi percuma jika dihoskan secara tempatan atau pada Streamlit Community Cloud untuk apl yang lebih kecil, tetapi untuk kegunaan awam pada skala, kos berkisar antara $5–$50 sebulan pada platform awan seperti Heroku, AWS atau DigitalOcean, bergantung pada keperluan trafik dan masa beroperasi.