agent-chatbot / app.py
Bazedgul's picture
Create app.py
275ee33
raw
history blame contribute delete
No virus
4.6 kB
import streamlit as st
from langchain.schema.runnable import RunnablePassthrough
from langchain.memory import ConversationBufferWindowMemory
from langchain.agents import AgentExecutor
from langchain.agents.format_scratchpad import format_to_openai_functions
import wikipedia
from langchain.tools.render import format_tool_to_openai_function
from langchain.prompts import MessagesPlaceholder
from langchain.agents.output_parsers import OpenAIFunctionsAgentOutputParser
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.agents import tool
import requests
import datetime,os
from langchain.pydantic_v1 import BaseModel,Field
st.set_page_config(page_title="ChatBot", page_icon="🤖")
st.header('Agent ChatBot')
st.write('Allows users to interact with the ChatGPT,Wikipedia and fetch current weather temperature of any place.')
if "messages" not in st.session_state:
st.session_state["messages"] = [{"role":"assistant","content":"Hello! How can I assist you today?"}]
chat_model = ChatOpenAI(model="gpt-3.5-turbo-1106",
streaming=True,)
# Define the input schema
class OpenMeteoInput(BaseModel):
latitude: float = Field(..., description="Latitude of the location to fetch weather data for")
longitude: float = Field(..., description="Longitude of the location to fetch weather data for")
@tool(args_schema=OpenMeteoInput)
def get_current_temperature(latitude: float, longitude: float) -> dict:
"""Fetch current temperature for given coordinates."""
BASE_URL = "https://api.open-meteo.com/v1/forecast"
# Parameters for the request
params = {
'latitude': latitude,
'longitude': longitude,
'hourly': 'temperature_2m',
'forecast_days': 1,
}
# Make the request
response = requests.get(BASE_URL, params=params)
if response.status_code == 200:
results = response.json()
else:
return f"API Request failed with status code: {response.status_code}"
current_utc_time = datetime.datetime.utcnow()
time_list = [datetime.datetime.fromisoformat(time_str.replace('Z', '+00:00')) for time_str in results['hourly']['time']]
temperature_list = results['hourly']['temperature_2m']
closest_time_index = min(range(len(time_list)), key=lambda i: abs(time_list[i] - current_utc_time))
current_temperature = temperature_list[closest_time_index]
return f'The current temperature is {current_temperature}°C'
@tool
def SearchWikiPedia(query: str):
"Serach wikipedia and get page summaries."
page_titles = wikipedia.search(query)
summaries = []
for page_title in page_titles[: 3]:
try:
wiki_page = wikipedia.page(title=page_title,auto_suggest=False)
summaries.append(f"Page: {wiki_page.title}\nSummary: {wiki_page.summary}")
except Exception:
pass
if not summaries:
return "No Good WikiPedia Search results found."
return "\n\n".join(summaries)
tools = [get_current_temperature,SearchWikiPedia]
functions = [format_tool_to_openai_function(t) for t in tools]
model_with_function = chat_model.bind(functions = functions)
prompt = ChatPromptTemplate.from_messages([("system","You are helpfull assistant.You can query from wikipedia if you donot know the answer of user query also you can check current weather temperature of any place."),
MessagesPlaceholder(variable_name="chat_history"),
("user","{user_input}"),
MessagesPlaceholder(variable_name="agent_scratchpad")])
chain = prompt | model_with_function | OpenAIFunctionsAgentOutputParser()
agent_chain = RunnablePassthrough.assign(
agent_scratchpad = lambda x: format_to_openai_functions(x['intermediate_steps'])
) | chain
for msg in st.session_state["messages"]:
st.chat_message(msg["role"]).write(msg["content"])
@st.cache_resource
def main():
memory=ConversationBufferWindowMemory(return_messages=True,memory_key="chat_history",k=54)
return AgentExecutor(agent=agent_chain,tools=tools,memory=memory)
def _main():
if user_input:= st.chat_input("Send Message To GPT..."):
st.chat_message("user").write(user_input)
st.session_state.messages.append({"role":"user","content":user_input})
response = main().invoke({'user_input':user_input})
with st.chat_message("assistant"):
st.write(response["output"])
st.session_state.messages.append({"role":"assistant","content":response["output"]})
try:
_main()
except Exception as error:
st.error(error)