Cours
Anthropic a récemment présenté Claude Skills, un module réutilisable et spécifique à une tâche qui permet à Claude de ne charger que l'expertise requise pour une tâche donnée. Au lieu d'utiliser des invites longues et répétitives, Skills regroupe des instructions, des scripts et des ressources afin que Claude puisse produire des résultats cohérents et alignés sur la marque dans l'ensemble de l'application. application Claude, Claude Codeet l'API.
Dans ce tutoriel, nous allons créer un « générateur automatique de factures » qui transforme une feuille de temps Excel en une facture prête à être envoyée au client (DOCX/PDF). Au cours de cette formation, vous apprendrez à :
- Veuillez créer une page d'accueil minimale (
SKILL.md) et télécharger une compétence (Skill) avec les ressources associées. - Pré-traitez les données telles que les feuilles de temps à l'aide d '
pandasz-les en une charge utile JSON prévisible. - Veuillez invoquer la compétence via l'API à l'aide d'une boucle d'utilisation d'outils sécurisée (balises bash/éditeur de texte).
- Veuillez capturer les artefacts générés par Claude (PDF/DOCX)
À la fin, vous disposerez d'une compétence portable que vous pourrez réutiliser partout dans l'écosystème Claude.
Quelles sont les compétences de Claude ?
Les compétences Claude sont des modules de tâches autonomes qui comprennent un fichier d'instructions ( SKILL.md ), des scripts facultatifs et des ressources complémentaires. Lorsqu'une tâche correspond à l'objectif d'une compétence, Claude charge les éléments minimaux de cette compétence afin d'exécuter la tâche de manière efficace. Une compétence peut être considérée comme un ensemble de connaissances spécialisées que vous pouvez versionner, partager et gérer au sein de votre organisation.
Principales caractéristiques des compétences de Claude
Les fonctionnalités principales de Claude Skill expliquent comment elles restent rapides, réutilisables et fiables dans l'ensemble de l'écosystème Claude. Parmi les principales fonctionnalités, on peut citer :
- Modulaire : Vous pouvez combiner plusieurs compétences pour exécuter des flux de travail en plusieurs étapes, tels que le nettoyage des données, l'analyse et la génération de rapports.
- Portable : Les compétences suivent un format commun, de sorte que la même compétence fonctionne de manière cohérente dans tout l'écosystème Claude.
- Efficace : Claude ne charge que les composants minimaux nécessaires à la tâche à accomplir, ce qui améliore à la fois la vitesse et la précision.
- Code exécutable : Les compétences peuvent exécuter du code dans un environnement sécurisé, permettant des actions déterministes telles que la création de fichiers, l'analyse syntaxique et l'analyse.
Lorsque vous demandez à Claude de « créer un budget Excel avec des synthèses mensuelles », il évalue votre demande, analyse les compétences disponibles et n'active que les éléments pertinents. L'activation est visible dans la vue « Raisonnement » de l'application Claude. Les compétences étant des composants versionnés, les équipes peuvent déployer des mises à jour sans modifier les invites partout.
Utilisation des compétences Claude dans l'écosystème Claude
Que vous discutiez dans les applications Claude, que vous programmiez dans Claude Codeou automatisez des flux de travail via l'API développeur, la même compétence peut être versionnée une seule fois, gérée de manière centralisée et invoquée automatiquement lorsque la tâche correspond à son objectif. Cela garantit une qualité constante et des délais d'exécution plus courts. Ainsi, une compétence utilisable partout.
Dans ce tutoriel, nous allons appliquer une compétence « Générateur automatique de factures » à l'application Claude et à l'API afin d'analyser un fichier Excel et de générer une facture prête à être envoyée.
Claude App
Les compétences Claude sont disponibles dans votre application Claude et s'activent automatiquement lorsqu'une demande correspond à leur objectif. Vous les activez une fois dans les paramètres, puis vous décrivez simplement le résultat souhaité. Claude charge la compétence appropriée et l'affiche dans la vue de raisonnement.

Source : Blog de Claude
Pour commencer :
- Veuillez vous connecter ou vous inscrire à l'aide de votre compte Google, puis accédez aux paramètres.
- Sous Capacités, veuillez rechercher l'onglet Compétences et télécharger un fichier de compétences (généralement un fichier SKILL.md) pouvant être utilisé dans n'importe quel chat.

Source : Blog de Claude
Remarque : Cette fonctionnalité est réservée aux utilisateurs Pro, Max, Team et Enterprise.
Vous pouvez également trouver une liste de compétences telles que l'art algorithmique, la création d'artefacts, les directives de marque, la conception de canevas, la communication interne, la création de MCP, la création de GIF Slack, etc., à ajouter à vos conversations avec Claude.
Veuillez cliquer sur « Télécharger une compétence » et télécharger un fichier zip contenant le fichier SKILL.md. Voici les exigences relatives aux fichiers.
-
Fichier ZIP contenant exactement un fichier SKILL.md à la racine.
-
SKILL.mdcontient le nom et la description d'une compétence au format YAML
Le fichier SKILL.md utilisé dans ce tutoriel se présente comme suit :
name: "auto-invoice-generator-monthly-articles"
description: "Generate monthly invoices for written content from simple line items. Produces a branded PDF or editable DOCX/RTF invoice and, optionally, a one-page timesheet if article titles/links are provided."

Une fois la compétence téléchargée, Claude la reconnaît automatiquement et ouvre une nouvelle fenêtre de discussion où elle est prête à être utilisée.

Comment cela affecte-t-il l'utilisation dans les discussions en ligne ?
- Il n'est pas nécessaire d'activer une compétence à l'intérieur de chaque conversation. Lorsque cela est pertinent, Claude invoque automatiquement les compétences activées et les affiche dans la vue de raisonnement pour plus de transparence.
- La désactivation d'une compétence empêche celle-ci d'être prise en compte dans les discussions jusqu'à ce que vous la réactiviez.
- Si votre organisation définit un ensemble canonique de compétences telles que les modèles de marque, les rapports, etc., le fait de les maintenir activées garantit des résultats cohérents à chaque fois.



Ensuite, j'ai transmis ma propre feuille de temps et demandé à Claude de créer une facture modifiable.

Claude a identifié la compétence de manière autonome, a lu le fichier Excel et a généré une facture Word modifiable, qui peut également être exportée au format PDF ou Word. La présentation de la facture est claire, et le sous-total ainsi que le total sont également corrects. Il a respecté les consignes, et les fichiers DOCX modifiables et PDF formatés correspondaient aux paramètres de marque de la compétence.
Maintenant, exécutons le même exemple en utilisant l'API.
Plateforme de développement Claude (API)
Les compétences de Claude sont également accessibles via l'API Claude. Dans cette section, nous examinerons comment reproduire l'interface de l'application Claude via l'API Claude.
Étape 1 : Conditions préalables
Veuillez commencer par installer toutes les dépendances d'exécution :
-
Anthropicpour l'API Claude Messages -
pandasetopenpyxlpour lire les feuilles de temps à partir d'Excel -
reportlabpour générer localement une facture PDF de secours
!pip -q install anthropic pandas openpyxl reportlab
Toutes les dépendances sont désormais installées. Ensuite, nous pouvons configurer notre clé API.
Étape 2 : Veuillez configurer votre clé API.
Avant de pouvoir appeler l'API Messages, nous devons procéder à l'authentification. anthropic.Client Cette étape permet de créer une autorisation unique et réutilisable avec la clé API.
import os, json, sys, re
import anthropic
from datetime import datetime, timedelta
API_KEY = "YOUR_ANTHROPIC_API_KEY"
client = anthropic.Client(api_key=API_KEY)
Veuillez vous connecter à Anthropic Console et localiser l'onglet Clés API sous Paramètres. Veuillez cliquer sur « » (Créer une clé), puis copiez votre clé API Anthropic.

Source : API Anthropic
Remarque : Si vous utilisez un bloc-notes privé à des fins personnelles, veuillez ajouter votre clé API. Dans le cas contraire, veuillez utiliser une variable d'environnement sécurisée afin que votre clé ne soit pas exposée dans le bloc-notes ou les journaux.
Le code ci-dessus initialise le client SDK Anthropic et configure l'environnement. L'objet client est ensuite réutilisé pour tous les appels API Messages suivants.
Étape 3 : Pré-traitement des données
Dans cette étape, nous allons transformer notre feuille d'timesheet.xlsxs en un objet JSON propre et prévisible que la compétence peut utiliser. Cela permet de simplifier la logique en aval et d'éviter une analyse syntaxique fragile.
def load_invoice_from_timesheet(excel_path):
import pandas as pd
df = pd.read_excel(excel_path)
df.columns = df.columns.str.strip()
invoice_period = "2025-10"
if 'Date' in df.columns:
first_date = str(df['Date'].iloc[0])
date_match = re.search(r'(\d{2})\s+(\w+)\s+(\d{4})', first_date)
if date_match:
month_name = date_match.group(2)
year = date_match.group(3)
month_num = datetime.strptime(month_name[:3], '%b').month
invoice_period = f"{year}-{month_num:02d}"
article_col = next((col for col in df.columns if 'article' in col.lower() and 'name' in col.lower()), None)
amount_col = next((col for col in df.columns if 'amount' in col.lower()), None)
topic_col = next((col for col in df.columns if 'topic' in col.lower()), None)
line_items = []
timesheet_articles = []
for idx, row in df.iterrows():
if pd.isna(row.get(article_col)) or row.get(article_col) == '':
continue
article_name = str(row[article_col]).strip()
amount = row.get(amount_col, 0)
if isinstance(amount, str):
amount = float(amount.replace('$', '').replace(',', '').strip())
line_items.append({
"title": article_name,
"rate_type": "flat",
"qty": 1,
"rate": float(amount)
})
timesheet_articles.append({
"title": article_name,
"topic": str(row.get(topic_col, 'N/A')) if topic_col else 'N/A'
})
return {
"client_name": "Client",
"billing_contact": "billing@example.com",
"invoice_period": invoice_period,
"currency": "USD",
"payment_terms": "Net-30",
"line_items": line_items,
"discount_pct": 0.0,
"tax_pct": 0.0,
"timesheet": timesheet_articles
}
La fonction load_invoice_from_timesheet convertit un fichier Excel téléchargé en une charge utile JSON normalisée de facture.
-
Il lit le fichier Excel à l'aide de pandas et normalise les en-têtes de colonnes.
-
Le code déduit ensuite l'adresse
invoice_periodà partir de la première ligneDate(si elle existe) à l'aide d'une expression régulière et d'une analyse du mois. -
Il détecte enfin les noms des colonnes pour le titre de l'article, le montant et le sujet sans tenir compte de la casse.
-
Cela génère deux structures :
-
line_items: Ceci est utilisé pour le calcul de la facturation (tarif forfaitaire par article dans ce cas). -
timesheet: Liste plate des entrées d'{title, topic}s pour une annexe facultative. -
L'expression régulière
(\d{2})\s+(\w+)\s+(\d{4})attend des formats tels que01 Oct 2025. Veuillez l'ajuster si votre feuille utilise un autre format. -
Les colonnes/valeurs manquantes sont gérées en ignorant les lignes vides, ou vous pouvez étendre le code pour qu'il échoue rapidement si nécessaire.
Notre contribution est désormais prête. Ensuite, nous ferons appel à la compétence Claude via l'API pour transformer la feuille de temps traitée en une facture modifiable.
Étape 4 : Fonctions d'assistance
Dans cette section, nous définissons deux fonctions d'aide qui simulent l'exécution de l'outil demandé par Claude lors d'une exécution de compétence.
def execute_bash_tool(command):
try:
dangerous = ['rm -rf /', 'sudo', 'chmod', 'mkfs', '> /dev/']
if any(d in command for d in dangerous):
return f"Error: Command blocked for safety: {command}"
result = subprocess.run(
command,
shell=True,
capture_output=True,
text=True,
timeout=30,
cwd=tempfile.gettempdir()
)
output = result.stdout if result.stdout else result.stderr
return output if output else "Command executed successfully"
except subprocess.TimeoutExpired:
return "Error: Command timed out"
except Exception as e:
return f"Error executing command: {str(e)}"
def execute_text_editor_tool(params):
try:
command = params.get('command')
path = params.get('path')
if command == 'create':
file_text = params.get('file_text', '')
os.makedirs(os.path.dirname(path) if os.path.dirname(path) else '.', exist_ok=True)
with open(path, 'w') as f:
f.write(file_text)
return f"File created: {path}"
elif command == 'view':
if os.path.exists(path):
with open(path, 'r') as f:
content = f.read()
return content[:1000]
return f"Error: File not found: {path}"
elif command == 'str_replace':
if os.path.exists(path):
with open(path, 'r') as f:
content = f.read()
old_str = params.get('old_str', '')
new_str = params.get('new_str', '')
content = content.replace(old_str, new_str)
with open(path, 'w') as f:
f.write(content)
return f"File updated: {path}"
return f"Error: File not found: {path}"
return f"Unknown command: {command}"
except Exception as e:
return f"Error: {str(e)}"
La fonction execute_bash_tool simule un outil bash sécurisé pour les actions basées sur les compétences. Il bloque d'abord les modèles dangereux tels que rm -rf /, sudo, chmod, mkfs, etc., comme une porte de sécurité, et exécute la commande avec subprocess.run() dans le répertoire temporaire du système d'exploitation avec un délai d'expiration imposé de 30 secondes.
La fonction ` execute_text_editor_tool ` fournit une interface minimale d'édition de texte utilisée par Skills. Il prend en charge trois commandes, à savoir « create » (pour créer un nouveau fichier avec l'file_text), « view » (pour renvoyer jusqu'à 1 000 caractères d'un fichier) et « str_replace » (pour l'new_str in place). Il crée également automatiquement des dossiers parents pour create, vérifie l'existence des fichiers pour view et str_replace, et enregistre les mises à jour sur le disque.
Ces assistants vous permettent de réaliser localement une boucle d'utilisation d'outils avec des garde-fous. Désormais, Skill peut demander des modifications de fichiers ou des actions shell pendant la génération des factures sans compromettre la sécurité de votre système.
Étape 5 : Veuillez invoquer la compétence via l'API.
Cette étape permet la génération de factures de bout en bout via l'API Claude Messages. Il envoie une requête structurée, active l'utilisation des outils, effectue des itérations sur tous les appels d'outils demandés par Claude et, enfin, collecte tous les fichiers PDF générés à partir des répertoires de travail et temporaires.
def generate_invoice_with_claude(invoice):
user_text = f"""Generate a professional PDF invoice with the following data:
Client: {invoice['client_name']}
Period: {invoice['invoice_period']}
Currency: {invoice['currency']}
Payment Terms: {invoice['payment_terms']}
Line Items:
{json.dumps(invoice['line_items'], indent=2)}
Timesheet Articles:
{json.dumps(invoice['timesheet'], indent=2)}
Please create a professional PDF invoice with:
1. Invoice header with invoice number (INV-{invoice['invoice_period'].replace('-', '')}-001)
2. Client billing information
3. Line items table with amounts
4. Subtotal and total calculations
5. Timesheet section showing all articles and topics
Save the PDF as: invoice_{invoice['client_name'].lower()}_{invoice['invoice_period']}.pdf
"""
tools = [
{"type": "bash_20250124", "name": "bash"},
{"type": "text_editor_20250728", "name": "str_replace_based_edit_tool"}
]
messages = [{"role": "user", "content": user_text}]
iteration = 0
max_iterations = 15
while iteration < max_iterations:
iteration += 1
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=8192,
tools=tools,
messages=messages
)
messages.append({"role": "assistant", "content": response.content})
if response.stop_reason == "end_turn":
break
if response.stop_reason == "tool_use":
tool_results = []
for block in response.content:
if block.type == "tool_use":
tool_name = block.name
tool_input = block.input
if tool_name == "bash":
result = execute_bash_tool(tool_input.get('command', ''))
elif tool_name == "str_replace_based_edit_tool":
result = execute_text_editor_tool(tool_input)
else:
result = f"Unknown tool: {tool_name}"
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": result
})
messages.append({"role": "user", "content": tool_results})
else:
break
pdf_files = []
for file in os.listdir('.'):
if file.endswith('.pdf') and 'invoice' in file.lower():
pdf_files.append(file)
for file in os.listdir(tempfile.gettempdir()):
if file.endswith('.pdf') and 'invoice' in file.lower():
temp_path = os.path.join(tempfile.gettempdir(), file)
import shutil
dest_path = os.path.join('.', file)
shutil.copy2(temp_path, dest_path)
pdf_files.append(file)
return pdf_files
def main():
if len(sys.argv) < 2:
print("Usage: python app.py <timesheet.xlsx>")
sys.exit(1)
excel_file = sys.argv[1]
if not os.path.exists(excel_file):
print(f"Error: File not found: {excel_file}")
sys.exit(1)
try:
invoice = load_invoice_from_timesheet(excel_file)
pdf_files = generate_invoice_with_claude(invoice)
if pdf_files:
for pdf in pdf_files:
print(f"Invoice generated: {os.path.abspath(pdf)}")
else:
print("Error: No PDF file was generated.")
except Exception as e:
print(f"Error: {e}")
import traceback
traceback.print_exc()
sys.exit(1)
if __name__ == "__main__":
main()
La fonction generate_invoice_with_claude envoie la facture normalisée à l'API Claude et gère l'exécution de la compétence de bout en bout. Voici ce que fait le code :
-
user_textIl crée une structure claire qui intègre le client, la période, la devise, les conditions, les lignes et les entrées de feuille de temps, ainsi que des exigences de sortie explicites telles que l'en-tête, les tableaux, les totaux et le nom de fichier. -
Il permet ensuite l'exécution de l'outil en déclarant un
bash_numberet untext_editor_numberavec une boucle de messages compatible avec l'outil qui envoie la demande, inspectestop_reasonet, lorsquetool_useest demandé, le transmet aux assistants locaux et renvoietool_resultdes blocs pour poursuivre l'échange. -
Enfin, il s'arrête sur
end_turnou lorsque la limite de boucle est atteinte, puis analyse le répertoire de travail et le répertoire temporaire du système d'exploitation à la recherche de fichiers correspondant àinvoice*.pdf. Il recopie tous les fichiers temporaires dans le dossier du projet et renvoie la liste des fichiers PDF détectés. -
La fonction
mainfournit une commande CLI simple :python app.py, qui valide le chemin d'accès saisi, puis exécute le pipeline :load_invoice_from_timesheet(...)pour créer la charge utile, etgenerate_invoice_with_claude(...)pour invoquer la compétence et collecter les fichiers PDF.
Une fois cela mis en place, l'appel API devrait générer un fichier PDF prêt à être utilisé par le client. Si aucun fichier n'apparaît, veuillez vérifier les journaux d'tool_result s et la configuration des compétences, puis réessayez avec une petite feuille de test.

Conclusion
Vous disposez désormais d'un générateur de factures automatique fonctionnel, optimisé par Claude Skills, et l'API est capable de transformer des feuilles de calcul brutes en factures prêtes à être envoyées aux clients. Cette démonstration met en avant les points forts de Skills, à savoir une configuration portable, une activation automatique, une exécution déterministe du code et des résultats cohérents dans l'application et l'API sans avoir à recréer les invites dans chaque thread. Claude Skills fournit des résultats cohérents dans différents contextes, qui sont des connaissances réutilisables dans le domaine et soutenues par du code. Bien que les compétences puissent exécuter du code, il est important de renforcer la sécurité en n'activant que les compétences fiables, en utilisant des contrôles au niveau de l'organisation et en examinant les mises à jour avant leur déploiement.
Pour approfondir vos connaissances, veuillez consulter la documentation sur les compétences d'Anthropic et la console pour la gestion des versions et les mises à niveau, puis commencez à créer plusieurs compétences afin de mettre en place des flux de travail de bout en bout.
Présentation des modèles Claude

Je suis un expert Google Developers en ML (Gen AI), un expert Kaggle 3x, et un ambassadeur Women Techmakers avec plus de 3 ans d'expérience dans la technologie. J'ai cofondé une startup dans le domaine de la santé en 2020 et je poursuis un master en informatique à Georgia Tech, avec une spécialisation dans l'apprentissage automatique.