Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
2
respuestas

[Proyecto] codigo alternativo Google AI Studio capa free

  • Código Google parte 1 ver siguiente cometario:
import os
from google import genai
from google.genai import errors
from dotenv import load_dotenv
import json

load_dotenv()

client = genai.Client(api_key=os.getenv("GOOGLE_API_KEY"))

modelo = "gemini-2.5-flash-lite"

def carga(nombre_archivo):
  try:
      with open(nombre_archivo, "r", encoding="utf-8") as archivo:
          return archivo.read()
  except IOError as e:
      print(f"Error al leer: {e}")
      return None

def guardar(nombre_archivo, contenido):
  try:
      with open(nombre_archivo, "w", encoding="utf-8") as archivo:
          archivo.write(contenido)
  except IOError as e:
      print(f"Error al guardar: {e}")

def limpiar_json(texto):
  """Lógica centralizada para limpiar bloques de código Markdown"""
  if "```json" in texto:
    texto = texto.split("```json")[1].split("```")[0].strip()
  elif "```" in texto:
    texto = texto.split("```")[1].split("```")[0].strip()
  return texto.strip()

def generar_informe(transaccion):
  print(f"2. Generando el informe para la transacción: {transaccion['ID Transacción']}")

  prompt_sistema = """
  Para la siguiente transacción, proporciona un parecer, solo si su estado es de "Posible Fraude". Indica en el informe una justificación por la cual fue identificada como un fraude.
  # Formato Salida
  "ID Transacción": "id",
  "Tipo de Transacción": "Crédito o Débito",
  "Establecimiento": "nombre del establecimiento",
  "Horario": "aaaa-mm-dd hh: mm: ss"
  "Producto": "nome producto"
  "Ciudad - Estado": "Ciudad - Departamento (País)",
  "Valor (USD)": valor número entero,
  "Estado": "Aprobado o Posible Fraude"
  "Informe": "informe con las posibles indicaciones"
  """

  try:
    respuesta = client.models.generate_content(
      model = modelo,
      contents = f"Transacción para analizar: {json.dumps(transaccion)}",
      config = {
          "system_instruction" : prompt_sistema
      }
    )
    return respuesta.text
  
  except errors.ClientError as e:
    # CORRECCIÓN: Acceso correcto al código de error en 2025
    # El código numérico suele venir en e.args[0] o dentro del mensaje
    error_msg = str(e)
    
    if "404" in error_msg:
      print(f"Error 404: El modelo '{modelo}' no existe. Usa 'gemini-2.0-flash' o 'gemini-3-flash-preview'.")
    elif "400" in error_msg:
      print("Error 400: Llave API inválida o error en los datos enviados.")
    elif "429" in error_msg:
      print("Error 429: Cuota agotada. Espera unos segundos. Usa 'gemini-2.0-flash' o 'gemini-3-flash-preview'.")
    else:
      print(f"Error de cliente: {e}")

  except errors.APIError as e:
    print(f"Error de servidor de Google: {e}")

  except Exception as e:
    print(f"Error inesperado: {type(e).__name__} - {e}")

def analizador_transacciones(lista_transacciones):
  print(f"1. Realizando el análisis pas las transacciones: {lista_transacciones}")
    
  prompt_sistema = """
  Analiza las transacciones financieras a continuación e identifica si cada una de ellas es un "Posible Fraude" o debe ser "Aprobada".
  Agrega un atributo "Estado" con uno de los valores: "Posible Fraude" o "Aprobado" .
  Cada nueva transacción debe ser insertada dentro de la lista del JSON.
  # Posibles indicaciones de fraude
  - Transacciones con valores muy discrepantes
  - Transacciones que ocurren en lugares muy distantes entre sí
  Adopta el formato de respuesta a continuación para componer tu respuesta.
  # Formato Salida
  {
    "transacciones": [
      {
        "ID Transacción": "id",
        "Tipo de Transacción": "Crédito o Débito",
        "Establecimiento": "nombre del establecimiento",
        "Horario": "aaaa-mm-dd hh:mm:ss",
        "Producto": "nome producto",
        "Ciudad - Estado": "Ciudad - Departamento (Pais)",
        "Valor (USD)": valor numero entero,
        "Estado": "Posible Fraude o Aprobado"
      },
    ]
  }
  """

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

2 respuestas
  • Código google parte 2:
  prompt_usuario = f"""
  Considera el CSV a continuación, donde cada línea es una transacción diferente: {lista_transacciones}.
  Tu respuesta debe adoptar el #Formato Salida (solo un json sin otros comentarios)"
  """
  
  try:
    respuesta = client.models.generate_content(
      model = modelo,
      contents = prompt_usuario,
      config = {
        "system_instruction" : prompt_sistema,
        "temperature" : 0 
      }
    )
    return json.loads(limpiar_json(respuesta.text))

  except errors.ClientError as e:
    # CORRECCIÓN: Acceso correcto al código de error en 2025
    # El código numérico suele venir en e.args[0] o dentro del mensaje
    error_msg = str(e)
    
    if "404" in error_msg:
      print(f"Error 404: El modelo '{modelo}' no existe. Usa 'gemini-2.0-flash' o 'gemini-3-flash-preview'.")
    elif "400" in error_msg:
      print("Error 400: Llave API inválida o error en los datos enviados.")
    elif "429" in error_msg:
      print("Error 429: Cuota agotada. Espera unos segundos. Usa 'gemini-2.0-flash' o 'gemini-3-flash-preview'.")
    else:
      print(f"Error de cliente: {e}")

  except errors.APIError as e:
    print(f"Error de servidor de Google: {e}")

  except Exception as e:
    print(f"Error inesperado: {type(e).__name__} - {e}")

def generar_recomendacion(informe):
  # Intentamos extraer el ID del informe para el log
  try:
    informe_json = json.loads(limpiar_json(informe))
    id_tr = informe_json.get("ID Transacción", "N/A")
  except:
    id_tr = "Desconocido"

  print(f"3. Generando la recomendación para transaccion: {id_tr}")

  prompt_sistema = """
  Para la siguiente transacción, proporcione una recomendación apropiada basada en el estado y los detalles de la transacción:
  Las recomendaciones pueden ser "Notificar Cliente", "Activar sector Anti-Fraude" o "Realizar Verificación Manual"
  Deben ser escritas en un formato técnico.
  Incluye también una clasificación del tipo de fraude, si es aplicable.
  """

  try:
    respuesta = client.models.generate_content(
      model = modelo,
      contents = f"Transacción para gennerar recomendación: {json.dumps(informe)}",
      config = {
        "system_instruction" : prompt_sistema
      }
    )

    return respuesta.text
  
  except errors.ClientError as e:
    # CORRECCIÓN: Acceso correcto al código de error en 2025
    # El código numérico suele venir en e.args[0] o dentro del mensaje
    error_msg = str(e)
    
    if "404" in error_msg:
      print(f"Error 404: El modelo '{modelo}' no existe. Usa 'gemini-2.0-flash' o 'gemini-3-flash-preview'.")
    elif "400" in error_msg:
      print("Error 400: Llave API inválida o error en los datos enviados.")
    elif "429" in error_msg:
      print("Error 429: Cuota agotada. Espera unos segundos. Usa 'gemini-2.0-flash' o 'gemini-3-flash-preview' o gemini-2.5-flash-lite.")
    else:
      print(f"Error de cliente: {e}")

  except errors.APIError as e:
    print(f"Error de servidor de Google: {e}")

  except Exception as e:
    print(f"Error inesperado: {type(e).__name__} - {e}")

lista_transacciones = carga("datos/transacciones.csv")

if lista_transacciones:
  transacciones_analizadas = analizador_transacciones(lista_transacciones)

  for transaccion in transacciones_analizadas["transacciones"]:
      if transaccion["Estado"] == "Posible Fraude":
        # 1. Generar el informe detallado
        informe = generar_informe(transaccion)
        print("-" * 20)
        print(informe)

        # 2. Generar la recomendación basada en ese informe
        recomendacion = generar_recomendacion(informe)
        print("-" * 20)
        print(recomendacion)

        # 3. Extraer datos para el nombre del archivo
        id_transaccion = transaccion["ID Transacción"]
        nombre_producto = transaccion["Producto"]
        estado_transaccion = transaccion["Estado"]

        # 4. GUARDAR (Dentro del loop para procesar cada fraude encontrado)
        nombre_archivo = f"datos/recomendacion-{id_transaccion}-{nombre_producto}-{estado_transaccion}.txt"
        contenido_final = f"INFORME:\n{limpiar_json(informe)}\n\nRECOMENDACIÓN:\n{limpiar_json(recomendacion)}"
        print("-" * 20)
        print(contenido_final)

        guardar(nombre_archivo, contenido_final)

Hola Esteban ,

Gracias por compartir tu aprendizaje con nosotros. Sigue así, tu esfuerzo inspira a la comunidad. Recuerda que estamos aquí para ayudarte: si necesitas apoyo, no dudes en buscarnos en el foro.

¡Gracias nuevamente por tu aporte!

Saludos,

Si este post te ayudó, por favor, marca como solucionado ✓. ¡Continúa con tus estudios!