95% dos devs Java integram IA como caixa preta. Os 5% que ativam o Thinking Mode do Claude 4 no Spring Boot tomam decisoes arquiteturais em segundos.
Existe uma forma de adicionar raciocinio arquitetural ao seu sistema Spring Boot sem precisar implementar uma IA do zero. A maioria dos devs Java ainda nao descobriu que o Spring AI ja suporta o Thinking Mode do Claude 4, que expoe o processo de raciocinio do modelo antes de dar a resposta final. Bora ver como isso funciona na pratica.
O que é Spring AI e por que a Anthropic tem um SDK Java oficial
Se você trabalha com Spring Boot há alguns anos, sabe que integrar serviços externos sempre foi natural: um @FeignClient aqui, um RestTemplate ali, e pronto. Com LLMs, a história é parecida, mas tem nuances que mudam bastante o resultado.
O Spring AI é o projeto oficial da Spring que abstrai a comunicação com provedores de modelos de linguagem, incluindo a Anthropic. Em vez de você lidar direto com requisições HTTP à API do Claude, o Spring AI oferece uma interface unificada com ChatClient, gerenciamento de prompts, memória de conversação e, mais recentemente, suporte a Extended Thinking.
A Anthropic também lançou o SDK Java oficial (com.anthropic:anthropic-java), disponível a partir da versão 2.32.0+. O Spring AI 2.0.0-M3 migrou para esse SDK como thin adapter, o que significa: melhor manutenibilidade, suporte a sync/async nativo e acesso automático a novas features da API assim que saem.
Na empresa em que trabalhei como Tech Leader, a gente tentou integrar o Claude direto via chamadas HTTP brutas antes de o Spring AI ter suporte oficial. Era um boilerplate enorme de tratamento de erro, retry logic e parsing de SSE. Depois que o Spring AI evoluiu, a integração virou questão de configurar 3 propriedades. Essa é a diferença que vale.
Para a referência oficial: Spring AI Anthropic Chat e o anthropic-sdk-java no GitHub. Veja também nosso artigo sobre Spring AI: introdução a LLMs no Java.
Configurando o projeto: dependências e credenciais
Bora para a parte prática. O pré-requisito é Java 21+ e Spring Boot 3.3+. Adicione as dependências no pom.xml:
<!-- Spring AI BOM -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-anthropic</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
No application.yaml, configure a API key via variável de ambiente — nunca diretamente no arquivo:
spring:
ai:
anthropic:
api-key: ${ANTHROPIC_API_KEY}
chat:
options:
model: claude-sonnet-4-6
max-tokens: 4096
temperature: 0.7
Para exportar localmente: export ANTHROPIC_API_KEY=sk-ant-.... Em produção use AWS Secrets Manager, Azure Key Vault ou a solução de secrets do seu ambiente. Nunca commit de API keys.
Primeira integração: ChatClient funcionando em 10 linhas
Com a dependência e configuração prontas, o ChatClient já está disponível para injeção:
@RestController
@RequestMapping("/api/claude")
public class ClaudeController {
private final ChatClient chatClient;
public ClaudeController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
@PostMapping("/ask")
public String ask(@RequestBody String question) {
return chatClient
.prompt()
.user(question)
.call()
.content();
}
}
Mas aqui ainda é o Claude como caixa preta, sem o reasoning explícito. Bora para a parte que interessa.
Ativando o Thinking Mode: reasoning nativo no Spring Boot
O Extended Thinking é uma feature do Claude 4 que faz o modelo publicar o raciocínio intermediário antes de chegar na resposta final. Pensa como aquele colega sênior que pensa em voz alta enquanto resolve um problema de arquitetura. Você entende por que ele chegou lá, e pode discordar de algum passo.
Para ativar no Spring AI, use as opções específicas do provider Anthropic:
@Service
public class ArchitectureReviewService {
private final ChatClient chatClient;
public ArchitectureReviewService(ChatClient.Builder builder) {
this.chatClient = builder
.defaultSystem("Voce e um arquiteto senior de Java. Analise o problema antes de responder.")
.build();
}
public ThinkingResponse reviewArchitecture(String question) {
var options = AnthropicChatOptions.builder()
.model(AnthropicApi.ChatModel.CLAUDE_OPUS_4_7.getValue())
.maxTokens(16000)
.thinkingType("enabled")
.thinkingBudgetTokens(10000)
.build();
var response = chatClient
.prompt(new Prompt(new UserMessage(question), options))
.call().chatResponse();
return new ThinkingResponse(
response.getResult().getOutput().getMetadata().get("thinking").toString(),
response.getResult().getOutput().getContent()
);
}
}
public record ThinkingResponse(String thinking, String answer) {}
Dois pontos importantes: o Thinking Mode consome mais tokens e aumenta o custo por chamada. Configure o thinkingBudgetTokens de acordo com a complexidade da pergunta. Para revisões de arquitetura, 10.000 tokens é razoável. Para respostas simples, 1.000 resolve. Tem impacto na latência também, então pense em usar de forma assíncrona. Veja como em nosso artigo sobre CompletableFuture no Spring Boot.
Casos de uso reais: quando o Thinking Mode faz diferença
Essa feature não é para qualquer situação. Onde ele brilha de verdade:
- Revisão de decisões de arquitetura: perguntas do tipo "qual abordagem é melhor" se beneficiam do raciocínio explícito. O modelo compara trade-offs em vez de dar a resposta mais óbvia.
- Diagnóstico de problemas complexos: logs com múltiplos componentes, erros em cascata. O thinking mostra por onde o Claude começou a investigar e o que descartou.
- Code review automatizado: ao analisar um diff grande, o modelo raciocina sobre dependências e efeitos colaterais. O thinking torna o review mais defensável.
- Geração de testes unitários com contexto: o modelo entende a intenção do código antes de gerar os asserts, resultando em testes mais precisos.
Quando não usar:
- Respostas factuais simples ("qual a versão LTS do Java?") — thinking só adiciona custo
- Streaming em tempo real para o usuário final — o thinking block não aparece no stream de forma amigável
- Quando latência é crítica (<500ms) — thinking adiciona 2-5 segundos
Para monitorar as chamadas em produção, veja como o Micrometer ajuda com observabilidade.
Perguntas frequentes
Qual a diferença entre Claude 4 Sonnet e Opus para essa integração?
O Opus gera raciocínio mais profundo com Thinking Mode, mas custa mais e é mais lento. O Sonnet tem boa qualidade de thinking para casos intermediários e é 5x mais econômico. Comece com Sonnet em dev e avalie se o Opus é necessário em produção.
O Extended Thinking funciona com streaming no Spring AI?
Parcialmente. O Spring AI suporta streaming para a resposta final, mas o thinking block é retornado antes do stream. Para chat em tempo real, avalie se exibir o thinking ao usuário faz sentido ou se prefere logar internamente.
Preciso do Spring AI 2.0.0-M3 ou a versão 1.x funciona?
O Thinking Mode com o SDK oficial exige Spring AI 1.0.0+ com o starter spring-ai-starter-model-anthropic. Versões mais antigas usavam um RestClient customizado sem suporte. Veja o guia de migração oficial.
Como gerencio o custo de tokens em produção?
Configure o thinkingBudgetTokens dinamicamente baseado na complexidade da query. Comece com budget baixo (1.000) e aumente só se necessário. Adicione o usage da resposta ao seu sistema de métricas para monitorar o gasto por endpoint.
O Claude 4 suporta tool use junto com Thinking Mode?
Sim, o Claude 4 tem suporte a interleaved thinking com tool use. O raciocínio acontece entre chamadas de tools. O Spring AI abstrai isso via FunctionCallback. Muito útil para agents que precisam justificar por que chamaram uma determinada tool.
Conclusão e próximos passos
Bora revisar o que você aprendeu aqui:
- O Spring AI tem suporte nativo ao Claude 4 via SDK oficial da Anthropic
- O Thinking Mode expõe o raciocínio intermediário do modelo, útil para arquitetura, diagnóstico e code review
- A configuração é mínima: dependência, API key e
AnthropicChatOptionscomthinkingType("enabled") - Use Thinking Mode onde ele agrega valor real: decisões complexas, debugging, análise de código
Você já usa o Claude ou outro LLM integrado ao seu sistema Java? Qual o caso de uso mais interessante que você já viu? Conta nos comentários, quero ouvir como está sendo na prática.
Na próxima semana vou mostrar como construir um Agent completo em Spring AI com tool use, memória de conversação e streaming para o usuário final. Muito mais que um simples ChatClient, o pattern de agent tem sido adotado por times de produto para substituir fluxos de workflow complexos. Não perde.