← capítulo

Function calling

Capítulo 6 · el modelo elige, tu código ejecuta

La hora

El problema

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.

La división del trabajo

El modelo nunca ejecuta nada.

  1. Declaras convert con un JSON Schema
  2. El modelo responde con una function call, no con texto
  3. Tu Python la ejecuta
  4. El resultado regresa; el modelo redacta la respuesta

La declaración es un prompt

TOOLS = [{
    "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.

OpenAI: el round trip

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)

Gemini: el mismo viaje, distinta ortografía

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.

Los argumentos son output del modelo

Ponlo a trabajar — tres apps

Cada una es una app web con docker compose up.

Conclusión

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.