Claude peut nativement exécuter plusieurs outils en même temps, mais certaines versions n'en tirent pas autant parti que vous pourriez le souhaiter. Vous pouvez considérablement augmenter les chances que Claude effectue plusieurs appels d'outils dans un seul message en implémentant un outil de traitement par lot.

Lorsque Claude renvoie des parties d'utilisation d'outils dans un message, il peut y avoir plusieurs demandes d'outils dans une seule réponse. Par exemple, si vous demandez « Quelle est la date du 12 mars 2025 + 50 jours ? Et quelle est la date du 12 mars 2025 + 100 jours ? », Claude pourrait théoriquement renvoyer deux parties d'utilisation d'outils distinctes - une pour chaque calcul. Ces opérations sont entièrement parallélisables puisqu'elles ne dépendent pas l'une de l'autre.
Cependant, Claude n'essaie pas toujours de paralléliser les appels d'outils autant que vous pourriez l'attendre. Au lieu d'effectuer les deux appels simultanément, il les effectue souvent de manière séquentielle, ce qui est moins efficace.
Comment fonctionne l'outil de traitement par lot
L'outil de traitement par lot est implémenté comme n'importe quel autre outil - vous avez besoin d'une spécification d'outil et d'une fonction pour gérer son appel. L'idée clé est de créer un outil capable d'invoquer plusieurs autres outils simultanément.
Voici la structure de base de la spécification de l'outil de traitement par lot :
{
"name": "batch_tool",
"description": "Invoke multiple other tool calls simultaneously",
"input_schema": {
"type": "object",
"properties": {
"invocations": {
"type": "array",
"description": "The tool calls to invoke",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the tool to invoke"
},
"arguments": {
"type": "string",
"description": "The arguments to the tool, encoded as a JSON string"
}
},
"required": ["name", "arguments"]
}
}
},
"required": ["invocations"]
}
}L'outil prend une liste d'invocations, où chaque invocation contient le nom d'un outil à appeler et ses arguments (encodés sous forme de chaîne JSON).
Implémentation
L'implémentation de l'outil de traitement par lot implique deux fonctions principales :
La fonction run_batch
def run_batch(tool_input):
batch_output = []
for invocation in tool_input["invocations"]:
tool_name = invocation["name"]
args = json.loads(invocation["arguments"])
tool_output = run_tool(tool_name, args)
batch_output.append({"tool_name": tool_name, "output": tool_output})
return batch_outputCette fonction parcourt chaque invocation, extrait le nom de l'outil et les arguments, appelle l'outil approprié en utilisant la fonction run_tool existante, et collecte tous les résultats.
Ajout à run_tool
Vous devez également ajouter un cas à votre fonction principale run_tool :
elif tool_name == "batch_tool":
return run_batch(tool_input)Notez que contrairement aux autres outils, vous transmettez tool_input directement sans utiliser l'opérateur splat (**), car l'outil de traitement par lot doit gérer la structure d'entrée brute.
Résultats
Lorsque vous implémentez l'outil de traitement par lot et exécutez la même requête de calcul de date, au lieu de voir deux appels d'outils distincts dans le journal des messages, vous verrez un seul appel à l'outil de traitement par lot. Cet appel unique contient les deux calculs de date en tant que sous-invocations, parallélisant ainsi efficacement les opérations.
L'outil de traitement par lot est particulièrement utile lorsque vous avez plusieurs opérations indépendantes qui peuvent être exécutées simultanément. En « trompant » Claude pour qu'il utilise ce modèle, vous pouvez améliorer considérablement l'efficacité de vos flux de travail d'appel d'outils.