I wanted to actually learn LangChain4j and LangGraph4j beyond the "hello world" chat example, so I built something with enough moving parts to force real decisions: a hiring workflow where several AI agents independently score a candidate, a graph aggregates their opinions into a routing decision, and a human gets pulled in whenever the signals aren't clean. It's langchain4j-sample on Spring Boot, with LangGraph4j's Postgres checkpointer for state.
This post is two things: first, how the framework pieces fit together and what I learned exploring them; second — because I didn't stop at "works against a mock LLM" — what happened when I pointed the same graph at a real, local, CPU-only Ollama model, and what that taught me about running agentic workflows outside a demo.
Why LangGraph4j instead of just chaining LangChain4j calls
The workflow needed three things a plain sequence of LLM calls doesn't give you for free: independent agents that run at the same time, a pause point that waits for a human and resumes later (possibly minutes or days later, possibly after a restart), and a durable record of exactly what happened at each step. That's what pushed me toward LangGraph4j's StateGraph rather than just wiring LangChain4j calls together by hand.






