Curso
Anthropic ha presentado recientemente Claude Skills, un módulo reutilizable específico para cada tarea que permite a Claude cargar solo los conocimientos especializados que requiere un trabajo. En lugar de indicaciones largas y repetitivas, Skills agrupa instrucciones, guiones y recursos para que Claude pueda producir resultados coherentes y alineados con la marca en toda la aplicación Claude. aplicación Claude, Claude Codey la API.
En este tutorial, crearemos un «generador automático de facturas» que convierte una hoja de horas de Excel en una factura lista para enviar al cliente (DOCX/PDF). A lo largo del camino, aprenderás a:
- Crea un sitio web mínimo (
SKILL.md) y sube una habilidad (skill) con los recursos necesarios. - Preprocesa datos como una hoja de horas con
pandasen una carga JSON predecible. - Invoca la habilidad a través de la API con un bucle de uso seguro de herramientas (etiquetas bash/editor de texto).
- Captura los artefactos generados por Claude (PDF/DOCX)
Al final, tendrás una habilidad portátil que podrás reutilizar en cualquier lugar del ecosistema de Claude.
¿Qué son las habilidades de Claude?
Las habilidades de Claude son módulos de tareas autónomos que incluyen un archivo de instrucciones ( SKILL.md ), scripts opcionales y recursos de apoyo. Cuando una tarea coincide con el propósito de una habilidad, Claude carga las partes mínimas de esa habilidad para realizar la tarea de manera eficiente. Una habilidad puede considerarse como un conjunto de conocimientos especializados que puedes versionar, compartir y gestionar en toda tu organización.
Características principales de Claude Skills
Las características principales de Claude Skill explican cómo se mantienen rápidas, reutilizables y fiables en todo el ecosistema de Claude. Algunas de las características principales son:
- Componible: Puedes combinar varias habilidades para ejecutar flujos de trabajo de varios pasos, como la limpieza de datos, el análisis y la generación de informes.
- Portátil: Las habilidades siguen un formato común, por lo que la misma habilidad funciona de manera coherente en todo el ecosistema de Claude.
- Eficiente: Claude carga solo los componentes mínimos necesarios para la tarea en cuestión, lo que mejora tanto la velocidad como la precisión.
- Código ejecutable: Las habilidades pueden ejecutar código en un entorno aislado seguro, lo que permite acciones determinísticas como la creación de archivos, el análisis sintáctico y el análisis.
Cuando le pides a Claude que «cree un presupuesto en Excel con resúmenes mensuales», evalúa tu solicitud, analiza las habilidades disponibles y activa solo las relevantes. La activación es visible en la vista de razonamiento dentro de la aplicación Claude. Dado que las habilidades son componentes versionados, los equipos pueden implementar actualizaciones sin tener que cambiar las indicaciones en todas partes.
Uso de las habilidades de Claude en todo el ecosistema de Claude
Tanto si estás chateando en las aplicaciones de Claude, programando en Claude Codeo automatizando flujos de trabajo a través de la API para programadores, la misma habilidad se puede versionar una vez, gestionar de forma centralizada e invocar automáticamente cuando la tarea coincide con su propósito. Esto da como resultado una calidad constante y plazos de entrega más rápidos. Por lo tanto, una habilidad que se puede reutilizar en cualquier lugar.
En este tutorial, aplicaremos la habilidad «Generador automático de facturas» en la aplicación Claude y la API para analizar un archivo Excel y generar una factura lista para enviar.
Claude App
Las habilidades de Claude residen en tu aplicación Claude y se activan automáticamente cuando una solicitud coincide con su finalidad. Actívalos una vez en Configuración y, a continuación, describe el resultado que deseas obtener. Claude carga la habilidad correcta y la muestra en la vista de razonamiento.

Fuente: Blog de Claude
Para empezar:
- Inicia sesión o regístrate con tu cuenta de Google y ve a Configuración.
- En Capacidades, busca la pestaña Habilidades y sube un archivo de habilidades (normalmente un SKILL.md) que se pueda utilizar en cualquier chat.

Fuente: Blog de Claude
Nota: Esta función solo está disponible para los usuarios Pro, Max, Team y Enterprise.
También puedes encontrar una lista de habilidades como arte algorítmico, creador de artefactos, directrices de marca, diseño de lienzos, comunicaciones internas, creador de mcp, creador de gifs para Slack, etc., para añadir a tus conversaciones con Claude.
Haz clic en «Subir habilidad» y sube un archivo zip que contenga el archivo SKILL.md. Estos son los requisitos del archivo.
-
Archivo ZIP que incluye exactamente un archivo SKILL.md en el nivel raíz.
-
SKILL.mdcontiene el nombre y la descripción de una habilidad con formato YAML.
El archivo SKILL.md utilizado en este tutorial tiene el siguiente aspecto:
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."

Una vez que subes la habilidad, Claude la reconoce automáticamente y abre un nuevo chat donde está lista para usar.

¿Cómo afecta esto al uso en los chats?
- No es necesario «activar» una habilidad dentro de cada conversación. Cuando es relevante, Claude invoca automáticamente las habilidades habilitadas y las muestra en la vista de razonamiento para mayor transparencia.
- Desactivar una habilidad impide que se tenga en cuenta en cualquier chat hasta que la vuelvas a activar.
- Si tu organización establece un conjunto canónico de habilidades, como plantillas de marca, informes, etc., mantenerlas habilitadas garantiza resultados coherentes en todo momento.



A continuación, envié mi hoja de horas y le pedí a Claude que creara una factura editable.

Claude detectó la habilidad por sí mismo, leyó el archivo Excel y devolvió una factura editable en Word, que también se puede exportar a PDF o Word. El diseño de la factura es claro, y el subtotal y el total también son correctos. Cumplió con las instrucciones, y tanto los archivos DOCX editables como los PDF formateados coincidían con la configuración de marca de Skill.
Ahora ejecutemos el mismo ejemplo utilizando la API.
Plataforma para programadores Claude (API)
También se puede acceder a las habilidades de Claude a través de la API de Claude. En esta sección, exploraremos cómo podemos imitar la interfaz de la aplicación Claude a través de la API de Claude.
Paso 1: Requisitos previos
Comienza instalando todas las dependencias de tiempo de ejecución:
-
Anthropicpara la API de Claude Messages -
pandasyopenpyxlpara leer hojas de horas desde Excel. -
reportlabpara generar una factura PDF alternativa localmente
!pip -q install anthropic pandas openpyxl reportlab
Ahora ya tenemos todas las dependencias instaladas. A continuación, podemos configurar nuestra clave API.
Paso 2: Configura tu clave API
Antes de poder llamar a la API de mensajes, debemos autenticarnos. Este paso crea una única clave de acceso de aplicación ( anthropic.Client ) reutilizable con la clave 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)
Inicia sesión en Anthropic Console y busca la pestaña «Claves API» en «Configuración». Haz clic en« » (Crear clave) y copia tu clave API de Anthropic.

Fuente: API antropológica
Nota: Si utilizas un cuaderno privado para uso personal, añade tu clave API. De lo contrario, utiliza una variable de entorno segura para que tu clave no quede expuesta en el cuaderno o en los registros.
El código anterior inicializa el cliente SDK de Anthropic y configura el entorno. A continuación, el objeto cliente se reutiliza para todas las llamadas posteriores a la API de mensajes.
Paso 3: Preprocesamiento de datos
En este paso, convertiremos nuestra hoja timesheet.xlsxen un objeto JSON limpio y predecible que la habilidad pueda consumir. Esto mantiene la lógica descendente simple y evita el frágil análisis sintáctico de los mensajes.
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 función load_invoice_from_timesheet convierte un archivo Excel cargado en una carga JSON de factura normalizada.
-
Lee el Excel con pandas y normaliza los encabezados de las columnas.
-
A continuación, el código deduce
invoice_perioda partir de la primera filaDate(si existe) utilizando una expresión regular y un análisis sintáctico del mes. -
Finalmente detecta los nombres de las columnas para el título del artículo, la cantidad y el tema sin distinguir entre mayúsculas y minúsculas.
-
Esto emite dos estructuras:
-
line_items: Se utiliza para el cálculo de la facturación (tarifa plana por artículo en este caso). -
timesheet: Una lista plana de entradas de{title, topic}para un apéndice opcional. -
La expresión regular
(\d{2})\s+(\w+)\s+(\d{4})espera formatos como01 Oct 2025. Ajústala si tu hoja utiliza otro formato. -
Las columnas o valores que faltan se gestionan omitiendo las filas vacías, o bien puedes ampliar el código para que falle rápidamente si es necesario.
Nuestra aportación ya está lista. A continuación, llamaremos a la habilidad Claude a través de la API para convertir la hoja de horas procesada en una factura editable.
Paso 4: Funciones auxiliares
En esta sección, definimos dos funciones auxiliares que simulan la ejecución de la herramienta que Claude solicita durante la ejecución de una habilidad.
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 función execute_bash_tool simula una herramienta bash segura para acciones basadas en habilidades. En primer lugar, bloquea patrones peligrosos como rm -rf /, sudo, chmod, mkfs, etc., a modo de barrera de seguridad, y ejecuta el comando con subprocess.run() en el directorio temporal del sistema operativo con un tiempo de espera obligatorio de 30 segundos.
La función execute_text_editor_tool proporciona una interfaz mínima de edición de texto utilizada por Skills. Admite tres comandos: « create » (para escribir un nuevo archivo con « file_text »), « view » (para devolver hasta 1000 caracteres de un archivo) y « str_replace » (para « new_str » en el lugar). También crea automáticamente carpetas principales para create, comprueba la existencia de archivos para view y str_replace, y escribe las actualizaciones en el disco.
Estos ayudantes te permiten completar un ciclo de uso de herramientas a nivel local con barreras de protección. Ahora, Skill puede solicitar modificaciones de archivos o acciones de terminal durante la generación de facturas sin poner en riesgo tu sistema.
Paso 5: Invoca la habilidad a través de la API.
Este paso impulsa la generación de facturas de principio a fin a través de la API de Claude Messages. Envía una solicitud estructurada, habilita el uso de herramientas, itera a través de cualquier llamada a herramientas que solicite Claude y, finalmente, recopila cualquier archivo PDF generado de los directorios de trabajo y temporales.
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 función « generate_invoice_with_claude » envía la factura normalizada a la API de Claude y controla la ejecución de la habilidad de principio a fin. Esto es lo que hace el código:
-
Crea un informe claro (
user_text) que incluye el cliente, el período, la moneda, los términos, las partidas y las entradas de la hoja de horas, además de requisitos de salida explícitos como el encabezado, las tablas, los totales y el nombre del archivo. -
A continuación, habilita la ejecución de la herramienta declarando un
bash_numbery untext_editor_numbercon un bucle de mensajes compatible con la herramienta que envía la solicitud, inspeccionastop_reasony, cuando se solicitatool_use, la envía a los ayudantes locales y devuelvetool_resultbloques para continuar el intercambio. -
Finalmente, se detiene en
end_turno cuando se alcanza el límite del bucle, y luego escanea el directorio de trabajo y el directorio temporal del sistema operativo en busca de archivos que coincidan coninvoice*.pdf. Copia cualquier artefacto temporal de vuelta a la carpeta del proyecto y devuelve la lista de archivos PDF encontrados. -
La función
mainproporciona un comando CLI sencillo:python app.py, que valida la ruta de entrada y, a continuación, ejecuta el canal:load_invoice_from_timesheet(...)para crear la carga útil, ygenerate_invoice_with_claude(...)para invocar la habilidad y recopilar los archivos PDF.
Con esto, la llamada a la API debería generar un PDF listo para el cliente. Si no aparece ningún archivo, revisa los registros de tool_result y la configuración de Skill, y vuelve a intentarlo con una pequeña hoja de prueba.

Conclusión
Ahora tienes un generador automático de facturas que funciona con Claude Skills, y la API es capaz de convertir hojas de cálculo sin procesar en facturas listas para enviar a los clientes. Esta demostración muestra lo mejor de Skills: configuración portátil, activación automática, ejecución de código determinista y resultados consistentes en toda la aplicación y la API sin necesidad de recrear indicaciones en cada hilo. Claude Skills ofrece resultados consistentes en distintos contextos, lo que supone un conocimiento del dominio reutilizable y respaldado por código. Aunque las habilidades pueden ejecutar código, debes garantizar la seguridad habilitando solo las habilidades de confianza, utilizando controles a nivel de organización y revisando las actualizaciones antes de su implementación.
Para ir más allá, explora la documentación sobre habilidades de Anthropic y la consola para el control de versiones y las actualizaciones, y luego empieza a componer múltiples habilidades para crear flujos de trabajo integrales.
Introducción a los modelos Claude

Soy una Google Developers Expert en ML(Gen AI), una Kaggle 3x Expert y una Women Techmakers Ambassador con más de 3 años de experiencia en tecnología. Cofundé una startup de tecnología sanitaria en 2020 y estoy cursando un máster en informática en Georgia Tech, especializándome en aprendizaje automático.


