Experimentando Starlette 1.0 com habilidades de Claude

Experimentando Starlette 1.0 com habilidades de Claude


Experimentando Starlette 1.0 com habilidades de Claude

22 de março de 2026

Starlette 1.0 foi lançada! Isso é realmente um grande negócio. Acho que Starlette pode ser a estrutura Python com mais uso em comparação com seu reconhecimento de marca relativamente baixo, porque Starlette é a base do FastAPI, que atraiu uma grande quantidade de buzz que parece ter ofuscado a própria Starlette.

Kim Christie começou a trabalhar no Starlette em 2018 e rapidamente se tornou meu favorito na nova geração de estruturas Python ASGI. A única razão pela qual não o usei como base para meu próprio projeto Datasette foi que ele ainda não prometia estabilidade, e eu estava determinado a fornecer uma API estável para os próprios plug-ins do Datasette… embora ainda não tenha sido corajoso o suficiente para lançar minha própria versão 1.0 (depois de 26 alfas e contando)!

Então, em setembro de 2025, Marcelo Trylesinski anunciou que Starlette e Uvicorn estavam transferindo para suas contas do GitHub, em reconhecimento aos seus muitos anos de contribuições e para facilitar o recebimento de patrocínio para esses projetos.

A versão 1.0 tem algumas alterações importantes em comparação com a série 0.x, descritas nas notas de versão 1.0.0rc1 lançadas em fevereiro.

A mais notável delas é uma mudança na forma como o código é executado na inicialização e no desligamento. Anteriormente isso era tratado por on_startup e on_shutdown parâmetros, mas o novo sistema usa um mecanismo de vida útil baseado em um gerenciador de contexto assíncrono:

@contextlib.asynccontextmanager
async def lifespan(app):
    async with some_async_resource():
        print("Run at startup!")
        yield
        print("Run on shutdown!")

app = Starlette(
    routes=routes,
    lifespan=lifespan
)

Se você nunca experimentou o Starlette antes, parece-me um cruzamento assíncio-nativo entre Flask e Django, não é surpreendente, já que o criador Kim Christie também é responsável pelo Django REST Framework. Crucialmente, isso significa que você pode escrever a maioria dos aplicativos como um único arquivo Python, estilo Flask.

Isso faz com que realmente é fácil para os LLMs cuspir um aplicativo Starlette funcional a partir de um único prompt.

Há apenas um problema aí: se o 1.0 quebra a compatibilidade com o código Starlette no qual os modelos foram treinados, como podemos fazer com que eles gerem um código que funcione com o 1.0?

Decidi ver se conseguia fazer isso funcionar com uma habilidade.

Desenvolvendo uma habilidade com Claude

O bate-papo regular de Claude em claude.ai possui habilidades, e uma dessas habilidades padrão é a habilidade de criador de habilidades. Isso significa que Claude sabe como desenvolver suas próprias habilidades.

Então comecei uma sessão de chat e disse:

Clone Starlette do GitHub – ele acaba de lançar sua versão 1.0. Crie um documento de redução de habilidades para esta versão que inclua exemplos de código de cada recurso.

Eu nem disse onde encontrar o repositório, Starlette é amplamente conhecido e eu esperava que pudesse encontrá-lo por conta própria.

Correu git clone https://github.com/encode/starlette.git que na verdade é o nome antigo do repositório, mas o GitHub lida com redirecionamentos automaticamente, então funcionou perfeitamente.

O documento de habilidade resultante me pareceu muito completo… e então notei um novo botão no topo que eu não tinha visto antes chamado “Copiar para suas habilidades”. Então cliquei:

Captura de tela da interface do Claude.ai mostrando uma conversa intitulada "Documento de habilidade Starlette 1.0 com exemplos de código." O painel esquerdo mostra um bate-papo onde o usuário solicitou: "Clone Starlette do GitHub - ele acaba de lançar a versão 1.0. Crie um documento de redução de habilidades para esta versão que inclua exemplos de código de cada recurso." As respostas de Claude incluem seções recolhidas rotuladas "Repositório de clonagem estratégica e documentação de exemplos abrangentes de recursos," "Detalhes da versão examinados e documentação fonte pesquisada de forma abrangente," e "Conhecimento Starlette 1.0 sintetizado para construir documentação abrangente de habilidades," com mensagens intermediárias como "Clonarei Starlette do GitHub e criarei um documento de habilidades abrangente. Deixe-me começar lendo o guia do criador de habilidades e depois clonando o repositório," "Agora deixe-me ler todos os arquivos de documentação para capturar todos os recursos:" e "Agora tenho um conhecimento completo de toda a base de código. Deixe-me construir o documento abrangente de habilidades." O painel direito mostra um painel de visualização de habilidades com botões "Copie para suas habilidades" e "Cópia" na parte superior e uma seção de descrição lendo: "Crie aplicativos web assíncronos e APIs com Starlette 1.0, a estrutura ASGI leve para Python. Use esta habilidade sempre que um usuário quiser criar um aplicativo web Python assíncrono, API REST, servidor WebSocket ou aplicativo ASGI usando Starlette. Os gatilhos incluem menções a 'Starlette', 'ASGI', estruturas web Python assíncronas ou solicitações para construir APIs assíncronas leves, serviços WebSocket, respostas de streaming ou pipelines de middleware. Use também quando o usuário estiver trabalhando com componentes internos do FastAPI (que é construído em Starlette), precisar de padrões de middleware ASGI ou desejar um servidor web assíncrono mínimo" (texto truncado).

E agora meu chat regular com Claude tem acesso a essa habilidade!

Um aplicativo de demonstração de gerenciamento de tarefas

Iniciei uma nova conversa e perguntei:

Crie um aplicativo de gerenciamento de tarefas com Starlette, ele deve ter projetos e tarefas e comentários e rótulos

E Claude fez exatamente isso, produzindo um clone simples do GitHub Issues usando Starlette 1.0, um banco de dados SQLite (via aiosqlite) e um modelo Jinja2.

Claude até testou o aplicativo manualmente assim:

cd /home/claude/taskflow && timeout 5 python -c "
import asyncio
from database import init_db
asyncio.run(init_db())
print('DB initialized successfully')
" 2>&1

pip install httpx --break-system-packages -q \
  && cd /home/claude/taskflow && \
  python -c "
from starlette.testclient import TestClient
from main import app

client = TestClient(app)

r = client.get('/api/stats')
print('Stats:', r.json())

r = client.get('/api/projects')
print('Projects:', len(r.json()), 'found')

r = client.get('/api/tasks')
print('Tasks:', len(r.json()), 'found')

r = client.get('/api/labels')
print('Labels:', len(r.json()), 'found')

r = client.get('/api/tasks/1')
t = r.json()
print(f'Task 1: \"{t(\"title\")}\" - {len(t(\"comments\"))} comments, {len(t(\"labels\"))} labels')

r = client.post('/api/tasks', json={'title':'Test task','project_id':1,'priority':'high','label_ids':(1,2)})
print('Created task:', r.status_code, r.json()('title'))

r = client.post('/api/comments', json={'task_id':1,'content':'Test comment'})
print('Created comment:', r.status_code)

r = client.get("https://simonwillison.net/")
print('Homepage:', r.status_code, '- length:', len(r.text))

print('\nAll tests passed!')
"

Apesar de todo o burburinho sobre Claude Code, é fácil ignorar que o próprio Claude agora conta como um agente de codificação, totalmente capaz de escrever e testar o código que está escrevendo.

Esta é a aparência do aplicativo resultante. O código está aqui no meu repositório de pesquisa.

Captura de tela de um aplicativo de quadro Kanban com tema sombrio chamado "Fluxo de tarefas" mostrando o "Redesenho do site" projeto. A barra lateral esquerda tem seções "VISÃO GERAL" com "Painel", "Todas as tarefas"e "Etiquetas"e "PROJETOS" com "Redesenho do site" (1) e "Plataforma API" (0). A área principal possui três colunas: "PENDÊNCIA" (0) mostrando "Nenhuma tarefa", "EM ANDAMENTO" (1) com um cartão intitulado "Blog sobre Starlette 1.0" marcado "MÉDIO" e "Documentação"e "FEITO" (0) mostrando "Nenhuma tarefa". Leitura dos botões no canto superior direito "+ Nova tarefa" e "Excluir".



Source link

Postagens Similares

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *