- يعد Streamlit وسيلة سريعة لبناء واجهات روبوتات دردشة مخصصة بالذكاء الاصطناعي، لكنه يحتاج إلى مرونة أكبر من مكونات الدردشة المدمجة.
- يوفر Botpress Chat API منطق الروبوت، والاسترجاع، وسير العمل، ويتم الوصول إليه عبر عميل Python مخصص.
- تدير تطبيق Streamlit المحادثات، وتبث الردود، وتتكامل مع جلسات المستخدم الديناميكية.
حسب معرفتي، Streamlit هو أسرع طريقة لإطلاق تطبيق ويب قابل للتخصيص. إذا كنت ترغب في إنشاء روبوت دردشة بالذكاء الاصطناعي ونشره على واجهتك الخاصة، فلا أجد خيارًا أفضل.
العائق الوحيد هو مكتبة عناصر الدردشة. فهي مصممة بشكل خاص لتناسب واجهة OpenAI وعميل Python الخاص بها.
وهذا أمر رائع—بضع أسطر من الشيفرة للتفاعل مع بعض من أرقى التقنيات المتاحة هو أمر... رائع بالفعل.
لكن هذا ليس كل شيء.
ماذا لو كنت ترغب في مزيد من التحكم في روبوتك؟ على سبيل المثال، قد تحتاج إلى سير عمل متعدد الخطوات، أو توليد معزز بالاسترجاع (RAG). عادةً ما تتطلب هذه الطبقات الإضافية من الوظائف التعامل مع مكتبات متعددة تعتمد على العديد من التبعيات.
أم هل الأمر كذلك؟
في هذا الدليل، سأقوم ببناء عميل روبوت دردشة مستضاف على Streamlit. سأعرض لك واجهة للتجربة السريعة وإنشاء روبوتات دردشة قابلة للتخصيص بدرجة عالية. بعد ذلك، ستتعلم كيفية دمج الروبوت باستخدام عميل Python مخصص على نمط OpenAI.
إذا كنت في مرحلة النمذجة الأولية، فلا ينبغي أن تعيقك الاعتماديات أو التفاصيل التقنية.
وبروح النمذجة السريعة، إذا أردت تجاوز الشرح والبدء مباشرة، الكود متوفر على GitHub.
لنبدأ 💣
الخطوة 1: بناء منطق روبوت الدردشة
سواء كان ذلك لأتمتة سير العمل أو روبوت حجز المواعيد، الخيارات أمامك واسعة هنا.
أنصحك باستكشاف حالات استخدام روبوتات الدردشة بالذكاء الاصطناعي إذا كنت تبحث عن الإلهام. من أجل البساطة، سأعود إلى روبوتي الشهير الآن، الساقية وينونا.
يمكن تحقيق روبوتنا المتطور والمفيد هذا في خطوات قليلة فقط. سأكون مختصرًا، لكن هناك العديد من الدروس المطولة والمفيدة للغاية التي يمكنك تصفحها.
1. أضف التعليمات
في الاستوديو، سننتقل إلى الرئيسية في الشريط الجانبي الأيسر.

يجب أن ترى قسم التعليمات في المنتصف. انقر عليه لإضافة أو تعديل التعليمات بنص واضح.

هذا يمنح روبوتنا التوجيهات والشخصية والضوابط. باستخدام لغة بسيطة، يمكنك توجيه روبوتك بفعالية نحو السلوك المطلوب. اجعله يبدو أكثر إنسانية، و
2. بناء التدفق
هنا يكمن جوهر شخصية الروبوت: الوصول إلى معلومات محددة، خطوات صارمة، تنفيذ الشيفرة، إلخ.
لا تستهين بقوة البساطة. عقدة مستقلة واحدة تنافس وظائف وكلاء الاستدلال. لدي واحدة متصلة بقاعدة المعرفة الخاصة بي (KB).

3. أضف قاعدة المعرفة
إذا كانت التعليمات تتعلق بالأسلوب، فإن قاعدة المعرفة تتعلق بالحقائق الصلبة. في حالتي، الحقائق هي أنواع النبيذ في مجموعة بيانات مراجعات النبيذ، وهي قائمة بأنواع النبيذ، ووصفها، وأسعارها. سأتعامل مع هذه القائمة كمخزون النبيذ الافتراضي لروبوتنا الساقي.
سأنقر على الجداول في اللوحة اليسرى، ثم أضغط على جدول جديد في أعلى يسار الصفحة، وأعطيه اسمًا وصفيًا.

انقر على النقاط الرأسية (⋮) في الأعلى يمينًا، ثم اختر استيراد.

اسحب ملف .csv الخاص بك إلى النافذة المنبثقة واتبع الخطوات الظاهرة على الشاشة.
لجعل الجدول متاحًا لروبوتك، انتقل إلى قواعد المعرفة في الشريط الجانبي الأيسر.

انقر على أيقونة الجدول الخضراء الصغيرة واختر المصدر المناسب. ثم اضغط إضافة الجداول.

تأكد من أن التدفق الخاص بك لديه حق الوصول إلى قاعدة المعرفة، وهكذا تكون جاهزًا.

الخطوة 2: إضافة تكامل Chat API
نقطة الاتصال بين الروبوت وعميلنا المحلي هي Chat API. لإضافته إلى روبوتنا، سأنتقل إلى قنوات الاتصال وأضغط على … المزيد.

تصفح التكاملات إذا رغبت بذلك. نحن نبحث عن الدردشة. اضطررت للتمرير قليلاً للعثور عليها.

انقر على التكامل واضغط على تثبيت التكامل في النافذة المنبثقة.

بعد التثبيت، سترى معرف Chat API في نهاية عنوان URL للويب هوك. ستحتاج إليه لاحقًا.
الخطوة 3: كتابة عميل Python
يوفر Chat API عدة نقاط نهاية لتنفيذ عمليات CRUD على المستخدمين والمحادثات والرسائل. كما وعدت، سأجمعها في عميل Python يمكنه استبدال عميل OpenAI.
1. أضف بيانات الاعتماد الخاصة بك
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 الخاص بك إلى ملف .env—يساعد ذلك في تصحيح الأخطاء، لكنه ليس ضروريًا تمامًا. سنتعامل مع معرف API ومفتاح المستخدم عند بناء تطبيق Streamlit.
أحتفظ بـ BASE_URI و HEADERS في ملف منفصل باسم constants.py، لتقليل الفوضى.
# constants.py
BASE_URI = "https://chat.botpress.cloud"
HEADERS = {
"accept": "application/json",
"Content-Type": "application/json",
}
2. أنشئ طرق الطلب
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")كما ذكرت، معظم هذه الطرق تتوافق مع نقطة نهاية في الـ API. أنا فقط أغلفها داخل صنف.
3. أنشئ مستمع SSE
هذا هو الحد الأقصى من التعقيد. للاستماع إلى تحديثات المحادثة وربطها بواجهة Streamlit، يحتاج العميل إلى طريقة للاستماع إلى—وتوليد—أحداث مرسلة من الخادم من الروبوت.
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"]}تأخذ هذه الدالة معرف المحادثة (وسيتم الوصول إليه برمجيًا داخل التطبيق) وتعرض البيانات الواردة فور حدوثها.
الخطوة 4: إنشاء تطبيق Streamlit
بعد تجهيز كل شيء، حان وقت بناء روبوت الدردشة. لاحظ أنني أتبع دليل Streamlit حول بناء تطبيق دردشة LLM—مع بعض الميزات الإضافية.
1. عدل الشيفرة الأساسية
نظريًا، يمكنك تشغيل التطبيق مع تغييرات طفيفة على الشيفرة الأساسية في مثال 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}
)
نقرأ هنا المتغيرات السرية. لذا أنشئ ملف .streamlit/secrets.toml وضع متغيراتك بداخله:
CHAT_API_ID = ”YOUR_API_ID”
USER_KEY = ”YOUR_USER_KEY”العمليات الأساسية تتم في:
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}
)
حيث يرتبط العميل بعناصر الدردشة لإرسال واستقبال الرسائل.
يعمل هذا، لكنه ليس مثاليًا لعدة أسباب:
- يجب أن تكون قد أنشأت محادثة جديدة مسبقًا.
- سيتم تنسيق الرسائل القديمة بشكل مختلف عن الجديدة، لأنها لا تحتوي على تعيين الدور (مستخدم أو مساعد).
- لا يمكنك التبديل بين المحادثات.
2. أنشئ المحادثات ديناميكيًا
بدءًا من الصفر، سأقوم بإنشاء محادثة جديدة تلقائيًا أو فتح أحدث واحدة:
# 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"]
لاحظ أنني عدلت المفاتيح السرية لتخزين عدة مستخدمين. ستحتاج إلى تعديل ملف .streamlit/secrets.toml الخاص بك ليعكس ذلك:
[[users]]
key = "your_user_key"يمكنك تكرار هذا الجزء كما تشاء، وتخزين المستخدمين كـ مصفوفة من الجداول.
3. اسمح للمستخدمين بإنشاء المحادثات والتبديل بينها
كما يشير العنوان، هذا ينشئ قائمة منسدلة في الأعلى مع زر يتيح لك اختيار المحادثة.
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. تعيين الدور الصحيح للرسائل السابقة
سنحل مشكلة التنسيق السابقة بتعيين دور المستخدم أو المساعد لكل رسالة سابقة:
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})هذا يجعل الشيفرة متوافقة مع البنية التي يتوقعها Streamlit.
5. أضف منطق الرسائل
هذا مشابه تقريبًا لما سبق، مع تعديلات على البنية الجديدة.
# 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. أنشئ مستخدمًا
المنطق جاهز، لكن ستحتاج إلى إنشاء مستخدم لتشغيل التطبيق. اخترت إضافة ذلك بشكل منفصل لمحاكاة تجربة التسجيل في خدمة. ولحسن حظك، كتبت أيضًا سكريبتًا لذلك:
# 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 الخاص بك، يمكنك تشغيل:
python create_user.py –name YOUR_NAME –id SOME_USER_ID –chat_api_id YOUR_CHAT_API_ID
سيقوم هذا بإنشاء المستخدم وإضافته إلى ملف الأسرار الخاص بك.
الخطوة 5: تشغيل التطبيق
بعد أن أنشأت المنطق الخاص بك وقمت بإنشاء المستخدم، حان الوقت لتجربة هذا التطبيق. قم بتثبيت التبعيات، ثم شغّل:
streamlit run app.py
وبكل بساطة، سترى البوت الخاص بنا في كامل روعته.

شغّل روبوت دردشة Streamlit اليوم
إذا كنت تقوم بعمل نموذج أولي باستخدام Streamlit، فأنت تعلم أن التخصيص لا يجب أن يكون على حساب السهولة. روبوتات الدردشة وُجدت لحل المشكلات، وليس لخلقها.
يأتي Botpress مع أداة بناء مرئية بالسحب والإفلات، وعشرات التكاملات الرسمية، ونقاط نهاية API سهلة الوصول. بهذه الطريقة يمكنك البناء والتطوير والنشر عبر العديد من قنوات التواصل.
ابدأ البناء اليوم. إنه مجاني.
الأسئلة الشائعة
لماذا قد أختار Streamlit بدلاً من أطر العمل الأمامية الأخرى لبناء روبوت دردشة؟
ستختار Streamlit لبناء روبوت دردشة إذا كنت تريد حلاً سريعاً يعتمد على بايثون ويسمح لك بإنشاء تطبيقات تفاعلية بسرعة دون الحاجة إلى خبرة في الواجهة الأمامية، حيث يتولى إدارة عناصر الواجهة مثل مكونات الدردشة وإدارة الحالة مع الحد الأدنى من الكود.
هل يمكن استخدام روبوت الدردشة المبني بـ Streamlit في بيئة الإنتاج أم أنه مخصص للنماذج الأولية فقط؟
روبوت دردشة Streamlit ممتاز للنماذج الأولية والأدوات الداخلية، ولكن للتطبيقات الإنتاجية الموجهة للجمهور والتي تتطلب حركة مرور كثيفة أو تصميماً متقدماً، قد تحتاج إلى طبقات إضافية مثل البروكسي العكسي، وتعزيز الأمان، وربما إطار عمل أمامي أكثر قوة للتعامل مع التوسع.
ما مدى إمكانية تخصيص مظهر وروح روبوت الدردشة الذي تم إنشاؤه باستخدام Streamlit؟
يتيح لك Streamlit تعديل بعض الأساسيات مثل الألوان والخطوط والتخطيط، لكنه أقل مرونة من أطر الويب التقليدية؛ ولتصاميم مخصصة بالكامل ستحتاج إلى تضمين HTML/CSS أو JavaScript مخصص، وهذا ممكن لكنه يزيد من التعقيد مقارنة باستخدام عناصر Streamlit المدمجة.
هل يمكنني دمج روبوت الدردشة المبني بـ Streamlit في موقع إلكتروني قائم، أم يجب أن يعمل بشكل مستقل؟
عادةً ما يعمل روبوت دردشة Streamlit كتطبيق ويب مستقل على عنوان URL خاص به، لكن يمكنك تضمينه في موقع ويب قائم عبر iframe، مع ضرورة معالجة الجوانب المتعلقة بالتنسيق والأمان لضمان تجربة سلسة للمستخدمين.
كم تبلغ تكلفة نشر روبوت دردشة مبني بـ Streamlit للاستخدام العام؟
يمكن نشر روبوت الدردشة المبني بـ Streamlit مجانًا إذا تم استضافته محليًا أو على Streamlit Community Cloud للتطبيقات الصغيرة، ولكن للاستخدام العام وعلى نطاق واسع، تتراوح التكاليف بين 5 و50 دولارًا شهريًا على منصات السحابة مثل Heroku أو AWS أو DigitalOcean، وذلك حسب حجم الزيارات ومتطلبات الجاهزية.





.webp)
