conradmarquesperes commited on
Commit
ce5416b
·
verified ·
1 Parent(s): 6edffde

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +229 -5
app.py CHANGED
@@ -1,11 +1,235 @@
1
  import gradio as gr
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
 
4
- def greet(name):
5
- return "Hello " + name + "!"
 
 
 
6
 
 
 
 
 
 
 
 
 
 
 
 
7
 
8
- demo = gr.Interface(fn=greet, inputs="textbox", outputs="textbox")
 
 
 
 
 
9
 
10
- if __name__ == "__main__":
11
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import gradio as gr
2
+ from crewai import Agent, Task, Crew, Process, LLM
3
+ from crewai_tools import LlamaIndexTool
4
+ from llama_index.core import StorageContext, load_index_from_storage
5
+ from llama_index.core.tools import QueryEngineTool, ToolMetadata
6
+ from llama_index.core.agent import ReActAgent
7
+ from llama_index.core import Settings
8
+ from llama_index.tools.tavily_research import TavilyToolSpec
9
+ from llama_index.llms.groq import Groq
10
+ from llama_index.embeddings.huggingface import HuggingFaceEmbedding
11
+ from llama_index.core.tools import FunctionTool
12
+ import os
13
+ from dotenv import load_dotenv
14
+ import requests
15
+ import arxiv
16
+ import requests
17
 
18
 
19
+ load_dotenv()
20
+ groq = os.getenv('groq')
21
+ nvidia = os.getenv('nvidia')
22
+ tavily_key = os.getenv('tavily_key')
23
+ hf_token = os.getenv('hf_token')
24
 
25
+ Settings.llm = Groq(model="lllama-3.3-70b-versatile", api_key=groq)
26
+ Settings.embed_model = HuggingFaceEmbedding(model_name="intfloat/multilingual-e5-large")
27
+ def consulta_artigos(titulo: str) -> str:
28
+ """
29
+ Consulta os artigos na base de dados arXiv e retorna resultados formatados.
30
+ """
31
+ busca = arxiv.Search(
32
+ query=titulo,
33
+ max_results=5,
34
+ sort_by=arxiv.SortCriterion.Relevance
35
+ )
36
 
37
+ resultados = []
38
+ for resultado in busca.results():
39
+ resultados.append(f"Título: {resultado.title}\n"
40
+ f"Resumo: {resultado.summary}\n"
41
+ f"Categoria: {resultado.primary_category}\n"
42
+ f"Link: {resultado.entry_id}\n")
43
 
44
+ return "\n\n".join(resultados)
45
+
46
+
47
+ ferramenta_artigos = FunctionTool.from_defaults(fn=consulta_artigos, name="consulta_artigos", description="Consulta os artigos na base de dados arXiv e retorna resultados formatados.")
48
+ tool = LlamaIndexTool.from_tool(ferramenta_artigos)
49
+ print(tavily_key)
50
+ tavily_tool = TavilyToolSpec(api_key=tavily_key)
51
+ tavily_tools = tavily_tool.to_tool_list()
52
+ tools = [LlamaIndexTool.from_tool(t) for t in tavily_tools]
53
+
54
+
55
+ storage_context = StorageContext.from_defaults(
56
+ persist_dir="./artigo"
57
+ )
58
+ artigo_index = load_index_from_storage(storage_context)
59
+
60
+ storage_context = StorageContext.from_defaults(
61
+ persist_dir="./livro"
62
+ )
63
+ livro_index = load_index_from_storage(storage_context)
64
+
65
+
66
+ artigo_engine = artigo_index.as_query_engine(similarity_top_k=3)
67
+ livro_engine = livro_index.as_query_engine(similarity_top_k=3)
68
+
69
+ query_engine_tools = [
70
+ QueryEngineTool(
71
+ query_engine=artigo_engine,
72
+ metadata=ToolMetadata(
73
+ name="artigo_engine",
74
+ description=(
75
+ "Fornece informações sobre algoritmos de inteligência artificial nas redes sociais. "
76
+ "Use uma pergunta detalhada em texto simples como entrada para a ferramenta."
77
+ ),
78
+ ),
79
+ ),
80
+ QueryEngineTool(
81
+ query_engine=livro_engine,
82
+ metadata=ToolMetadata(
83
+ name="livro_engine",
84
+ description=(
85
+ "Fornece informações sobre avanços e tendências sobre inteligência artificial. "
86
+ "Use uma pergunta detalhada em texto simples como entrada para a ferramenta."
87
+ ),
88
+ ),
89
+ ),
90
+ ]
91
+
92
+ llm = LLM(
93
+ model="nvidia_nim/meta/llama-3.3-70b-instruct",
94
+ api_key=nvidia
95
+ )
96
+
97
+ def baixar_pdf_arxiv(link):
98
+ """
99
+ Baixa o PDF de um artigo do arXiv dado o link do artigo.
100
+
101
+ Args:
102
+ link (str): O link para o artigo no arXiv.
103
+
104
+ Returns:
105
+ str: O caminho do arquivo salvo ou uma mensagem de erro.
106
+ """
107
+ try:
108
+ # Verifica se o link é do arXiv
109
+ if "arxiv.org" not in link:
110
+ return "O link fornecido não é um link válido do arXiv."
111
+
112
+ # Extrai o ID do artigo do link
113
+ artigo_id = link.split("/")[-1]
114
+
115
+ # Monta o link direto para o PDF
116
+ pdf_url = f"https://arxiv.org/pdf/{artigo_id}.pdf"
117
+
118
+ # Faz o download do PDF
119
+ response = requests.get(pdf_url, stream=True)
120
+ if response.status_code == 200:
121
+ nome_arquivo = f"artigo_{artigo_id}.pdf"
122
+ with open(nome_arquivo, "wb") as f:
123
+ for chunk in response.iter_content(chunk_size=1024):
124
+ f.write(chunk)
125
+ return f"PDF salvo como {nome_arquivo}"
126
+ else:
127
+ return f"Erro ao baixar o PDF. Código de status: {response.status_code}"
128
+ except Exception as e:
129
+ return f"Ocorreu um erro: {e}"
130
+
131
+ ferramenta_baixar = FunctionTool.from_defaults(fn=baixar_pdf_arxiv, name="baixa_artigos", description="Baixa o PDF de um artigo do arXiv dado o link do artigo.")
132
+ tool_baixar = LlamaIndexTool.from_tool(ferramenta_baixar)
133
+
134
+ def pesquisar_artigos(tema):
135
+ # Criação dos agentes com o tema dinâmico
136
+ agent = Agent(
137
+ role='Agente de pesquisa',
138
+ goal='Fornece artigos científicos sobre um assunto de interesse.',
139
+ backstory='Um agente expert em pesquisa científica que possui a habilidade de acessar e baixar artigos no arxiv',
140
+ tools=[tool, tool_baixar],
141
+ llm=llm
142
+ )
143
+
144
+ agent_web = Agent(
145
+ role='Agente de pesquisa por documentos na web',
146
+ goal='Fornece artigos científicos encontrados na web sobre um assunto de interesse.',
147
+ backstory='Um agente expert em pesquisa científica que possui a habilidade de buscar artigos na web',
148
+ tools=[*tools],
149
+ llm=llm
150
+ )
151
+
152
+ agente_verificacao = Agent(
153
+ role='Agente de pesquisa que verifica documentos',
154
+ goal='Fornece como saída apenas artigos científicos válidos',
155
+ backstory='Um agente expert em pesquisa científica',
156
+ tools=[*tools],
157
+ llm=llm
158
+ )
159
+
160
+ manager = Agent(
161
+ role="Gerente do projeto",
162
+ goal="Gerenciar a equipe com eficiência",
163
+ backstory="Gerente de projeto experiente que coordena os esforços da equipe",
164
+ allow_delegation=True,
165
+ llm=llm
166
+ )
167
+
168
+ # Criação das tasks usando o tema recebido como parâmetro
169
+ task = Task(
170
+ description=f"Busque artigos científicos no arxiv sobre {tema}.",
171
+ expected_output="5 artigos e seus respectivos links",
172
+ agent=agent
173
+ )
174
+
175
+ task1 = Task(
176
+ description=f"Busque artigos científicos sobre {tema}.",
177
+ expected_output="5 artigos e seus respectivos links",
178
+ agent=agent_web
179
+ )
180
+
181
+ task2 = Task(
182
+ description="Verifique se os artigos encontrados na web realmente são artigos científicos.",
183
+ expected_output="5 artigos e seus respectivos links",
184
+ agent=agente_verificacao
185
+ )
186
+
187
+ crew_hierarquica = Crew(
188
+ agents=[agent, agent_web, agente_verificacao],
189
+ tasks=[task, task1, task2],
190
+ manager_agent=manager,
191
+ process=Process.hierarchical,
192
+ verbose=1,
193
+ )
194
+
195
+ result = crew_hierarquica.kickoff()
196
+ return result
197
+
198
+ # Função para a segunda aba
199
+ def pergunta(query):
200
+ agente = ReActAgent.from_tools(
201
+ query_engine_tools,
202
+ verbose=True,
203
+ )
204
+ response = agente.chat(query)
205
+
206
+ return response
207
+
208
+ # Interface Gradio para a primeira aba
209
+ pesquisa_interface = gr.Interface(
210
+ fn=pesquisar_artigos,
211
+ inputs=gr.Textbox(label="Digite o tema para pesquisa"),
212
+ outputs=gr.Textbox(label="Resultados"),
213
+ title="👨‍🔬👩‍🔬 Pesquisador de Artigos Científicos",
214
+ description="Digite um tema para encontrar artigos científicos relacionados.",
215
+ theme=gr.themes.Glass()
216
+ )
217
+
218
+ # Interface Gradio para a segunda aba
219
+ hello_interface = gr.Interface(
220
+ fn=pergunta,
221
+ inputs=gr.Textbox(label="Faça sua pergunta"),
222
+ outputs=gr.Textbox(label="Saída"),
223
+ title="Perguntas sobre IA nas redes sociais",
224
+ description="Exemplo simples de uma segunda aba."
225
+ )
226
+
227
+ # Combinação das abas em um bloco de abas
228
+ with gr.Blocks(theme=gr.themes.Glass()) as app:
229
+ with gr.Tab("Pesquisa de Artigos"):
230
+ pesquisa_interface.render()
231
+ with gr.Tab("Consulta artigos"):
232
+ hello_interface.render()
233
+
234
+ # Iniciar a aplicação
235
+ app.launch()