From ed887a6e11b233214a59de9ecc006aaa57d21a4d Mon Sep 17 00:00:00 2001 From: zeeland Date: Mon, 5 Aug 2024 22:00:55 +0800 Subject: [PATCH 1/3] fix: error in ToolAgent prompt --- promptulate/agents/tool_agent/prompt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/promptulate/agents/tool_agent/prompt.py b/promptulate/agents/tool_agent/prompt.py index c0f3fd92..4359f216 100644 --- a/promptulate/agents/tool_agent/prompt.py +++ b/promptulate/agents/tool_agent/prompt.py @@ -76,7 +76,7 @@ ```json { -"thought": "The thought of what to do and why.", +"analysis": "The thought of what to do and why.", "action": { "name": "finish", "args": {"content": "Sorry, I cannot answer your query, because (Summary all the upper steps, and explain)"} From 2d2d46d1c168cb42352e0bda195c68911d6b2282 Mon Sep 17 00:00:00 2001 From: zeeland Date: Mon, 5 Aug 2024 22:03:36 +0800 Subject: [PATCH 2/3] feat: add streamlit sidebar component --- promptulate/beta/__init__.py | 4 ++-- promptulate/beta/st/__init__.py | 3 +++ promptulate/beta/st/sidebar.py | 38 +++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 promptulate/beta/st/__init__.py create mode 100644 promptulate/beta/st/sidebar.py diff --git a/promptulate/beta/__init__.py b/promptulate/beta/__init__.py index 2786e4c7..423635e7 100644 --- a/promptulate/beta/__init__.py +++ b/promptulate/beta/__init__.py @@ -1,3 +1,3 @@ -from promptulate.beta import agents, rag +from promptulate.beta import agents, rag, st -__all__ = ["agents", "rag"] +__all__ = ["agents", "rag", "st"] diff --git a/promptulate/beta/st/__init__.py b/promptulate/beta/st/__init__.py new file mode 100644 index 00000000..a6729391 --- /dev/null +++ b/promptulate/beta/st/__init__.py @@ -0,0 +1,3 @@ +from promptulate.beta.st.sidebar import model_sidebar + +__all__ = ["model_sidebar"] diff --git a/promptulate/beta/st/sidebar.py b/promptulate/beta/st/sidebar.py new file mode 100644 index 00000000..2dc4c002 --- /dev/null +++ b/promptulate/beta/st/sidebar.py @@ -0,0 +1,38 @@ +from typing import List, TypedDict + + +class ModelConfig(TypedDict): + model_name: str + api_key: str + api_base: str + + +def model_sidebar(model_options: List[str] = None) -> ModelConfig: + import streamlit as st + + model_options = model_options or [ + "Custom Model", + "openai/gpt-4o", + "openai/gpt-4o-mini", + "openai/gpt-4-turbo", + "deepseek/deepseek-chat", + "claude-3-5-sonnet-20240620", + "zhipu/glm-4", + "ollama/llama2", + "groq/llama-3.1-70b-versatile", + ] + + with st.sidebar: + selected_model = st.selectbox("Language Model Name", model_options) + + if selected_model == "Custom Model": + selected_model = st.text_input( + "Enter Custom Model Name", + placeholder="Custom model name, eg: groq/llama3-70b-8192", + help="For more details, please see [how to write model name?](https://www.promptulate.cn/#/other/how_to_write_model_name)", # noqa + ) + + api_key = st.text_input("API Key", key="provider_api_key", type="password") + api_base = st.text_input("OpenAI Proxy URL (Optional)") + + return ModelConfig(model_name=selected_model, api_key=api_key, api_base=api_base) From d31fa19fe13f092358f9b72468c13ccb9e52c198 Mon Sep 17 00:00:00 2001 From: zeeland Date: Mon, 5 Aug 2024 22:23:16 +0800 Subject: [PATCH 3/3] pref: optimize chatbot usage --- docs/_sidebar.md | 2 +- docs/use_cases/img/mode-sidebar.png | Bin 0 -> 49900 bytes ...{streamlit-pne.md => streamlit-chatbot.md} | 77 +++++++++++---- example/streamlit-chatbot/app.py | 89 ++++++++---------- pyproject.toml | 2 +- 5 files changed, 102 insertions(+), 68 deletions(-) create mode 100644 docs/use_cases/img/mode-sidebar.png rename docs/use_cases/{streamlit-pne.md => streamlit-chatbot.md} (60%) diff --git a/docs/_sidebar.md b/docs/_sidebar.md index dbcd042b..52014a8a 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -7,7 +7,7 @@ - [Best practices](use_cases/intro.md#use-cases) - [Awesome chat function](use_cases/chat_usage.md#chat) - [Build math application with agent](use_cases/build-math-application-with-agent.md#building-a-math-application-with-promptulate-agents) - - [Build chatbot with streamlit and pne.chat()](use_cases/streamlit-pne.md#build-a-simple-chatbot-using-streamlit-and-pne) + - [Build chatbot with streamlit and pne.chat()](use_cases/streamlit-chatbot#build-a-simple-chatbot-using-streamlit-and-pne) - [Build a Simple Chatbot Using pne and gradio](use_cases/pne-gradio.md#build-a-simple-chatbot-using-pne-and-gradio) - [Groq, llama3, Streamlit to build a application](use_cases/streamlit-groq-llama3.md#groq-llama3-streamlit-to-build-a-application) - [Build knowledge map with streamlit and pne.chat()](use_cases/llmapper.md#llmapper) diff --git a/docs/use_cases/img/mode-sidebar.png b/docs/use_cases/img/mode-sidebar.png new file mode 100644 index 0000000000000000000000000000000000000000..ca5eee73f3ee78a6af296b091ee5dc6dc431fa13 GIT binary patch literal 49900 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 pne.beta.st.model_sidebar() is currently in beta phase and is expected to be converted to the official version in v1.20.0 + +```python +import pne + +config = pne.beta.st.model_sidebar() +print(config) +``` + +model_sidebar provide some models default options, you can also pass a list of model names to it if you want to customize the options. + +Output: + +```text +{'model_name': 'openai/gpt-4o', 'api_key': 'your api key', 'api_base': ''} +``` + +Render it like this: + +![img.png](img/mode-sidebar.png) + +The upper code is the same as the following code: ```python -with st.sidebar: - model_name: str = st.selectbox( - label="Language Model Name", - options=[ - "openai/gpt-4o", - "openai/gpt-4-turbo", - "deepseek/deepseek-chat", - "zhipu/glm-4", - "ollama/llama2", - ], - help="For more details, please see" - "[how to write model name?](https://www.promptulate.cn/#/other/how_to_write_model_name)", # noqa - ) - api_key = st.text_input("API Key", key="provider_api_key", type="password") - api_base = st.text_input("OpenAI Proxy URL (Optional)") +from typing import List, TypedDict + + +class ModelConfig(TypedDict): + model_name: str + api_key: str + api_base: str + + +def model_sidebar(model_options: List[str] = None) -> ModelConfig: + import streamlit as st + + model_options = model_options or [ + "Custom Model", + "openai/gpt-4o", + "openai/gpt-4o-mini", + "openai/gpt-4-turbo", + "deepseek/deepseek-chat", + "claude-3-5-sonnet-20240620", + "zhipu/glm-4", + "ollama/llama2", + "groq/llama-3.1-70b-versatile", + ] + + with st.sidebar: + selected_model = st.selectbox("Language Model Name", model_options) + + if selected_model == "Custom Model": + selected_model = st.text_input( + "Enter Custom Model Name", + placeholder="Custom model name, eg: groq/llama3-70b-8192", + help="For more details, please see [how to write model name?](https://www.promptulate.cn/#/other/how_to_write_model_name)", # noqa + ) + + api_key = st.text_input("API Key", key="provider_api_key", type="password") + api_base = st.text_input("OpenAI Proxy URL (Optional)") + return ModelConfig(model_name=selected_model, api_key=api_key, api_base=api_base) ``` ### Step 3 diff --git a/example/streamlit-chatbot/app.py b/example/streamlit-chatbot/app.py index 7245c6c5..5d5fb48d 100644 --- a/example/streamlit-chatbot/app.py +++ b/example/streamlit-chatbot/app.py @@ -2,69 +2,58 @@ import streamlit as st -def main(): - with st.sidebar: - model_options = [ - "openai/gpt-4o", - "openai/gpt-4-turbo", - "deepseek/deepseek-chat", - "zhipu/glm-4", - "ollama/llama2", - "groq/llama-3.1-70b-versatile", - "claude-3-5-sonnet-20240620", +def initialize_session_state(): + if "messages" not in st.session_state: + st.session_state.messages = [ + {"role": "assistant", "content": "How can I help you?"} ] - # Add a placeholder for custom model name entry - model_options.insert(0, "Custom Model") - selected_option = st.selectbox( - label="Language Model Name", - options=model_options, +def render_chat_history(): + for msg in st.session_state.messages: + st.chat_message(msg["role"]).write(msg["content"]) + + +def get_user_input() -> str: + return st.chat_input("How can I help you?") + + +def update_chat(role: str, content: str): + """Update the chat history with the new message from the user or assistant.""" + st.session_state.messages.append({"role": role, "content": content}) + with st.chat_message(role): + st.markdown(content) + + +def generate_response(model_name: str, api_base: str, api_key: str) -> str: + """Generate a response using the specified model.""" + with st.chat_message("assistant"): + stream = pne.chat( + model=model_name, + stream=True, + messages=st.session_state.messages, + model_config={"api_base": api_base, "api_key": api_key}, ) + response = st.write_stream(stream) + return response - model_name = selected_option - if selected_option == "Custom Model": - model_name = st.text_input( - "Enter Custom Model Name", - placeholder="Custom model name, eg: groq/llama3-70b-8192", - help=( - "For more details, please see " - "[how to write model name?](https://www.promptulate.cn/#/other/how_to_write_model_name)" # noqa - ), - ) - api_key = st.text_input("API Key", key="provider_api_key", type="password") - api_base = st.text_input("OpenAI Proxy URL (Optional)") + +def main(): + initialize_session_state() + config = pne.beta.st.sidebar.model_sidebar() st.title("💬 Chat") st.caption("🚀 Hi there! 👋 I am a simple chatbot by Promptulate to help you.") - if "messages" not in st.session_state: - st.session_state["messages"] = [ - {"role": "assistant", "content": "How can I help you?"} - ] - - for msg in st.session_state.messages: - st.chat_message(msg["role"]).write(msg["content"]) + render_chat_history() - if prompt := st.chat_input("How can I help you?"): - if not api_key: + if prompt := get_user_input(): + if not config["api_key"]: st.info("Please add your API key to continue.") st.stop() - st.session_state.messages.append({"role": "user", "content": prompt}) - - with st.chat_message("user"): - st.markdown(prompt) - - with st.chat_message("assistant"): - stream = pne.chat( - model=model_name, - stream=True, - messages=st.session_state.messages, - model_config={"api_base": api_base, "api_key": api_key}, - ) - response = st.write_stream(stream) - st.session_state.messages.append({"role": "assistant", "content": response}) + update_chat("user", prompt) + generate_response(**config) if __name__ == "__main__": diff --git a/pyproject.toml b/pyproject.toml index b1fe1273..e52e4ecc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ name = "promptulate" readme = "README.md" homepage = "https://github.com/Undertone0809/promptulate" repository = "https://github.com/Undertone0809/promptulate" -version = "1.18.0" +version = "1.18.1" keywords = [ "promptulate", "pne",