from openai import OpenAI
from dotenv import load_dotenv
import os
import openai
import json
load_dotenv()
API_KEY = os.getenv("OLLAMA_API_KEY")
OLLAMA_HOST = os.getenv("OLLAMA_BASE_URL")
cliente = OpenAI(
api_key=API_KEY,
base_url=OLLAMA_HOST
)
modelo = "gemma4:e4b"
def carrega(nome_do_arquivo):
#omitido pra caber aqui no post
def salva(nome_do_arquivo, conteudo):
#omitido pra caber aqui no post
def limpar_conteudo(conteudo):
#limpar saída do modelo, removendo os blocos de código e espaços em branco
conteudo = conteudo.strip().replace("```json", "").replace("```", "")
return conteudo
def analisar_transacao(lista_transacoes):
print("1. Executando a análise de transação")
prompt_sistema = """
Analise as transações financeiras a seguir e identifique se cada uma delas é uma "Possível Fraude" ou deve ser "Aprovada".
Adicione um atributo "Status" com um dos valores: "Possível Fraude" ou "Aprovado".
Cada nova transação deve ser inserida dentro da lista do JSON.
# Possíveis indicações de fraude
- Transações com valores muito discrepantes
- Transações que ocorrem em locais muito distantes um do outro e diferente de todos as outras cidades considere possível fraude
- verifique o horário, cidade e estados das Transações, em horários próximos e cidades e estado diferentes alertar fraude
Adote o formato de resposta abaixo para compor sua resposta.
# Formato Saída
{
"transacoes": [
{
"id": "id",
"tipo": "crédito ou débito",
"estabelecimento": "nome do estabelecimento",
"horário": "horário da transação",
"valor": "R$XX,XX",
"nome_produto": "nome do produto",
"localização": "cidade - estado (País)"
"status": ""
},
]
}
"""
lista_mensagens = [
{
"role": "system",
"content": prompt_sistema
},
{
"role": "user",
"content": f"Considere o CSV abaixo, onde cada linha é uma transação diferente: {lista_transacoes}. Sua resposta deve adotar o #Formato de Resposta (apenas um json sem outros comentários)"
}
]
try:
resposta = cliente.chat.completions.create(
messages=lista_mensagens,
model=modelo,
temperature=0
)
conteudo = resposta.choices[0].message.content
conteudo = limpar_conteudo(conteudo)
print("\nConteúdo:", conteudo)
json_resultado = json.loads(conteudo)
return json_resultado
except openai.AuthenticationError as e:
print(f"Erro de Autenticação: {e}")
except openai.APIError as e:
print(f"Erro de API: {e}")
def gerar_parecer(transacao):
print("2. Gerando um parecer para cada transação.")
prompt_sistema = f"""
Para a seguinte transação, forneça um parecer, apenas se o status dela for de "Possível Fraude". Indique no parecer uma justificativa para que você identifique uma fraude.
Transação: {transacao}
## Formato de Resposta
"id": "id",
"tipo": "crédito ou débito",
"estabelecimento": "nome do estabelecimento",
"horario": "horário da transação",
"valor": "R$XX,XX",
"nome_produto": "nome do produto",
"localizacao": "cidade - estado (País)"
"status": "",
"parecer" : "Colocar Não Aplicável se o status for Aprovado"
"""
lista_mensagens = [
{
"role": "system",
"content": prompt_sistema
}
]
resposta = cliente.chat.completions.create(
messages = lista_mensagens,
model=modelo,
)
conteudo = resposta.choices[0].message.content
#print(conteudo)
print("Finalizou a geração de parecer")
return conteudo
def gerar_recomendacao(parecer):
#omitido pra caber aqui no post
# Processamento em lotes
lista_de_transacoes = carrega("./dados/transacoes.csv")
transacoes_analisadas = analisar_transacao(lista_de_transacoes)
for transacao in transacoes_analisadas["transacoes"]:
id_transacao = transacao["id"]
produto_transacao = transacao["nome_produto"]
status_transacao = transacao["status"]
if transacao["status"] == "Possível Fraude":
parecer = gerar_parecer(transacao)
recomendacao = gerar_recomendacao(parecer)
salva(f"transacao-{id_transacao}-{produto_transacao}-{status_transacao}.txt", recomendacao)