feat: improve tool documentation and timezone handling

This commit is contained in:
2026-03-09 20:46:16 -05:00
parent 15c8589826
commit f78908ad88

View File

@@ -16,7 +16,6 @@ _MCP_CLIENT = Client(MCP_SERVER_URL)
class NaliiaTools: class NaliiaTools:
def __init__(self): def __init__(self):
self._session_active = False self._session_active = False
@@ -27,122 +26,157 @@ class NaliiaTools:
self.get_tomorrow_date, self.get_tomorrow_date,
self.schedule_appointment, self.schedule_appointment,
self.find_service_centers, self.find_service_centers,
self.find_products_and_services self.find_products_and_services,
] ]
@tool @tool
def get_tomorrow_date() -> str: def get_tomorrow_date() -> str:
""" """
Consulta la fecha y hora actual del sistema y calcula la fecha del dia de mañana. Consulta la fecha actual del sistema y calcula la fecha del día de mañana.
Retorna la fecha en formato ISO 8601. No se aceptan fechas en el pasado con respecto a esta fecha.
Returns:
str: Fecha del día siguiente en formato ISO 8601 (YYYY-MM-DD).
Ejemplo: "2026-03-10"
Notes:
- No se aceptan fechas en el pasado con respecto a esta fecha.
- Utiliza la zona horaria de Colombia (America/Bogota, UTC-5).
""" """
td = timedelta(days=1) td = timedelta(days=1)
tomorrow = datetime.now().date() + td tomorrow = datetime.now().date() + td
tomorrow_date_formated = tomorrow.isoformat()
return tomorrow.isoformat() logger.info(tomorrow_date_formated)
return tomorrow_date_formated
@tool @tool
def get_current_datetime() -> str: def get_current_datetime() -> str:
""" """
Consulta la fecha y hora actual del sistema. Consulta la fecha y hora actual del sistema.
Retorna la fecha en formato ISO 8601.
No se aceptan fechas en el pasado con respecto a esta fecha. Returns:
str: Fecha y hora actual en formato ISO 8601 con zona horaria.
Ejemplo: "2026-03-09T17:30:00-05:00"
Notes:
- No se aceptan fechas en el pasado con respecto a esta fecha.
- Utiliza la zona horaria de Colombia (America/Bogota, UTC-5).
""" """
logger.info("Consultando fecha actual.") logger.info("Consultando fecha actual.")
return datetime.now(tz=ZoneInfo(TIMEZONE)).isoformat() today_date_formated = datetime.now(tz=ZoneInfo(TIMEZONE)).isoformat()
logger.info(today_date_formated)
return today_date_formated
@tool @tool
def find_service_centers(): def find_service_centers():
""" """
Obtiene los centros de servicios disponibles. Obtiene la lista de centros de servicio disponibles para agendar citas.
Return: Returns:
response=[{ str: JSON array con los centros de servicio disponibles.
'id': 1, Cada elemento contiene:
'name': Campo Amor - id (int): Identificador único del centro de servicio
}, - name (str): Nombre del centro de servicio
{
'id': 2, Example:
'name': Belen '[{"id": 1, "name": "Campo Amor"}, {"id": 2, "name": "Belen"}]'
}
]
""" """
async def call_tool(): async def call_tool():
async with _MCP_CLIENT: async with _MCP_CLIENT:
result = await _MCP_CLIENT.call_tool( result = await _MCP_CLIENT.call_tool("find_service_centers", None)
"find_service_centers", None)
logger.info(result.content[0].text) logger.info(result.content[0].text)
return result return result
result = asyncio.run(call_tool()) result = asyncio.run(call_tool())
return result.content[0].text return result.content[0].text
@tool @tool
def find_products_and_services(): def find_products_and_services():
""" """
Obtiene los productos disponibles. Obtiene la lista de productos y servicios disponibles para agendar.
Return: Returns:
response=[{ str: JSON array con los productos y servicios disponibles.
'id': 1, Cada elemento contiene:
'name': Manicure, - id (int): Identificador único del producto/servicio
'price': 20000.00, - name (str): Nombre del producto o servicio
'description': None - price (float): Precio del servicio
}, - description (str | None): Descripción adicional del servicio
{
'id': 2, Example:
'name': Corte de Cabello, '[{"id": 1, "name": "Manicure", "price": 20000.0, "description": null},
'price': 30000.00, {"id": 2, "name": "Corte de Cabello", "price": 30000.0, "description": "Corte frances, aleman"}]'
'description': "Corte frances, aleman"
}
]
""" """
async def call_tool(): async def call_tool():
async with _MCP_CLIENT: async with _MCP_CLIENT:
result = await _MCP_CLIENT.call_tool( result = await _MCP_CLIENT.call_tool("find_products_and_services", None)
"find_products_and_services", None)
logger.info(result.content[0].text) logger.info(result.content[0].text)
return result return result
result = asyncio.run(call_tool()) result = asyncio.run(call_tool())
return result.content[0].text return result.content[0].text
@tool(args_schema=ScheduleSchema) @tool(args_schema=ScheduleSchema)
def schedule_appointment( def schedule_appointment(
schedule_date, schedule_time, schedule_date,
service_center, customer, schedule_time,
professional, description description,
service_center=11,
customer=4,
professional=6,
) -> bool: ) -> bool:
""" """
Permite al Cliente al Agendar una Cita Permite agendar una cita para un cliente en un centro de servicio específico.
Args:
schedule_date: Fecha de la cita en formato YYYY-MM-DD.
schedule_time: Hora de la cita en formato HH:MM:SS.
description (str): Descripción o motivo de la cita.
service_center (int, optional): ID del centro de servicio. Por defecto es 11.
customer (int, optional): ID del cliente. Por defecto es 4.
professional (int, optional): ID del profesional. Por defecto es 6.
Returns:
bool: True si la cita fue agendada exitosamente, False en caso contrario.
Notes:
- La fecha y hora se almacenan en zona horaria America/Bogota (UTC-5).
- La fecha no puede ser en el pasado.
""" """
logger.info("Agendando cita...") logger.info("Agendando cita...")
logger.info([schedule_date, schedule_time])
if not schedule_date and schedule_time: if not schedule_date and schedule_time:
return False return False
schedule = datetime.combine( schedule = (
schedule_date, datetime.combine(schedule_date, schedule_time)
schedule_time .replace(tzinfo=ZoneInfo(TIMEZONE))
).replace( .isoformat()
tzinfo=timezone.utc )
).isoformat()
example_schedule = {
'professional': 6,
'description': description,
'customer': 4,
'date': schedule,
'service_center': 11
}
async def call_tool(): async def call_tool():
async with _MCP_CLIENT: async with _MCP_CLIENT:
result = await _MCP_CLIENT.call_tool( result = await _MCP_CLIENT.call_tool(
"create_schedule", example_schedule) "create_schedule",
{
"professional": professional,
"description": description,
"customer": customer,
"date": schedule,
"service_center": service_center,
},
)
logger.info(result) logger.info(result)
asyncio.run(call_tool()) asyncio.run(call_tool())