Series
Building agents on the JVM with Embabel
Learning Embabel by building with it, in order — planning, testing without a model, tools, human-in-the-loop, tracing, exposing it over MCP.
7 posts
·
45 min total
·
updated 28 Jul 2026
Part 1
One Goal Too Many: Learning Embabel's Planner the Hard Way
My first afternoon with Embabel, the JVM agent framework. I added one action too many, the planner quietly stopped early, and a cryptic get(...) must not be null taught me how GOAP, goals, and AgentInvocation actually fit together.
24 Jul 2026
·
8 min read
Part 2
Stub the Model, Assert the Plan: Unit-Testing Embabel Agents
The non-deterministic part of an agent is the LLM. Box it out and the rest is ordinary, deterministic code you can test. Here's how I test Embabel agents on the JVM without spending a single token.
25 Jul 2026
·
5 min read
Part 3
Give the Agent Hands: Tools in Embabel
An LLM cannot know a live account balance, and in banking a confidently hallucinated number is a disaster. The fix is a tool. Here's how @LlmTool works in Embabel on the JVM, plus the one API gotcha that cost me a compile.
25 Jul 2026
·
5 min read
Part 4
The Agent Asks First: Human-in-the-Loop with Embabel's WaitFor
In regulated work the dangerous agent is the one that acts without asking. Here's how I made an Embabel agent pause for human approval before moving money -- with the approval built into the type graph, not an if-check.
25 Jul 2026
·
5 min read
Part 5
Embabel Agents Being Tracked Through LGTM Observability
I pointed my Embabel agents at a local Grafana LGTM stack and saw nothing. Three configuration gotchas later, every GOAP planning step, LLM call and tool loop shows up as a span in Tempo. Here is the full walkthrough, with screenshots.
26 Jul 2026
·
8 min read
Part 6
The Silent No-Op: Exposing Embabel Agents Over MCP
Turning my JVM agents into MCP tools took one dependency and one annotation. It also took three silent failures -- a starter that suppresses the web server, a shell that eats your CLI flags, and an annotation default that publishes exactly zero tools without telling you.
26 Jul 2026
·
7 min read
Part 7
The condition nothing could satisfy: custom @Condition gates in Embabel
My agent refused to run a single action. The @Condition gate was FALSE and nothing in the agent could ever make it TRUE, because Embabel builds an action's effects from what you declare, not from what your condition reads.
28 Jul 2026
·
7 min read