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)