I'm a full-stack engineer moving my backend experience into AI engineering: LLM agents, MCP servers and graph RAG, built with the same habits as any production system. Deterministic code makes the decisions, every claim is backed by an eval, and guardrails assume the model will get things wrong.
data class WesleyReis(
val name : String = "Wesley Reis",
val role : String = "Software Engineer · AI Engineering",
val focus : List<String> = listOf("LLM Agents", "MCP Servers", "Graph RAG", "Evals", "Backend"),
val ai : List<String> = listOf("LangGraph", "LangChain", "Spring AI", "MCP", "Neo4j / Cypher", "pgvector", "OpenRouter"),
val practice : List<String> = listOf("Eval-driven prompts", "Retrieval evals", "Structured outputs", "Guardrails", "Agent memory"),
val languages: List<String> = listOf("TypeScript", "Python", "Java 21", "Kotlin"),
val backend : List<String> = listOf("Node.js / Fastify", "Spring Boot 4", "FastAPI"),
val frontend : List<String> = listOf("React 19", "Next.js"),
val data : List<String> = listOf("PostgreSQL", "Neo4j", "Redis", "SQLite", "Kafka"),
val cloud : List<String> = listOf("AWS", "Docker", "GitHub Actions"),
val funFact : String = "I turn ☕ into distributed systems"
)
🏎️ f1-graph-qaAsk about Formula 1 history in plain English. A LangGraph agent writes Cypher over a Neo4j graph of every Grand Prix since 1950 (26k race results), fixes its own failed queries, and answers only from what the database returns.
|
🎬 tmdb-mcpAn MCP server for The Movie Database, designed around how agents use tools: compact typed outputs, names instead of ids, and errors an agent can act on.
|
|
A travel assistant with long-term memory the user controls. It learns preferences from what the traveller says, never from its own suggestions, and keeps a change log.
|
A conversational table-booking agent where the LLM understands and phrases, and deterministic code decides availability.
|
|
Event-driven ticket triage: two Spring Boot services over Kafka. An LLM classifies tickets and drafts grounded replies; when the model is slow or down, keyword rules take over, and a human approves every reply.
|
Ask the Spring Boot reference docs and get streamed answers that cite the exact sections. The same index is an MCP server for coding agents.
|
Explainable music recommendations over a Last.fm listening graph, with a mood search tuned to each listener's taste.
|
The same principles run through every project above:
| Principle | In practice |
|---|---|
| The LLM understands, code decides | The booking agent never decides availability; a rules engine does, and the reply may only use its result. |
| No claim without an eval | Each project ships an eval runner: execution accuracy for text-to-Cypher, intent and slot accuracy, memory precision and recall, retrieval hit rate, recommendation recall against a baseline. |
| Assume the model will be wrong | Read-only guards plus READ transactions for generated Cypher, retries fed with the actual error, and graceful failure when extraction breaks. |
| The model will also be down | A circuit breaker hands triage to keyword rules, explanations fall back to a template, and agents try the next model when a provider fails. |
| Design tools for agents, not for APIs | Compact outputs, human names instead of ids, and error messages that tell the agent how to fix its call. |
| Users own their data | Agent memory can be inspected, traced to when it was learned, and erased. |
"First, solve the problem. Then, write the code." — John Johnson
⭐️ From wsqreis