Galvanized Pukeko is a framework that enables LLM-powered agents to dynamically render forms, charts, and tables when interacting with users. It eliminates the need for static HTML pages while maintaining consistent formatting and branded interfaces.
Status: This is a proof-of-concept; expect frequent changes and occasional breakage while we iterate.
A quick demo on YouTube: https://youtu.be/rfiUhsaDtrU
- Dynamic UI Rendering - AI agents can render forms, charts, and tables on-the-fly
- Real-time Communication - WebSocket integration for instant form updates
- Chat Interface - Built-in conversational UI powered by SSE streaming
- Extensible Architecture - Support for MCP (Model Context Protocol) and A2A (Agent-to-Agent) integrations
- Embedded Deployment - Web client can be served directly from the agent server
This project is organized as a monorepo containing the following packages:
| Package | Description | Documentation |
|---|---|---|
galvanized-pukeko-agent-adk |
Spring Boot application extending Google ADK with UI rendering capabilities. Available on Maven Central. | README |
galvanized-pukeko-vue-ui |
Vue.js UI component library and chat interface source (compiled into web-client) | — |
galvanized-pukeko-web-client |
Web client host: serves the Vue UI build, owns config.json and Playwright tests |
README |
gaunt-sloth-assistant |
TypeScript CLI tool for agent workflows; provides an AG-UI-compatible HTTP server as an alternative backend | — |
The system consists of a Web UI (Vue.js) and a UI Server ADK (Spring Boot) hosting the AI Agent.
graph LR
subgraph Browser
UI["Web UI (Vue.js)<br/>Port: 5555"]
end
subgraph Server["UI Server ADK (Spring Boot)<br/>Port: 8080"]
UIAgent["UI Agent<br/>(io.github.galvanized_pukeko.UiAgent)"]
end
subgraph Agents["External AI Agents<br/>(Business Logic)"]
direction TB
Agent1["Agent 1"]
Agent2["Agent 2"]
end
UI -->|AG-UI| UIAgent
UI <-->|WebSocket /ws| UIAgent
UIAgent <-.->|A2A| Agent1
UIAgent <-.->|MCP| Agent2
-
Web Client (
packages/galvanized-pukeko-web-client):- Vue.js application providing chat interface and dynamic form renderer
- Runs standalone on port 5555 for development, or served from the ADK agent
- Communicates via AG-UI for chat and WebSockets for UI rendering
-
Agent ADK (
packages/galvanized-pukeko-agent-adk):- Spring Boot application running on port 8080
- Extends Google ADK to host
UiAgentwith dynamic UI rendering tools - Serves the built web client and exposes API endpoints
- Supports MCP and A2A integrations for external tools and agents
- Java 17+ (recommended: Temurin 21)
- Node.js 24+
- Maven (included via Maven wrapper
./mvnw)
Start both the ADK agent and the web client dev server together:
npm run start-adkThis builds and starts:
- Agent ADK on port 8080 (logs to
start-adk-java.log) - Web Client dev server on port 5555
Navigate to http://localhost:5555 for development. Press Ctrl+C to stop both.
To use the TypeScript Gaunt Sloth backend instead of the Java ADK agent:
npm run start-gth-ag-uiThis starts:
- Gaunt Sloth AG-UI server on port 3000
- Web Client dev server on port 5555 (pointing at the Gaunt Sloth backend)
Start the Agent ADK only:
cd packages/galvanized-pukeko-agent-adk
./mvnw clean compile exec:java -Dexec.classpathScope=compile \
-Dexec.args="--server.port=8080 --adk.agents.source-dir=target"Start the Web Client dev server only:
npm run webAfter making changes to the web client, rebuild and deploy to the ADK agent:
npm run sinkThis builds the Vue UI (galvanized-pukeko-vue-ui) and copies the artifacts into the ADK agent's resources directory.
- Open
http://localhost:8080(orhttp://localhost:5555in development mode) - Type "Hello" in the chat to verify connectivity
- Try these commands to see dynamic UI rendering:
"Show me a contact form"- Renders a dynamic form"Show me a chart of month lengths"- Displays a chart"Show me a table of suppliers"- Renders a data table
We use Playwright for End-to-End (E2E) testing.
The integration test scripts start all required services automatically:
# ADK agent integration tests
npm run it-adk
# ADK agent integration tests (headed browser)
npm run it-adk-headed
# Gaunt Sloth AG-UI integration tests
npm run it-gth-ag-uiIf Playwright reports the browser is not found, run npx playwright install.
# Run all e2e tests
npx playwright test
# Interactive UI mode
npx playwright test --ui
# Headed mode (visible browser, sequential execution)
npx playwright test --headed --workers=1
# Debug mode
npx playwright test --debugADK Agent (Google Gemini):
| Variable | Description | Default |
|---|---|---|
GOOGLE_API_KEY or GEMINI_API_KEY |
API key for Google AI / Gemini models | Required |
GOOGLE_GENAI_USE_VERTEXAI |
Set to "true" to use Vertex AI instead of Google AI |
false |
Gaunt Sloth backend (multi-provider):
The Gaunt Sloth backend supports many AI providers (Anthropic, OpenAI, Groq, Google AI, Ollama, xAI, etc.). Configure via .gsloth.config.json in the working directory. See examples/pukeko-gaunt-sloth-ag-ui/ for a sample configuration.
See Agent ADK README for detailed configuration options including:
- UI customization (logo, header, footer)
- CORS settings
- MCP server integration
- A2A agent configuration
Contributions are welcome! Please feel free to submit issues and pull requests.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
