- Streamlit, özel AI chatbot arayüzleri oluşturmak için hızlı bir yol sunar ancak yerleşik sohbet bileşenlerinin ötesinde esneklik gerektirir.
- Botpress Chat API, chatbot mantığını, bilgi getirmeyi ve iş akışlarını destekler; özel bir Python istemcisiyle sunulur.
- Streamlit uygulaması sohbetleri yönetir, yanıtları akış halinde gösterir ve dinamik kullanıcı oturumlarıyla entegre olur.
Bildiğim kadarıyla, Streamlit özelleştirilebilir bir web uygulamasını hızlıca başlatmak için en hızlı yol. Kendi ön yüzünüzde bir AI chatbot oluşturmak ve dağıtmak istiyorsanız, daha iyi bir seçenek düşünemiyorum.
Tek engel, sohbet öğeleri kütüphanesi. Bunlar özellikle OpenAI’nin API’si ve Python istemcisi için ayarlanmış.
Bu harika bir şey—en prestijli teknolojilerle etkileşim kurmak için birkaç satır kod yazmak gerçekten… harika.
Ama her şey bu kadar değil.
Botunuz üzerinde daha fazla kontrol sahibi olmak ister misiniz? Örneğin, çok adımlı bir iş akışı veya bilgiyle zenginleştirilmiş üretim (RAG) isteyebilirsiniz. Bu tür ek işlevsellik katmanları genellikle çeşitli bağımlılıkları olan kütüphaneleri bir araya getirmek anlamına gelir.
Yoksa öyle mi?
Bu rehberde, Streamlit üzerinde barındırılan bir chatbot istemcisi oluşturacağım. Hızlı yineleme ve yüksek derecede özelleştirilebilir chatbotlar için bir arayüz göstereceğim. Ardından, chatbotu özel olarak hazırlanmış OpenAI tarzı bir Python istemcisiyle nasıl entegre edeceğinizi öğreneceksiniz.
Prototipleme aşamasında, bağımlılıklar ve teknik detaylar sizi yavaşlatmamalı.
Ve hızlı prototipleme ruhuyla, rehberi atlayıp hemen denemek isterseniz, kod GitHub’da.
Başlıyoruz 💣
Adım 1: Chatbot Mantığını Oluşturun
İster iş akışı otomasyonu ister bir randevu alma chatbotu için olsun, burada seçenekleriniz oldukça geniş.
İlham arıyorsanız, GenAI chatbotları için kullanım alanlarını mutlaka inceleyin. Basitlik adına, umarım artık meşhur olan sommelier botum Winona ile devam edeceğim.
Bu sofistike ve yardımcı küçük botu sadece birkaç adımda oluşturabilirsiniz. Kısa tutacağım, ancak göz atabileceğiniz birçok ayrıntılı ve çok faydalı rehber var.
1. Talimatları Verin
Stüdyoda, sol kenar çubuğunda Ana Sayfa bölümüne gideceğiz.

Ortada Talimatlar bölümünü görmelisiniz. Üzerine tıklayarak düz metin halinde talimat ekleyin veya düzenleyin.

Bu bölüm botumuza yönergeler, kişilik ve sınırlar kazandırır. Düz bir dil kullanarak botunuzu istediğiniz davranışa etkili şekilde yönlendirebilirsiniz. Onu daha insana yakın hale getirin ve
2. Akışı Oluşturun
Botun kişiliğinin temelini burada oluşturursunuz: belirli bilgilere erişim, adım adım ilerleme, kod çalıştırma vb.
Basitliğin gücünü küçümsemeyin. Tek bir otonom düğüm akıl yürüten ajanların işlevselliğiyle yarışır. Benimki Bilgi Tabanıma (KB) bağlı.

3. Bilgi Tabanını Ekleyin
Talimatlar botun havasıysa, KB kesin ve net bilgilerdir. Benim örneğimde, söz konusu bilgiler Şarap Yorumları veri setindeki şaraplar, açıklamalar ve fiyatlar. Bunu botumuz için fiili bir şarap envanteri olarak kullanacağım.
Sol panelde Tablolar’a tıklayıp sayfanın sol üstünde Yeni Tablo’ya basıyorum ve açıklayıcı bir isim veriyorum.

Sağ üstteki dikey üç nokta (⋮) simgesine tıklayın ve İçe Aktar’ı seçin.

Açılan pencereye .csv dosyanızı sürükleyin ve ekrandaki adımları takip edin.
Tabloyu botunuza erişilebilir yapmak için sol kenar çubuğunda Bilgi Tabanları’na gidin.

Küçük yeşil tablo simgesine tıklayın ve ilgili kaynağı seçin. Tabloları ekle’ye basın.

Akışınızın Bilgi Tabanına erişimi olduğundan emin olun, böylece her şey hazır olacaktır.

Adım 2: Chat API Entegrasyonunu Ekleyin
Bot ile yerel istemcimiz arasındaki temas noktası Chat API’dir. Bunu botumuza eklemek için İletişim Kanallarına gidip … Daha Fazla’ya tıklayacağım.

İsterseniz entegrasyonlara göz atabilirsiniz. Bizim aradığımız Chat. Bulmak için biraz aşağı kaydırmam gerekti.

Entegrasyona tıklayın ve açılan pencerede Entegrasyonu Yükle’ye basın.

Kurulum tamamlandığında, webhook URL’sinin sonunda Chat API Kimliğini göreceksiniz. Bunu daha sonra kullanacaksınız.
Adım 3: Python İstemcisini Yazın
Chat API, kullanıcılar, sohbetler ve mesajlar üzerinde crud işlemleri yapmak için çeşitli uç noktalar sunar. Söz verdiğim gibi, bunları bir Python istemcisine saracağım ve OpenAI istemcisinin yerine kullanabileceksiniz.
1. Kimlik bilgilerinizi ekleyin
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,
}
Chat API Kimliğinizi bir .env dosyasına eklemekte özgürsünüz– hata ayıklamada yardımcı olur ama zorunlu değil. API kimliği ve kullanıcı anahtarıyla Streamlit uygulamasını oluştururken ilgileneceğiz.
Ben BASE_URI ve HEADERS’ı ayrı bir constants.py dosyasında tutuyorum, karışıklığı önlemek için.
# constants.py
BASE_URI = "https://chat.botpress.cloud"
HEADERS = {
"accept": "application/json",
"Content-Type": "application/json",
}
2. İstek yöntemlerini oluşturun
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")Belirtildiği gibi, bunların neredeyse tamamı API’deki bir uç noktaya karşılık geliyor. Sadece bunları bir sınıf içinde topluyorum.
3. SSE Dinleyicisi Oluşturun
Tüm hile bu kadar. Sohbet güncellemelerini dinlemek ve Streamlit ön yüzüne aktarmak için, istemcinin botumuzdan sunucu kaynaklı olayları dinleyecek ve iletecek bir yönteme ihtiyacı var.
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"]}Bu fonksiyon, uygulama içinde programatik olarak erişilecek olan conversation_id’yi alır ve gelen verileri anlık olarak iletir.
Adım 4: Streamlit Uygulamasını Oluşturun
Her şey hazır olduğuna göre, chatbotu oluşturma zamanı. Streamlit’in LLM sohbet uygulaması oluşturma rehberini takip ediyorum—bazı ek özelliklerle.
1. Şablon kodu uyarlayın
Teoride, Streamlit örneğindeki şablon kodda çok az değişiklikle uygulamayı çalıştırabilirsiniz.
# 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}
)
Burada gizli değişkenleri okuyoruz. Bu yüzden bir .streamlit/secrets.toml dosyası oluşturup değişkenlerinizi içine yerleştirin:
CHAT_API_ID = ”YOUR_API_ID”
USER_KEY = ”YOUR_USER_KEY”Asıl işlemler burada gerçekleşiyor:
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}
)
istemci, mesajları göndermek ve almak için sohbet öğelerine bağlanıyor.
Bu çalışıyor, ancak birkaç nedenle ideal değil:
- Yeni bir sohbeti önceden oluşturmuş olmanız gerekiyor.
- Eski mesajlar, yeni mesajlardan farklı biçimlenecek çünkü rol ataması (kullanıcı veya asistan) yok.
- Sohbetler arasında geçiş yapamıyorsunuz.
2. Sohbetleri dinamik olarak oluşturun
Sıfırdan başlayarak, otomatik olarak yeni bir sohbet oluşturacağım veya en sonuncusunu açacağım:
# 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"]
Gizli anahtarları birden fazla kullanıcıyı saklayacak şekilde değiştirdim. .streamlit/secrets.toml dosyanızı buna göre düzenleyin:
[[users]]
key = "your_user_key"Bu bloğu istediğiniz kadar tekrarlayabilir, kullanıcıları bir tablo dizisi olarak saklayabilirsiniz.
3. Kullanıcıların sohbet oluşturmasına ve aralarında geçiş yapmasına izin verin
Başlıkta belirtildiği gibi, bu en üstte bir açılır menü ve sohbetinizi seçmenizi sağlayan bir düğme oluşturur.
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. Geçmiş mesajlara doğru rolü atayın
Yukarıdaki biçimlendirme sorununu, geçmiş mesajların her birine kullanıcı veya asistan rolü atayarak çözeceğiz:
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})Bu, kodumuzu Streamlit’in beklediği yapıya uygun hale getirir.
5. Mesajlaşma mantığını ekleyin
Bu, öncekiyle büyük ölçüde aynı, sadece yeni yapıya uyarlanmış hali.
# 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. Kullanıcı oluşturun
Mantık hazır, ancak uygulamayı çalıştırmak için bir kullanıcı oluşturmanız gerekecek. Ben bunu ayrı eklemeyi seçtim, böylece bir hizmete kayıt olma deneyimini simüle edebilirsiniz. Neyse ki sizin için bir de betik yazdım:
# 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)
Chat API Kimliğiniz varsa, şunu çalıştırabilirsiniz:
python create_user.py –name YOUR_NAME –id SOME_USER_ID –chat_api_id YOUR_CHAT_API_ID
Bu, kullanıcıyı oluşturacak ve secrets dosyanıza ekleyecek.
Adım 5: Uygulamayı çalıştırın
Mantığınız hazır ve kullanıcıyı oluşturduysanız, artık bu uygulamayı denemenin zamanı geldi. Bağımlılıkları yükleyin ve şunu çalıştırın:
streamlit run app.py
Ve işte bu kadar, botumuzu tüm ihtişamıyla göreceksiniz.

Bugün bir Streamlit sohbet botu çalıştırın
Streamlit ile prototip oluşturuyorsanız, özelleştirilebilirlik kolaylıktan ödün vermemeli. Sohbet botları sorunları çözmek için vardır—yeni sorunlar yaratmak için değil.
Botpress, görsel sürükle-bırak oluşturucu, onlarca resmi entegrasyon ve erişilebilir API uç noktalarıyla birlikte gelir. Böylece birçok iletişim kanalında hızlıca oluşturabilir, yineleyebilir ve dağıtım yapabilirsiniz.
Hemen oluşturmaya başlayın. Ücretsiz.
Sıkça Sorulan Sorular
Bir sohbet botu oluşturmak için neden Streamlit'i diğer ön yüz çerçevelerine tercih edeyim?
Hızlı, Python tabanlı bir çözümle, ön yüz uzmanlığına ihtiyaç duymadan etkileşimli uygulamaları hızlıca prototiplemek istiyorsanız, Streamlit'i tercih edersiniz; çünkü sohbet bileşenleri ve durum yönetimi gibi arayüz öğelerini minimum kodla halleder.
Bir Streamlit sohbet botu, üretim ortamı için uygun mu yoksa sadece prototipler için mi kullanılabilir?
Streamlit sohbet botu, prototipler ve dahili araçlar için harikadır; ancak yoğun trafik alan veya gelişmiş tasarım gerektiren halka açık üretim uygulamaları için, ölçeklenebilirlik sağlamak adına ters proxy, güvenlik güçlendirmesi ve muhtemelen daha sağlam bir ön yüz çerçevesi gibi ek katmanlara ihtiyaç duyabilirsiniz.
Streamlit ile oluşturulan bir sohbet botunun görünümünü ve hissini ne kadar özelleştirebilirim?
Streamlit, renkler, yazı tipleri ve düzen gibi temel stilleri ayarlamanıza izin verir; ancak geleneksel web çerçevelerine göre daha az esnektir. Gerçekten özel tasarımlar için özel HTML/CSS veya JavaScript gömmeniz gerekir ki bu da Streamlit’in yerleşik bileşenlerine göre daha fazla karmaşıklık getirir.
Bir Streamlit sohbet botunu mevcut bir web sitesine entegre edebilir miyim, yoksa yalnızca bağımsız mı çalışabilir?
Bir Streamlit sohbet botu genellikle kendi URL’sinde bağımsız bir web uygulaması olarak çalışır; ancak bir iframe aracılığıyla mevcut bir web sitesine gömebilirsiniz. Bunu yaparken, gömülü deneyimin kullanıcılar için sorunsuz olması adına stil ve güvenlik konularını yönetmeniz gerekir.
Bir Streamlit sohbet botunu herkese açık olarak dağıtmanın maliyeti nedir?
Bir Streamlit sohbet botunu yerel olarak veya küçük uygulamalar için Streamlit Community Cloud üzerinde barındırırsanız dağıtım ücretsiz olabilir, ancak geniş çapta herkese açık kullanım için Heroku, AWS veya DigitalOcean gibi bulut platformlarında trafik ve çalışma süresi gereksinimlerine bağlı olarak aylık yaklaşık 5–50 dolar arasında bir maliyet oluşur.





.webp)
