martianband1t commited on
Commit
a574aea
1 Parent(s): 7ee432b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +171 -50
app.py CHANGED
@@ -1,64 +1,185 @@
 
1
  import gradio as gr
2
- from huggingface_hub import InferenceClient
 
 
 
 
 
 
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
- def respond(
11
- message,
12
- history: list[tuple[str, str]],
13
- system_message,
14
- max_tokens,
15
- temperature,
16
- top_p,
17
- ):
18
- messages = [{"role": "system", "content": system_message}]
19
 
20
- for val in history:
21
- if val[0]:
22
- messages.append({"role": "user", "content": val[0]})
23
- if val[1]:
24
- messages.append({"role": "assistant", "content": val[1]})
 
 
 
 
25
 
26
- messages.append({"role": "user", "content": message})
 
 
 
 
 
 
 
 
 
 
 
 
 
27
 
28
- response = ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
 
30
- for message in client.chat_completion(
31
- messages,
32
- max_tokens=max_tokens,
33
- stream=True,
34
- temperature=temperature,
35
- top_p=top_p,
36
- ):
37
- token = message.choices[0].delta.content
 
38
 
39
- response += token
40
- yield response
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
 
43
- """
44
- For information on how to customize the ChatInterface, peruse the gradio docs: https://www.gradio.app/docs/chatinterface
45
- """
46
- demo = gr.ChatInterface(
47
- respond,
48
- additional_inputs=[
49
- gr.Textbox(value="You are a friendly Chatbot.", label="System message"),
50
- gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"),
51
- gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
52
- gr.Slider(
53
- minimum=0.1,
54
- maximum=1.0,
55
- value=0.95,
56
- step=0.05,
57
- label="Top-p (nucleus sampling)",
58
- ),
59
- ],
60
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
 
63
  if __name__ == "__main__":
64
- demo.launch()
 
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()