feat: add agents/app
This commit is contained in:
35
agents/app/langgraph_tools/tools/catalog/catalog_class.py
Normal file
35
agents/app/langgraph_tools/tools/catalog/catalog_class.py
Normal 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
|
||||
190
agents/app/langgraph_tools/tools/catalog/catalog_tools.py
Normal file
190
agents/app/langgraph_tools/tools/catalog/catalog_tools.py
Normal 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,
|
||||
]
|
||||
Reference in New Issue
Block a user