jad2121
9 months ago
14 changed files with 2275 additions and 3 deletions
@ -0,0 +1,81 @@
|
||||
from langchain_community.tools import DuckDuckGoSearchRun |
||||
import os |
||||
from crewai import Agent, Task, Crew, Process |
||||
from dotenv import load_dotenv |
||||
import os |
||||
|
||||
current_directory = os.path.dirname(os.path.realpath(__file__)) |
||||
config_directory = os.path.expanduser("~/.config/fabric") |
||||
env_file = os.path.join(config_directory, ".env") |
||||
load_dotenv(env_file) |
||||
os.environ['OPENAI_MODEL_NAME'] = 'gpt-4-0125-preview' |
||||
|
||||
# You can choose to use a local model through Ollama for example. See https://docs.crewai.com/how-to/LLM-Connections/ for more information. |
||||
# osOPENAI_API_BASE='http://localhost:11434/v1' |
||||
# OPENAI_MODEL_NAME='openhermes' # Adjust based on available model |
||||
# OPENAI_API_KEY='' |
||||
|
||||
# Install duckduckgo-search for this example: |
||||
# !pip install -U duckduckgo-search |
||||
|
||||
search_tool = DuckDuckGoSearchRun() |
||||
|
||||
# Define your agents with roles and goals |
||||
researcher = Agent( |
||||
role='Senior Research Analyst', |
||||
goal='Uncover cutting-edge developments in AI and data science', |
||||
backstory="""You work at a leading tech think tank. |
||||
Your expertise lies in identifying emerging trends. |
||||
You have a knack for dissecting complex data and presenting actionable insights.""", |
||||
verbose=True, |
||||
allow_delegation=False, |
||||
tools=[search_tool] |
||||
# You can pass an optional llm attribute specifying what mode you wanna use. |
||||
# It can be a local model through Ollama / LM Studio or a remote |
||||
# model like OpenAI, Mistral, Antrophic or others (https://docs.crewai.com/how-to/LLM-Connections/) |
||||
# |
||||
# import os |
||||
# |
||||
# OR |
||||
# |
||||
# from langchain_openai import ChatOpenAI |
||||
# llm=ChatOpenAI(model_name="gpt-3.5", temperature=0.7) |
||||
) |
||||
writer = Agent( |
||||
role='Tech Content Strategist', |
||||
goal='Craft compelling content on tech advancements', |
||||
backstory="""You are a renowned Content Strategist, known for your insightful and engaging articles. |
||||
You transform complex concepts into compelling narratives.""", |
||||
verbose=True, |
||||
allow_delegation=True |
||||
) |
||||
|
||||
# Create tasks for your agents |
||||
task1 = Task( |
||||
description="""Conduct a comprehensive analysis of the latest advancements in AI in 2024. |
||||
Identify key trends, breakthrough technologies, and potential industry impacts.""", |
||||
expected_output="Full analysis report in bullet points", |
||||
agent=researcher |
||||
) |
||||
|
||||
task2 = Task( |
||||
description="""Using the insights provided, develop an engaging blog |
||||
post that highlights the most significant AI advancements. |
||||
Your post should be informative yet accessible, catering to a tech-savvy audience. |
||||
Make it sound cool, avoid complex words so it doesn't sound like AI.""", |
||||
expected_output="Full blog post of at least 4 paragraphs", |
||||
agent=writer |
||||
) |
||||
|
||||
# Instantiate your crew with a sequential process |
||||
crew = Crew( |
||||
agents=[researcher, writer], |
||||
tasks=[task1, task2], |
||||
verbose=2, # You can set it to 1 or 2 to different logging levels |
||||
) |
||||
|
||||
# Get your crew to work! |
||||
result = crew.kickoff() |
||||
|
||||
print("######################") |
||||
print(result) |
@ -0,0 +1,89 @@
|
||||
from crewai import Crew |
||||
from textwrap import dedent |
||||
from .trip_agents import TripAgents |
||||
from .trip_tasks import TripTasks |
||||
import os |
||||
from dotenv import load_dotenv |
||||
|
||||
current_directory = os.path.dirname(os.path.realpath(__file__)) |
||||
config_directory = os.path.expanduser("~/.config/fabric") |
||||
env_file = os.path.join(config_directory, ".env") |
||||
load_dotenv(env_file) |
||||
os.environ['OPENAI_MODEL_NAME'] = 'gpt-4-0125-preview' |
||||
|
||||
|
||||
class TripCrew: |
||||
|
||||
def __init__(self, origin, cities, date_range, interests): |
||||
self.cities = cities |
||||
self.origin = origin |
||||
self.interests = interests |
||||
self.date_range = date_range |
||||
|
||||
def run(self): |
||||
agents = TripAgents() |
||||
tasks = TripTasks() |
||||
|
||||
city_selector_agent = agents.city_selection_agent() |
||||
local_expert_agent = agents.local_expert() |
||||
travel_concierge_agent = agents.travel_concierge() |
||||
|
||||
identify_task = tasks.identify_task( |
||||
city_selector_agent, |
||||
self.origin, |
||||
self.cities, |
||||
self.interests, |
||||
self.date_range |
||||
) |
||||
gather_task = tasks.gather_task( |
||||
local_expert_agent, |
||||
self.origin, |
||||
self.interests, |
||||
self.date_range |
||||
) |
||||
plan_task = tasks.plan_task( |
||||
travel_concierge_agent, |
||||
self.origin, |
||||
self.interests, |
||||
self.date_range |
||||
) |
||||
|
||||
crew = Crew( |
||||
agents=[ |
||||
city_selector_agent, local_expert_agent, travel_concierge_agent |
||||
], |
||||
tasks=[identify_task, gather_task, plan_task], |
||||
verbose=True |
||||
) |
||||
|
||||
result = crew.kickoff() |
||||
return result |
||||
|
||||
|
||||
class planner_cli: |
||||
def ask(self): |
||||
print("## Welcome to Trip Planner Crew") |
||||
print('-------------------------------') |
||||
location = input( |
||||
dedent(""" |
||||
From where will you be traveling from? |
||||
""")) |
||||
cities = input( |
||||
dedent(""" |
||||
What are the cities options you are interested in visiting? |
||||
""")) |
||||
date_range = input( |
||||
dedent(""" |
||||
What is the date range you are interested in traveling? |
||||
""")) |
||||
interests = input( |
||||
dedent(""" |
||||
What are some of your high level interests and hobbies? |
||||
""")) |
||||
|
||||
trip_crew = TripCrew(location, cities, date_range, interests) |
||||
result = trip_crew.run() |
||||
print("\n\n########################") |
||||
print("## Here is you Trip Plan") |
||||
print("########################\n") |
||||
print(result) |
@ -0,0 +1,38 @@
|
||||
import json |
||||
import os |
||||
|
||||
import requests |
||||
from crewai import Agent, Task |
||||
from langchain.tools import tool |
||||
from unstructured.partition.html import partition_html |
||||
|
||||
|
||||
class BrowserTools(): |
||||
|
||||
@tool("Scrape website content") |
||||
def scrape_and_summarize_website(website): |
||||
"""Useful to scrape and summarize a website content""" |
||||
url = f"https://chrome.browserless.io/content?token={os.environ['BROWSERLESS_API_KEY']}" |
||||
payload = json.dumps({"url": website}) |
||||
headers = {'cache-control': 'no-cache', 'content-type': 'application/json'} |
||||
response = requests.request("POST", url, headers=headers, data=payload) |
||||
elements = partition_html(text=response.text) |
||||
content = "\n\n".join([str(el) for el in elements]) |
||||
content = [content[i:i + 8000] for i in range(0, len(content), 8000)] |
||||
summaries = [] |
||||
for chunk in content: |
||||
agent = Agent( |
||||
role='Principal Researcher', |
||||
goal= |
||||
'Do amazing researches and summaries based on the content you are working with', |
||||
backstory= |
||||
"You're a Principal Researcher at a big company and you need to do a research about a given topic.", |
||||
allow_delegation=False) |
||||
task = Task( |
||||
agent=agent, |
||||
description= |
||||
f'Analyze and summarize the content bellow, make sure to include the most relevant information in the summary, return only the summary nothing else.\n\nCONTENT\n----------\n{chunk}' |
||||
) |
||||
summary = task.execute() |
||||
summaries.append(summary) |
||||
return "\n\n".join(summaries) |
@ -0,0 +1,15 @@
|
||||
from langchain.tools import tool |
||||
|
||||
class CalculatorTools(): |
||||
|
||||
@tool("Make a calculation") |
||||
def calculate(operation): |
||||
"""Useful to perform any mathematical calculations, |
||||
like sum, minus, multiplication, division, etc. |
||||
The input to this tool should be a mathematical |
||||
expression, a couple examples are `200*7` or `5000/2*10` |
||||
""" |
||||
try: |
||||
return eval(operation) |
||||
except SyntaxError: |
||||
return "Error: Invalid syntax in mathematical expression" |
@ -0,0 +1,37 @@
|
||||
import json |
||||
import os |
||||
|
||||
import requests |
||||
from langchain.tools import tool |
||||
|
||||
|
||||
class SearchTools(): |
||||
|
||||
@tool("Search the internet") |
||||
def search_internet(query): |
||||
"""Useful to search the internet |
||||
about a a given topic and return relevant results""" |
||||
top_result_to_return = 4 |
||||
url = "https://google.serper.dev/search" |
||||
payload = json.dumps({"q": query}) |
||||
headers = { |
||||
'X-API-KEY': os.environ['SERPER_API_KEY'], |
||||
'content-type': 'application/json' |
||||
} |
||||
response = requests.request("POST", url, headers=headers, data=payload) |
||||
# check if there is an organic key |
||||
if 'organic' not in response.json(): |
||||
return "Sorry, I couldn't find anything about that, there could be an error with you serper api key." |
||||
else: |
||||
results = response.json()['organic'] |
||||
string = [] |
||||
for result in results[:top_result_to_return]: |
||||
try: |
||||
string.append('\n'.join([ |
||||
f"Title: {result['title']}", f"Link: {result['link']}", |
||||
f"Snippet: {result['snippet']}", "\n-----------------" |
||||
])) |
||||
except KeyError: |
||||
next |
||||
|
||||
return '\n'.join(string) |
@ -0,0 +1,45 @@
|
||||
from crewai import Agent |
||||
|
||||
from .tools.browser_tools import BrowserTools |
||||
from .tools.calculator_tools import CalculatorTools |
||||
from .tools.search_tools import SearchTools |
||||
|
||||
|
||||
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) |
||||
|
||||
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) |
||||
|
||||
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) |
@ -0,0 +1,83 @@
|
||||
from crewai import Task |
||||
from textwrap import dedent |
||||
from datetime import date |
||||
|
||||
|
||||
class TripTasks(): |
||||
|
||||
def identify_task(self, agent, origin, cities, interests, range): |
||||
return Task(description=dedent(f""" |
||||
Analyze and select the best city for the trip based |
||||
on specific criteria such as weather patterns, seasonal |
||||
events, and travel costs. This task involves comparing |
||||
multiple cities, considering factors like current weather |
||||
conditions, upcoming cultural or seasonal events, and |
||||
overall travel expenses. |
||||
|
||||
Your final answer must be a detailed |
||||
report on the chosen city, and everything you found out |
||||
about it, including the actual flight costs, weather |
||||
forecast and attractions. |
||||
{self.__tip_section()} |
||||
|
||||
Traveling from: {origin} |
||||
City Options: {cities} |
||||
Trip Date: {range} |
||||
Traveler Interests: {interests} |
||||
"""), |
||||
agent=agent) |
||||
|
||||
def gather_task(self, agent, origin, interests, range): |
||||
return Task(description=dedent(f""" |
||||
As a local expert on this city you must compile an |
||||
in-depth guide for someone traveling there and wanting |
||||
to have THE BEST trip ever! |
||||
Gather information about key attractions, local customs, |
||||
special events, and daily activity recommendations. |
||||
Find the best spots to go to, the kind of place only a |
||||
local would know. |
||||
This guide should provide a thorough overview of what |
||||
the city has to offer, including hidden gems, cultural |
||||
hotspots, must-visit landmarks, weather forecasts, and |
||||
high level costs. |
||||
|
||||
The final answer must be a comprehensive city guide, |
||||
rich in cultural insights and practical tips, |
||||
tailored to enhance the travel experience. |
||||
{self.__tip_section()} |
||||
|
||||
Trip Date: {range} |
||||
Traveling from: {origin} |
||||
Traveler Interests: {interests} |
||||
"""), |
||||
agent=agent) |
||||
|
||||
def plan_task(self, agent, origin, interests, range): |
||||
return Task(description=dedent(f""" |
||||
Expand this guide into a a full 7-day travel |
||||
itinerary with detailed per-day plans, including |
||||
weather forecasts, places to eat, packing suggestions, |
||||
and a budget breakdown. |
||||
|
||||
You MUST suggest actual places to visit, actual hotels |
||||
to stay and actual restaurants to go to. |
||||
|
||||
This itinerary should cover all aspects of the trip, |
||||
from arrival to departure, integrating the city guide |
||||
information with practical travel logistics. |
||||
|
||||
Your final answer MUST be a complete expanded travel plan, |
||||
formatted as markdown, encompassing a daily schedule, |
||||
anticipated weather conditions, recommended clothing and |
||||
items to pack, and a detailed budget, ensuring THE BEST |
||||
TRIP EVER, Be specific and give it a reason why you picked |
||||
# up each place, what make them special! {self.__tip_section()} |
||||
|
||||
Trip Date: {range} |
||||
Traveling from: {origin} |
||||
Traveler Interests: {interests} |
||||
"""), |
||||
agent=agent) |
||||
|
||||
def __tip_section(self): |
||||
return "If you do your BEST WORK, I'll tip you $100!" |
Loading…
Reference in new issue