L'outil de recherche d'outils permet à Claude de travailler avec des centaines ou des milliers d'outils en les découvrant et en les chargeant à la demande. Au lieu de charger toutes les définitions d'outils dans la fenêtre de contexte dès le départ, Claude recherche dans votre catalogue d'outils (y compris les noms d'outils, les descriptions, les noms d'arguments et les descriptions d'arguments) et charge uniquement les outils dont il a besoin.
Le chargement initial de toutes les définitions d'outils entraîne deux problèmes à mesure qu'une bibliothèque d'outils s'agrandit :
La recherche d'outils est disponible en disponibilité générale sur l'API Claude. Pour les modèles pris en charge, consultez Compatibilité des modèles.
Pour comprendre les défis de mise à l'échelle que la recherche d'outils résout, consultez Advanced tool use. Le chargement à la demande de la recherche d'outils est également une application du principe plus large de récupération juste-à-temps décrit dans Effective context engineering.
La recherche d'outils s'exécute en tant qu'outil côté serveur, mais vous pouvez également implémenter votre propre recherche d'outils côté client. Consultez Implémentation personnalisée de la recherche d'outils pour plus de détails.
Partagez vos commentaires sur cette fonctionnalité via le formulaire de commentaires.
Cette fonctionnalité est éligible à la Zero Data Retention (ZDR). Lorsque votre organisation dispose d'un accord ZDR, les données envoyées via cette fonctionnalité ne sont pas stockées après le retour de la réponse de l'API.
Sur Amazon Bedrock, la recherche d'outils côté serveur est disponible uniquement via l'API InvokeModel, et non via l'API Converse.
Sur Claude Platform on AWS, la recherche d'outils côté serveur fonctionne de manière identique à l'API Claude. Claude Platform on AWS utilise directement l'API Messages d'Anthropic, il n'y a donc pas de distinction entre InvokeModel et Converse.
Les deux variantes de recherche d'outils sont disponibles sur les modèles suivants :
| Modèle | Versions de l'outil |
|---|---|
| Claude Fable 5 (claude-fable-5) | tool_search_tool_regex_20251119, tool_search_tool_bm25_20251119 |
| Claude Mythos 5 (claude-mythos-5) | tool_search_tool_regex_20251119, tool_search_tool_bm25_20251119 |
| Claude Opus 4.8 (claude-opus-4-8) | tool_search_tool_regex_20251119, tool_search_tool_bm25_20251119 |
| Claude Opus 4.7 (claude-opus-4-7) | tool_search_tool_regex_20251119, tool_search_tool_bm25_20251119 |
| Claude Opus 4.6 (claude-opus-4-6) | tool_search_tool_regex_20251119, tool_search_tool_bm25_20251119 |
| Claude Sonnet 4.6 (claude-sonnet-4-6) | tool_search_tool_regex_20251119, tool_search_tool_bm25_20251119 |
| Claude Opus 4.5 (claude-opus-4-5-20251101) | tool_search_tool_regex_20251119, tool_search_tool_bm25_20251119 |
| Claude Sonnet 4.5 (claude-sonnet-4-5-20250929) | tool_search_tool_regex_20251119, tool_search_tool_bm25_20251119 |
| Claude Haiku 4.5 (claude-haiku-4-5-20251001) | tool_search_tool_regex_20251119, tool_search_tool_bm25_20251119 |
Claude Opus 4.1 et les modèles antérieurs ne prennent pas en charge l'outil de recherche d'outils.
Il existe deux variantes de recherche d'outils :
tool_search_tool_regex_20251119) : Claude construit des motifs regex pour rechercher des outils.tool_search_tool_bm25_20251119) : Claude utilise des requêtes en langage naturel pour rechercher des outils.Lorsque vous activez l'outil de recherche d'outils :
tool_search_tool_regex_20251119 ou tool_search_tool_bm25_20251119) dans votre liste tools.tools et définissez defer_loading: true sur les outils qui ne doivent pas être chargés dès le départ. Au moins un outil, normalement l'outil de recherche d'outils lui-même, doit rester non différé.tool_reference (jusqu'à 5 par défaut).L'exemple suivant inclut l'outil de recherche d'outils et deux outils différés :
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=2048,
messages=[{"role": "user", "content": "What is the weather in San Francisco?"}],
tools=[
{"type": "tool_search_tool_regex_20251119", "name": "tool_search_tool_regex"},
{
"name": "get_weather",
"description": "Get the weather at a specific location",
"input_schema": {
"type": "object",
"properties": {
"location": {"type": "string"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
},
"required": ["location"],
},
"defer_loading": True,
},
{
"name": "search_files",
"description": "Search through files in the workspace",
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string"},
"file_types": {"type": "array", "items": {"type": "string"}},
},
"required": ["query"],
},
"defer_loading": True,
},
],
)
print(response)Claude recherche dans le catalogue, découvre get_weather et l'appelle. La réponse se termine par stop_reason: "tool_use". Exécutez l'outil découvert et renvoyez un tool_result comme indiqué dans Gérer les appels d'outils. La section Format de réponse montre les blocs que vous recevez et ce qu'il faut envoyer ensuite.
L'outil de recherche d'outils a deux variantes :
{
"type": "tool_search_tool_regex_20251119",
"name": "tool_search_tool_regex"
}{
"type": "tool_search_tool_bm25_20251119",
"name": "tool_search_tool_bm25"
}Format de requête de la variante regex : regex Python, pas de langage naturel
Avec tool_search_tool_regex_20251119, Claude écrit des motifs Python re.search(), et non des requêtes en langage naturel. La correspondance est insensible à la casse. Les motifs courants incluent les suivants :
"weather" : correspond aux noms et descriptions d'outils contenant « weather »"get_.*_data" : correspond à des outils tels que get_user_data et get_weather_data"database.*query|query.*database" : correspond à l'un ou l'autre ordre des motsLongueur maximale du motif : 200 caractères
Format de requête de la variante BM25 : langage naturel
Avec tool_search_tool_bm25_20251119, Claude effectue des recherches avec des requêtes en langage naturel. Longueur maximale de la requête : 500 caractères.
Marquez les outils pour un chargement à la demande en ajoutant defer_loading: true :
{
"name": "get_weather",
"description": "Get current weather for a location",
"input_schema": {
"type": "object",
"properties": {
"location": { "type": "string" },
"unit": { "type": "string", "enum": ["celsius", "fahrenheit"] }
},
"required": ["location"]
},
"defer_loading": true
}defer_loading contrôle ce qui entre dans la fenêtre de contexte, et non ce que vous envoyez dans la requête :
tools à chaque requête, y compris les outils différés. L'API en a besoin côté serveur pour exécuter la recherche et développer les blocs tool_reference.defer_loading sont chargés immédiatement dans le contexte.defer_loading: true sont chargés uniquement lorsque Claude les découvre via la recherche.defer_loading: true sur l'outil de recherche d'outils lui-même.Les deux variantes de recherche d'outils (regex et bm25) recherchent dans les noms d'outils, les descriptions, les noms d'arguments et les descriptions d'arguments.
En interne, l'API exclut les outils différés du préfixe de l'invite système. Lorsque Claude découvre un outil différé via la recherche d'outils, l'API ajoute un bloc tool_reference en ligne dans la conversation, puis le développe en définition d'outil complète avant de le transmettre à Claude. Le préfixe reste intact, de sorte que la mise en cache des prompts est préservée. La grammaire du mode strict (les règles qui contraignent la sortie des appels d'outils à correspondre à vos schémas) est construite à partir de l'ensemble complet des outils, de sorte que defer_loading et le mode strict se combinent sans recompilation de la grammaire.
Lorsque Claude utilise l'outil de recherche d'outils, la réponse inclut les types de blocs suivants :
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "I'll search for tools to help with the weather information."
},
{
"type": "server_tool_use",
"id": "srvtoolu_01ABC123",
"name": "tool_search_tool_regex",
"input": {
"pattern": "weather"
}
},
{
"type": "tool_search_tool_result",
"tool_use_id": "srvtoolu_01ABC123",
"content": {
"type": "tool_search_tool_search_result",
"tool_references": [{ "type": "tool_reference", "tool_name": "get_weather" }]
}
},
{
"type": "text",
"text": "I found a weather tool. Let me get the weather for San Francisco."
},
{
"type": "tool_use",
"id": "toolu_01XYZ789",
"name": "get_weather",
"input": { "location": "San Francisco", "unit": "fahrenheit" }
}
],
"stop_reason": "tool_use"
}server_tool_use : l'appel de Claude à l'outil de recherche d'outils. La recherche s'exécute sur les serveurs d'Anthropic. Ne renvoyez jamais de tool_result pour son ID srvtoolu_....tool_search_tool_result : les résultats de la recherche, dans un objet imbriqué tool_search_tool_search_result. Conservez-le tel quel dans l'historique des messages.tool_references : un tableau d'objets tool_reference pointant vers les outils découverts. L'API les développe pour Claude. Vous ne les développez jamais vous-même.tool_use : l'appel de Claude à un outil découvert. Exécutez-le et renvoyez un tool_result exactement comme dans l'utilisation d'outils standard.L'API développe automatiquement les blocs tool_reference en définitions d'outils complètes avant de les montrer à Claude. Vous n'avez pas besoin de gérer ce développement vous-même, tant que vous fournissez toutes les définitions d'outils correspondantes dans le paramètre tools.
Lors de la requête suivante, renvoyez le contenu de l'assistant sans modification, y compris les blocs server_tool_use et tool_search_tool_result. Ajoutez votre tool_result pour l'outil découvert dans un message utilisateur, et envoyez le même tableau tools : l'outil de recherche plus chaque définition différée. Ne renvoyez pas de tool_result pour l'ID srvtoolu_... : l'API rejette la requête. L'API développe les blocs tool_reference tout au long de l'historique de la conversation, de sorte que Claude peut réutiliser les outils découverts lors des tours suivants sans effectuer de nouvelle recherche. Une recherche qui ne correspond à rien renvoie un tool_search_tool_search_result avec un tableau tool_references vide, et non une erreur.
Si vos outils proviennent de serveurs MCP via le connecteur MCP, vous ne définissez pas defer_loading sur les définitions d'outils individuelles. À la place, définissez-le une seule fois dans le default_config de l'entrée mcp_toolset pour l'ensemble du serveur, ou par outil dans ses configs. Consultez Configuration de l'ensemble d'outils MCP.
Vous pouvez implémenter votre propre logique de recherche d'outils (par exemple, en utilisant des « embeddings » (plongements vectoriels) ou une recherche sémantique) en renvoyant des blocs tool_reference depuis un outil personnalisé. Lorsque Claude appelle votre outil de recherche personnalisé, renvoyez un tool_result standard avec des blocs tool_reference dans le tableau de contenu :
{
"type": "tool_result",
"tool_use_id": "toolu_your_tool_id",
"content": [{ "type": "tool_reference", "tool_name": "discovered_tool_name" }]
}Chaque outil référencé doit avoir une définition d'outil correspondante dans le paramètre tools de niveau supérieur, normalement avec defer_loading: true. Cela vous permet d'utiliser des méthodes de recherche que les variantes intégrées ne fournissent pas, telles que la récupération basée sur les embeddings, et l'API développe les blocs tool_reference renvoyés de la même manière.
Le format tool_search_tool_result présenté dans la section Format de réponse est le format côté serveur utilisé en interne par la recherche d'outils intégrée d'Anthropic. Pour les implémentations personnalisées côté client, utilisez toujours le format tool_result standard avec des blocs de contenu tool_reference comme indiqué dans l'exemple précédent.
Pour un exemple complet utilisant des embeddings, consultez la recette recherche d'outils avec embeddings.
Les exemples d'utilisation d'outils
fonctionnent avec la recherche d'outils : lorsque Claude découvre un outil différé, l'API développe
ses input_examples en même temps que sa définition.
Ces erreurs empêchent l'API de traiter la requête :
Tous les outils sont différés :
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "At least one tool must have defer_loading=false. All tools cannot be deferred."
}
}Définition d'outil manquante :
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "Tool reference 'unknown_tool' not found in available tools"
}
}Lorsqu'une opération de recherche d'outils échoue pendant l'exécution, l'API renvoie une réponse 200 avec l'erreur dans le corps :
{
"type": "tool_search_tool_result",
"tool_use_id": "srvtoolu_01ABC123",
"content": {
"type": "tool_search_tool_result_error",
"error_code": "invalid_tool_input",
"error_message": "Invalid regular expression pattern: missing ) at position 1"
}
}Le champ error_code a quatre valeurs possibles :
invalid_tool_input : l'entrée de recherche était invalide, par exemple un motif regex mal formé ou un motif dépassant la limite de 200 caractèresunavailable : la recherche n'a pas pu s'exécuter, par exemple parce qu'elle a expiré ou que le service était indisponibletoo_many_requests : limite de débit dépassée pour les opérations de recherche d'outilsexecution_time_exceeded : la recherche a dépassé sa limite de temps d'exécutionPour savoir comment defer_loading préserve la mise en cache des prompts, consultez Utilisation d'outils avec la mise en cache des prompts.
Un outil avec defer_loading: true ne peut pas également porter cache_control : l'API renvoie une erreur 400. Placez le point d'arrêt de cache sur un outil non différé.
Lorsque le streaming est activé, vous recevrez les événements de recherche d'outils dans le cadre du flux :
event: content_block_start
data: {"type": "content_block_start", "index": 1, "content_block": {"type": "server_tool_use", "id": "srvtoolu_xyz789", "name": "tool_search_tool_regex"}}
// Search pattern streamed
event: content_block_delta
data: {"type": "content_block_delta", "index": 1, "delta": {"type": "input_json_delta", "partial_json": "{\"pattern\":\"weather\"}"}}
// Pause while search executes
// Search results streamed
event: content_block_start
data: {"type": "content_block_start", "index": 2, "content_block": {"type": "tool_search_tool_result", "tool_use_id": "srvtoolu_xyz789", "content": {"type": "tool_search_tool_search_result", "tool_references": [{"type": "tool_reference", "tool_name": "get_weather"}]}}}
// Claude continues with discovered toolsVous pouvez inclure l'outil de recherche d'outils dans l'API Messages Batches.
defer_loading: true par requêteUtilisez la recherche d'outils lorsque l'une des conditions suivantes s'applique :
L'appel d'outils standard, sans recherche d'outils, est plus adapté lorsque vous avez moins de 10 outils, que chaque outil est utilisé dans chaque requête, ou que vos définitions d'outils sont petites (moins de 100 tokens au total).
github_, slack_) afin qu'une seule recherche corresponde à l'ensemble du groupe.La recherche d'outils n'est pas comptabilisée comme un outil serveur distinct. L'objet usage.server_tool_use de la réponse ne comporte pas de champ de recherche d'outils, et les définitions d'outils que la recherche charge dans le contexte sont comptabilisées comme des tokens d'entrée, comme toute autre définition d'outil.
Permettez à Claude de stocker et de récupérer des informations entre les conversations en implémentant les opérations de fichiers de l'outil de mémoire dans votre application.
Répertoire des outils fournis par Anthropic et référence des propriétés optionnelles de définition d'outils.
Configurez des ensembles d'outils MCP avec chargement différé.
Mettez en cache les définitions d'outils entre les tours et comprenez ce qui invalide votre cache.
Spécifiez des schémas d'outils, rédigez des descriptions efficaces et contrôlez quand Claude appelle vos outils.
Was this page helpful?