Spaces:
Runtime error
Runtime error
from pydantic import BaseModel | |
from langchain_community.vectorstores import FAISS | |
from langchain.chains import RetrievalQA | |
from langchain.agents import Tool, AgentExecutor, create_json_chat_agent, create_react_agent | |
from langchain_core.messages import AIMessage, HumanMessage | |
from personal_models import PersonalModels | |
from personal_templates import PersonalTemplate | |
import uuid | |
#------------------------------- Mixtral | |
def create_model_instances(model_name, embedding_model, embedding_dir, agent_type): | |
templates = PersonalTemplate() | |
models = PersonalModels() | |
chat_model = models.get_chat_model( | |
model=model_name, | |
temperature=0.1, | |
max_tokens=1000) | |
llm = models.get_rag_model( | |
model=model_name, | |
temperature=0.1, | |
max_tokens=500, | |
top_k=20) | |
embeddings = models.get_embedding_model(model=embedding_model) | |
vectorstore = FAISS.load_local(embedding_dir, embeddings) | |
qa_tool = RetrievalQA.from_chain_type( | |
llm=llm, | |
chain_type="stuff", | |
retriever=vectorstore.as_retriever(), | |
verbose=True, | |
chain_type_kwargs={'prompt': templates.retriever_prompt} | |
) | |
tools = [ | |
Tool( | |
name='tax-law-search', | |
func=qa_tool.run, | |
description='useful when you want to answer questions about brazilian tax law and legal entities', | |
verbose=True | |
) | |
] | |
print('Usando agente do tipo: ',agent_type) | |
if agent_type == 'JSON_CHAT_MODEL': | |
agent = create_json_chat_agent(chat_model, tools, templates.chatbot_tributario_prompt) | |
else: | |
agent = create_react_agent(llm, tools, templates.chatbot_tributario_prompt_react) | |
agent_executor = AgentExecutor(agent=agent, tools=tools, handle_parsing_errors="Check your output and make sure it conforms! Do not output an action and a final answer at the same time.", return_intermediate_steps=True, verbose=True) | |
return agent_executor | |
#-------------------------------- Classe Modificada | |
class Message(BaseModel): | |
user_id: str | |
text: str | |
model: str | |
embedding_model: str | |
embedding_dir: str | |
agent_type: str | |
class ChatHandler: | |
historico_por_usuario = {} | |
def __init__(self): | |
pass | |
def generate_id(self): | |
new_id = str(uuid.uuid4()) | |
self.historico_por_usuario[new_id] = [] | |
return new_id | |
def clear_history(self, user_id): | |
if user_id not in self.historico_por_usuario: | |
return "Usuário não encontrado" | |
self.historico_por_usuario[user_id].clear() | |
return "Histórico limpo com sucesso" | |
def post_message(self, message: dict): | |
user_id = message['user_id'] | |
if user_id not in self.historico_por_usuario: | |
return "Usuário não encontrado" | |
model_name = message['model'] | |
agent_executor = create_model_instances(model_name, message['embedding_model'], message['embedding_dir'], message['agent_type']) | |
try: | |
print('message: ', message['text']) | |
chat_history = self.historico_por_usuario[user_id][-10:] | |
response = agent_executor.invoke( | |
{ | |
"input": message['text'], | |
"chat_history": chat_history | |
} | |
) | |
print(response['intermediate_steps']) | |
self.historico_por_usuario[user_id].append(HumanMessage(content=message['text'])) | |
self.historico_por_usuario[user_id].append(AIMessage(content=response['output'])) | |
except Exception as e: | |
response = {'output': 'Ocorreu um erro de execução do Agente. O erro não será salvo no histórico, tente novamente.', | |
'intermediate_steps':[]} | |
return response['output'],response['intermediate_steps'] | |