Files
claude-code-best-practice/fr/reports/claude-advanced-tool-use.md
T
2026-06-02 23:24:21 +02:00

421 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Patterns d'usage avancé des outils de Claude
Fonctionnalités au niveau API (désormais GA) qui réduisent la consommation de tokens, la latence et améliorent la précision des outils. Sorties avec Opus/Sonnet 4.6.
<table width="100%">
<tr>
<td><a href="../">← Retour à Claude Code Best Practice</a></td>
<td align="right"><img src="../../!/claude-jumping.svg" alt="Claude" width="60" /></td>
</tr>
</table>
## Table des matières
1. [Vue d'ensemble](#vue-densemble)
2. [Appels d'outils programmatiques (PTC)](#appels-doutils-programmatiques-ptc)
3. [Filtrage dynamique pour Web Search/Fetch](#filtrage-dynamique-pour-web-searchfetch)
4. [Outil de recherche d'outils (Tool Search Tool)](#outil-de-recherche-doutils-tool-search-tool)
5. [Exemples d'usage d'outils (Tool Use Examples)](#exemples-dusage-doutils-tool-use-examples)
6. [Pertinence pour Claude Code](#pertinence-pour-claude-code)
---
## Vue d'ensemble
| Fonctionnalité | Problème résolu | Économie de tokens | Disponibilité |
|---------|---------------|---------------|--------------|
| Appels d'outils programmatiques | Les boucles d'agent multi-étapes brûlent des tokens en allers-retours | ~37% de réduction | API, Foundry (GA) |
| Filtrage dynamique | Les résultats de web search/fetch gonflent le contexte de contenu non pertinent | ~24% de tokens d'entrée en moins | API, Foundry (GA) |
| Tool Search Tool | Trop de définitions d'outils gonflent le contexte | ~85% de réduction | API, Foundry (GA) |
| Tool Use Examples | Le schéma seul ne peut exprimer les patterns d'usage | 72% → 90% de précision | API, Foundry (GA) |
Toutes les fonctionnalités sont **disponibles en général (GA)** depuis le 18 février 2026.
**Empilement stratégique** — commence par ton plus gros goulot d'étranglement :
- Gonflement du contexte par les définitions d'outils → Tool Search Tool
- Gros résultats intermédiaires → Appels d'outils programmatiques
- Bruit de web search → Filtrage dynamique
- Erreurs de paramètres → Tool Use Examples
---
## Appels d'outils programmatiques (PTC)
<img src="../../reports/assets/programmatic-tool-calling-diagram.svg" alt="Diagramme PTC — Appels d'outils traditionnels vs programmatiques" width="100%" />
### Le changement de paradigme
**Avant (appels d'outils traditionnels) :**
```
Prompt utilisateur → Claude → Appel d'outil 1 → Réponse 1 → Claude → Appel d'outil 2 → Réponse 2 → Claude → Appel d'outil 3 → Réponse 3 → Claude → Réponse finale
```
Chaque appel d'outil requiert un aller-retour complet du modèle. 3 outils = 3 passes d'inférence.
**Après (appels d'outils programmatiques) :**
```
Prompt utilisateur → Claude → écrit un script Python → Le script appelle Outil 1, Outil 2, Outil 3 en interne → stdout → Claude → Réponse finale
```
Claude écrit du code qui orchestre tous les outils. Seul le `stdout` final entre dans la fenêtre de contexte. 3 outils = 1 passe d'inférence.
### Comment ça fonctionne
1. Tu définis des outils avec `allowed_callers: ["code_execution_20250825"]`
2. Claude écrit du Python qui appelle ces outils comme des fonctions async dans un sandbox
3. Quand une fonction d'outil est appelée, le sandbox se met en pause et l'API renvoie un bloc `tool_use`
4. Tu fournis le résultat de l'outil — il va au **code en cours d'exécution**, pas au contexte de Claude
5. Le code reprend, traite les résultats, appelle d'autres outils si besoin
6. Seul le `stdout` de l'exécution finale atteint Claude
### Configuration clé
```json
{
"tools": [
{
"type": "code_execution_20250825",
"name": "code_execution"
},
{
"name": "query_database",
"description": "Execute a SQL query. Returns rows as JSON objects with fields: id (str), name (str), revenue (float).",
"input_schema": {
"type": "object",
"properties": {
"sql": { "type": "string", "description": "SQL query to execute" }
},
"required": ["sql"]
},
"allowed_callers": ["code_execution_20250825"]
}
]
}
```
### Le champ `allowed_callers`
| Valeur | Comportement |
|-------|----------|
| `["direct"]` | Appels d'outils traditionnels uniquement (défaut si omis) |
| `["code_execution_20250825"]` | Appelable uniquement depuis le sandbox Python |
| `["direct", "code_execution_20250825"]` | Les deux modes disponibles |
**Recommandation :** Choisis un seul mode par outil, pas les deux. Cela donne à Claude un guidage plus clair.
### Le champ `caller` dans les réponses
Chaque bloc d'usage d'outil inclut un champ `caller` pour que tu saches comment il a été invoqué :
```json
// Direct (traditionnel)
{ "caller": { "type": "direct" } }
// Programmatique (depuis l'exécution de code)
{ "caller": { "type": "code_execution_20250825", "tool_id": "srvtoolu_abc123" } }
```
### Patterns avancés
**Traitement par lots** — traiter N éléments en 1 passe d'inférence :
```python
regions = ["West", "East", "Central", "North", "South"]
results = {}
for region in regions:
data = await query_database(f"SELECT SUM(revenue) FROM sales WHERE region='{region}'")
results[region] = data[0]["revenue"]
top = max(results.items(), key=lambda x: x[1])
print(f"Top region: {top[0]} with ${top[1]:,}")
```
**Terminaison anticipée** — s'arrêter dès que les critères de succès sont remplis :
```python
endpoints = ["us-east", "eu-west", "apac"]
for endpoint in endpoints:
status = await check_health(endpoint)
if status == "healthy":
print(f"Found healthy endpoint: {endpoint}")
break
```
**Sélection conditionnelle d'outil :**
```python
file_info = await get_file_info(path)
if file_info["size"] < 10000:
content = await read_full_file(path)
else:
content = await read_file_summary(path)
print(content)
```
**Filtrage de données** — réduire ce que Claude voit :
```python
logs = await fetch_logs(server_id)
errors = [log for log in logs if "ERROR" in log]
print(f"Found {len(errors)} errors")
for error in errors[-10:]:
print(error)
```
### Compatibilité des modèles
| Modèle | Supporté |
|-------|-----------|
| Claude Opus 4.6 | Oui |
| Claude Sonnet 4.6 | Oui |
| Claude Sonnet 4.5 | Oui |
| Claude Opus 4.5 | Oui |
### Contraintes
| Contrainte | Détail |
|-----------|--------|
| **Pas sur Bedrock/Vertex** | API et Foundry uniquement |
| **Pas d'outils MCP** | Les outils de connecteur MCP ne peuvent être appelés programmatiquement |
| **Pas de web search/fetch** | Les outils web ne sont pas supportés en PTC |
| **Pas de sorties structurées** | Outils `strict: true` incompatibles |
| **Pas de choix d'outil forcé** | `tool_choice` ne peut forcer le PTC |
| **Durée de vie du conteneur** | ~4,5 minutes avant expiration |
| **ZDR** | Non couvert par le Zero Data Retention |
| **Résultats d'outils sous forme de chaînes** | Valide les résultats externes contre les risques d'injection de code |
### Quand utiliser le PTC
| Bons cas d'usage | Moins idéal |
|----------------|------------|
| Traiter de grands jeux de données nécessitant des agrégats | Appels d'outil unique avec réponses simples |
| 3+ appels d'outils dépendants en séquence | Outils nécessitant un retour utilisateur immédiat |
| Filtrer/transformer les résultats avant que Claude ne les voie | Opérations très rapides (surcoût > bénéfice) |
| Opérations parallèles sur de nombreux éléments | |
| Logique conditionnelle basée sur des résultats intermédiaires | |
### Efficacité en tokens
- Les résultats d'outils issus d'appels programmatiques ne sont **pas ajoutés au contexte de Claude** — seul le `stdout` final
- Le traitement intermédiaire se passe dans le code, pas en tokens de modèle
- 10 outils en programmatique ≈ 1/10ᵉ des tokens de 10 appels directs
---
## Filtrage dynamique pour Web Search/Fetch
### Le problème
Les outils de web search et fetch déversent des pages HTML complètes dans la fenêtre de contexte de Claude. La majeure partie de ce contenu est non pertinente — navigation, pubs, boilerplate. Claude raisonne ensuite sur tout cela, gaspillant des tokens et réduisant la précision.
### La solution
Claude **écrit et exécute désormais du code Python pour filtrer les résultats web** avant qu'ils n'entrent dans la fenêtre de contexte. Au lieu de raisonner sur du HTML brut, Claude filtre, parse et extrait uniquement le contenu pertinent dans un sandbox.
### Comment ça fonctionne
**Avant :**
```
Requête → Résultats de recherche → Récupérer le HTML complet × N pages → Tout le contenu entre en contexte → Claude raisonne sur tout
```
**Après :**
```
Requête → Résultats de recherche → Claude écrit du code de filtrage → Le code extrait uniquement le contenu pertinent → Les résultats filtrés entrent en contexte
```
### Configuration API
Utilise des versions de type d'outil mises à jour avec un en-tête beta :
```json
{
"model": "claude-opus-4-6",
"max_tokens": 4096,
"tools": [
{
"type": "web_search_20260209",
"name": "web_search"
},
{
"type": "web_fetch_20260209",
"name": "web_fetch"
}
]
}
```
**En-tête requis :** `anthropic-beta: code-execution-web-tools-2026-02-09`
**Activé par défaut** en utilisant les nouvelles versions de type d'outil avec Sonnet 4.6 et Opus 4.6.
### Résultats de benchmark
**BrowseComp** (trouver des informations spécifiques sur des sites web) :
| Modèle | Sans filtrage | Avec filtrage | Amélioration |
|-------|-------------------|----------------|-------------|
| Sonnet 4.6 | 33,3% | **46,6%** | +13,3 pp |
| Opus 4.6 | 45,3% | **61,6%** | +16,3 pp |
**DeepsearchQA** (recherche multi-étapes, score F1) :
| Modèle | Sans filtrage | Avec filtrage | Amélioration |
|-------|-------------------|----------------|-------------|
| Sonnet 4.6 | 52,6% | **59,4%** | +6,8 pp |
| Opus 4.6 | 69,8% | **77,3%** | +7,5 pp |
**Efficacité en tokens :** En moyenne 24% de tokens d'entrée en moins. Sonnet 4.6 voit une réduction de coût ; Opus 4.6 peut augmenter légèrement à cause d'un code de filtrage plus complexe.
### Cas d'usage
- Passer au crible de la documentation technique
- Vérifier des citations sur plusieurs sources
- Recouper des résultats de recherche
- Requêtes de recherche multi-étapes
- Trouver des données spécifiques enfouies dans de grandes pages
---
## Outil de recherche d'outils (Tool Search Tool)
### Le problème
Charger toutes les définitions d'outils d'emblée gaspille du contexte. Si tu as 50 outils MCP à ~1,5K tokens chacun, c'est 75K tokens avant même que l'utilisateur ne pose une question.
### La solution
Marque les outils peu utilisés avec `defer_loading: true`. Ils sont exclus du contexte initial. Claude les découvre à la demande via un Tool Search Tool.
### Configuration
```json
{
"tools": [
{
"type": "mcp_toolset",
"mcp_server_name": "google-drive",
"default_config": { "defer_loading": true },
"configs": {
"search_files": { "defer_loading": false }
}
}
]
}
```
### Bonnes pratiques
- Garde les 3-5 outils les plus utilisés toujours chargés, diffère le reste
- Écris des noms et descriptions d'outils clairs et descriptifs (la recherche s'appuie dessus)
- Documente les capacités disponibles dans le system prompt
### Quand l'utiliser
- Définitions d'outils consommant > 10K tokens
- 10+ outils disponibles
- Plusieurs serveurs MCP
- Problèmes de précision de sélection d'outil dus à trop d'options
### Économie de tokens
~85% de réduction des tokens de définition d'outils (77K → 8,7K dans les benchmarks d'Anthropic).
### Équivalent Claude Code
Claude Code dispose du **mode auto de recherche d'outils MCP** (activé par défaut depuis v2.1.7). Quand les descriptions d'outils MCP dépassent 10% du contexte, elles sont différées et découvertes via `MCPSearch`. Configure le seuil avec `ENABLE_TOOL_SEARCH=auto:N` où N est le pourcentage de contexte (0-100).
---
## Exemples d'usage d'outils (Tool Use Examples)
### Le problème
Les schémas JSON définissent la structure mais ne peuvent exprimer :
- Quand inclure des paramètres optionnels
- Quelles combinaisons de paramètres ont du sens
- Les conventions de format (formats de date, patterns d'ID)
- L'usage de structures imbriquées
### La solution
Ajoute `input_examples` aux définitions d'outils — des patterns d'usage concrets au-delà du schéma.
### Configuration
```json
{
"name": "create_ticket",
"description": "Create a support ticket",
"input_schema": {
"type": "object",
"properties": {
"title": { "type": "string" },
"priority": { "type": "string", "enum": ["low", "medium", "high", "critical"] },
"assignee": { "type": "string" },
"labels": { "type": "array", "items": { "type": "string" } }
},
"required": ["title"]
},
"input_examples": [
{
"title": "Login page returns 500 error",
"priority": "critical",
"assignee": "oncall-team",
"labels": ["bug", "auth", "production"]
},
{
"title": "Add dark mode support",
"priority": "low",
"labels": ["feature-request", "ui"]
},
{
"title": "Update API docs for v2 endpoints"
}
]
}
```
### Bonnes pratiques
- Utilise des **données réalistes**, pas des chaînes placeholder comme « example_value »
- Montre de la **variété** : spécifications minimale, partielle et complète
- Reste concis : **1-5 exemples par outil**
- Concentre-toi sur la résolution d'ambiguïté — vise la clarté comportementale plutôt que la complétude du schéma
- Montre les corrélations de paramètres (par ex. `priority: "critical"` a tendance à avoir un `assignee`)
### Résultats
72% → 90% de précision sur la gestion de paramètres complexes dans les benchmarks d'Anthropic.
---
## Pertinence pour Claude Code
### Ce qui s'applique directement aux utilisateurs de Claude Code
| Fonctionnalité | Statut Claude Code | Action |
|---------|-------------------|--------|
| Tool Search | Intégré depuis v2.1.7 comme mode auto MCPSearch | Règle `ENABLE_TOOL_SEARCH=auto:N` si tu as beaucoup d'outils MCP |
| Filtrage dynamique | Non disponible en CLI (outils web au niveau API) | Pertinent pour les utilisateurs de l'Agent SDK faisant de la recherche web |
| PTC | Non disponible en CLI | Pertinent pour les utilisateurs de l'Agent SDK construisant des agents personnalisés |
| Tool Use Examples | Non configurable en CLI | Pertinent pour les auteurs de serveurs MCP personnalisés |
### Pour les développeurs Agent SDK
Si tu construis des agents avec `@anthropic-ai/claude-agent-sdk`, le PTC est immédiatement actionnable :
1. Ajoute `code_execution_20250825` à ton tableau d'outils
2. Définis `allowed_callers` sur les outils qui bénéficient du batching/filtrage
3. Implémente la boucle de résultat d'outil (pause → fournir le résultat → reprendre)
4. Renvoie des données structurées (JSON) depuis les outils pour un parsing programmatique plus facile
### Pour les auteurs de serveurs MCP
Si tu construis des serveurs MCP personnalisés, les Tool Use Examples peuvent améliorer la façon dont Claude utilise tes outils :
- Ajoute `input_examples` aux schémas d'outils
- Documente clairement les formats de retour dans les descriptions (le PTC doit les parser)
---
## Sources
- [Anthropic Engineering: Advanced Tool Use](https://www.anthropic.com/engineering/advanced-tool-use)
- [Documentation Programmatic Tool Calling](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling)
- [Documentation Code Execution Tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool)
- [Improved Web Search with Dynamic Filtering](https://claude.com/blog/improved-web-search-with-dynamic-filtering)