veadk frontend is a self-contained launcher: in the default mode it serves this React UI and the agent API from a single process on the same origin, so there is no separate backend to deploy and no cross-origin setup.
What it can do
- Create agents: use a conversational, custom, or template flow to produce a runnable VeADK project (
agent.py,requirements.txt, and so on) that you can preview, edit, and download. The workflow entry is marked as coming soon and cannot be selected. - Chat and debug: multi-turn conversations showing thinking, tool calls, token usage and timing; conversations also render the A2UI rich-UI cards an agent returns.
- Agent picker: switch agents from the top-left; hover an agent to see its model and mounted tools.
- Skill center: browse and discover reusable skills to use when creating agents.
- Session history: auto-saved, time-sorted, reopen or delete.
- Smart search: the Session source full-text-searches the current agent’s history; the Web source calls the agent’s mounted web-search tool live, using credentials from the server’s environment variables.
- Add an AgentKit agent: paste a URL and API key to connect a remote agent over the ADK protocol; it then appears in the picker.
- Tracing: view the call flame graph for the current session.
- Login: SSO or a local username.
Run
Build the UI once, then serve the UI and the agent API together from a single process.1
Build the UI
veadk frontend. When VeADK is installed via pip, a built UI is already bundled in the package, so you can run it directly.2
Launch
Dev mode (hot reload)
In dev modeveadk frontend serves only the agent API and allows CORS from the Vite dev server (http://localhost:5173); the UI runs separately under Vite with hot reload.
The veadk frontend command
Outside dev mode, if the built UI directory is not found, the command fails and asks you to run
npm run build first (or use --dev with the Vite dev server).Authentication
Sessions and memory are scoped by the ADKuser_id, which comes from the signed-in user. On startup the command loads a .env file from the current directory or its parents, so the environment variables below can be placed in .env.
Gateway authentication — use gateway mode when the service runs behind an AgentKit Runtime gateway that has already authenticated the user:
Authorization: Bearer <JWT> header forwarded by the upstream gateway.
SSO — enable by passing the pool and client. The UI shows a login page and redirects through the identity provider, then uses the user identifier returned by the userinfo endpoint as the user_id. The pool and client can be given either by name or by UID.
/web/auth-config, /favicon.ico, /assets, and /skillhub, so the app loads and shows its own login page instead of being bounced to the identity provider. The login button’s label and icon are config-driven.
Third-party / custom OAuth2 (env vars) — without a VeIdentity user pool, set OAUTH2_CLIENT_ID (and the secret) to enable GitHub, Google, or any OIDC login. Endpoints are resolved in this order: a built-in preset (OAUTH2_PROVIDER=github or google), then OIDC discovery (set OAUTH2_ISSUER), then explicit endpoints (OAUTH2_AUTHORIZE_URL, etc.).
The GitHub preset only needs the client credentials:
OAUTH2_PROVIDER=google; for any OIDC provider (Keycloak, Auth0, Okta, and so on) set OAUTH2_ISSUER plus the client credentials. A full example lives at examples/front_with_sso/.
No SSO (local username) — without those flags, the login page asks for a username (letters and digits, up to 16 characters), stored locally and used as the user_id. In this case the server always reports an unauthenticated state and an empty provider list, and the app renders its local username login.
Login state is cached: SSO via the
veadk_session cookie, local mode via localStorage. The session itself is created lazily on the first message, not on page load. Logout is a local logout — it clears the session and returns to the login page.Rendering flow
The frontend talks to the Google ADK API server: it lists available agents, creates a session, and receives the agent’s output as a live stream. When the agent returns an A2UI message, the frontend parses its UI instructions, creates and incrementally updates the corresponding surface, then renders the matching React components by type. A registry maps each component type to a renderer, so adding a new component type only requires registering a renderer for it.Adding a custom (enterprise) component
A custom component has two halves that share one catalog id. For the backend half, see A2UI; the frontend half is below. Frontend half — drop in a new directory; it auto-registers, with no central edit:src/a2ui/components/RevenueChart/index.ts
src/a2ui/components/RevenueChart/RevenueChart.tsx
Unknown components with no registered renderer fall back to a collapsible JSON view, so a catalog/renderer mismatch never crashes the UI.