A Spring Boot starter that adds a live workflow visualization UI and REST API for Embabel agents — zero code required.
This is a multi-module Maven project:
| Module | Purpose |
|---|---|
embabel-workflow-visualizer-starter |
Spring Boot auto-configuration, REST API, actuator endpoint, and visualization UI |
embabel-sample-application |
Runnable sample Embabel application that uses the starter |
# Build and test everything from the repository root
mvn test
# Test only the starter module
mvn -pl embabel-workflow-visualizer-starter testCompatibility note: this project is built against Spring Boot 4.1 and validated against Embabel 1.5.0 (the latest release, available on Maven Central). Embabel 1.5.0 requires Spring Boot 4.x / Spring AI 2.x, so this line of the starter is Spring Boot 4 only.
| Visualizer | Spring Boot | Embabel | Java |
|---|---|---|---|
1.0.x |
4.1.x | 1.5.x | 21+ |
0.3.x |
3.5.x | 1.0.x | 21+ |
A single artifact cannot support both Spring Boot 3 and 4 (Spring Framework 7 baseline), so consumers still on Spring Boot 3.5 should stay on the 0.3.x line.
It supports every Embabel annotation feature: @Agent (GOAP / UTILITY / HYBRID / SUPERVISOR planners, opaque, provider, beanName, scan, agent-level actionRetryPolicy / actionRetryPolicyExpression), @EmbabelComponent (scan), @Action (pre/post, cost/value, costMethod/valueMethod, canRerun, readOnly, clearBlackboard, outputBinding, event trigger, actionRetryPolicy and actionRetryPolicyExpression), @Condition (name, cost), @Cost, @AchievesGoal (value, tags, examples, and @Export with remote, local, name, startingInputTypes), @State, @LlmTool (description, name, returnDirect, category, metadata), and the @Provided / @RequireNameMatch parameter annotations.
The library is published to Maven Central.
<dependency>
<groupId>com.patbaumgartner.embabel</groupId>
<artifactId>embabel-workflow-visualizer-starter</artifactId>
<version>1.0.0</version>
</dependency>Embabel 1.5.0 and the visualizer starter are both published to Maven Central, so no extra repository configuration is needed. Only if your project uses Embabel snapshot dependencies, add the Embabel snapshot repository:
<repositories>
<!-- Required for com.embabel.agent.* snapshot dependencies -->
<repository>
<id>embabel-snapshots</id>
<name>Embabel Snapshot Repository</name>
<url>https://repo.embabel.com/artifactory/libs-snapshot</url>
<releases><enabled>false</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories># Expose the actuator endpoint over HTTP
management.endpoints.web.exposure.include=health,info,embabel
# Enable the REST API (GET /embabel-workflows/api) and the visualization UI
embabel.workflow.visualizer.enabled=true| Endpoint | Requires | Description |
|---|---|---|
GET /actuator/embabel |
management.endpoints.web.exposure.include=embabel |
Returns the workflow catalog as JSON |
GET /embabel-workflows/api |
embabel.workflow.visualizer.enabled=true |
REST API — returns the workflow catalog as JSON |
GET /embabel-workflows |
embabel.workflow.visualizer.enabled=true |
Interactive pan/zoom workflow visualization UI |
The starter activates automatically when:
- The application runs in a servlet web environment (
@ConditionalOnWebApplication(SERVLET)) - Spring Boot Actuator is on the classpath
| Bean | Always registered | Condition |
|---|---|---|
EmbabelWorkflowCatalogService |
✅ | Discovers @Agent beans via the ApplicationContext |
EmbabelWorkflowActuatorEndpoint |
When exposed | Requires management.endpoints.web.exposure.include=embabel |
EmbabelWorkflowApiController |
Off by default | Requires embabel.workflow.visualizer.enabled=true |
WorkflowVisualizerPageController |
Off by default | Requires embabel.workflow.visualizer.enabled=true |
All beans use @ConditionalOnMissingBean — declare your own bean to replace any of them.
The UI (GET /embabel-workflows) renders each discovered @Agent as an interactive flow diagram:
- Drag individual nodes to rearrange the layout · Drag the background to pan · Scroll to zoom · Double-click background to auto-fit
- Hover over any node to spotlight its connected edges and neighbours
- Per-agent controls: Fit, Zoom In, Zoom Out, Reset Layout
- Node types color-coded with the 42talents brand palette (cyan, yellow, green, pink, orange)
- Animated flowing arrows on pre-condition edges; AchievesGoal nodes glow green
- Node badges surface
canRerun,readOnly,clearBlackboard,@LlmTool, event-triggered actions (@Action(trigger=)),returnDirecttools, MCP-exported goals (@Export(remote = true)), and goals withheld from local callers (@Export(local = false)) - Cost / value rows show static
cost=/value=declarations, dynamiccostMethod=/valueMethod=references,@AchievesGoal(value=), and@Condition(cost=);retry/retry policyrows show the per-action SpEL QoS key andActionRetryPolicyconstant, andcategory,tool nameand metadata rows describe the@LlmTool - Goal rows show
starts fromfor@Export(startingInputTypes=); step rows showprovided(@Provided) andname match(@RequireNameMatch) parameters - Agent headers show the planner badge (GOAP / UTILITY / HYBRID / SUPERVISOR / COMPONENT),
opaque, ascan offbadge forscan = false, and thebeanNameplus agent-level retry policy - Light / dark mode toggle, respects
prefers-color-scheme
The embabel-sample-application module ships eleven demo agents covering common enterprise use cases.
Each agent intentionally demonstrates a different workflow pattern so you can see how the Embabel
planner handles linear flows, fan-in, branching, converging branches, dynamic cost methods, static
cost declarations, Utility AI planning, Hybrid planning, @State routing, LLM-supervised planning, and
revision loops.
| Agent | Workflow pattern | Description | Endpoint |
|---|---|---|---|
KycVerificationAgent |
Branching + 2× @AchievesGoal |
Screens a customer against risk indicators; routes to enhanced due diligence or a direct risk assessment. | POST /api/kyc/verify |
FraudDetectionAgent |
Linear pipeline, readOnly enrichment |
Pure three-step pipeline: data enrichment (no LLM), pattern screening, final decision. Single @AchievesGoal. |
POST /api/fraud/detect |
SentimentAnalysisAgent |
@Cost method + costMethod= |
Dynamic cost calculations drive planner decisions; static cost= on the cheap first step. Single @AchievesGoal. |
POST /api/sentiment/analyze |
ResumeScreeningAgent |
Fan-in (no conditions) | Two independent analyses (analyzeResume, assessCultureFit) both start from the same input and converge into a single @AchievesGoal. |
POST /api/recruitment/screen |
ContentModerationAgent |
Converging branches → single @AchievesGoal |
Two condition-gated branches both produce TaggedContent; the terminal action operates on that type regardless of which branch ran. |
POST /api/moderation/evaluate |
LoanApplicationAgent |
Branching + static cost= on every action |
Two @Conditions split the flow; every @Action declares a static cost= so the planner can weigh paths. Two @AchievesGoal actions. |
POST /api/loan/apply |
DocumentProcessingAgent |
Default-producer for optional input + full @AchievesGoal |
provideDefaultMetadataHints supplies MetadataHints only when the caller did not; Ai injection, static value=, canRerun, and @Export(remote = true) MCP goal publishing. |
POST /api/documents/process |
TicketRoutingAgent |
UTILITY planner + @State routing |
Utility AI planner ranks actions by dynamic valueMethod=; routeToCategory returns one of three @State records, each containing its own @AchievesGoal handler. |
POST /api/tickets/route |
ProductResearchAgent |
SUPERVISOR planner + SpEL precondition + @EmbabelComponent |
LLM-supervised planning; pre = {"spel:marketData.confidenceScore > 0.6"} gates the competitor analysis; ResearchUtils contributes gatherMarketData (with outputBinding) as a shared @EmbabelComponent. |
POST /api/research/analyze |
StoryWriterAgent |
Revision loop (canRerun) + @LlmTool + persona |
Draft → review → revise loop until editorial approval; PersonaSpec prompt contributor, per-action LlmOptions temperatures, ActionException.Transient/Permanent, and an @LlmTool method. |
POST /api/story/write |
ComplianceReviewAgent |
HYBRID planner + retry policies + restricted export |
Pure-Java branching review; agent-level beanName and actionRetryPolicyExpression (a QoS key under embabel.agent.platform.action-qos.*), @Action(actionRetryPolicy = FIRE_ONCE), @Condition(cost=), @Export(startingInputTypes=), and an @LlmTool with name and metadata. |
POST /api/compliance/review |
Ready-to-run HTTP request examples for all eleven agents are in embabel-sample-application/requests/.
