feat: add agents/app

This commit is contained in:
2025-03-24 20:33:04 -05:00
parent cb63404b50
commit b6b94ac2b5
37 changed files with 3396 additions and 1 deletions

View File

@@ -0,0 +1,35 @@
class CatalogTools:
def list_products(self):
"""
Lista todos los productos disponibles en el catálogo con su disponibilidad
"""
pass
def search_products(self):
"""
Busca productos en el catálogo que coincidan con la consulta
"""
pass
def check_price(self):
"""
Verifica el precio de un producto específico
"""
pass
def check_availability(self):
"""
Verifica la disponibilidad de un producto espécifico
"""
pass
def get_product_details(self):
"""
Obtiene detalles completos de un producto
"""
pass
def list_tools(self):
"""Retorna los metodos de esta clase en una lista"""
pass

View File

@@ -0,0 +1,190 @@
from langchain_core.tools import tool
from typing import List, Dict, Optional
from app.seller.catalog_tools import CatalogTrytonTools
import json
import requests
url = "http://192.168.0.25:8000"
key = "9a9ffc430146447d81e6698240199a4be2b0e774cb18474999d0f60e33b5b1eb1cfff9d9141346a98844879b5a9e787489c891ddc8fb45cc903b7244cab64fb1"
db = "tryton"
application_name = "sale_don_confiao"
catalog = CatalogTrytonTools(url, application_name, key, db)
@tool
def list_products() -> str:
"""
Lista todos los productos disponibles en el catálogo con su disponibilidad
"""
response = catalog.list_products()
products: str = ""
for product in response:
id = product["id"]
name = product["name"]
id_unit_measurement = product["default_uom."]["id"]
products += f"- id: {id} - Nombre: {name} - ID Unidad de Medida: {id_unit_measurement} \n"
return products
@tool
def search_products(product_name: str) -> str:
"""
Busca productos en el catálogo que coincidan con el nombre del producto proporcionado.
Parámetros:
- product_name (str): El nombre del producto a buscar.
Devuelve:
- str: Una cadena de texto que lista los IDs, nombres y precios de los productos encontrados,
formateada con cada producto en una línea separada.
"""
response = catalog.search_products(product_name)
precios: str = ""
for product in response:
id = product["id"]
name = product["name"]
precio = product["template."]["list_price"]["decimal"]
id_unit_measurement = product["default_uom."]["id"]
precios += f"- id: {id} - Nombre: {name}: ${precio} - ID Unidad de Medida: {id_unit_measurement}\n"
return precios
@tool
def check_price(product_name: str) -> str:
"""
Verifica el precio de un producto específico
"""
response = catalog.search_products(product_name)
precios: str = ""
for product in response:
id = product["id"]
name = product["name"]
precio = product["template."]["list_price"]["decimal"]
id_unit_measurement = product["default_uom."]["id"]
precios += f"- id: {id} - Nombre: {name}: ${precio} - ID Unidad de Medida: {id_unit_measurement}\n"
return precios
@tool
def check_availability(product_name: str) -> str:
"""
Verifica la disponibilidad de un producto específico
"""
response = catalog.search_products("Papa")
disponibilidad: str = ""
for product in response:
id = product["id"]
name = product["name"]
stock = product["quantity"]
id_unit_measurement = product["default_uom."]["id"]
disponibilidad += f"- id: {id} - Nombre: {name} - Stock: {stock} - ID Unidad de Medida: {id_unit_measurement}\n"
return disponibilidad
@tool
def get_product_details(product_name: str) -> str:
"""
Obtiene los detalles completos de un producto
"""
products = CatalogManager.search_products(product_name)
if products:
product = products[0] # Tomar el primer producto que coincida
stock_status = "En stock" if product["stock"] > 0 else "Agotado"
return f"""
Detalles del producto:
- Producto: {product['producto']}
- Categoría: {product['categoria']}
- Unidad de medida: {product['unidad']}
- id unidad de medida: {product["default_uom."]["id"]}
- Precio: ${product['precio']:,}
- Estado: {stock_status} ({product['stock']} unidades)
"""
return f"No se encontró el producto '{product_name}' en nuestro catálogo."
@tool
def list_category_products(category_name: str) -> str:
"""
Lista todos los productos de una categoría específica
"""
products = CatalogManager.search_products(category_name)
if not products:
return f"No se encontraron productos en la categoría '{category_name}'."
result = f"Productos en la categoría {category_name}:\n"
for product in products:
if product["categoria"] == category_name:
stock_status = " Disponible" if product["stock"] > 0 else " Agotado"
result += f"- {product['producto']} | {product['unidad']} | ${product['precio']:,} | {stock_status}\n"
return result
@tool
def get_low_stock_products(threshold: int = 10) -> str:
"""
Lista productos con stock bajo (por defecto, menos de 10 unidades)
"""
products = CatalogManager.list_all_products()
low_stock = [p for p in products if p["stock"] <= threshold]
if not low_stock:
return f"No hay productos con stock menor a {threshold} unidades."
result = f"Productos con stock bajo (menos de {threshold} unidades):\n"
for product in low_stock:
result += f"- {product['producto']}: {product['stock']} {product['unidad']}(s) restantes\n"
return result
@tool
def get_products_by_price_range(min_price: float, max_price: float) -> str:
"""
Busca productos dentro de un rango de precios específico
"""
products = CatalogManager.list_all_products()
filtered_products = [p for p in products if min_price <= p["precio"] <= max_price]
if not filtered_products:
return f"No se encontraron productos entre ${min_price:,} y ${max_price:,}."
result = f"Productos entre ${min_price:,} y ${max_price:,}:\n"
for product in filtered_products:
result += (
f"- {product['producto']} | {product['unidad']} | ${product['precio']:,}\n"
)
return result
# Lista de todas las herramientas disponibles
tools = [
list_products,
search_products,
check_price,
check_availability,
# get_product_details,
# list_category_products,
# get_low_stock_products,
# get_products_by_price_range,
]