Spaces:
Sleeping
Sleeping
martianband1t
commited on
Commit
•
a574aea
1
Parent(s):
7ee432b
Update app.py
Browse files
app.py
CHANGED
@@ -1,64 +1,185 @@
|
|
|
|
1 |
import gradio as gr
|
2 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
4 |
-
|
5 |
-
For more information on `huggingface_hub` Inference API support, please check the docs: https://huggingface.co/docs/huggingface_hub/v0.22.2/en/guides/inference
|
6 |
-
"""
|
7 |
-
client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")
|
8 |
|
|
|
9 |
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
max_tokens,
|
15 |
-
temperature,
|
16 |
-
top_p,
|
17 |
-
):
|
18 |
-
messages = [{"role": "system", "content": system_message}]
|
19 |
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
|
|
|
|
|
|
|
|
25 |
|
26 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
27 |
|
28 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
29 |
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
|
|
38 |
|
39 |
-
|
40 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
61 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
62 |
|
63 |
if __name__ == "__main__":
|
64 |
-
|
|
|
1 |
+
import os
|
2 |
import gradio as gr
|
3 |
+
import requests
|
4 |
+
from crewai import Agent, Task, Crew, Process
|
5 |
+
from dotenv import load_dotenv
|
6 |
+
from langchain_openai import ChatOpenAI
|
7 |
+
from langchain_community.tools import DuckDuckGoSearchRun, DuckDuckGoSearchResults
|
8 |
+
from crewai_tools import tool, SeleniumScrapingTool, ScrapeWebsiteTool
|
9 |
+
from duckduckgo_search import DDGS
|
10 |
|
11 |
+
from newspaper import Article
|
|
|
|
|
|
|
12 |
|
13 |
+
load_dotenv()
|
14 |
|
15 |
+
# Ensure essential environment variables are set
|
16 |
+
openai_api_key = os.getenv('OPENAI_API_KEY')
|
17 |
+
if not openai_api_key:
|
18 |
+
raise EnvironmentError("OPENAI_API_KEY is not set in environment variables")
|
|
|
|
|
|
|
|
|
|
|
19 |
|
20 |
+
def fetch_content(url):
|
21 |
+
try:
|
22 |
+
article = Article(url)
|
23 |
+
article.download()
|
24 |
+
article.parse()
|
25 |
+
return article.text
|
26 |
+
except Exception as e:
|
27 |
+
print("ERROR: " + str(e))
|
28 |
+
return f"Error fetching content: {e}"
|
29 |
|
30 |
+
# Define the DuckDuckGoSearch tool
|
31 |
+
@tool('DuckDuckGoSearchResults')
|
32 |
+
def search_results(search_query: str) -> dict:
|
33 |
+
"""
|
34 |
+
Effectue une recherche sur le Web pour rassembler et renvoyer une collection de résultats de recherche.
|
35 |
+
Cet outil automatise la récupération d'informations Web liées à une requête spécifiée.
|
36 |
+
Args :
|
37 |
+
- search_query (str) : La chaîne de requête qui spécifie les informations à rechercher sur le Web. Il doit s'agir d'une expression claire et concise des besoins d'information de l'utilisateur.
|
38 |
+
Retours :
|
39 |
+
- list : Une liste de dictionnaires, où chaque dictionnaire représente un résultat de recherche. Chaque dictionnaire comprend un « extrait » de la page et le « lien » avec l'URL qui y renvoie.
|
40 |
+
"""
|
41 |
+
results = DDGS().text(search_query, max_results=5, timelimit='m')
|
42 |
+
results_list = [{"title": result['title'], "snippet": result['body'], "link": result['href']} for result in results]
|
43 |
+
return results_list
|
44 |
|
45 |
+
@tool('WebScrapper')
|
46 |
+
def web_scrapper(url: str, topic: str) -> str:
|
47 |
+
"""
|
48 |
+
Un outil conçu pour extraire et lire le contenu d'un lien spécifié et générer un résumé sur un sujet spécifique.
|
49 |
+
Il est capable de gérer différents types de pages Web en effectuant des requêtes HTTP et en analysant le contenu HTML reçu.
|
50 |
+
Cet outil est particulièrement utile pour les tâches de web scraping, la collecte de données ou l'extraction d'informations spécifiques à partir de sites Web.
|
51 |
+
|
52 |
+
Args:
|
53 |
+
- url (str) : L'URL à partir de laquelle récupérer le contenu.
|
54 |
+
- topic (str) : Le sujet spécifique sur lequel générer un résumé.
|
55 |
+
Returns:
|
56 |
+
- summary (str): résumé de l'url sur le sujet
|
57 |
+
"""
|
58 |
+
# Scrape content from the specified URL
|
59 |
+
content = fetch_content(url)
|
60 |
+
|
61 |
+
# Prepare the prompt for generating the summary
|
62 |
+
prompt = f"Générer un résumé du contenu suivant sur le sujet ## {topic} ### \n\nCONTENT:\n\n" + content
|
63 |
+
|
64 |
+
# Generate the summary using OpenAI
|
65 |
+
openai_llm = ChatOpenAI(temperature=0.4, model_name="gpt-3.5-turbo")
|
66 |
+
response = openai_llm.invoke(prompt)
|
67 |
|
68 |
+
summary_response = f"""###
|
69 |
+
Summary:
|
70 |
+
{response.content}
|
71 |
+
|
72 |
+
URL: {url}
|
73 |
+
###
|
74 |
+
"""
|
75 |
+
|
76 |
+
return summary_response
|
77 |
|
78 |
+
def kickoff_crew(topic: str, model_choice: str) -> str:
|
79 |
+
try:
|
80 |
+
# Initialize the OpenAI language model
|
81 |
+
openai_llm = ChatOpenAI(temperature=0, model_name=model_choice)
|
82 |
+
|
83 |
+
# Define Agents with OpenAI LLM
|
84 |
+
researcher = Agent(
|
85 |
+
role='Researcher',
|
86 |
+
goal=f'Rechercher et collecter des informations détaillées sur le sujet ## {topic} ##',
|
87 |
+
tools=[search_results, web_scrapper],
|
88 |
+
llm=openai_llm,
|
89 |
+
backstory=(
|
90 |
+
"Vous êtes un chercheur méticuleux, habile à parcourir de grandes quantités d'informations pour en extraire des informations essentielles sur un sujet donné. "
|
91 |
+
"Votre souci du détail garantit la fiabilité et l'exhaustivité de vos découvertes. "
|
92 |
+
"Avec une approche stratégique, vous analysez et documentez soigneusement les données, dans le but de fournir des résultats précis et fiables."
|
93 |
+
),
|
94 |
+
allow_delegation=False,
|
95 |
+
max_iter=15,
|
96 |
+
max_rpm=20,
|
97 |
+
memory=True,
|
98 |
+
verbose=True
|
99 |
+
)
|
100 |
|
101 |
+
|
102 |
+
editor = Agent(
|
103 |
+
role='Editor',
|
104 |
+
goal=f'Compiler et affiner les informations dans un rapport complet sur le sujet ## {topic} ##',
|
105 |
+
llm=openai_llm,
|
106 |
+
backstory=(
|
107 |
+
"En tant qu'éditeur expert, vous êtes spécialisé dans la transformation de données brutes en rapports clairs et attrayants. "
|
108 |
+
"Votre maîtrise de la langue et votre souci du détail garantissent que chaque rapport ne transmet pas seulement des informations essentielles"
|
109 |
+
"mais il est également facilement compréhensible et attrayant pour des publics divers."
|
110 |
+
),
|
111 |
+
allow_delegation=False,
|
112 |
+
max_iter=5,
|
113 |
+
max_rpm=15,
|
114 |
+
memory=True,
|
115 |
+
verbose=True
|
116 |
+
)
|
117 |
+
|
118 |
+
# Define Tasks
|
119 |
+
research_task = Task(
|
120 |
+
description=(
|
121 |
+
f"Utilisez l'outil DuckDuckGoSearchResults pour collecter des extraits de recherche initiaux sur ## {topic} ##. "
|
122 |
+
f"Si des recherches plus détaillées sont nécessaires, générez et exécutez de nouvelles requêtes liées à ## {topic} ##. "
|
123 |
+
"Ensuite, utilisez l'outil WebScrapper pour approfondir les URL importantes identifiées à partir des extraits de code, en extrayant ainsi des informations et des insights supplémentaires. "
|
124 |
+
"Compilez ces résultats dans un avant-projet, en documentant toutes les sources, titres et liens pertinents associés au sujet. "
|
125 |
+
"Assurez une grande précision tout au long du processus et évitez toute fabrication ou fausse représentation des informations."
|
126 |
+
),
|
127 |
+
expected_output=(
|
128 |
+
"Un projet de rapport structuré sur le sujet, comprenant une introduction, un corps principal détaillé organisé par différents aspects du sujet et une conclusion. "
|
129 |
+
"Chaque section doit citer correctement les sources, fournissant un aperçu complet des informations recueillies."
|
130 |
+
),
|
131 |
+
agent=researcher
|
132 |
+
)
|
133 |
|
134 |
+
|
135 |
+
edit_task = Task(
|
136 |
+
description=(
|
137 |
+
"Révisez et affinez le projet de rapport initial de la tâche de recherche. Organisez le contenu de manière logique pour améliorer le flux d'informations. "
|
138 |
+
"Vérifiez l'exactitude de toutes les données, corrigez les écarts et mettez à jour les informations pour vous assurer qu'elles reflètent les connaissances actuelles et qu'elles sont bien étayées par les sources. "
|
139 |
+
"Améliorez la lisibilité du rapport en améliorant la clarté du langage, en ajustant les structures de phrases et en maintenant un ton cohérent. "
|
140 |
+
"Inclure une section répertoriant toutes les sources utilisées, formatée sous forme de puces suivant ce modèle : "
|
141 |
+
"- titre : url'."
|
142 |
+
),
|
143 |
+
expected_output=(
|
144 |
+
f"Un rapport soigné et complet sur le sujet ## {topic} ##, avec un récit clair et professionnel qui reflète fidèlement les résultats de la recherche. "
|
145 |
+
"Le rapport doit comprendre une introduction, une section de discussion approfondie, une conclusion concise et une liste de sources bien organisée. "
|
146 |
+
"Assurez-vous que le document est grammaticalement correct et prêt à être publié ou présenté."
|
147 |
+
),
|
148 |
+
agent=editor,
|
149 |
+
context=[research_task]
|
150 |
+
)
|
151 |
+
|
152 |
+
# Forming the Crew
|
153 |
+
crew = Crew(
|
154 |
+
agents=[researcher, editor],
|
155 |
+
tasks=[research_task, edit_task],
|
156 |
+
process=Process.sequential,
|
157 |
+
)
|
158 |
+
|
159 |
+
# Kick-off the research process
|
160 |
+
result = crew.kickoff()
|
161 |
+
if not isinstance(result, str):
|
162 |
+
result = str(result)
|
163 |
+
return result
|
164 |
+
except Exception as e:
|
165 |
+
return f"Error: {str(e)}"
|
166 |
|
167 |
+
def main():
|
168 |
+
"""Set up the Gradio interface for the CrewAI Research Tool."""
|
169 |
+
with gr.Blocks() as demo:
|
170 |
+
gr.Markdown("## Martian CrewAI Research Tool")
|
171 |
+
topic_input = gr.Textbox(label="Entrer le sujet de recherche", placeholder="Écrivez le sujet ici..")
|
172 |
+
model_choice = gr.Radio(choices=["gpt-3.5-turbo", "gpt-4"], label="Choissisez un modèle")
|
173 |
+
submit_button = gr.Button("Commencez la Recherche!")
|
174 |
+
output = gr.Markdown(label="Résultats")
|
175 |
+
|
176 |
+
submit_button.click(
|
177 |
+
fn=kickoff_crew,
|
178 |
+
inputs=[topic_input, model_choice],
|
179 |
+
outputs=output
|
180 |
+
)
|
181 |
+
|
182 |
+
demo.launch(debug=True)
|
183 |
|
184 |
if __name__ == "__main__":
|
185 |
+
main()
|