From 7169f87ad0142bbc83a08b98de952026d5f4e5ac Mon Sep 17 00:00:00 2001 From: Reid <61492567+reidliu41@users.noreply.github.com> Date: Thu, 1 May 2025 21:34:02 +0800 Subject: [PATCH] [doc] add streamlit integration (#17522) Signed-off-by: reidliu41 Co-authored-by: reidliu41 --- .../assets/deployment/streamlit-chat.png | Bin 0 -> 108553 bytes docs/source/deployment/frameworks/index.md | 1 + .../source/deployment/frameworks/streamlit.md | 42 ++++ .../streamlit_openai_chatbot_webserver.py | 185 ++++++++++++++++++ 4 files changed, 228 insertions(+) create mode 100644 docs/source/assets/deployment/streamlit-chat.png create mode 100644 docs/source/deployment/frameworks/streamlit.md create mode 100644 examples/online_serving/streamlit_openai_chatbot_webserver.py diff --git a/docs/source/assets/deployment/streamlit-chat.png b/docs/source/assets/deployment/streamlit-chat.png new file mode 100644 index 0000000000000000000000000000000000000000..1e37b9d70e15df2d253319dcd0ebeb123ee719a0 GIT binary patch literal 108553 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 literal 0 HcmV?d00001 diff --git a/docs/source/deployment/frameworks/index.md b/docs/source/deployment/frameworks/index.md index a1b405386b77a..683fa8217a802 100644 --- a/docs/source/deployment/frameworks/index.md +++ b/docs/source/deployment/frameworks/index.md @@ -12,5 +12,6 @@ lws modal open-webui skypilot +streamlit triton ::: diff --git a/docs/source/deployment/frameworks/streamlit.md b/docs/source/deployment/frameworks/streamlit.md new file mode 100644 index 0000000000000..084550ec991e1 --- /dev/null +++ b/docs/source/deployment/frameworks/streamlit.md @@ -0,0 +1,42 @@ +(deployment-streamlit)= + +# Streamlit + +[Streamlit](https://github.com/streamlit/streamlit) lets you transform Python scripts into interactive web apps in minutes, instead of weeks. Build dashboards, generate reports, or create chat apps. + +It can be quickly integrated with vLLM as a backend API server, enabling powerful LLM inference via API calls. + +## Prerequisites + +- Setup vLLM environment + +## Deploy + +- Start the vLLM server with the supported chat completion model, e.g. + +```console +vllm serve qwen/Qwen1.5-0.5B-Chat +``` + +- Install streamlit and openai: + +```console +pip install streamlit openai +``` + +- Use the script: + +- Start the streamlit web UI and start to chat: + +```console +streamlit run streamlit_openai_chatbot_webserver.py + +# or specify the VLLM_API_BASE or VLLM_API_KEY +VLLM_API_BASE="http://vllm-server-host:vllm-server-port/v1" streamlit run streamlit_openai_chatbot_webserver.py + +# start with debug mode to view more details +streamlit run streamlit_openai_chatbot_webserver.py --logger.level=debug +``` + +:::{image} /assets/deployment/streamlit-chat.png +::: diff --git a/examples/online_serving/streamlit_openai_chatbot_webserver.py b/examples/online_serving/streamlit_openai_chatbot_webserver.py new file mode 100644 index 0000000000000..d8a0f211d44d5 --- /dev/null +++ b/examples/online_serving/streamlit_openai_chatbot_webserver.py @@ -0,0 +1,185 @@ +# SPDX-License-Identifier: Apache-2.0 +""" +vLLM Chat Assistant - A Streamlit Web Interface + +A streamlined chat interface that quickly integrates +with vLLM API server. + +Features: +- Multiple chat sessions management +- Streaming response display +- Configurable API endpoint +- Real-time chat history + +Requirements: + pip install streamlit openai + +Usage: + # Start the app with default settings + streamlit run streamlit_openai_chatbot_webserver.py + + # Start with custom vLLM API endpoint + VLLM_API_BASE="http://your-server:8000/v1" \ + streamlit run streamlit_openai_chatbot_webserver.py + + # Enable debug mode + streamlit run streamlit_openai_chatbot_webserver.py \ + --logger.level=debug +""" +import os +from datetime import datetime + +import streamlit as st +from openai import OpenAI + +# Get command line arguments from environment variables +openai_api_key = os.getenv('VLLM_API_KEY', "EMPTY") +openai_api_base = os.getenv('VLLM_API_BASE', "http://localhost:8000/v1") + +# Initialize session states for managing chat sessions +if "sessions" not in st.session_state: + st.session_state.sessions = {} + +if "current_session" not in st.session_state: + st.session_state.current_session = None + +if "messages" not in st.session_state: + st.session_state.messages = [] + +if "active_session" not in st.session_state: + st.session_state.active_session = None + +# Initialize session state for API base URL +if "api_base_url" not in st.session_state: + st.session_state.api_base_url = openai_api_base + + +def create_new_chat_session(): + """Create a new chat session with timestamp as ID""" + session_id = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + st.session_state.sessions[session_id] = [] + st.session_state.current_session = session_id + st.session_state.active_session = session_id + st.session_state.messages = [] + + +def switch_to_chat_session(session_id): + """Switch to a different chat session""" + st.session_state.current_session = session_id + st.session_state.active_session = session_id + st.session_state.messages = st.session_state.sessions[session_id] + + +def get_llm_response(messages, model): + """Get streaming response from llm + + Args: + messages: List of message dictionaries + model: Name of model + + Returns: + Streaming response object or error message string + """ + try: + response = client.chat.completions.create(model=model, + messages=messages, + stream=True) + return response + except Exception as e: + st.error(f"Error details: {str(e)}") + return f"Error: {str(e)}" + + +# Sidebar - API Settings first +st.sidebar.title("API Settings") +new_api_base = st.sidebar.text_input("API Base URL:", + value=st.session_state.api_base_url) +if new_api_base != st.session_state.api_base_url: + st.session_state.api_base_url = new_api_base + st.rerun() + +st.sidebar.divider() + +# Sidebar - Session Management +st.sidebar.title("Chat Sessions") +if st.sidebar.button("New Session"): + create_new_chat_session() + +# Display all sessions in reverse chronological order +for session_id in sorted(st.session_state.sessions.keys(), reverse=True): + # Mark the active session with a pinned button + if session_id == st.session_state.active_session: + st.sidebar.button(f"📍 {session_id}", + key=session_id, + type="primary", + on_click=switch_to_chat_session, + args=(session_id, )) + else: + st.sidebar.button(f"Session {session_id}", + key=session_id, + on_click=switch_to_chat_session, + args=(session_id, )) + +# Main interface +st.title("vLLM Chat Assistant") + +# Initialize OpenAI client with API settings +client = OpenAI(api_key=openai_api_key, base_url=st.session_state.api_base_url) + +# Get and display current model id +models = client.models.list() +model = models.data[0].id +st.markdown(f"**Model**: {model}") + +# Initialize first session if none exists +if st.session_state.current_session is None: + create_new_chat_session() + st.session_state.active_session = st.session_state.current_session + +# Display chat history for current session +for message in st.session_state.messages: + with st.chat_message(message["role"]): + st.write(message["content"]) + +# Handle user input and generate llm response +if prompt := st.chat_input("Type your message here..."): + # Save user message to session + st.session_state.messages.append({"role": "user", "content": prompt}) + st.session_state.sessions[ + st.session_state.current_session] = st.session_state.messages + + # Display user message + with st.chat_message("user"): + st.write(prompt) + + # Prepare messages for llm + messages_for_llm = [{ + "role": m["role"], + "content": m["content"] + } for m in st.session_state.messages] + + # Generate and display llm response + with st.chat_message("assistant"): + message_placeholder = st.empty() + full_response = "" + + # Get streaming response from llm + response = get_llm_response(messages_for_llm, model) + if isinstance(response, str): + message_placeholder.markdown(response) + full_response = response + else: + for chunk in response: + if hasattr(chunk.choices[0].delta, "content"): + content = chunk.choices[0].delta.content + if content: + full_response += content + message_placeholder.markdown(full_response + "▌") + + message_placeholder.markdown(full_response) + + # Save llm response to session history + st.session_state.messages.append({ + "role": "assistant", + "content": full_response + })