Observed since 20 Oct, 23:36 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Visual workflow builder for computer vision
Visual workflow builder for computer vision and AI. Create image processing pipelines by connecting tools in a drag-and-drop interface, then export and run them programmatically.
Part of the Datamarkin ecosystem - Built on PixelFlow and Mozo for production-ready computer vision.
AgentUI is a web-first tool builder that lets you:
Think of it as a visual programming environment for computer vision tasks.
# Install
pip install agentui
# Start the server
agentui start
# Open http://localhost:8000 in your browser
That's it. The UI is already bundled - no separate build step needed.
AgentUI can be dropped into any Flask application with minimal code:
from flask import Flask
import agentui
app = Flask(__name__)
# Optional: Inject a custom header (e.g., navigation, user menu)
agentui.set_header("my_app_header.html",
context_fn=lambda: {"user": current_user.name})
# Mount AgentUI at /workflow-builder
app.register_blueprint(agentui.create_agentui_bp(), url_prefix='/workflow-builder')
# Access the runner view at /workflow-builder/run/<workflow_id>
Key integration features:
/run/<workflow_id>window.AgentUI.run(), .getWorkflow(), etc.See the Integration Guide below for details.
from agentui import Workflow
# Load a workflow created in the UI
workflow = Workflow.load('my_workflow.json')
# Run with an image
result = workflow.run(image='test.jpg')
# Access outputs
detections = result['detections'] # PixelFlow Detections object
print(f"Found {len(detections)} objects")
# Batch processing (automatic)
result = workflow.run(image=['img1.jpg', 'img2.jpg', 'img3.jpg'])
for i, dets in enumerate(result['detections']):
print(f"Image {i}: {len(dets)} objects")
AgentUI is designed for visual workflow creation:
Why not build workflows in code? The visual interface is the fastest way to prototype CV pipelines. The Python API focuses on execution (loading and running workflows), not construction. This separation keeps the codebase simple and the workflow format UI-native.
AgentUI integrates two powerful libraries:
These libraries are maintained by the same team and designed to work together seamlessly.
Only needed if you're modifying the UI:
cd ui
npm install
npm run dev # Development server with hot reload at http://localhost:5173
# When done
npm run build # Builds to ../agentui/static/
Tools are Python classes that inherit from Tool:
from agentui.core.tool import Tool, ToolOutput, Port, PortType
class MyCustomTool(Tool):
@property
def tool_type(self) -> str:
return "MyCustomTool"
@property
def input_ports(self) -> Dict[str, Port]:
return {"image": Port("image", PortType.IMAGE, "Input image")}
@property
def output_ports(self) -> Dict[str, Port]:
return {"image": Port("image", PortType.IMAGE, "Output image")}
def process(self) -> bool:
image = self.inputs["image"].data
# Do something with the image
self.outputs["image"] = ToolOutput(processed_image, PortType.IMAGE)
return True
Tools are automatically discovered by the registry. See CLAUDE.md for detailed development guidance.
git clone <repository-url>
cd agentui
# Python setup
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -e .
# Start server
agentui start
# Optional: UI development (only if modifying Svelte code)
cd ui
npm install
npm run build
Future additions will focus on:
Replace AgentUI's default toolbar with your own header:
import agentui
agentui.set_header(
"templates/agentui_custom_header.html", # Jinja2 template path
context_fn=lambda: { # Optional: dynamic context per request
"user": current_user.name,
"workflows": get_saved_workflows()
}
)
Your header template has access to window.AgentUI for programmatic control:
<!-- templates/agentui_custom_header.html -->
<nav class="your-custom-navbar">
<button onclick="window.AgentUI.run()">Run Workflow</button>
<button onclick="window.AgentUI.exportWorkflow()">Export</button>
<select onchange="window.AgentUI.loadWorkflow(this.value)">
{% for wf in workflows %}
<option value="{{ wf.id }}">{{ wf.name }}</option>
{% endfor %}
</select>
</nav>
When embedding, control AgentUI from your header via window.AgentUI:
| Method | Description |
|---|---|
run() | Execute the current workflow |
getWorkflow() | Return { nodes, edges } of current workflow |
loadWorkflow(id) | Load a workflow by ID |
saveWorkflow(name, description) | Save current workflow to the cloud API |
isRunning() | Check if workflow is currently executing |
Serve a workflow in execution-only mode (no editor):
# In your Flask app
@app.route('/process/<workflow_id>')
def process_workflow(workflow_id):
return redirect(url_for('agentui', view_mode='runner', workflow_id=workflow_id))
Or directly via AgentUI's blueprint:
GET /workflow-builder/run/my-workflow-id
The runner view provides:
Listen for execution state changes from your header:
window.addEventListener('agentui:statechange', (event) => {
const { isExecuting } = event.detail;
if (isExecuting) {
// Disable buttons, show spinner
} else {
// Re-enable buttons
}
});
MIT License - see LICENSE file for details
Contributions welcome! Please check CLAUDE.md for development guidelines and architecture overview.
Built by Datamarkin - Making computer vision accessible through visual workflows.
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.2.0 | 1 Apr 2026 | 8 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 23:36 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:c53c55a3d10cd623c194aeaec9f870c25f7f8569d37511908e40a7a0a0d7d0c8