chat-terra2 / app.py
spadini's picture
Upload 2 files
6ac455e verified
from litellm import completion
import requests
import json
import gradio as gr
import pandas as pd
from pinecone import Pinecone
import os
from dotenv import load_dotenv
from transformers import pipeline
import numpy as np
load_dotenv()
def info_geologia(query):
PINECONE_API = os.getenv('PINECONE_API')
pc = Pinecone(api_key=PINECONE_API)
index = pc.Index("geologia")
x = pc.inference.embed(
model="multilingual-e5-large",
inputs=[query],
parameters={
"input_type": "query"
}
)
results = index.query(
namespace="ns1",
vector=x[0].values,
top_k=3,
include_values=False,
include_metadata=True
)
return results
def previsao_do_tempo(city, country):
WEATHER_API = os.getenv('WEATHER_API')
url = f"http://api.openweathermap.org/data/2.5/weather?q={city},{country}&APPID={WEATHER_API}&lang=pt_br&units=metric"
response = requests.get(url)
data = response.json()
return json.dumps(data)
def verificar_tempestade_solar():
url = "https://services.swpc.noaa.gov/products/noaa-planetary-k-index.json"
response = requests.get(url)
if response.status_code == 200:
data = response.json()
latest_kp = float(data[-1][1]) # O último valor Kp
if latest_kp >= 5:
return f"Alerta de tempestade solar! Índice Kp atual: {latest_kp}"
else:
return f"Sem tempestade solar no momento. Índice Kp atual: {latest_kp}"
else:
return "Não foi possível obter informações sobre tempestades solares no momento."
def extrair_sismos():
# Fazer a requisição para obter o conteúdo da página
url = 'https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/4.5_day.csv'
df = pd.read_csv(url)
# Retornar o DataFrame com os dados
return df
tools = [
{
"type": "function",
"function": {
"name": "previsao_do_tempo",
"description": "Retorna a previsão do tempo em uma cidade específica",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Nome da cidade",
},
"country": {
"type": "string",
"description": "Sigla do país",
},
},
"required": ["city", "country"],
},
}
},
{
"type": "function",
"function": {
"name": "verificar_tempestade_solar",
"description": "Verifica se há uma tempestade solar em andamento",
"parameters": {
"type": "object",
"properties": {},
"required": [],
},
}
},
{
"type": "function",
"function": {
"name": "extrair_sismos",
"description": "Extrai dados de sismos da USGS",
"parameters": {
"type": "object",
"properties": {},
"required": [],
},
}
}
]
# Função para chamar a API com o histórico de mensagens
def call_groq_api(messages, model="groq/llama3-groq-70b-8192-tool-use-preview"):
global tools
GROQ_API_KEY = os.getenv('GROQ_API_KEY')
response = completion(
model=model,
messages=messages,
tools=tools,
tool_choice="auto",
api_key=GROQ_API_KEY,
)
resposta_texto = response.choices[0].message
chamada_ferramentas = resposta_texto.tool_calls
if chamada_ferramentas:
available_functions = {
"previsao_do_tempo": previsao_do_tempo,
"verificar_tempestade_solar": verificar_tempestade_solar,
"extrair_sismos": extrair_sismos
}
for tool_call in chamada_ferramentas:
function_name = tool_call.function.name
function_to_call = available_functions[function_name]
function_args = json.loads(tool_call.function.arguments)
match function_name:
case "previsao_do_tempo":
function_response = function_to_call(
city=function_args.get("city"),
country=function_args.get("country"),
)
case "verificar_tempestade_solar":
function_response = function_to_call()
case "extrair_sismos":
function_response = function_to_call()
return function_response
else:
return resposta_texto.content
def response(message, history):
messages = [{"role": "system", "content": """
Você é o Chat da Terra e do Universo e responde em português brasileiro
perguntas sobre a previsão do tempo na Terra e do espaço próximo à Terra, além de informações sobre terremotos.
"""}]
# Adicionar o histórico anterior ao histórico de mensagens
for user_msg, bot_msg in history:
messages.append({"role": "user", "content": user_msg})
messages.append({"role": "assistant", "content": bot_msg})
# Adicionar a nova mensagem do usuário
messages.append({"role": "user", "content": message})
# Verificar se o tema é geologia
if "geologia" in message.lower():
resposta = info_geologia(message)
geologia_info = f"Informações adicionais sobre geologia: {resposta.matches[0].metadata['text']}"
messages.append({"role": "system", "content": geologia_info})
# Obter a resposta do modelo
model_response = call_groq_api(messages)
# Se a resposta for um DataFrame, convertê-la para texto
if isinstance(model_response, pd.DataFrame):
texto_corrido = ""
for index, row in model_response.iterrows():
texto_corrido += f"Evento {index + 1}: Magnitude {row['mag']}, Local {row['place']}, Tempo {row['time']}\n"
model_response = texto_corrido
# Retornar a resposta como string para Gradio
return model_response
transcritor = pipeline("automatic-speech-recognition",model="openai/whisper-base",generate_kwargs = {"task":"transcribe", "language":"<|pt|>"})
def transcricao(audio):
sr, y = audio
# Convert to mono if stereo
if y.ndim > 1:
y = y.mean(axis=1)
y = y.astype(np.float32)
y /= np.max(np.abs(y))
return transcritor({"sampling_rate": sr, "raw": y})["text"]
def responde_audio(audio):
messages = [{"role": "system", "content": """
Você é o Chat da Terra e do Universo e responde em português brasileiro
perguntas sobre a previsão do tempo na Terra e do espaço próximo à Terra, além de informações sobre terremotos.
"""}]
message = transcricao(audio)
# Adicionar a nova mensagem do usuário
messages.append({"role": "user", "content": message})
# Verificar se o tema é geologia
if "geologia" in message.lower():
resposta = info_geologia(message)
geologia_info = f"Informações adicionais sobre geologia: {resposta.matches[0].metadata['text']}"
messages.append({"role": "system", "content": geologia_info})
# Obter a resposta do modelo
model_response = call_groq_api(messages)
# Se a resposta for um DataFrame, convertê-la para texto
if isinstance(model_response, pd.DataFrame):
texto_corrido = ""
for index, row in model_response.iterrows():
texto_corrido += f"Evento {index + 1}: Magnitude {row['mag']}, Local {row['place']}, Tempo {row['time']}\n"
model_response = texto_corrido
# Retornar a resposta como string para Gradio
return model_response
with gr.Blocks() as demo:
with gr.Tab("Chat da Terra e do Universo"):
gr.ChatInterface(
response,
title='🌍☀️🌧️ Chat da Terra e do Universo',
textbox=gr.Textbox(placeholder="Digite sua mensagem aqui..."),
submit_btn=gr.Button("Enviar")
)
with gr.Tab("Assitente de áudio"):
gr.Interface(
fn=responde_audio,
inputs=[gr.Audio(sources="microphone")],
outputs=["text"],
title="Assistente de Áudio"
)
demo.launch(debug=True)