File size: 7,884 Bytes
6edffde
ce5416b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6edffde
 
ce5416b
 
 
 
 
6edffde
ce5416b
 
 
 
 
 
 
 
 
 
 
6edffde
ce5416b
 
 
 
 
 
6edffde
ce5416b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
import gradio as gr
from crewai import Agent, Task, Crew, Process, LLM
from crewai_tools import LlamaIndexTool
from llama_index.core import StorageContext, load_index_from_storage
from llama_index.core.tools import QueryEngineTool, ToolMetadata
from llama_index.core.agent import ReActAgent
from llama_index.core import Settings
from llama_index.tools.tavily_research import TavilyToolSpec
from llama_index.llms.groq import Groq
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.core.tools import FunctionTool
import os
from dotenv import load_dotenv
import requests
import arxiv
import requests


load_dotenv()
groq = os.getenv('groq')
nvidia = os.getenv('nvidia')
tavily_key = os.getenv('tavily_key')
hf_token = os.getenv('hf_token')

Settings.llm = Groq(model="lllama-3.3-70b-versatile", api_key=groq)
Settings.embed_model = HuggingFaceEmbedding(model_name="intfloat/multilingual-e5-large")
def consulta_artigos(titulo: str) -> str:
    """
    Consulta os artigos na base de dados arXiv e retorna resultados formatados.
    """
    busca = arxiv.Search(
        query=titulo,
        max_results=5,
        sort_by=arxiv.SortCriterion.Relevance
    )

    resultados = []
    for resultado in busca.results():
        resultados.append(f"Título: {resultado.title}\n"
                          f"Resumo: {resultado.summary}\n"
                          f"Categoria: {resultado.primary_category}\n"
                          f"Link: {resultado.entry_id}\n")

    return "\n\n".join(resultados)


ferramenta_artigos = FunctionTool.from_defaults(fn=consulta_artigos, name="consulta_artigos", description="Consulta os artigos na base de dados arXiv e retorna resultados formatados.")
tool = LlamaIndexTool.from_tool(ferramenta_artigos)
print(tavily_key)
tavily_tool = TavilyToolSpec(api_key=tavily_key)
tavily_tools = tavily_tool.to_tool_list()
tools = [LlamaIndexTool.from_tool(t) for t in tavily_tools]


storage_context = StorageContext.from_defaults(
        persist_dir="./artigo"
    )
artigo_index = load_index_from_storage(storage_context)

storage_context = StorageContext.from_defaults(
        persist_dir="./livro"
    )
livro_index = load_index_from_storage(storage_context)


artigo_engine = artigo_index.as_query_engine(similarity_top_k=3)
livro_engine = livro_index.as_query_engine(similarity_top_k=3)

query_engine_tools = [
    QueryEngineTool(
        query_engine=artigo_engine,
        metadata=ToolMetadata(
            name="artigo_engine",
            description=(
                "Fornece informações sobre algoritmos de inteligência artificial nas redes sociais. "
                "Use uma pergunta detalhada em texto simples como entrada para a ferramenta."
            ),
        ),
    ),
    QueryEngineTool(
        query_engine=livro_engine,
        metadata=ToolMetadata(
            name="livro_engine",
            description=(
                "Fornece informações sobre avanços e tendências sobre inteligência artificial. "
                "Use uma pergunta detalhada em texto simples como entrada para a ferramenta."
            ),
        ),
    ),
]

llm = LLM(
    model="nvidia_nim/meta/llama-3.3-70b-instruct",
    api_key=nvidia
)

def baixar_pdf_arxiv(link):
    """
    Baixa o PDF de um artigo do arXiv dado o link do artigo.

    Args:
        link (str): O link para o artigo no arXiv.

    Returns:
        str: O caminho do arquivo salvo ou uma mensagem de erro.
    """
    try:
        # Verifica se o link é do arXiv
        if "arxiv.org" not in link:
            return "O link fornecido não é um link válido do arXiv."

        # Extrai o ID do artigo do link
        artigo_id = link.split("/")[-1]

        # Monta o link direto para o PDF
        pdf_url = f"https://arxiv.org/pdf/{artigo_id}.pdf"

        # Faz o download do PDF
        response = requests.get(pdf_url, stream=True)
        if response.status_code == 200:
            nome_arquivo = f"artigo_{artigo_id}.pdf"
            with open(nome_arquivo, "wb") as f:
                for chunk in response.iter_content(chunk_size=1024):
                    f.write(chunk)
            return f"PDF salvo como {nome_arquivo}"
        else:
            return f"Erro ao baixar o PDF. Código de status: {response.status_code}"
    except Exception as e:
        return f"Ocorreu um erro: {e}"

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.")
tool_baixar = LlamaIndexTool.from_tool(ferramenta_baixar)

def pesquisar_artigos(tema):
    # Criação dos agentes com o tema dinâmico
    agent = Agent(
        role='Agente de pesquisa',
        goal='Fornece artigos científicos sobre um assunto de interesse.',
        backstory='Um agente expert em pesquisa científica que possui a habilidade de acessar e baixar artigos no arxiv',
        tools=[tool, tool_baixar],
        llm=llm
    )

    agent_web = Agent(
        role='Agente de pesquisa por documentos na web',
        goal='Fornece artigos científicos encontrados na web sobre um assunto de interesse.',
        backstory='Um agente expert em pesquisa científica que possui a habilidade de buscar artigos na web',
        tools=[*tools],
        llm=llm
    )

    agente_verificacao = Agent(
        role='Agente de pesquisa que verifica documentos',
        goal='Fornece como saída apenas artigos científicos válidos',
        backstory='Um agente expert em pesquisa científica',
        tools=[*tools],
        llm=llm
    )

    manager = Agent(
        role="Gerente do projeto",
        goal="Gerenciar a equipe com eficiência",
        backstory="Gerente de projeto experiente que coordena os esforços da equipe",
        allow_delegation=True,
        llm=llm
    )

    # Criação das tasks usando o tema recebido como parâmetro
    task = Task(
        description=f"Busque artigos científicos no arxiv sobre {tema}.",
        expected_output="5 artigos e seus respectivos links",
        agent=agent
    )

    task1 = Task(
        description=f"Busque artigos científicos sobre {tema}.",
        expected_output="5 artigos e seus respectivos links",
        agent=agent_web
    )

    task2 = Task(
        description="Verifique se os artigos encontrados na web realmente são artigos científicos.",
        expected_output="5 artigos e seus respectivos links",
        agent=agente_verificacao
    )

    crew_hierarquica = Crew(
        agents=[agent, agent_web, agente_verificacao],
        tasks=[task, task1, task2],
        manager_agent=manager,
        process=Process.hierarchical,
        verbose=1,
    )

    result = crew_hierarquica.kickoff()
    return result

# Função para a segunda aba
def pergunta(query):
    agente = ReActAgent.from_tools(
    query_engine_tools,
    verbose=True,
    )
    response = agente.chat(query)

    return response

# Interface Gradio para a primeira aba
pesquisa_interface = gr.Interface(
    fn=pesquisar_artigos,
    inputs=gr.Textbox(label="Digite o tema para pesquisa"),
    outputs=gr.Textbox(label="Resultados"),
    title="👨‍🔬👩‍🔬 Pesquisador de Artigos Científicos",
    description="Digite um tema para encontrar artigos científicos relacionados.",
    theme=gr.themes.Glass()
)

# Interface Gradio para a segunda aba
hello_interface = gr.Interface(
    fn=pergunta,
    inputs=gr.Textbox(label="Faça sua pergunta"),
    outputs=gr.Textbox(label="Saída"),
    title="Perguntas sobre IA nas redes sociais",
    description="Exemplo simples de uma segunda aba."
)

# Combinação das abas em um bloco de abas
with gr.Blocks(theme=gr.themes.Glass()) as app:
    with gr.Tab("Pesquisa de Artigos"):
        pesquisa_interface.render()
    with gr.Tab("Consulta artigos"):
        hello_interface.render()

# Iniciar a aplicação
app.launch()