Cómo construir sistemas agentes listos para producción con Z.AI GLM-5 utilizando el modo de pensamiento, llamada de herramientas, transmisión y flujos de trabajo de múltiples turnos
print(“\n” + “=” * 70) print(“🤖 SECCIÓN 8: Bucle agente de múltiples herramientas”) print(“=” * 70) print(“Construya un agente completo que pueda usar múltiples herramientas en cada turno.\n”) class GLM5Agent: def __init__(self, system_prompt: str, tools: list, tool_registry: dict): self.client = ZaiClient(api_key=API_KEY) self.messages = [{“role”: “system”, “content”: system_prompt}]
self.tools = herramientas self.registry = tool_registry self.max_iterations = 5 def chat(self, user_input: str) -> str: self.messages.append({“role”: “user”, “content”: user_input}) para iteración en el rango(self.max_iterations): respuesta = self.client.chat.completions.create( model=”glm-5″, mensajes=self.messages, herramientas=self.tools, tool_choice=”auto”, max_tokens=2048, temperatura=0.6, ) msg = respuesta.opciones[0].message self.messages.append(msg.model_dump()) si no es msg.tool_calls: devuelve msg.content para tc en msg.tool_calls: fn_name = tc.function.name fn_args = json.loads(tc.function.arguments) print(f” 🔧 [{iteration+1}] {fn_name}({fn_args})”) si fn_name en self.registry: resultado = self.registry[fn_name](**fn_args) else: resultado = {“error”: f”Función desconocida: {fn_name}”} self.messages.append({ “role”: “tool”, “content”: json.dumps(result, sure_ascii=False), “tool_call_id”: tc.id, }) return “⚠️ El agente alcanzó el máximo de iteraciones sin una respuesta final”. herramientas_extendidas = herramientas + [
{
“type”: “function”,
“function”: {
“name”: “get_current_time”,
“description”: “Get the current date and time in ISO format”,
“parameters”: {
“type”: “object”,
“properties”: {},
“required”: []}, }, }, { “type”: “function”, “function”: { “name”: “unit_converter”, “description”: “Convertir entre unidades (longitud, peso, temperatura)”, “parameters”: { “type”: “object”, “properties”: { “value”: {“type”: “number”, “description”: “Valor numérico a convertir”}, “from_unit”: {“type”: “string”, “description”: “Unidad de origen (p. ej., ‘km’, ‘millas’, ‘kg’, ‘lbs’, ‘celsius’, ‘fahrenheit’)”}, “to_unit”: {“type”: “string”, “description”: “Unidad de destino”}, }, “required”: [“value”, “from_unit”, “to_unit”]}, }, }, ]def get_current_time() -> dict: return {“datetime”: datetime.now().isoformat(), “timezone”: “UTC”} def unit_converter(valor: float, from_unit: str, to_unit: str) -> dict: conversiones = { (“km”, “millas”): lambda v: v * 0.621371, (“millas”, “km”): lambda v: v * 1,60934, (“kg”, “lbs”): lambda v: v * 2,20462, (“lbs”, “kg”): lambda v: v * 0,453592, (“celsius”, “fahrenheit”): lambda v: v * 9 / 5 + 32, (“fahrenheit”, “celsius”): lambda v: (v – 32) * 5/9, (“metros”, “pies”): lambda v: v * 3.28084, (“pies”, “metros”): lambda v: v * 0.3048, } clave = (from_unit.lower(), to_unit.lower()) si ingresa la clave en conversiones: resultado = round(conversiones[key](valor), 4) return {“value”: value, “from”: from_unit, “to”: to_unit, “result”: result} return {“error”: f”Conversión {from_unit} → {to_unit} no compatible”} extended_registry = { **TOOL_REGISTRY, “get_current_time”: get_current_time, “unit_converter”: unit_converter, } agente = GLM5Agent( system_prompt=( “Eres un asistente útil con acceso al clima, las matemáticas, el tiempo y ” “herramientas de conversión de unidades. Utilízalas siempre que puedan ayudar a responder ” “la pregunta del usuario con precisión. Muestra siempre tu trabajo.” ), tools=extended_tools, tool_registry=extended_registry, ) print(“🧑 Usuario: ¿Qué hora es? Además, si hace 28°C en Tokio, ¿qué es eso en Fahrenheit?”) print(” ¿Y cuánto es 2^16?”) resultado = agente.chat( “¿Qué hora es? Además, si en Tokio hay 28°C, ¿cuánto es eso en Fahrenheit? ” “¿Y qué es 2^16?” ) print(f”\n🤖 Agente: {resultado}”) print(“\n” + “=” * 70) print(“⚖️ SECCIÓN 9: Modo de pensamiento activado o desactivado Comparación”) print(“=” * 70) print(“Vea cómo el modo de pensamiento mejora la precisión en un problema de lógica complicado.\n”) tricky_question = ( “Tengo 12 monedas. Una de ellas es falsa y pesa diferente que el resto. ” ) print(“─── SIN Modo de Pensamiento ───”) t0 = time.time() r_no_think = client.chat.completions.create(model=”glm-5″, mensajes=[{“role”: “user”, “content”: tricky_question}]pensando={“type”: “disabled”}, max_tokens=2048, temperatura=0.6, ) t1 = time.time() print(f”⏱️ Hora: {t1-t0:.1f}s | Tokens: {r_no_think.usage.completion_tokens}”) print(f”📝 Respuesta (primeros 300 caracteres): {r_no_think.choices[0].mensaje.contenido[:300]}…”) print(“\n─── CON Modo de pensamiento ───”) t0 = time.time() r_think = client.chat.completions.create( model=”glm-5″, mensajes=[{“role”: “user”, “content”: tricky_question}]pensando={“type”: “enabled”}, max_tokens=4096, temperatura=0.6, ) t1 = time.time() print(f”⏱️ Hora: {t1-t0:.1f}s | Tokens: {r_think.usage.completion_tokens}”) print(f”📝 Respuesta (primeros 300 caracteres): {r_think.choices[0].mensaje.contenido[:300]}…”)