Spaces:
Sleeping
Sleeping
""" | |
This is a demo of AutoGen chat agents. You can use it to chat with OpenAI's GPT-3 and GPT-4 models. They are able to execute commands, answer questions, and even write code. | |
An example a question you can ask is: 'How is the S&P 500 doing today? Summarize the news for me.' | |
UserProxyAgent is used to send messages to the AssistantAgent. The AssistantAgent is used to send messages to the UserProxyAgent. | |
""" | |
import streamlit as st | |
import asyncio | |
from autogen import AssistantAgent, UserProxyAgent | |
# setup page title and description | |
st.set_page_config(page_title="AutoGen Chat app", page_icon="🤖", layout="wide") | |
st.markdown("Adapted from [this example](https://github.com/sugarforever/autogen-streamlit)") | |
st.markdown("This is a demo of AutoGen chat agents. You can use it to chat with OpenAI's GPT-3 and GPT-4 models. They are able to execute commands, answer questions, and even write code.") | |
st.markdown("An example a question you can ask is: 'How is the S&P 500 doing today? Summarize the news for me.'") | |
st.markdown("Start by getting an API key from OpenAI. You can get one [here](https://openai.com/pricing).") | |
class TrackableAssistantAgent(AssistantAgent): | |
""" | |
A custom AssistantAgent that tracks the messages it receives. | |
This is done by overriding the `_process_received_message` method. | |
""" | |
def _process_received_message(self, message, sender, silent): | |
with st.chat_message(sender.name): | |
st.markdown(message) | |
return super()._process_received_message(message, sender, silent) | |
class TrackableUserProxyAgent(UserProxyAgent): | |
""" | |
A custom UserProxyAgent that tracks the messages it receives. | |
This is done by overriding the `_process_received_message` method. | |
""" | |
def _process_received_message(self, message, sender, silent): | |
with st.chat_message(sender.name): | |
st.markdown(message) | |
return super()._process_received_message(message, sender, silent) | |
# add placeholders for selected model and key | |
selected_model = None | |
selected_key = None | |
# setup sidebar: models to choose from and API key input | |
with st.sidebar: | |
st.header("OpenAI Configuration") | |
selected_model = st.selectbox("Model", ['gpt-3.5-turbo', 'gpt-4-1106-preview', 'gpt-4-turbo-2024-04-09'], index=1) | |
st.markdown("Press enter to save key") | |
st.markdown("For more information about the models, see [here](https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo).") | |
selected_key = st.text_input("API Key", type="password") | |
# setup main area: user input and chat messages | |
with st.container(): | |
user_input = st.text_input("User Input") | |
# only run if user input is not empty and model and key are selected | |
if user_input: | |
if not selected_key or not selected_model: | |
st.warning('You must provide valid OpenAI API key and choose preferred model', icon="⚠️") | |
st.stop() | |
# setup request timeout and config list | |
llm_config = { | |
#"request_timeout": 600, | |
"config_list": [ | |
{ | |
"model": selected_model, | |
"api_key": selected_key | |
}, | |
], | |
#"seed": "42", # seed for reproducibility | |
#"temperature": 0, # temperature of 0 means deterministic output | |
} | |
# create an AssistantAgent instance named "assistant" | |
assistant = TrackableAssistantAgent(name="assistant", llm_config=llm_config) | |
# create a UserProxyAgent instance named "user" | |
# human_input_mode is set to "NEVER" to prevent the agent from asking for user input | |
user_proxy = TrackableUserProxyAgent(name="user", human_input_mode="NEVER", llm_config=llm_config, is_termination_msg=lambda x: x.get("content", "").strip().endswith("TERMINATE")) | |
# Create an event loop: this is needed to run asynchronous functions | |
loop = asyncio.new_event_loop() | |
asyncio.set_event_loop(loop) | |
# Define an asynchronous function: this is needed to use await | |
if 'chat_initiated' not in st.session_state: | |
st.session_state.chat_initiated = False # Initialize the session state | |
if not st.session_state.chat_initiated: | |
async def initiate_chat(): | |
await user_proxy.a_initiate_chat( | |
assistant, | |
message=user_input, | |
max_consecutive_auto_reply=5, | |
is_termination_msg=lambda x: x.get("content", "").strip().endswith("TERMINATE") | |
) | |
st.stop() # Stop code execution after termination command | |
# Run the asynchronous function within the event loop | |
loop.run_until_complete(initiate_chat()) | |
# Close the event loop | |
loop.close() | |
st.session_state.chat_initiated = True # Set the state to True after running the chat | |
# stop app after termination command | |
st.stop() | |