Portfolio Agent
Um agente de IA bilíngue e durável integrado a este portfólio para responder sobre minha carreira, projetos e decisões técnicas.
- Eve
- OpenAI
- json-render
- Transformers.js
- Next.js
Desafio
Tornar um agente de portfólio realmente útil para recrutadores e engenheiros sem permitir que ele invente fatos profissionais ou vire um assistente genérico sem limites.
Abordagem
Gerar contexto canônico permanente a partir dos mesmos dados tipados usados pelo portfólio e instruir o modelo a verificar cada afirmação nesse contexto. Os componentes de UI generativa recebem apenas identificadores do portfólio, então cards e linhas do tempo são renderizados com os dados do próprio site em vez de fatos escritos pelo modelo, e cada spec é validada antes de chegar ao navegador. As ferramentas padrão do harness ficam desligadas, e uma suíte de evals cobre fundamentação, prompt injection, idioma e escolhas de UI. O speech-to-text roda inteiro em um Web Worker.
Resultado
Uma experiência bilíngue fundamentada no portfólio público, transparente quando uma informação não está disponível e com transcrição de voz local.
Arquitetura
Decisões e trade-offs
Os componentes de UI generativa recebem identificadores do portfólio, nunca texto livre
O modelo escolhe qual projeto, empresa ou skill mostrar, e o card renderiza os fatos desse item a partir dos dados do próprio site, então o modelo nunca escreve o que um card diz.
Um componente só mostra o que os dados já registram; um tipo novo de fato exige mudar o código, não o prompt.
A comparação com uma vaga passa por uma segunda checagem, feita por outro modelo
É o único componente com texto escrito pelo modelo, e um visitante já conseguiu fazer o agente renderizar uma ofensa nele. O verificador vê só o bloco, não a conversa, e falha fechado.
Uma chamada a mais ao modelo por comparação, e uma comparação legítima pode ser recusada.
As perguntas de continuação são geradas fora do loop do agente
Uma ferramenta que o agente chamava no fim de cada resposta era pulada em cerca de um terço das vezes, então o chat agora pede as perguntas numa chamada estruturada curta depois que o turno termina.
Um endpoint separado, que precisa do seu próprio rate limit e limite de tamanho.
