📋 Sobre o projeto

Um assistente de finanças pessoais operado por voz. O usuário fala um comando em português, e a aplicação registra o gasto ou responde uma consulta — sem formulário, sem digitar.

A ideia central não é usar IA — é conectar IA a uma aplicação real sem deixar que ela atravesse as fronteiras do código. A IA nunca fala com o banco: ela pede a execução de um caso de uso, que é Java comum, testável, e funcionaria igual atrás de um formulário web.

🔄 O pipeline de voz

Cada interação percorre quatro estágios:

1 Fala → texto

O Whisper transcreve o áudio enviado pelo usuário.

2 Interpretação e tool calling

O gpt-4o-mini entende a intenção e escolhe qual função Java invocar.

3 Execução do caso de uso

Java e JPA persistem os dados. É aqui que a regra de negócio vive — não no prompt.

4 Texto → fala

O gpt-4o-mini-tts devolve a resposta em áudio.

🧰 As ferramentas expostas à IA

Quatro métodos anotados com @Tool formam todo o vocabulário que o modelo tem à disposição:

FerramentaO que faz
registrarGastoCria uma transação — só o valor é obrigatório
consultarTotalDoPeriodoSoma as despesas entre duas datas
listarGastosDoPeriodoLista as transações individuais
consultarTotalPorCategoriaAgrupa os totais por categoria

🏛️ Arquitetura em camadas

A dependência aponta sempre para dentro. Trocar o OpenAI por outro provedor, ou o H2 por MySQL, não encosta no domínio.

🔌 Endpoints REST

MétodoRotaEntradaSaída
POST/api/chatJSON com a mensagemJSON com a resposta
POST/api/transcribeÁudio (multipart)JSON com o texto
POST/api/synthesizeJSON com o textoaudio/mpeg
POST/api/assistant/voiceÁudio (multipart)audio/mpeg

Todos eles são documentados em OpenAPI 3.1 pelo springdoc e podem ser testados direto do navegador em /docs.

⚖️ Decisões técnicas

✅ Testes

São 17 testes automatizados, separados pelo que custam para rodar:

TipoQtd.TempoCusto
Unitários110,4szero
De fatia (@WebMvcTest, @DataJpaTest)54szero
De contexto (@SpringBootTest)19szero
De integração com a OpenAI (sufixo *IT)5~30smínimo

Os testes verificam efeitos — o dado gravado no banco — em vez de afirmar sobre o texto que o modelo produziu, que varia a cada execução.

⏱️ Latência

Registrar um gasto leva cerca de 8,3s e uma consulta, 6,5s. O tempo reflete quatro chamadas à OpenAI por interação: transcrição, duas rodadas de chat e síntese de voz — não lentidão da aplicação em si.

📖 Leitura complementar

Escrevi um artigo percorrendo esta API endpoint por endpoint no Swagger UI: como enviar um áudio pelo navegador, ler o pipeline nos headers da resposta e usar a própria interface para medir uma decisão de design em bytes. Ler o artigo →