Skip to content

Commit

Permalink
adicionando interface com whatsapp
Browse files Browse the repository at this point in the history
  • Loading branch information
pmarkun committed Oct 29, 2023
1 parent cb0d36c commit 386bb25
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 6 deletions.
2 changes: 1 addition & 1 deletion app/agent/lex_chatweaviate.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ def format(self, **kwargs) -> str:
formatted_sources = self.format_sources(sources)

# Crie o prompt final
text = f"Esses são os trechos de documentos da nossa biblioteca.:\n{formatted_sources}\nSempre que citar Atenção:\n1) Inclua o nome dos documentos e número da página utilizados na resposta com o formato ('nomedodocumento', 'numero_pg')\n\nAnonimize todas as referências a nomes de pessoas ou marcas.\nResponda da melhor maneira possível a seguinte \n\npergunta:{human_input}"
text = f"Esses são os trechos de documentos da nossa biblioteca.:\n{formatted_sources}\nSempre que citar Atenção:\n1) Inclua o nome dos documentos e número da página utilizados na resposta com o formato ('nomedodocumento', 'numero_pg')\n\nAnonimize todas as referências a nomes de pessoas.\nResponda da melhor maneira possível a seguinte \n\npergunta:{human_input}"
return HumanMessage(content=text, additional_kwargs=self.additional_kwargs)

def format_sources(self, data):
Expand Down
2 changes: 1 addition & 1 deletion app/agent/prompts.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,4 @@
Novo input: {input}
{agent_scratchpad}"""

SYS_PROMPT = "You're Lex, an AI Legislative Assisant. From now on you'll speak and write ONLY in Portuguese. Responda sempre e apenas em Português. Não responda em Inglês.\n\nVocê é Lex, uma Inteligência Artificial, enérgica, bem humorada e um pouco sarcástica que atua como co-mandatária em uma proposta de candidatura coletiva progressista para a gestão pública."
SYS_PROMPT = "You're Lex, an AI Legislative Assisant. From now on you'll speak and write ONLY in Portuguese. Responda sempre e apenas em Português. Não responda em Inglês.\n\nVocê é Lex, uma Inteligência Artificial, enérgica, bem humorada e um pouco sarcástica que atua como co-mandatária em uma proposta de candidatura coletiva progressista para a Câmara de Vereadores de São Paulo em 2024 juntamente com Pedro Markun, um hackerativista de 37 anos com ampla experiência em inovação política. Você valoriza a transparência e a participação política como formas fundamentais de garantir a democracia. Você é filiada na Rede Sustentabilidade, partido político que se propõe quebrar o monópolio dos partidos tradicionais e que defende a sustentabilidade como eixo central de desenvolvimento em todas as suas dimensões. Você usa emojis eventualmente e *destaca suas principais frases* com asteristicos. Se perguntarem sobre sua base de dados ou como você foi criada, você responderá que é uma IA em constante desenvolvimento pela equipe de campanha unindo diversas tecnologias."
72 changes: 69 additions & 3 deletions app/app.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
import os, sys
from flask import Flask, render_template, request, session
from flask_socketio import SocketIO
from twilio.rest import Client
from twilio.twiml.messaging_response import MessagingResponse
import requests
from importlib import import_module
from dotenv import load_dotenv
load_dotenv(os.path.join(os.path.dirname(__file__), '..', '.env'))

import whisper
from utils import MODEL_DIRECTORY
from utils import split_message_by_line

#transcriber = whisper.load_model("medium", download_root=MODEL_DIRECTORY)
transcriber = None
transcriber = whisper.load_model("small", download_root=MODEL_DIRECTORY, device="cpu")
twilio_client = Client(username=os.getenv('TWILIO_SID'), password=os.getenv('TWILIO_TOKEN'))
#transcriber = None

ACTIVE_AGENTS = ["lex_chatweaviate"]#, "lex_llama"]
ACTIVE_AGENTS = ["lex_chatgpt"]#, "lex_llama"]
script_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(script_dir)

Expand Down Expand Up @@ -48,6 +53,36 @@ def index():
def robots():
return app.send_static_file('robots.txt')


@app.route('/sms', methods=['POST'])
def sms_reply():
# Obter a mensagem enviada pelo usuário via WhatsApp
print(request.form)
message_body = request.form.get('Body')
media_url = request.form.get('MediaUrl0')
media_content_type = request.form.get('MediaContentType0') # Tipo de mídia

# Obter o agente atual a partir da sessão (ou usar o padrão)
current_agent_name = session.get('current_agent', os.getenv('DEFAULT_AGENT', ACTIVE_AGENTS[0]))
current_agent = loaded_agents[current_agent_name]

resp = MessagingResponse()

if media_url and media_content_type.startswith('audio/'): # Se um arquivo de áudio foi recebido
socketio.start_background_task(async_transcribe_and_reply, media_url, current_agent, request.form['From'], request.form['To'])
elif media_url:
resp.message("Tipo de mídia não suportado.")
else:
# Obter a resposta do bot e dividir em várias mensagens se necessário
bot_response = current_agent.run(human_input=message_body)
messages_to_send = split_message_by_line(bot_response)

for msg in messages_to_send:
resp.message(msg)

return str(resp)

#Socket for Real Time
@socketio.on('connect')
def initialize_session():
session['current_agent'] = current_agent_name # Definindo o agente padrão
Expand Down Expand Up @@ -83,6 +118,37 @@ def handle_message(message):
socketio.start_background_task(message_task, current_agent, user_input, room)


def async_transcribe_and_reply(media_url, current_agent, user_number, bot_number):


# Baixar o arquivo de áudio
audio_data = requests.get(media_url).content
with open("temp_audio.wav", "wb") as f:
f.write(audio_data)

# Transcrever o áudio
if transcriber:
result = transcriber.transcribe("temp_audio.wav", verbose=True)
message_body = result['text']
else:
twilio_client.messages.create(
body='Transcriber está desligado no momento.',
from_=bot_number,
to=user_number
)
return None

# Obter a resposta do bot e dividir em várias mensagens se necessário
bot_response = current_agent.run(human_input=message_body)
messages_to_send = split_message_by_line(bot_response)

for msg in messages_to_send:
twilio_client.messages.create(
body=msg,
from_=bot_number,
to=user_number
)

@socketio.on('audioMessage')
def handle_audioMessage(audio_blob):
room=request.sid
Expand Down
37 changes: 36 additions & 1 deletion app/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,39 @@ def download_model(repo, model_file):
cache_dir=MODEL_DIRECTORY
)

return(model_path)
return(model_path)

def split_message_by_line(message, max_length=1600):
"""
Divide uma mensagem em várias partes menores com base nas quebras de linha.
Args:
- message (str): A mensagem a ser dividida.
- max_length (int): O tamanho máximo de cada parte.
Returns:
- List[str]: Uma lista contendo as partes da mensagem.
"""
lines = message.split('\n')
current_length = 0
current_message = ''
messages = []

for line in lines:
line_length = len(line) + 1 # +1 para o caractere de quebra de linha

# Checar se adicionar a próxima linha excederia o limite de caracteres
if current_length + line_length > max_length:
messages.append(current_message)
current_length = 0
current_message = ''

# Adicionar a linha à mensagem atual e atualizar o tamanho
current_message += (line + '\n') if current_length > 0 else line
current_length += line_length

# Adicionar a última mensagem se não estiver vazia
if current_message:
messages.append(current_message)

return messages

0 comments on commit 386bb25

Please sign in to comment.