For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navigation principale
Theme

Recherche d’outils

Différez le chargement des outils pour que les modèles n’importent que les définitions dont ils ont besoin au moment de l’exécution.

La recherche d’outils permet au modèle de rechercher des outils et de les charger dans son contexte à mesure qu’il en a besoin. Vous évitez ainsi de charger toutes les définitions d’outils dès le départ, ce qui peut réduire la consommation totale de tokens et le coût global. Pour optimiser les coûts et la latence, la recherche d’outils est conçue pour préserver le cache du modèle. Les nouveaux outils que découvre le modèle sont ajoutés à la fin de sa fenêtre de contexte.

Dans l’API Responses, seuls gpt-5.4 et les modèles ultérieurs prennent en charge tool_search.

La configuration et les exemples qui suivent utilisent l’API Responses. Pour le chargement des fonctions au sein d’une session et la découverte automatique des outils MCP, consultez la section API Agents.

Pour activer la recherche d’outils dans l’API Responses, procédez en deux étapes :

  1. Ajoutez tool_search en tant qu’outil dans votre tableau tools.
  2. Si vous utilisez des fonctions, indiquez defer_loading: true pour celles dont vous souhaitez différer le chargement. Si vous utilisez des serveurs MCP, indiquez defer_loading: true dans la définition de l’outil correspondant au serveur MCP.

Utilisez des espaces de noms lorsque c’est possible

La recherche d’outils prend en charge le chargement différé des fonctions, des espaces de noms et des serveurs MCP. Nous vous recommandons de privilégier les espaces de noms ou les serveurs MCP lorsque c’est possible. Nos modèles ont principalement été entraînés à y rechercher des outils, et les économies de tokens y sont généralement plus importantes.

Dans un espace de noms, defer_loading s’applique aux fonctions qu’il contient, et non à l’objet qui représente l’espace de noms lui-même.

Au début d’une requête, le modèle voit le nom et la description de chaque élément qu’il peut rechercher. Pour un espace de noms ou un serveur MCP, seuls le nom et la description de l’espace ou du serveur sont visibles au départ. Le modèle accède aux détails de chaque fonction lorsque la recherche d’outils la charge. Pour une fonction déclarée individuellement en chargement différé, le modèle voit d’emblée son nom et sa description. En pratique, c’est donc surtout le chargement du schéma des paramètres qui est différé.

Pour économiser autant de tokens que possible, regroupez les fonctions à chargement différé dans des espaces de noms ou sur des serveurs MCP. Donnez à chacun une description claire qui présente les fonctions disponibles dans leur ensemble. Le modèle peut ainsi cibler sa recherche et charger uniquement les fonctions pertinentes. Dans la mesure du possible, limitez chaque espace de noms à moins de 10 fonctions pour optimiser la consommation de tokens et les performances du modèle.

{
    "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"
      }
    ]
  }

Un espace de noms peut contenir à la fois des outils à chargement différé et des outils à chargement immédiat. Le modèle peut appeler immédiatement les outils pour lesquels defer_loading: true n’est pas spécifié. Il charge les autres outils du même espace de noms via la recherche d’outils.

Modes de recherche d’outils

Choisissez l’un des deux modes de recherche d’outils :

  • Recherche d’outils hébergée : OpenAI effectue la recherche parmi les outils à chargement différé que vous avez déclarés dans la requête et renvoie les outils chargés dans la même réponse.
  • Recherche d’outils côté client : le modèle émet un tool_search_call, votre application effectue la recherche, puis vous renvoyez le tool_search_output correspondant.

Commencez par la recherche hébergée si vous connaissez déjà les outils parmi lesquels effectuer la recherche au moment de créer la requête. Utilisez la recherche côté client si la découverte des outils dépend de l’état du projet, de celui du tenant ou d’un autre système que votre application contrôle.

Recherche d’outils hébergée

La recherche hébergée est la solution la plus simple si vous connaissez déjà la liste complète des fonctions, des espaces de noms ou des serveurs MCP parmi lesquels le modèle doit effectuer ses recherches. Déclarez-les dès le départ, ajoutez {"type": "tool_search"} et laissez l’API choisir les outils à charger.

Configuration de la recherche d’outils hébergée
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 le modèle détermine qu’il a besoin d’un outil à chargement différé, la réponse contient deux éléments de sortie supplémentaires avant l’appel de fonction :

  • tool_search_call consigne l’étape de recherche hébergée.
  • tool_search_output contient les outils chargés, que le modèle peut désormais appeler.
Réponse de la recherche d’outils hébergée
[
  {
    "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 mode hébergé, execution vaut server et call_id vaut null.

Pour les tâches plus complexes, le modèle peut aussi charger plusieurs espaces de noms ou serveurs MCP dans un même tool_search_call. Par exemple, si une tâche nécessite des fonctions issues de plusieurs espaces de noms, le modèle peut choisir d’effectuer la recherche dans ces espaces et de les charger ensemble avant d’appeler les fonctions.

Recherche d’outils côté client

Avec la recherche d’outils côté client, votre application contrôle entièrement la découverte des outils. Ce mode est utile lorsque les outils disponibles dépendent d’informations qu’il serait difficile de déclarer dans la liste tools initiale.

Configurez l’outil tool_search avec execution: "client" et un schéma décrivant les arguments de recherche attendus par votre application :

Configuration de la recherche d’outils côté client
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",
    previous_response_id=first_response.id,
    input=[
        {
            "type": "tool_search_output",
            "execution": "client",
            "call_id": search_call.call_id,
            "status": "completed",
            "tools": loaded_tools,
        },
    ],
)

print(second_response.output)

Au premier tour, le modèle émet un tool_search_call et s’arrête là :

Appel de recherche d’outils côté client
[
  {
    "type": "tool_search_call",
    "execution": "client",
    "call_id": "call_abc123",
    "status": "completed",
    "arguments": {
      "goal": "Find the shipping ETA tool for order_42."
    }
  }
]

Votre application effectue ensuite la recherche et renvoie un tool_search_output contenant les outils qu’elle souhaite charger :

Renvoi de tool_search_output
[
  {
    "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
        }
      }
    ]
  }
]

Au tour suivant, le modèle peut appeler l’outil chargé comme une fonction ordinaire :

Appel de la fonction chargée
[
  {
    "type": "function_call",
    "name": "get_shipping_eta",
    "namespace": "get_shipping_eta",
    "call_id": "call_xyz456",
    "arguments": "{\"order_id\":\"order_42\"}"
  }
]

En mode client, execution vaut client et call_id a une valeur définie. Reprenez la valeur de call_id fournie par le tool_search_call dans votre tool_search_output.

Utilisation avancée

Rédigez des descriptions claires pour les espaces de noms

Décrivez clairement le cas d’usage de chaque espace de noms. Le modèle s’appuie sur cette description pour décider quand charger une partie des fonctions de l’espace de noms. Gardez la description concise. Réservez les détails aux descriptions des fonctions à chargement différé, que le modèle ne charge que lorsqu’il en a besoin.

Identifiez les outils chargés

tool_search_output.tools contient la liste des outils que le modèle a chargés dynamiquement. Le modèle peut appeler chacun de ces outils lors des tours suivants. En mode client, vous n’avez donc pas besoin de recharger le même outil d’un tour à l’autre. Le modèle n’a pas accès aux outils absents de ce tableau. Pour désactiver un outil chargé, vous pouvez le retirer de l’élément tool_search_output dans lequel vous définissez l’ensemble des outils chargés. Toute modification de cet ensemble invalide le cache du modèle à partir de ce point.

Injection avancée d’outils

La plupart des intégrations déclarent les outils dans le paramètre tools de la requête. La recherche d’outils côté client permet également à votre application de renvoyer des outils qui ne figuraient pas dans la requête initiale. Dans ce cas avancé, validez soigneusement les schémas renvoyés et ne rendez accessibles que des définitions d’outils de confiance.

Recherche d’outils et mise en cache

Tous les outils sont chargés à la fin de la fenêtre de contexte du modèle, aussi bien en mode hébergé qu’en mode client. Le modèle conserve ainsi son cache d’une requête à l’autre, ce qui réduit les coûts globaux et accélère le traitement.

Ajoutez des outils à un point précis de l’entrée

Dans les workflows avancés, vous pouvez utiliser un élément d’entrée additional_tools pour rendre des outils disponibles à un point précis de la conversation. C’est utile lorsque votre application charge des outils en dehors du processus habituel de recherche ou doit conserver l’ordre dans lequel les outils ont été ajoutés lors d’une réponse précédente.

Attribuez à role la valeur developer et placez les outils à ajouter dans le tableau tools de l’élément :

{
    "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
        }
      }
    ]
  }

Les outils d’un élément additional_tools ne deviennent disponibles qu’après l’apparition de cet élément dans l’entrée. Lorsque vous retransmettez manuellement les éléments de la conversation, conservez la position de cet élément pour que le modèle voie les mêmes outils au même point de la conversation.

API Agents

Par défaut, l’API Agents charge immédiatement les définitions des fonctions. Pour différer le chargement de certaines fonctions, ajoutez { "type": "tool_search" } dans agent.tools et indiquez defer_loading: true pour chaque fonction que l’agent doit découvrir à la demande. L’ajout de tool_search ne diffère pas automatiquement le chargement de toutes les fonctions.

La requête de session fournit toujours la définition complète de la fonction, y compris son nom, sa description et le schéma de ses arguments. La recherche d’outils change le moment où le modèle reçoit cette définition. Une fois la fonction découverte, votre application traite l’appel et renvoie le résultat comme d’habitude. Pour en savoir plus sur le traitement des résultats, consultez le guide Fonctions.

Définissez OPENAI_API_KEY avant d’exécuter cet exemple :

Chargement des fonctions à la demande
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);

Choisissez une stratégie de chargement des fonctions

Stratégie Configuration Cas d’usage Compromis
Chargement immédiat Omettez defer_loading ou attribuez-lui la valeur false. Un petit nombre de fonctions, ou des fonctions nécessaires à la plupart des tâches. Les définitions inutilisées occupent de la place dans le contexte. La modification d’une définition peut invalider un préfixe mis en cache.
Chargement différé Indiquez defer_loading: true et ajoutez tool_search. Un vaste catalogue dont seules quelques fonctions sont nécessaires pour chaque tâche. La découverte ajoute une étape et suppose que la recherche trouve l’outil pertinent.

L’API Agents permet de combiner chargement immédiat et chargement différé dans une même session, mais cette approche est généralement déconseillée. Donnez aux fonctions à chargement différé des noms et des descriptions clairs. Avant de choisir une stratégie par défaut, utilisez des requêtes représentatives pour comparer la réussite des tâches, la consommation de tokens en entrée et la latence.

Outils MCP et outils fournis par des plugins

Dans l’API Agents, la découverte des outils MCP est automatique lorsque le modèle et le fournisseur prennent en charge la recherche d’outils. L’environnement d’exécution diffère le chargement des outils MCP et ajoute la recherche d’outils dès que des outils à chargement différé peuvent faire l’objet d’une recherche. Cela s’applique aux serveurs MCP distants, aux serveurs MCP des exécuteurs et aux outils MCP fournis par des plugins.

Pour les outils MCP seuls, vous n’avez pas besoin d’ajouter { "type": "tool_search" } ni de définir l’option defer_loading au niveau des fonctions sur un serveur MCP. Pour configurer le serveur, consultez le guide Connexions MCP. La configuration de l’API Responses décrite plus haut ne s’applique pas aux serveurs MCP de l’API Agents.

Guides associés

  • Utilisez l’appel de fonction pour définir des fonctions que le modèle peut appeler et des outils personnalisés.
  • Consultez le guide Utilisation des outils pour une vue d’ensemble des outils disponibles dans l’API Responses.