spadini commited on
Commit
aea9970
1 Parent(s): 2a6eee3

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +252 -0
app.py ADDED
@@ -0,0 +1,252 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from litellm import completion
2
+ import requests
3
+ import json
4
+ import gradio as gr
5
+ import pandas as pd
6
+ from pinecone import Pinecone
7
+ import os
8
+ from dotenv import load_dotenv
9
+ from transformers import pipeline
10
+ import numpy as np
11
+
12
+ load_dotenv()
13
+
14
+ def info_geologia(query):
15
+ PINECONE_API = os.getenv('PINECONE_API')
16
+ pc = Pinecone(api_key=PINECONE_API)
17
+ index = pc.Index("geologia")
18
+ x = pc.inference.embed(
19
+ model="multilingual-e5-large",
20
+ inputs=[query],
21
+ parameters={
22
+ "input_type": "query"
23
+ }
24
+ )
25
+ results = index.query(
26
+ namespace="ns1",
27
+ vector=x[0].values,
28
+ top_k=3,
29
+ include_values=False,
30
+ include_metadata=True
31
+ )
32
+ return results
33
+
34
+ def previsao_do_tempo(city, country):
35
+ WEATHER_API = os.getenv('WEATHER_API')
36
+ url = f"http://api.openweathermap.org/data/2.5/weather?q={city},{country}&APPID={WEATHER_API}&lang=pt_br&units=metric"
37
+ response = requests.get(url)
38
+ data = response.json()
39
+
40
+ return json.dumps(data)
41
+
42
+
43
+ def verificar_tempestade_solar():
44
+ url = "https://services.swpc.noaa.gov/products/noaa-planetary-k-index.json"
45
+ response = requests.get(url)
46
+ if response.status_code == 200:
47
+ data = response.json()
48
+ latest_kp = float(data[-1][1]) # O último valor Kp
49
+ if latest_kp >= 5:
50
+ return f"Alerta de tempestade solar! Índice Kp atual: {latest_kp}"
51
+ else:
52
+ return f"Sem tempestade solar no momento. Índice Kp atual: {latest_kp}"
53
+ else:
54
+ return "Não foi possível obter informações sobre tempestades solares no momento."
55
+
56
+ def extrair_sismos():
57
+ # Fazer a requisição para obter o conteúdo da página
58
+ url = 'https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/4.5_day.csv'
59
+
60
+ df = pd.read_csv(url)
61
+
62
+ # Retornar o DataFrame com os dados
63
+ return df
64
+
65
+
66
+ tools = [
67
+ {
68
+ "type": "function",
69
+ "function": {
70
+ "name": "previsao_do_tempo",
71
+ "description": "Retorna a previsão do tempo em uma cidade específica",
72
+ "parameters": {
73
+ "type": "object",
74
+ "properties": {
75
+ "city": {
76
+ "type": "string",
77
+ "description": "Nome da cidade",
78
+ },
79
+ "country": {
80
+ "type": "string",
81
+ "description": "Sigla do país",
82
+ },
83
+ },
84
+ "required": ["city", "country"],
85
+ },
86
+ }
87
+
88
+ },
89
+
90
+ {
91
+ "type": "function",
92
+ "function": {
93
+ "name": "verificar_tempestade_solar",
94
+ "description": "Verifica se há uma tempestade solar em andamento",
95
+ "parameters": {
96
+ "type": "object",
97
+ "properties": {},
98
+ "required": [],
99
+ },
100
+ }
101
+ },
102
+ {
103
+ "type": "function",
104
+ "function": {
105
+ "name": "extrair_sismos",
106
+ "description": "Extrai dados de sismos da USGS",
107
+ "parameters": {
108
+ "type": "object",
109
+ "properties": {},
110
+ "required": [],
111
+ },
112
+ }
113
+ }
114
+ ]
115
+
116
+
117
+ # Função para chamar a API com o histórico de mensagens
118
+ def call_groq_api(messages, model="groq/llama3-groq-70b-8192-tool-use-preview"):
119
+ global tools
120
+ GROQ_API_KEY = os.getenv('GROQ_API_KEY')
121
+ response = completion(
122
+ model=model,
123
+ messages=messages,
124
+ tools=tools,
125
+ tool_choice="auto",
126
+ api_key=GROQ_API_KEY,
127
+ )
128
+ resposta_texto = response.choices[0].message
129
+ chamada_ferramentas = resposta_texto.tool_calls
130
+ if chamada_ferramentas:
131
+ available_functions = {
132
+ "previsao_do_tempo": previsao_do_tempo,
133
+ "verificar_tempestade_solar": verificar_tempestade_solar,
134
+ "extrair_sismos": extrair_sismos
135
+ }
136
+ for tool_call in chamada_ferramentas:
137
+ function_name = tool_call.function.name
138
+ function_to_call = available_functions[function_name]
139
+ function_args = json.loads(tool_call.function.arguments)
140
+
141
+ match function_name:
142
+ case "previsao_do_tempo":
143
+
144
+ function_response = function_to_call(
145
+ city=function_args.get("city"),
146
+ country=function_args.get("country"),
147
+ )
148
+ case "verificar_tempestade_solar":
149
+ function_response = function_to_call()
150
+ case "extrair_sismos":
151
+ function_response = function_to_call()
152
+ return function_response
153
+
154
+ else:
155
+ return resposta_texto.content
156
+
157
+
158
+ def response(message, history):
159
+ messages = [{"role": "system", "content": """
160
+ Você é o Chat da Terra e do Universo e responde em português brasileiro
161
+ perguntas sobre a previsão do tempo na Terra e do espaço próximo �� Terra, além de informações sobre terremotos.
162
+ """}]
163
+
164
+ # Adicionar o histórico anterior ao histórico de mensagens
165
+ for user_msg, bot_msg in history:
166
+ messages.append({"role": "user", "content": user_msg})
167
+ messages.append({"role": "assistant", "content": bot_msg})
168
+
169
+ # Adicionar a nova mensagem do usuário
170
+ messages.append({"role": "user", "content": message})
171
+
172
+ # Verificar se o tema é geologia
173
+ if "geologia" in message.lower():
174
+ resposta = info_geologia(message)
175
+ geologia_info = f"Informações adicionais sobre geologia: {resposta.matches[0].metadata['text']}"
176
+ messages.append({"role": "system", "content": geologia_info})
177
+
178
+ # Obter a resposta do modelo
179
+ model_response = call_groq_api(messages)
180
+
181
+ # Se a resposta for um DataFrame, convertê-la para texto
182
+ if isinstance(model_response, pd.DataFrame):
183
+ texto_corrido = ""
184
+ for index, row in model_response.iterrows():
185
+ texto_corrido += f"Evento {index + 1}: Magnitude {row['mag']}, Local {row['place']}, Tempo {row['time']}\n"
186
+ model_response = texto_corrido
187
+
188
+ # Retornar a resposta como string para Gradio
189
+ return model_response
190
+
191
+ transcritor = pipeline("automatic-speech-recognition",model="openai/whisper-base",generate_kwargs = {"task":"transcribe", "language":"<|pt|>"})
192
+ def transcricao(audio):
193
+ sr, y = audio
194
+ # Convert to mono if stereo
195
+ if y.ndim > 1:
196
+ y = y.mean(axis=1)
197
+
198
+ y = y.astype(np.float32)
199
+ y /= np.max(np.abs(y))
200
+
201
+ return transcritor({"sampling_rate": sr, "raw": y})["text"]
202
+
203
+ def responde_audio(audio):
204
+ messages = [{"role": "system", "content": """
205
+ Você é o Chat da Terra e do Universo e responde em português brasileiro
206
+ perguntas sobre a previsão do tempo na Terra e do espaço próximo à Terra, além de informações sobre terremotos.
207
+ """}]
208
+ message = transcricao(audio)
209
+
210
+
211
+ # Adicionar a nova mensagem do usuário
212
+ messages.append({"role": "user", "content": message})
213
+
214
+ # Verificar se o tema é geologia
215
+ if "geologia" in message.lower():
216
+ resposta = info_geologia(message)
217
+ geologia_info = f"Informações adicionais sobre geologia: {resposta.matches[0].metadata['text']}"
218
+ messages.append({"role": "system", "content": geologia_info})
219
+
220
+ # Obter a resposta do modelo
221
+ model_response = call_groq_api(messages)
222
+
223
+ # Se a resposta for um DataFrame, convertê-la para texto
224
+ if isinstance(model_response, pd.DataFrame):
225
+ texto_corrido = ""
226
+ for index, row in model_response.iterrows():
227
+ texto_corrido += f"Evento {index + 1}: Magnitude {row['mag']}, Local {row['place']}, Tempo {row['time']}\n"
228
+ model_response = texto_corrido
229
+
230
+ # Retornar a resposta como string para Gradio
231
+ return model_response
232
+
233
+
234
+ with gr.Blocks() as demo:
235
+ with gr.Tab("Chat da Terra e do Universo"):
236
+ gr.ChatInterface(
237
+ response,
238
+ title='🌍☀️🌧️ Chat da Terra e do Universo',
239
+ textbox=gr.Textbox(placeholder="Digite sua mensagem aqui..."),
240
+ submit_btn=gr.Button("Enviar")
241
+
242
+ )
243
+
244
+ with gr.Tab("Assitente de áudio"):
245
+ gr.Interface(
246
+ fn=responde_audio,
247
+ inputs=[gr.Audio(sources="microphone")],
248
+ outputs=["text"],
249
+ title="Assistente de Áudio"
250
+ )
251
+
252
+ demo.launch(debug=True)