|
from crewai import Agent |
|
import re |
|
import streamlit as st |
|
from langchain_community.llms import OpenAI |
|
|
|
from tools.browser_tools import BrowserTools |
|
from tools.calculator_tools import CalculatorTools |
|
from tools.search_tools import SearchTools |
|
from crewai.llm import LLM |
|
|
|
model_kwargs = { |
|
"model": f"openai/{st.secrets['MODEL_ID']}", |
|
"base_url": st.secrets["MODEL_BASE_URL"], |
|
"api_key": st.secrets["OPENAI_API_KEY"] |
|
} |
|
llm = LLM(**model_kwargs) |
|
|
|
|
|
class TripAgents(): |
|
|
|
def city_selection_agent(self): |
|
return Agent( |
|
role='City Selection Expert', |
|
goal='Select the best city based on weather, season, and prices', |
|
backstory='An expert in analyzing travel data to pick ideal destinations', |
|
tools=[ |
|
SearchTools.search_internet, |
|
BrowserTools.scrape_and_summarize_website, |
|
], |
|
verbose=True, |
|
llm=llm |
|
|
|
) |
|
|
|
def local_expert(self): |
|
return Agent( |
|
role='Local Expert at this city', |
|
goal='Provide the BEST insights about the selected city', |
|
backstory="""A knowledgeable local guide with extensive information |
|
about the city, it's attractions and customs""", |
|
tools=[ |
|
SearchTools.search_internet, |
|
BrowserTools.scrape_and_summarize_website, |
|
], |
|
verbose=True, |
|
llm=llm |
|
|
|
) |
|
|
|
def travel_concierge(self): |
|
return Agent( |
|
role='Amazing Travel Concierge', |
|
goal="""Create the most amazing travel itineraries with budget and |
|
packing suggestions for the city""", |
|
backstory="""Specialist in travel planning and logistics with |
|
decades of experience""", |
|
tools=[ |
|
SearchTools.search_internet, |
|
BrowserTools.scrape_and_summarize_website, |
|
CalculatorTools.calculate, |
|
], |
|
verbose=True, |
|
llm=llm |
|
|
|
) |
|
|
|
class StreamToExpander: |
|
def __init__(self, expander): |
|
self.expander = expander |
|
self.buffer = [] |
|
self.colors = ['red', 'green', 'blue', 'orange'] |
|
self.color_index = 0 |
|
|
|
def write(self, data): |
|
|
|
cleaned_data = re.sub(r'\x1B\[[0-9;]*[mK]', '', data) |
|
|
|
|
|
task_match_object = re.search(r'\"task\"\s*:\s*\"(.*?)\"', cleaned_data, re.IGNORECASE) |
|
task_match_input = re.search(r'task\s*:\s*([^\n]*)', cleaned_data, re.IGNORECASE) |
|
task_value = None |
|
if task_match_object: |
|
task_value = task_match_object.group(1) |
|
elif task_match_input: |
|
task_value = task_match_input.group(1).strip() |
|
|
|
if task_value: |
|
st.toast(":robot_face: " + task_value) |
|
|
|
|
|
if "Entering new CrewAgentExecutor chain" in cleaned_data: |
|
|
|
self.color_index = (self.color_index + 1) % len(self.colors) |
|
|
|
cleaned_data = cleaned_data.replace("Entering new CrewAgentExecutor chain", f":{self.colors[self.color_index]}[Entering new CrewAgentExecutor chain]") |
|
|
|
if "City Selection Expert" in cleaned_data: |
|
|
|
cleaned_data = cleaned_data.replace("City Selection Expert", f":{self.colors[self.color_index]}[City Selection Expert]") |
|
if "Local Expert at this city" in cleaned_data: |
|
cleaned_data = cleaned_data.replace("Local Expert at this city", f":{self.colors[self.color_index]}[Local Expert at this city]") |
|
if "Amazing Travel Concierge" in cleaned_data: |
|
cleaned_data = cleaned_data.replace("Amazing Travel Concierge", f":{self.colors[self.color_index]}[Amazing Travel Concierge]") |
|
if "Finished chain." in cleaned_data: |
|
cleaned_data = cleaned_data.replace("Finished chain.", f":{self.colors[self.color_index]}[Finished chain.]") |
|
|
|
self.buffer.append(cleaned_data) |
|
if "\n" in data: |
|
self.expander.markdown(''.join(self.buffer), unsafe_allow_html=True) |
|
self.buffer = [] |
|
|