Curso
A Anthropic lançou recentemente o Claude Skills, um módulo reutilizável específico para tarefas que permite que o Claude carregue apenas o conhecimento necessário para um trabalho. Em vez de prompts longos e repetitivos, o Skills agrupa instruções, scripts e recursos para que o Claude possa produzir resultados consistentes e alinhados com a marca em todo o aplicativo Claude, Claude Codee no API.
Neste tutorial, vamos criar um “Gerador automático de faturas” que transforma uma planilha de horas trabalhadas do Excel em uma fatura pronta para o cliente (DOCX/PDF). Ao longo do caminho, você vai aprender como:
- Crie um site minimalista
SKILL.mde envie uma habilidade com os recursos de apoio. - Pré-processe dados como uma folha de ponto com o
pandasem uma carga JSON previsível. - Chame a habilidade pela API com um loop de uso seguro da ferramenta (tags bash/editor de texto).
- Capture artefatos gerados pelo Claude (PDF/DOCX)
No final, você vai ter uma habilidade portátil que pode usar de novo em qualquer lugar do ecossistema Claude.
O que são as habilidades do Claude?
As habilidades do Claude são módulos de tarefas independentes que incluem um arquivo de instruções ( SKILL.md ), scripts opcionais e recursos de apoio. Quando uma tarefa combina com o objetivo de uma habilidade, o Claude carrega as partes mínimas dessa habilidade para fazer a tarefa de forma eficiente. Uma habilidade pode ser vista como um pacote de conhecimentos especializados que você pode versionar, compartilhar e controlar em toda a sua organização.
Principais características das habilidades de Claude
Os principais recursos do Claude Skill mostram como eles continuam rápidos, reutilizáveis e confiáveis em todo o ecossistema Claude. Algumas das principais características incluem:
- Componível: Você pode juntar várias habilidades para fazer fluxos de trabalho com várias etapas, como limpar dados, fazer análises e criar relatórios.
- Portátil: As habilidades seguem um formato comum, então a mesma habilidade funciona de forma consistente em todo o ecossistema Claude.
- Eficiente: O Claude só carrega os componentes mínimos necessários para a tarefa em questão, o que melhora tanto a velocidade quanto a precisão.
- Código executável: As habilidades podem rodar código em uma área segura, permitindo ações determinísticas como criação de arquivos, análise e análise de dados.
Quando você pede ao Claude para “criar um orçamento no Excel com relatórios mensais”, ele avalia sua solicitação, verifica as habilidades disponíveis e ativa apenas as partes relevantes. A ativação aparece na visualização de raciocínio dentro do aplicativo Claude. Como as habilidades são componentes versionados, as equipes podem lançar atualizações sem precisar mudar as instruções em todos os lugares.
Usando as habilidades do Claude em todo o ecossistema Claude
Se você está conversando no aplicativos Claude, programando no Claude Codeou automatizando fluxos de trabalho por meio da API do desenvolvedor, a mesma habilidade pode ser versionada uma vez, gerenciada centralmente e invocada automaticamente quando a tarefa corresponder à sua finalidade. Isso leva a uma qualidade consistente e prazos de entrega mais rápidos. Então, uma habilidade que dá pra usar em qualquer lugar.
Neste tutorial, vamos usar a habilidade “Gerador automático de faturas” no aplicativo Claude e na API para analisar um arquivo Excel e criar uma fatura pronta para enviar.
Claude App
As habilidades do Claude ficam no seu aplicativo Claude e são ativadas automaticamente quando uma solicitação combina com o que elas fazem. Você ativa-os uma vez nas Configurações e, em seguida, basta descrever o resultado que deseja. Claude carrega a habilidade certa e mostra na visualização de raciocínio.

Fonte: Blog do Claude
Pra começar:
- Faça login ou cadastre-se com sua conta do Google e vá para Configurações.
- Em Capacidades, procure a guia Habilidades e carregue um arquivo de habilidade (normalmente um SKILL.md) que possa ser usado em qualquer chat.

Fonte: Blog do Claude
Observação: Esse recurso só está disponível para usuários Pro, Max, Team e Enterprise.
Você também pode encontrar uma lista de habilidades como arte algorítmica, criador de artefatos, diretrizes de marca, design de tela, comunicações internas, criador de mcp, criador de gifs do Slack, etc., para adicionar às suas conversas com o Claude.
Clique em “upload skill” e envie um arquivo zip com o arquivo SKILL.md. Aqui estão os requisitos dos arquivos.
-
Arquivo ZIP que inclui exatamente um arquivo SKILL.md no nível raiz
-
SKILL.mdtem o nome e a descrição de uma habilidade formatados em YAML
O arquivo SKILL.md usado neste tutorial é assim:
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."

Depois de carregar a habilidade, o Claude reconhece automaticamente e abre um novo chat onde ela está pronta para ser usada.

Como isso afeta o uso nos chats?
- Você não precisa “ativar” uma habilidade dentro de cada conversa. Quando for o caso, o Claude chama automaticamente as habilidades ativadas e mostra elas na visualização de raciocínio pra garantir a transparência.
- Desativar uma habilidade faz com que ela não seja considerada em nenhum chat até você reativá-la.
- Se a sua organização define um conjunto padrão de habilidades, como modelos de marca, relatórios, etc., mantê-las ativadas garante resultados consistentes todas as vezes.



Depois, passei minha própria planilha de horas trabalhadas e pedi pro Claude criar uma fatura que pudesse ser editada.

Claude encontrou a habilidade por conta própria, leu o arquivo Excel e gerou uma fatura editável no Word, que também pode ser exportada para PDF ou Word. O layout da fatura parece bem organizado, e o subtotal e o total também estão certinhos. Seguiu as instruções, e tanto os arquivos DOCX editáveis quanto os PDF formatados ficaram com o estilo da marca da Skill.
Agora vamos rodar o mesmo exemplo usando a API.
Plataforma de desenvolvimento Claude (API)
As habilidades do Claude também podem ser acessadas pela API do Claude. Nesta seção, vamos ver como podemos imitar a interface do aplicativo Claude usando a API do Claude.
Passo 1: Pré-requisitos
Comece instalando todas as dependências de tempo de execução:
-
Anthropicpara a API Claude Messages -
pandaseopenpyxlpara ler planilhas de horas trabalhadas do Excel -
reportlabpara gerar uma fatura PDF alternativa localmente
!pip -q install anthropic pandas openpyxl reportlab
Agora temos todas as dependências instaladas. Depois, dá pra configurar a nossa chave API.
Passo 2: Configure sua chave API
Antes de chamarmos a API Mensagens, precisamos fazer a autenticação. Essa etapa cria um único token de acesso de sessão ( anthropic.Client ) reutilizável com a chave da 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)
Faça login no Anthropic Console e procure a aba Chaves de API em Configurações. Clique em“ ” (Criar chave) e copie sua chave da API da Anthropic.

Fonte: API Antrópica
Observação: Se você estiver usando um caderno privado para uso pessoal, adicione sua chave API. Caso contrário, use uma variável de ambiente segura para que sua chave não fique exposta no notebook ou nos registros.
O código acima inicializa o cliente Anthropic SDK e configura o ambiente. O objeto cliente é então reutilizado para todas as chamadas subsequentes da API de mensagens.
Passo 3: Pré-processamento de dados
Nesta etapa, vamos transformar nossa planilha timesheet.xlsxem um objeto JSON limpo e previsível que a Skill pode usar. Isso mantém a lógica a jusante simples e evita a análise frágil de prompts.
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
}
A função load_invoice_from_timesheet transforma um arquivo Excel que você carregou em uma carga JSON normalizada de fatura.
-
Ele lê o Excel com pandas e normaliza os cabeçalhos das colunas.
-
O código então descobre o
invoice_perioda partir da primeira linhaDate(se tiver) usando uma expressão regular e analisando o mês. -
Finalmente, ele detecta os nomes das colunas para título do artigo, valor e tópico sem se importar com maiúsculas e minúsculas.
-
Isso gera duas estruturas:
-
line_items: Isso é usado para cálculos de faturamento (taxa fixa por artigo, neste caso). -
timesheet: Uma lista simples de entradas{title, topic}para um apêndice opcional. -
A expressão regular
(\d{2})\s+(\w+)\s+(\d{4})espera formatos como01 Oct 2025. Se a sua planilha usa outro formato, dá um jeito nela. -
As colunas/valores que faltam são tratados ignorando as linhas vazias, ou você pode estender o código para falhar rapidamente, se necessário.
Nossa contribuição já está pronta. Depois, vamos chamar a habilidade Claude pela API pra transformar a planilha de horas processada numa fatura que dá pra editar.
Passo 4: Funções auxiliares
Nesta seção, vamos definir duas funções auxiliares que simulam a execução da ferramenta que o Claude pede durante uma execução da Skill.
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)}"
A função execute_bash_tool simula uma ferramenta bash segura para ações orientadas por habilidades. Primeiro, ele bloqueia padrões perigosos como rm -rf /, sudo, chmod, mkfs, etc., como uma porta de segurança, e executa o comando com subprocess.run() no diretório temporário do sistema operacional com um tempo limite forçado de 30 segundos.
A função ` execute_text_editor_tool ` oferece uma interface básica de edição de texto usada pelo Skills. Ele suporta três comandos, a saber: ` create ` (para gravar um novo arquivo com ` file_text`), ` view ` (para retornar até 1.000 caracteres de um arquivo) e ` str_replace ` (para ` new_str ` no local). Ele também cria automaticamente pastas pai para create, verifica a existência de arquivos para view e str_replace e grava as atualizações de volta no disco.
Esses auxiliares permitem que você complete um ciclo de uso de ferramentas localmente com proteções. Agora, o Skill pode pedir edições de arquivos ou ações de shell durante a geração de faturas sem colocar seu sistema em risco.
Passo 5: Chame a habilidade pela API
Essa etapa faz a geração completa da fatura usando a API Claude Messages. Ele manda uma solicitação estruturada, permite o uso de ferramentas, repete todas as chamadas de ferramentas que o Claude pede e, por fim, junta todos os arquivos PDF gerados dos diretórios de trabalho e temporários.
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()
A função generate_invoice_with_claude manda a fatura normalizada para a API Claude e controla a execução da Skill do começo ao fim. E aí, o que o código faz:
-
Ele cria um arquivo
user_textbem claro que inclui cliente, período, moeda, termos, itens de linha e entradas da planilha de horas, além de requisitos de saída explícitos, como cabeçalho, tabelas, totais e nome do arquivo. -
Em seguida, ele permite a execução da ferramenta declarando um
bash_numbere umtext_editor_numbercom um loop de mensagens compatível com a ferramenta que envia a solicitação, inspecionastop_reasone, quandotool_useé solicitado, ele despacha para auxiliares locais e retornatool_resultblocos para continuar a troca. -
Por fim, ele para em
end_turnou quando o limite do loop é atingido, então verifica o diretório de trabalho e o diretório temporário do sistema operacional em busca de arquivos que correspondam ainvoice*.pdf. Ele copia todos os artefatos temporários de volta para a pasta do projeto e retorna a lista de PDFs encontrados. -
A função
mainoferece um comando CLI simples:python app.py, que verifica o caminho de entrada e, em seguida, executa o pipeline:load_invoice_from_timesheet(...)para criar a carga útil egenerate_invoice_with_claude(...)para chamar a Skill e coletar PDFs.
Com isso pronto, a chamada da API deve gerar um PDF pronto para o cliente. Se nenhum arquivo aparecer, dá uma olhada nos registros tool_result e na configuração da Skill, depois tenta de novo com uma pequena folha de teste.

Conclusão
Agora você tem um Gerador de Faturas Automáticas funcionando com a ajuda do Claude Skills, e a API consegue transformar planilhas em faturas prontas para os clientes. Essa demonstração mostra o que o Skills faz de melhor, ou seja, configuração portátil, ativação automática, execução de código determinístico e resultados consistentes em todo o aplicativo e API sem precisar recriar prompts em cada thread. O Claude Skills dá resultados consistentes em vários contextos, que são conhecimentos reutilizáveis do domínio e baseados em código. Embora as Skills possam executar código, você ainda precisa garantir a segurança ativando apenas Skills confiáveis, usando controles no nível da organização e revisando as atualizações antes da implementação.
Para ir mais longe, dá uma olhada nos documentos sobre Skills da Anthropic e no Console para ver versões e atualizações, e depois começa a criar várias Skills para montar fluxos de trabalho completos.
Introdução aos Modelos Claude

Sou Google Developers Expert em ML (Gen AI), Kaggle 3x Expert e Women Techmakers Ambassador com mais de 3 anos de experiência em tecnologia. Fui cofundador de uma startup de tecnologia de saúde em 2020 e estou fazendo mestrado em ciência da computação na Georgia Tech, com especialização em machine learning.

