feat: improve tool documentation and timezone handling
This commit is contained in:
@@ -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())
|
||||||
|
|||||||
Reference in New Issue
Block a user