Feat: Adds parallel and async process to calls and ocr

This commit is contained in:
2026-03-11 17:14:47 -03:00
parent b7c0b92fa3
commit 08be8e314d
8 changed files with 193 additions and 1507 deletions

View File

@@ -7,6 +7,7 @@ This agent demonstrates a basic ReAct-style agent with tool calling capabilities
import boto3
import csv
import json
import asyncio
from pathlib import Path
from typing import Annotated, TypedDict, Literal
from langgraph.graph import StateGraph, END
@@ -202,7 +203,7 @@ Para beneficiário de outras Unimeds (importado)
Ver item ATENDIMENTO INTERCÂMBIO.
Para beneficiário Unimed 0032 (atendimento local):
Todas as solicitações devem ser direcionadas para análise da Auditoria Médica,
com a documentação mínima.""",
com a Documentação.""",
"4034906":"""Para beneficiário de outras Unimeds (importado):
Ver item ATENDIMENTO INTERCÃMBIO.
Para beneficiário Unimed 0032 (atendimento local):
@@ -230,7 +231,7 @@ Para beneficiário de outras Unimeds (importado)
Ver item ATENDIMENTO INTERCÂMBIO.
Para beneficiário Unimed 0032 (atendimento local):
Todas as solicitações devem ser direcionadas para análise da Auditoria Médica,
com a documentação mínima.""",
com a Documentação.""",
"20103190":"""Autorizar sem o parecer da Auditoria Médica desde que a justificativa indique pelo
menos uma das patologias abaixo ou CIDs relacionados:
·Incontinência urinária (CID R32);
@@ -272,7 +273,7 @@ Para beneficiário Unimed 0032 (atendimento local):
Esse código não requer análise da Auditoria Médica, analisar baseado na cobertura e
limite contratual do beneficiário.
Caso seja necessário análise da auditoria médica devido alguma mensagem de
negação, consultar o item "Documentação Mínima".
negação, consultar o item "Documentação".
Para beneficiário Unimed 0032 (atendimento em outra singular/Exportado):
A liberação do procedimento não está condicionada a solicitação dos materiais, pois
o mesmo poderá ser realizado sem a utilização da "Alça de Polipectomia" e da
@@ -286,7 +287,7 @@ Para beneficiário Unimed 0032 (atendimento local):
Esse código não requer análise da Auditoria Médica, analisar baseado na cobertura e
limite contratual do beneficiário.
Caso seja necessário análise da auditoria médica devido alguma mensagem de
negação, consultar o item "Documentação Mínima".
negação, consultar o item "Documentação".
Para beneficiário Unimed 0032 (atendimento em outra singular/Exportado):
A liberação do procedimento não está condicionada a solicitação dos materiais, pois
o mesmo poderá ser realizado sem a utilização da "Alça de Polipectomia" e da
@@ -311,53 +312,53 @@ Encaminhar para deliberação da Unimed origem.""",
}
MIN_DOC={
"20103190":"""DOCUMENTAÇÃO MÍNIMA
"20103190":"""Documentação
Justificativa Médica e/ou indicação clínica.""",
"20203020":"""DOCUMENTAÇÃO MÍNIMA:
"20203020":"""Documentação:
·
Justificativa Médica e/ou indicação clínica.""",
"31303293":"""DOCUMENTAÇÃO MÍNIMA
"31303293":"""Documentação
Beneficiário 0032 (atendidos em Curitiba e em Outras cidades):
·Justificativa médica e/ou indicação clínica;
·Formulário de Solicitação - DIU Hormonal (ver anexo do script).
Beneficiário Intercâmbio/Outras Unimeds:
·
Relatório Médico Detalhado (conforme racionalização).""",
"40202542":"""DOCUMENTAÇÃO MÍNIMA
"40202542":"""Documentação
Para beneficiário de outras Unimeds (importado):
Ver item ATENDIMENTO INTERCÃMBIO.
Para beneficiário Unimed 0032 (atendimento local):
Justificativa Médica e/ou indicação clínica.""",
"40202550":"""DOCUMENTAÇÃO MÍNIMA
"40202550":"""Documentação
Para beneficiário de outras Unimeds (importado):
Ver item ATENDIMENTO INTERCÃMBIO.
Para beneficiário Unimed 0032 (atendimento local):
Justificativa Médica e/ou indicação clínica.""",
"40304906":"""DOCUMENTAÇÃO MÍNIMA
"40304906":"""Documentação
Para beneficiário de outras Unimeds (importado):
Ver item ATENDIMENTO INTERCÃMBIO.
Para beneficiário Unimed 0032 (atendimento local):
Justificativa e/ou indicação clínica.""",
"4034906":"""DOCUMENTAÇÃO MÍNIMA
"4034906":"""Documentação
Para beneficiário de outras Unimeds (importado):
Ver item ATENDIMENTO INTERCÃMBIO.
Para beneficiário Unimed 0032 (atendimento local):
Justificativa e/ou indicação clínica.""",
"40314626":"""DOCUMENTAÇÃO MÍNIMA
"40314626":"""Documentação
Não há;""",
"40314618":"""DOCUMENTAÇÃO MÍNIMA
"40314618":"""Documentação
Não há;""",
"40323676":"""DOCUMENTAÇÃO MÍNIMA
"40323676":"""Documentação
Não há;""",
"40901254":"""Justificativa Médica e/ou indicação clínica informando a idade gestacional e Laudo
do 1º exame sonográfico gestacional realizado.""",
"40901262":"""DOCUMENTAÇÃO MÍNIMA
"40901262":"""Documentação
Relatório médico informando a idade gestacional + laudo do 1o exame sonográfico
gestacional realizado.""",
"4091262":"""DOCUMENTAÇÃO MÍNIMA
"4091262":"""Documentação
Relatório médico informando a idade gestacional + laudo do 1o exame sonográfico
gestacional realizado.""",
"4101230":"""DOCUMENTAÇÃO MÍNIMA
"4101230":"""Documentação
Para beneficiário de outras Unimeds (importado)
Ver item ATENDIMENTO INTERCÂMBIO.
Para beneficiário Unimed 0032 (atendimento local):
@@ -370,7 +371,7 @@ esforço físico;
e/ ou TIMI risk;
·
Laudos de exames cardiológicos recentes.""",
"4101230":"""DOCUMENTAÇÃO MÍNIMA
"4101230":"""Documentação
Para beneficiário de outras Unimeds (importado)
Ver item ATENDIMENTO INTERCÂMBIO.
Para beneficiário Unimed 0032 (atendimento local):
@@ -383,7 +384,7 @@ esforço físico;
e/ ou TIMI risk;
·
Laudos de exames cardiológicos recentes.""",
"41501144":"""DOCUMENTAÇÃO MÍNIMA
"41501144":"""Documentação
PARA BENEFICIÁRIOS 0032 SENDO ATENDIDO EM CURITIBA, FORA (EXPORTADO),
E PAC:
·
@@ -407,18 +408,18 @@ Esclarecemos que o envio de retinografia, poderá eventualmente ser solicitado p
auditoria para fins de elucidação diagnóstica.
PARA BENEFICIÁRIOS INTERCÂMBIO NACIONAL:
SEGUIR DOCUMENTAÇÃO CONFORME RACIONALIZAÇÃO.""",
"31005101":"""DOCUMENTAÇÃO MÍNIMA:
"31005101":"""Documentação:
·Relatório médico detalhado;
·Laudo RX e/ou tomografia e/ou ressonância e/ou ultrassonografia.""",
"31005470":"""DOCUMENTAÇÃO MÍNIMA:
"31005470":"""Documentação:
·Relatório médico detalhado;
·Laudo RX e/ou tomografia e/ou ressonância e/ou ultrassonografia.""",
"40808122":"""DOCUMENTAÇÃO MÍNIMA
"40808122":"""Documentação
Para beneficiário de outras Unimeds (importado):
Ver item ATENDIMENTO INTERCÂMBIO.
Para beneficiário Unimed 0032 (atendimento local):
Justificativa e/ou indicação clínica.""",
"40808130":"""DOCUMENTAÇÃO MÍNIMA
"40808130":"""Documentação
Para beneficiário de outras Unimeds (importado):
Ver item ATENDIMENTO INTERCÂMBIO.
Para beneficiário Unimed 0032 (atendimento local):
@@ -531,7 +532,7 @@ def create_agent(file_content: str = ""):
return workflow.compile()
def run_agent(query: str, code: str, file_content: str = "") -> str:
async def run_agent(query: str, code: str, file_content: str = "") -> str:
"""
Run the agent with a given query.
@@ -544,14 +545,17 @@ def run_agent(query: str, code: str, file_content: str = "") -> str:
The agent's final response
"""
agent = create_agent(file_content)
SYSTEM_PROMPT = """You are a AI assistant responsible to check if a person is Allowed or Denied acces to medical procedure based on the following rules:
<rules>
SYSTEM_PROMPT = """You are a AI assistant responsible to check if a person is Allowed or Denied acces to medical procedure based on the inpout data. There are a few always accepted criteira in which, any of them been met, even a single one, will be accepted, these criteria been:
<auto-accept-criteria>
"""+RULES[code]+""""
<\rules>
Also this is the required documentation or infomation for aproval, equivalent information to the required one in another is allowed, do try to indetify every document as one of these if it fits, or contains the required information, or not identified:
"""+MIN_DOC[code]+""""
<\auto-accept-criteria>
If those criteria aren´t met, you can check the documents to see if the following information are present, if so, aprove the procedure:
<additional-information>"""+MIN_DOC[code]+"""
<\additional-information>
If the additional information is not present, but any of the auto-accept-criteira are met, allow the procedure.
If there aren´t any auto-accept criteria present, check the documents for the additional information, and if they are all present, even if not in the exact type of document especified in them, allow the procedure.
Your capabilities:
- You can check the OCR of anexed documents if the json input is not enough to determinate if it should be aproved, using the check tool.
- You can check the OCR of all the documents anexed, at the same time, if the json input is not enough to determinate if it should be aproved, using the check tool.
For every document, check if the name of the person in json is present, and at output list every document and if it belongs to the person in the request.
Start your answer with either:
@@ -559,8 +563,38 @@ Start your answer with either:
Reprovado: If there aren't any rules met.
And list the document classification and the met criteira, in case of aprovation. Be really precise and succint.
Start the response with either Aprovado or Reprovado, do not add any characters before either of them, even "*" """
Start the response with either Aprovado or Reprovado, do not add any characters before either of them, even "*".
You must start the message with the result, either Aprovado or Reprovado. It must be the first word at the output.
<examples>
Exemplos de saída:
Aprovado
Critério:
Idade superior a 25 anos
Documentos anexados:
Nome Documento 1 - Pertence a pessoa FUlana
Nome documento 2- Pertence a pessoa FUlana
Reprovado
Critério:
Nenhum crtiério preenchido e informações para aprovação faltando no documento
Aprovado
Critério:
Fornecidos documentos nescessários contendo analise médica e pedido de exame
Documentos anexados:
Guia - Pertence a pessoa Fulana, contém pedido de exame, mesmo não sendo pedido de exame
Laudo- Pertence a pessoa Fula, contém análise médica
<\examples>
<answer_format>
(Aprovado ou Reprovado)
Critério:
######
Documentos anexados:
######
######
<\answer_format>
Follow the answer format strictly, do not list the person data nor start with phrases like (Vou analisar a solicitação de ####### par a NOME DA PESSOA) or anything like it. Just stick with the format, dont add anything else """
user_message = query
if file_content:
user_message += "\n\n<documentos_anexados>\n" + file_content + "\n</documentos_anexados>"
@@ -572,13 +606,10 @@ Start your answer with either:
]
}
print(f"\nUser: {query}")
print("-" * 50)
# Run the agent
langfuse_handler = CallbackHandler()
config = {"callbacks": [langfuse_handler]}
final_state = agent.invoke(initial_state, config=config)
final_state = await agent.ainvoke(initial_state, config=config)
# Get the final response
final_message = final_state["messages"][-1]
@@ -593,9 +624,7 @@ Start your answer with either:
input_tokens += usage.get("input_tokens", 0)
output_tokens += usage.get("output_tokens", 0)
langfuse.flush()
print(f"Agent: {response}")
print(f"Tokens - input: {input_tokens}, output: {output_tokens}")
await asyncio.to_thread(langfuse.flush)
return {"response": response, "input_tokens": input_tokens, "output_tokens": output_tokens}