La búsqueda de herramientas permite que el modelo busque y cargue herramientas dinámicamente en su contexto según las necesite. Así, puedes evitar cargar todas las definiciones de herramientas en el contexto del modelo desde el inicio, lo que puede ayudar a reducir el consumo total de tokens y el costo. Para optimizar el costo y la latencia, la búsqueda de herramientas está diseñada para conservar la caché del modelo. Cuando el modelo descubre herramientas nuevas, estas se insertan al final de la ventana de contexto.
En la API Responses, solo gpt-5.4 y los modelos posteriores admiten tool_search.
La configuración y los ejemplos siguientes usan la API Responses. Para obtener información sobre la carga de funciones por sesión y el descubrimiento automático de MCP, consulta API de agentes.
Para activar la búsqueda de herramientas en la API Responses, debes hacer dos cosas:
- Agrega
tool_searchcomo herramienta en tu arreglotools. - Si usas funciones, marca aquellas cuya carga quieras diferir con
defer_loading: true. Si usas servidores MCP, establecedefer_loading: trueen la definición de la herramienta del servidor MCP.
Usa espacios de nombres siempre que sea posible
Puedes usar la búsqueda de herramientas con funciones, espacios de nombres o servidores MCP de carga diferida, pero recomendamos usar espacios de nombres o servidores MCP siempre que sea posible. Nuestros modelos se han entrenado principalmente para buscar en estos conjuntos, donde el ahorro de tokens suele ser más significativo.
En los espacios de nombres, defer_loading se aplica a las funciones que contienen, no al objeto del espacio de nombres en sí.
Al inicio de una solicitud, el modelo sigue viendo el nombre y la descripción de todo lo que se puede buscar. En el caso de un espacio de nombres o un servidor MCP, esto significa que, al principio, el modelo solo ve el nombre y la descripción del espacio de nombres o del servidor. Los detalles de las funciones individuales que contiene no se muestran hasta que la herramienta de búsqueda de herramientas las carga. En el caso de una función individual de carga diferida, el modelo sigue viendo el nombre y la descripción de la función, por lo que, en la práctica, la búsqueda de herramientas difiere principalmente la carga del esquema de parámetros.
Para maximizar el ahorro de tokens, recomendamos agrupar las funciones de carga diferida en espacios de nombres o servidores MCP con descripciones generales claras que le den al modelo una buena idea de lo que contienen. Así, podrá buscar y cargar de manera eficaz solo las funciones pertinentes. Como buena práctica, procura que cada espacio de nombres tenga menos de 10 funciones para optimizar el uso de tokens y el rendimiento del modelo.
{
"tools": [
{
"type": "namespace",
"name": "crm",
"description": "CRM tools for customer lookup and order management.",
"tools": [
{
"type": "function",
"name": "list_open_orders",
"description": "List open orders for a customer ID.",
"defer_loading": true,
"parameters": {
"type": "object",
"properties": {
"customer_id": { "type": "string" }
},
"required": ["customer_id"],
"additionalProperties": false
}
}
]
},
{
"type": "tool_search"
}
]
}Los espacios de nombres pueden combinar herramientas de carga diferida y de carga inmediata. Las herramientas sin defer_loading: true se pueden llamar de inmediato, mientras que las herramientas de carga diferida del mismo espacio de nombres se cargan mediante la búsqueda de herramientas.
Tipos de búsqueda de herramientas
Elige entre dos tipos de búsqueda de herramientas:
- Búsqueda de herramientas alojada: OpenAI busca entre las herramientas de carga diferida que declaraste en la solicitud y devuelve el subconjunto cargado en la misma respuesta.
- Búsqueda de herramientas ejecutada por el cliente: el modelo emite un
tool_search_call, tu aplicación realiza la búsqueda y tú devuelves eltool_search_outputcorrespondiente.
Comienza con la búsqueda de herramientas alojada si ya conoces las herramientas candidatas al crear la solicitud. Usa la búsqueda de herramientas ejecutada por el cliente cuando el descubrimiento de herramientas dependa del estado del proyecto, del estado del tenant o de otro sistema que controle tu aplicación.
Búsqueda de herramientas alojada
La búsqueda de herramientas alojada es la opción más sencilla cuando ya conoces el inventario completo de funciones, espacios de nombres o servidores MCP en los que quieres que el modelo busque. Los declaras desde el inicio, agregas {"type": "tool_search"} y dejas que la API decida qué cargar.
from openai import OpenAI
client = OpenAI()
crm_namespace = {
"type": "namespace",
"name": "crm",
"description": "CRM tools for customer lookup and order management.",
"tools": [
{
"type": "function",
"name": "get_customer_profile",
"description": "Fetch a customer profile by customer ID.",
"parameters": {
"type": "object",
"properties": {
"customer_id": {"type": "string"},
},
"required": ["customer_id"],
"additionalProperties": False,
},
},
{
"type": "function",
"name": "list_open_orders",
"description": "List open orders for a customer ID.",
"defer_loading": True,
"parameters": {
"type": "object",
"properties": {
"customer_id": {"type": "string"},
},
"required": ["customer_id"],
"additionalProperties": False,
},
},
],
}
response = client.responses.create(
model="gpt-6-astra",
input="List open orders for customer CUST-12345.",
tools=[
crm_namespace,
{"type": "tool_search"},
],
parallel_tool_calls=False,
)
print(response.output)Si el modelo decide que necesita una herramienta de carga diferida, la respuesta incluye dos elementos de salida adicionales antes de la posterior llamada a la función:
tool_search_call, que registra el paso de búsqueda alojada.tool_search_output, que contiene el subconjunto cargado de herramientas que ya se pueden llamar.
[
{
"type": "tool_search_call",
"execution": "server",
"call_id": null,
"status": "completed",
"arguments": {
"paths": ["crm"]
}
},
{
"type": "tool_search_output",
"execution": "server",
"call_id": null,
"status": "completed",
"tools": [
{
"type": "namespace",
"name": "crm",
"description": "CRM tools for customer lookup and order management.",
"tools": [
{
"type": "function",
"name": "list_open_orders",
"description": "List open orders for a customer ID.",
"defer_loading": true,
"parameters": {
"type": "object",
"properties": {
"customer_id": { "type": "string" }
},
"required": ["customer_id"],
"additionalProperties": false
}
}
]
}
]
},
{
"type": "function_call",
"name": "list_open_orders",
"namespace": "crm",
"call_id": "call_abc123",
"arguments": "{\"customer_id\":\"CUST-12345\"}"
}
]En el modo alojado, execution se establece en server y call_id se establece en null.
Para tareas más complejas, el modelo también puede cargar varios espacios de nombres o servidores MCP en un mismo tool_search_call. Por ejemplo, si necesita funciones de distintos espacios de nombres para completar una tarea, puede optar por buscar y cargar esos conjuntos de forma conjunta antes de realizar las llamadas posteriores a las funciones.
Búsqueda de herramientas ejecutada por el cliente
La búsqueda de herramientas ejecutada por el cliente le da a tu aplicación control total sobre cómo funciona el descubrimiento de herramientas. Esto resulta útil cuando las herramientas disponibles dependen de información que no es práctico declarar en la lista inicial de tools.
Configura la herramienta tool_search con execution: "client" y un esquema para los argumentos de búsqueda que espera tu aplicación:
from openai import OpenAI
client = OpenAI()
first_response = client.responses.create(
model="gpt-6-astra",
input="Find the shipping ETA tool first, then use it for order_42.",
tools=[
{
"type": "tool_search",
"execution": "client",
"description": "Find the project-specific tools needed to continue the task.",
"parameters": {
"type": "object",
"properties": {
"goal": {"type": "string"},
},
"required": ["goal"],
"additionalProperties": False,
},
}
],
parallel_tool_calls=False,
)
search_call = next(
item for item in first_response.output if item.type == "tool_search_call"
)
loaded_tools = [
{
"type": "function",
"name": "get_shipping_eta",
"description": "Look up shipping ETA details for an order.",
"defer_loading": True,
"parameters": {
"type": "object",
"properties": {
"order_id": {"type": "string"},
},
"required": ["order_id"],
"additionalProperties": False,
},
}
]
second_response = client.responses.create(
model="gpt-6-astra",
input=[
*first_response.output,
{
"type": "tool_search_output",
"execution": "client",
"call_id": search_call.call_id,
"status": "completed",
"tools": loaded_tools,
},
],
)
print(second_response.output)En el primer turno, el modelo emite un tool_search_call y se detiene ahí:
[
{
"type": "tool_search_call",
"execution": "client",
"call_id": "call_abc123",
"status": "completed",
"arguments": {
"goal": "Find the shipping ETA tool for order_42."
}
}
]Luego, tu aplicación realiza la búsqueda y devuelve un tool_search_output con las herramientas que quiere cargar:
[
{
"type": "tool_search_output",
"execution": "client",
"call_id": "call_abc123",
"status": "completed",
"tools": [
{
"type": "function",
"name": "get_shipping_eta",
"description": "Look up shipping ETA details for an order.",
"defer_loading": true,
"parameters": {
"type": "object",
"properties": {
"order_id": { "type": "string" }
},
"required": ["order_id"],
"additionalProperties": false
}
}
]
}
]En el siguiente turno, la herramienta cargada se puede llamar como una función normal:
[
{
"type": "function_call",
"name": "get_shipping_eta",
"namespace": "get_shipping_eta",
"call_id": "call_xyz456",
"arguments": "{\"order_id\":\"order_42\"}"
}
]En el modo cliente, execution se establece en client y call_id está definido. Incluye en tu tool_search_output el mismo call_id del tool_search_call.
Uso avanzado
Mantén claras las descripciones de los espacios de nombres
Redacta descripciones claras de los espacios de nombres que expliquen el caso de uso, ya que el modelo se basa en ellas para decidir cuándo cargar un subconjunto de funciones de ese espacio de nombres. Evita las descripciones demasiado largas. Incluye los detalles más completos en las descripciones de las funciones de carga diferida, que solo se cargan cuando se necesitan.
Comprende qué se carga
tool_search_output.tools contiene la lista de herramientas que el modelo cargó dinámicamente. El modelo podrá llamar a cualquiera de estas herramientas en turnos posteriores, por lo que, en el modo cliente, no necesitas volver a cargar la misma herramienta en cada turno. Las herramientas que no figuren en este arreglo no estarán disponibles para el modelo. Si quieres desactivar una herramienta cargada, puedes quitarla del elemento tool_search_output en el que defines el conjunto de herramientas cargadas, pero ten en cuenta que modificar este conjunto invalidará la caché del modelo a partir de ese punto.
Patrones avanzados de inserción
La mayoría de las integraciones declaran las herramientas en el parámetro tools de la solicitud. La búsqueda de herramientas ejecutada por el cliente también admite patrones más avanzados en los que tu aplicación devuelve herramientas que no estaban presentes en la solicitud original. Trata esto como un flujo de trabajo avanzado: valida cuidadosamente los esquemas devueltos y expón solo definiciones de herramientas confiables.
Búsqueda de herramientas y almacenamiento en caché
Todas las herramientas se cargan al final de la ventana de contexto del modelo. Esto se aplica tanto a la búsqueda de herramientas alojada como a la ejecutada por el cliente. Así, la caché del modelo se conserva de una solicitud a otra, lo que reduce los costos totales y aumenta la velocidad.
Agrega herramientas en un punto específico de la entrada
En flujos de trabajo avanzados, puedes usar un elemento de entrada additional_tools para que las herramientas estén disponibles en un punto específico de la conversación. Esto resulta útil cuando tu aplicación carga herramientas fuera del flujo normal de búsqueda de herramientas o necesita conservar el orden de las herramientas agregadas durante una respuesta anterior.
Establece role en developer e incluye las herramientas que quieras agregar en el arreglo tools del elemento:
{
"type": "additional_tools",
"role": "developer",
"tools": [
{
"type": "function",
"name": "get_customer",
"description": "Look up a customer by ID.",
"parameters": {
"type": "object",
"properties": {
"customer_id": { "type": "string" }
},
"required": ["customer_id"],
"additionalProperties": false
}
}
]
}Las herramientas de un elemento additional_tools solo están disponibles después de que ese elemento aparece en la entrada. Cuando recibas y vuelvas a enviar manualmente los elementos de la conversación, conserva la posición del elemento para que el modelo vea las mismas herramientas en el mismo punto de la conversación.
API de agentes
La API de agentes carga las definiciones de funciones de forma anticipada de manera predeterminada. Para diferir la carga de funciones específicas, incluye { "type": "tool_search" } en agent.tools y establece defer_loading: true en cada función que quieras que el agente descubra según la necesite. Agregar tool_search no difiere la carga de todas las funciones.
Tu solicitud de sesión sigue proporcionando la definición completa de la función, incluidos su nombre, descripción y esquema de argumentos. La búsqueda de herramientas cambia el momento en que esa definición llega al modelo. Tras el descubrimiento, tu aplicación maneja la llamada a la función y devuelve su resultado como de costumbre. Consulta Funciones para obtener información sobre el manejo de resultados.
Configura OPENAI_API_KEY antes de ejecutar este ejemplo:
import OpenAI from "openai";
const client = new OpenAI();
const result = await client.beta.agents.sessions.create({
agent: {
model: "gpt-6-astra",
tools: [
{
type: "tool_search",
},
{
type: "function",
name: "lookup_account",
description: "Find an account by its account number.",
parameters: {
type: "object",
properties: {
account_id: {
type: "string",
},
},
required: ["account_id"],
additionalProperties: false,
},
defer_loading: true,
},
],
},
environment: {
type: "none",
},
input: [
{
role: "user",
content: [
{
type: "input_text",
text: "Look up account 42.",
},
],
},
],
});
console.log(result.id);Elige una estrategia de carga de funciones
| Estrategia | Configuración | Útil para | Contrapartida |
|---|---|---|---|
| Carga anticipada | Omite defer_loading o establécelo en false. | Un conjunto pequeño de funciones o funciones necesarias para la mayoría de las tareas. | Las definiciones que no se usan ocupan espacio en el contexto. Cambiar una definición puede invalidar un prefijo almacenado en caché. |
| Carga diferida | Establece defer_loading: true e incluye tool_search. | Un catálogo amplio en el que cada tarea necesita solo unas pocas funciones. | El descubrimiento agrega un paso y depende de encontrar la herramienta pertinente. |
Se pueden combinar funciones de carga anticipada y diferida en una sesión de la API de agentes, pero por lo general no se recomienda. Asigna nombres y descripciones claros a las funciones de carga diferida. Compara la finalización de tareas, el consumo de tokens de entrada y la latencia con solicitudes representativas antes de elegir una estrategia predeterminada.
Herramientas MCP y de complementos
Las herramientas MCP usan el descubrimiento automático en la API de agentes cuando el modelo y el proveedor admiten la búsqueda de herramientas. El entorno de ejecución difiere la carga de las herramientas MCP y agrega la búsqueda de herramientas cuando hay herramientas de carga diferida disponibles que se pueden buscar. Esto se aplica a los MCP remotos, los MCP del ejecutor y las herramientas MCP proporcionadas por complementos.
No necesitas agregar { "type": "tool_search" } solo para las herramientas MCP ni establecer una bandera defer_loading de nivel de función en un servidor MCP. Configura el servidor mediante Conexiones MCP. La configuración de la API Responses descrita anteriormente en esta guía no se aplica a los servidores MCP de la API de agentes.
Guías relacionadas
- Usa la llamada a funciones para definir funciones invocables y herramientas personalizadas.
- Consulta Uso de herramientas para obtener una visión general de las herramientas disponibles en Responses.