Capítulo 6 · el modelo elige, tu código ejecuta
Pídele a un modelo 26.2 millas en kilómetros.
Contesta con toda confianza — y seguido con el número equivocado. Los pesos aproximan la aritmética; no la hacen.
El modelo nunca ejecuta nada.
convert con un JSON SchemaTOOLS = [{
"type": "function",
"name": "convert",
"description": "Convert a length between units exactly.",
"parameters": {...}, # JSON Schema, enums included
}]
El modelo lee la descripción para decidir cuándo llamar.
response = client.responses.create(
model="gpt-5.4-nano", input=QUESTION, tools=TOOLS)
call = next(i for i in response.output
if i.type == "function_call")
result = convert(**json.loads(call.arguments))
final = client.responses.create(
model="gpt-5.4-nano",
previous_response_id=response.id,
input=[{"type": "function_call_output",
"call_id": call.call_id,
"output": json.dumps({"result": result})}],
tools=TOOLS)response = client.models.generate_content(
model="gemini-3.1-flash-lite",
contents=QUESTION, config=CONFIG)
fc = response.function_calls[0] # args already a dict
result = convert(**fc.args)
# replay: question + model's call turn + function_response
Sin previous_response_id — tú rearmas la conversación.
datetime cuentaCada una es una app web con docker compose up.
El modelo elige, tu código ejecuta — mantén esa línea bien marcada.
La próxima semana: ponle un while a este loop y agrega más herramientas.