{"id":50879031,"url":"https://github.com/patbaumgartner/embabel-workflow-visualizer","last_synced_at":"2026-06-15T12:03:36.154Z","repository":{"id":363771937,"uuid":"1234582222","full_name":"patbaumgartner/embabel-workflow-visualizer","owner":"patbaumgartner","description":"Spring Boot starter for live workflow visualization of Embabel agents — actuator endpoint, REST API, and interactive pan/zoom UI","archived":false,"fork":false,"pushed_at":"2026-06-10T08:43:12.000Z","size":342,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-10T10:15:52.354Z","etag":null,"topics":["actuator","embabel","java","spring-boot","visualization","workflow"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/patbaumgartner.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-10T11:27:03.000Z","updated_at":"2026-06-10T08:43:17.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/patbaumgartner/embabel-workflow-visualizer","commit_stats":null,"previous_names":["patbaumgartner/embabel-workflow-visualizer"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/patbaumgartner/embabel-workflow-visualizer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patbaumgartner%2Fembabel-workflow-visualizer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patbaumgartner%2Fembabel-workflow-visualizer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patbaumgartner%2Fembabel-workflow-visualizer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patbaumgartner%2Fembabel-workflow-visualizer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/patbaumgartner","download_url":"https://codeload.github.com/patbaumgartner/embabel-workflow-visualizer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patbaumgartner%2Fembabel-workflow-visualizer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34361403,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-15T02:00:07.085Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["actuator","embabel","java","spring-boot","visualization","workflow"],"created_at":"2026-06-15T12:03:35.469Z","updated_at":"2026-06-15T12:03:36.149Z","avatar_url":"https://github.com/patbaumgartner.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Embabel Workflow Visualizer\n\n[![CI](https://github.com/patbaumgartner/embabel-workflow-visualizer/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/patbaumgartner/embabel-workflow-visualizer/actions/workflows/ci.yml)\n[![Release](https://github.com/patbaumgartner/embabel-workflow-visualizer/actions/workflows/release.yml/badge.svg)](https://github.com/patbaumgartner/embabel-workflow-visualizer/actions/workflows/release.yml)\n[![CodeQL](https://github.com/patbaumgartner/embabel-workflow-visualizer/actions/workflows/codeql.yml/badge.svg?branch=main)](https://github.com/patbaumgartner/embabel-workflow-visualizer/actions/workflows/codeql.yml)\n[![Dependency Review](https://github.com/patbaumgartner/embabel-workflow-visualizer/actions/workflows/dependency-review.yml/badge.svg?branch=main)](https://github.com/patbaumgartner/embabel-workflow-visualizer/actions/workflows/dependency-review.yml)\n[![Scorecards](https://github.com/patbaumgartner/embabel-workflow-visualizer/actions/workflows/scorecards.yml/badge.svg?branch=main)](https://github.com/patbaumgartner/embabel-workflow-visualizer/actions/workflows/scorecards.yml)\n\nA Spring Boot starter that adds a live workflow visualization UI and REST API for [Embabel](https://embabel.com) agents — zero code required.\n\n![Embabel Workflow Visualizer](assets/embabel-workflow-visualizer.png)\n\n---\n\n## Project structure\n\nThis is a multi-module Maven project:\n\n| Module | Purpose |\n|---|---|\n| `embabel-workflow-visualizer-starter` | Spring Boot auto-configuration, REST API, actuator endpoint, and visualization UI |\n| `embabel-sample-application` | Runnable sample Embabel application that uses the starter |\n\n## Build and test\n\n```bash\n# Build and test everything from the repository root\nmvn test\n\n# Test only the starter module\nmvn -pl embabel-workflow-visualizer-starter test\n```\n\n## Usage\n\nCompatibility note: this project is validated against [Embabel](https://github.com/embabel/embabel-agent) 0.4.0 (the latest release, available on Maven Central) and supports all Embabel annotation features: `@Agent` (GOAP / UTILITY / SUPERVISOR planners, `opaque`), `@EmbabelComponent`, `@Action` (`pre`/`post`, `cost`/`value`, `costMethod`/`valueMethod`, `canRerun`, `readOnly`, `clearBlackboard`, `outputBinding`), `@Condition`, `@Cost`, `@AchievesGoal` (`value`, `tags`, `examples`, `@Export` MCP publishing), `@State`, and `@LlmTool`.\n\n### 1. Add the dependency\n\nThe library is published to [Maven Central](https://central.sonatype.com/artifact/com.patbaumgartner.embabel/embabel-workflow-visualizer-starter).\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.patbaumgartner.embabel\u003c/groupId\u003e\n    \u003cartifactId\u003eembabel-workflow-visualizer-starter\u003c/artifactId\u003e\n    \u003cversion\u003e0.1.1\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nEmbabel 0.4.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:\n\n```xml\n\u003crepositories\u003e\n  \u003c!-- Required for com.embabel.agent.* snapshot dependencies --\u003e\n  \u003crepository\u003e\n    \u003cid\u003eembabel-snapshots\u003c/id\u003e\n    \u003cname\u003eEmbabel Snapshot Repository\u003c/name\u003e\n    \u003curl\u003ehttps://repo.embabel.com/artifactory/libs-snapshot\u003c/url\u003e\n    \u003creleases\u003e\u003cenabled\u003efalse\u003c/enabled\u003e\u003c/releases\u003e\n    \u003csnapshots\u003e\u003cenabled\u003etrue\u003c/enabled\u003e\u003c/snapshots\u003e\n  \u003c/repository\u003e\n\u003c/repositories\u003e\n```\n\n### 2. Configure your `application.properties`\n\n```properties\n# Expose the actuator endpoint over HTTP\nmanagement.endpoints.web.exposure.include=health,info,embabel\n\n# Enable the REST API (GET /embabel-workflows/api) and the visualization UI\nembabel.workflow.visualizer.enabled=true\n```\n\n## Endpoints\n\n| Endpoint | Requires | Description |\n|---|---|---|\n| `GET /actuator/embabel` | `management.endpoints.web.exposure.include=embabel` | Returns the workflow catalog as JSON |\n| `GET /embabel-workflows/api` | `embabel.workflow.visualizer.enabled=true` | REST API — returns the workflow catalog as JSON |\n| `GET /embabel-workflows` | `embabel.workflow.visualizer.enabled=true` | Interactive pan/zoom workflow visualization UI |\n\n## Auto-configuration\n\nThe starter activates automatically when:\n\n- The application runs in a **servlet web environment** (`@ConditionalOnWebApplication(SERVLET)`)\n- **Spring Boot Actuator** is on the classpath\n\n| Bean | Always registered | Condition |\n|---|---|---|\n| `EmbabelWorkflowCatalogService` | ✅ | Discovers `@Agent` beans via the `ApplicationContext` |\n| `EmbabelWorkflowActuatorEndpoint` | When exposed | Requires `management.endpoints.web.exposure.include=embabel` |\n| `EmbabelWorkflowApiController` | Off by default | Requires `embabel.workflow.visualizer.enabled=true` |\n| `WorkflowVisualizerPageController` | Off by default | Requires `embabel.workflow.visualizer.enabled=true` |\n\nAll beans use `@ConditionalOnMissingBean` — declare your own bean to replace any of them.\n\n## Visualization UI\n\nThe UI (`GET /embabel-workflows`) renders each discovered `@Agent` as an interactive flow diagram:\n\n- **Drag individual nodes** to rearrange the layout · **Drag the background** to pan · **Scroll** to zoom · **Double-click** background to auto-fit\n- Hover over any node to spotlight its connected edges and neighbours\n- Per-agent controls: Fit, Zoom In, Zoom Out, Reset Layout\n- Node types color-coded with the 42talents brand palette (cyan, yellow, green, pink, orange)\n- Animated flowing arrows on pre-condition edges; AchievesGoal nodes glow green\n- Node badges surface `canRerun`, `readOnly`, `clearBlackboard`, `@LlmTool`, and MCP-exported goals (`@Export(remote = true)`)\n- Cost / value rows show static `cost=` / `value=` declarations, dynamic `costMethod=` / `valueMethod=` references, and `@AchievesGoal(value=)`\n- Light / dark mode toggle, respects `prefers-color-scheme`\n\n## Sample agents\n\nThe `embabel-sample-application` module ships ten demo agents covering common enterprise use cases.\nEach agent intentionally demonstrates a **different workflow pattern** so you can see how the Embabel\nplanner handles linear flows, fan-in, branching, converging branches, dynamic cost methods, static\ncost declarations, Utility AI planning, @State routing, LLM-supervised planning, and revision loops.\n\n| Agent | Workflow pattern | Description | Endpoint |\n|---|---|---|---|\n| `KycVerificationAgent` | Branching + 2× `@AchievesGoal` | Screens a customer against risk indicators; routes to enhanced due diligence or a direct risk assessment. | `POST /api/kyc/verify` |\n| `FraudDetectionAgent` | Linear pipeline, `readOnly` enrichment | Pure three-step pipeline: data enrichment (no LLM), pattern screening, final decision. Single `@AchievesGoal`. | `POST /api/fraud/detect` |\n| `SentimentAnalysisAgent` | `@Cost` method + `costMethod=` | Dynamic cost calculations drive planner decisions; static `cost=` on the cheap first step. Single `@AchievesGoal`. | `POST /api/sentiment/analyze` |\n| `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` |\n| `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` |\n| `LoanApplicationAgent` | Branching + static `cost=` on every action | Two `@Condition`s split the flow; every `@Action` declares a static `cost=` so the planner can weigh paths. Two `@AchievesGoal` actions. | `POST /api/loan/apply` |\n| `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` |\n| `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` |\n| `ProductResearchAgent` | `SUPERVISOR` planner + SpEL precondition + `@EmbabelComponent` | LLM-supervised planning; `pre = {\"spel:marketData.confidenceScore \u003e 0.6\"}` gates the competitor analysis; `ResearchUtils` contributes `gatherMarketData` (with `outputBinding`) as a shared `@EmbabelComponent`. | `POST /api/research/analyze` |\n| `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` |\n\nReady-to-run HTTP request examples for all ten agents are in [`embabel-sample-application/requests/`](embabel-sample-application/requests/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpatbaumgartner%2Fembabel-workflow-visualizer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpatbaumgartner%2Fembabel-workflow-visualizer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpatbaumgartner%2Fembabel-workflow-visualizer/lists"}