feat: Implement new sales data analysis agents and utilities
- Added Router_de_agentes.py to manage agent interactions for sales data analysis. - Created Analizador_de_datos_de_ventas.yaml for generating structured text reports from sales data. - Developed Generador_sql_ventas.yaml for generating SQL queries to analyze sales data. - Established Router_de_agente.yaml as a routing mechanism for agent requests. - Compiled centros_disponibles.md listing available sales centers. - Introduced primera_ejecucion_de_un_agente.py as an example for executing agents. - Added ver_los_prompts_de_un_agente.py to inspect prompts sent to OpenAI. - Included service account key for BigQuery access in rag-datasets-reader-sa-key.json. - Defined schema for sales data in Objeto_ventas.json. - Implemented utility functions for querying BigQuery in conseguir_datos_bq.py. - Created data transformation utilities in transformar_datos.py for handling decimal and date formats.
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
from agno.agent import Agent
|
||||
from agno.models.openai import OpenAIChat
|
||||
|
||||
# Prefect imports #######################################
|
||||
|
||||
from prefect import task, flow
|
||||
from prefect.logging import get_run_logger
|
||||
from prefect.filesystems import LocalFileSystem
|
||||
|
||||
local_file_system_block = LocalFileSystem.load("localfile")
|
||||
|
||||
# Cargar variables de entorno ###########################
|
||||
|
||||
import os
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv()
|
||||
|
||||
openai_api_key = os.getenv("OPENAI_API_KEY")
|
||||
|
||||
|
||||
# Definir tareas ###############################################
|
||||
|
||||
@task(name="Inicializar agente financiero", log_prints=True)
|
||||
def inicializar_agente_financiero():
|
||||
prefect_logger = get_run_logger()
|
||||
|
||||
|
||||
prefect_logger.debug(f"Inicializando el agente financiero")
|
||||
# Aquí se podría agregar la lógica para inicializar el agente
|
||||
return "Agente financiero inicializado"
|
||||
|
||||
|
||||
@task(name="Analizar datos financieros", log_prints=True)
|
||||
def analizar_datos_financieros(datos: str):
|
||||
prefect_logger = get_run_logger()
|
||||
|
||||
|
||||
prefect_logger.debug(f"Creando el agente con OpenAI")
|
||||
|
||||
prefect_logger.debug(f"analizando los datos: {datos}")
|
||||
|
||||
# Crear el agente
|
||||
agente = Agent(
|
||||
model=OpenAIChat(id="gpt-4o-mini", api_key=openai_api_key),
|
||||
name="analista_financiero",
|
||||
description="Agente especializado en análisis financiero y económico"
|
||||
)
|
||||
|
||||
prefect_logger.debug(f"Ejecutando el agente")
|
||||
|
||||
respuesta = agente.run("Da un resumen corto financiero de los siguientes datos: " + datos)
|
||||
|
||||
prefect_logger.info(f"Respuesta del agente: {respuesta.content}")
|
||||
|
||||
return respuesta.content
|
||||
|
||||
|
||||
# Definir el flujo principal #########################################
|
||||
|
||||
@flow(name="Flujo financiero", result_storage=local_file_system_block, log_prints=True) # type: ignore
|
||||
def flujo_principal():
|
||||
datos_ejemplo = "La bolsa de valores de Nueva York cerró al alza hoy, con el índice S&P 500 subiendo un 1.2% impulsado por ganancias en el sector tecnológico. Las acciones de Apple y Microsoft lideraron las ganancias, mientras que los mercados europeos también mostraron signos de recuperación tras datos económicos positivos."
|
||||
|
||||
agente_inicializado = inicializar_agente_financiero.submit().result()
|
||||
|
||||
|
||||
resultado_analisis = analizar_datos_financieros.submit(datos_ejemplo).result()
|
||||
|
||||
return resultado_analisis
|
||||
|
||||
|
||||
# Ejecutar el flujo principal #############################
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
flujo_principal()
|
||||
@@ -0,0 +1,136 @@
|
||||
# Constantes ##########################################################################
|
||||
|
||||
PROMPT = "Busca en Wikipedia información sobre la inflación en Argentina y dame un resumen."
|
||||
|
||||
|
||||
# Librerias de Agno ################################################################
|
||||
|
||||
from agno.agent import Agent
|
||||
from agno.models.openai import OpenAIChat
|
||||
from agno.tools.yfinance import YFinanceTools
|
||||
from agno.tools.wikipedia import WikipediaTools
|
||||
|
||||
# Prefect imports ##################################################################
|
||||
|
||||
from prefect import task, flow
|
||||
from prefect.logging import get_run_logger
|
||||
from prefect.filesystems import LocalFileSystem
|
||||
|
||||
local_file_system_block = LocalFileSystem.load("localfile")
|
||||
|
||||
# Cargar variables de entorno ######################################################
|
||||
|
||||
import os
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv()
|
||||
|
||||
openai_api_key = os.getenv("OPENAI_API_KEY")
|
||||
|
||||
|
||||
# Imports adicionales #########################################################
|
||||
|
||||
import traceback
|
||||
from uuid import uuid4
|
||||
|
||||
|
||||
|
||||
|
||||
# 01. Averiguar el prompt que se envía a OpenAI ################################################
|
||||
|
||||
|
||||
@task(name="averiguar_el_prompt_que_seenvia_a_openai", log_prints=True)
|
||||
def averiguar_el_prompt_que_seenvia_a_openai(prompt_de_usuario: str):
|
||||
prefect_logger = get_run_logger()
|
||||
|
||||
try:
|
||||
prefect_logger.debug("Creando el agente con OpenAI")
|
||||
|
||||
agente = Agent(
|
||||
model=OpenAIChat(id="gpt-4o-mini", api_key=openai_api_key),
|
||||
name="analista_financiero",
|
||||
description="Agente especializado en análisis financiero y económico",
|
||||
debug_mode=True,
|
||||
tools=[YFinanceTools(), WikipediaTools()],
|
||||
)
|
||||
|
||||
prefect_logger.debug("Preparando los mensajes que se enviarán al modelo...")
|
||||
|
||||
try:
|
||||
# 🚀 Este método interno construye los mensajes igual que antes,
|
||||
# pero no requiere crear un RunOutput ni AgentSession manualmente.
|
||||
run_messages = agente._get_run_messages(
|
||||
run_response=None,
|
||||
input=prompt_de_usuario,
|
||||
session=None,
|
||||
session_state={},
|
||||
user_id=None,
|
||||
audio=None,
|
||||
images=None,
|
||||
videos=None,
|
||||
files=None,
|
||||
knowledge_filters=None,
|
||||
add_history_to_context=False,
|
||||
dependencies=None,
|
||||
add_dependencies_to_context=False,
|
||||
add_session_state_to_context=False,
|
||||
metadata=None,
|
||||
)
|
||||
except Exception as e:
|
||||
prefect_logger.error("❌ Error al generar los mensajes con _get_run_messages()")
|
||||
prefect_logger.error(f"Tipo de error: {type(e).__name__}")
|
||||
prefect_logger.error(f"Detalle: {str(e)}")
|
||||
prefect_logger.error(traceback.format_exc())
|
||||
raise
|
||||
|
||||
mensajes_enviados = []
|
||||
try:
|
||||
for msg in run_messages.messages:
|
||||
mensajes_enviados.append({
|
||||
"role": msg.role,
|
||||
"content": msg.content
|
||||
})
|
||||
except Exception as e:
|
||||
prefect_logger.error("❌ Error al procesar los mensajes construidos.")
|
||||
prefect_logger.error(f"Tipo de error: {type(e).__name__}")
|
||||
prefect_logger.error(f"Detalle: {str(e)}")
|
||||
prefect_logger.error(traceback.format_exc())
|
||||
raise
|
||||
|
||||
prefect_logger.info("✅ Mensajes construidos por el agente:")
|
||||
for m in mensajes_enviados:
|
||||
prefect_logger.info(f"ROLE: {m['role']}\nCONTENT:\n{m['content']}\n{'-'*40}")
|
||||
|
||||
resultado = agente.run(prompt_de_usuario)
|
||||
|
||||
prefect_logger.info("✅ Resultado de la ejecución:")
|
||||
prefect_logger.info(f"{resultado}")
|
||||
|
||||
prefect_logger.debug("Función completada correctamente ✅")
|
||||
|
||||
return mensajes_enviados
|
||||
|
||||
except Exception as e:
|
||||
prefect_logger.error("💥 Error inesperado en la tarea averiguar_el_prompt_que_seenvia_a_openai")
|
||||
prefect_logger.error(f"Tipo de error: {type(e).__name__}")
|
||||
prefect_logger.error(f"Mensaje: {str(e)}")
|
||||
prefect_logger.error(traceback.format_exc())
|
||||
raise
|
||||
|
||||
|
||||
|
||||
# Definir el flujo principal #########################################
|
||||
|
||||
@flow(name="Averiguar_prompt_enviado", result_storage=local_file_system_block, log_prints=True) # type: ignore
|
||||
def flujo_principal():
|
||||
|
||||
resultado_analisis = averiguar_el_prompt_que_seenvia_a_openai.submit(PROMPT).result()
|
||||
|
||||
return resultado_analisis
|
||||
|
||||
|
||||
# Ejecutar el flujo principal #############################
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
flujo_principal()
|
||||
Reference in New Issue
Block a user