Build and demo Java AI agent systems with langchain4j-agentic: workflow patterns, supervisor, custom Planner strategies (incl. the flagship typed-verdict / CriticResult-style critic pattern), plus MCP tools, A2A remote agents, build setup, and conference-demo storylines. Pinned to 1.15.0 / 1.15.0-beta25.
84
89%
Does it follow best practices?
Impact
100%
4.76xAverage score across 2 eval scenarios
Passed
No known issues
{
"context": "Tests whether the agent correctly configures parallel and loop workflow patterns in langchain4j-agentic: explicit Executor for concurrency, no ChatMemory on parallelMapper sub-agents, bounded loops with maxIterations and exitCondition, maxSequentialToolsInvocations on tool-using agents, and observability via AgentMonitor.",
"type": "weighted_checklist",
"checklist": [
{
"name": "No ChatMemory on parallel sub-agents",
"description": "Sub-agents used inside a parallelMapperBuilder (the per-item fan-out) do NOT have .chatMemory(...) or @ChatMemorySupplier configured — they are stateless by construction",
"max_score": 15
},
{
"name": "Explicit Executor provided",
"description": "The parallelBuilder or parallelMapperBuilder call includes an explicit .executor(...) argument (e.g. Executors.newFixedThreadPool(N) or newVirtualThreadPerTaskExecutor()) — does NOT rely solely on an internal default pool",
"max_score": 15
},
{
"name": "loopBuilder sets maxIterations",
"description": "The iterative refinement loop is built with loopBuilder and includes a .maxIterations(N) call to bound the number of retry cycles",
"max_score": 15
},
{
"name": "loopBuilder has exitCondition",
"description": "The loopBuilder includes an .exitCondition(...) predicate over the AgenticScope (e.g. checking the score against a threshold) in addition to the maxIterations bound",
"max_score": 15
},
{
"name": "parallelMapper fan-out over the batch",
"description": "The batch classification/scoring stage uses parallelMapperBuilder to fan the SAME agent out over the collection of articles (naming the collection via itemsProvider, or relying on a single iterable argument) — it does NOT hand-roll a manual loop or a fixed set of distinct parallel sub-agents",
"max_score": 15
},
{
"name": "AgentMonitor and HtmlReportGenerator",
"description": "An AgentMonitor is registered on the top-level workflow via .listener(monitor) and HtmlReportGenerator.generateReport(monitor, path) is called after the pipeline run",
"max_score": 15
},
{
"name": "outputKey not outputName",
"description": "All agent builders and @Agent annotations use 'outputKey' to publish results — the deprecated 'outputName' does not appear anywhere in the source files",
"max_score": 10
}
]
}