Run the AG-UI Dojo demo viewer locally and wire the AG-UI .NET SDK in as a dojo integration. USE FOR: starting the dojo app (apps/dojo), running the .NET dojo backend (AGUIDojoServer), registering or modifying the ag-ui-dotnet integration (agents.ts/menu.ts/env.ts/files.json), running the dojo Playwright e2e suite for the .NET integration (agUiDotnetTests), or understanding how dojo-e2e.yml runs it in CI. DO NOT USE FOR: generic Playwright validation of arbitrary pages (use agui-playwright-validate), or the docs site (use agui-dotnet-sdk-docs).
80
100%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
The Dojo is a Next.js "demo viewer" (apps/dojo) that showcases AG-UI protocol
features (agentic chat, generative UI, human-in-the-loop, shared state, etc.) against
many framework integrations. The AG-UI .NET SDK is one integration, id ag-ui-dotnet.
| Piece | Path | Role |
|---|---|---|
| Dojo app (frontend) | apps/dojo | Next.js viewer, runs on port 9999 |
| .NET backend | sdks/dotnet/samples/AGUIClientServer/AGUIDojoServer/ | ASP.NET host exposing AG-UI endpoints, port 8023 |
| Agent registry | apps/dojo/src/agents.ts | ag-ui-dotnet → HttpAgent per feature |
| Menu / feature list | apps/dojo/src/menu.ts | integration id, name, enabled features |
| Env config | apps/dojo/src/env.ts | aguiDotnetUrl ← AGUI_DOTNET_URL (default http://localhost:8023) |
| Generated source viewer data | apps/dojo/src/files.json | generated, committed |
| Content generator | apps/dojo/scripts/generate-content-json.ts | builds files.json from menu.ts |
| Prep / run orchestrators | apps/dojo/scripts/{prep,run}-dojo-everything.js | install/build + start services |
| .NET e2e suite | apps/dojo/e2e/tests/agUiDotnetTests/*.spec.ts | Playwright tests |
| CI | .github/workflows/dojo-e2e.yml | suite ag-ui-dotnet (triggers on sdks/dotnet/**) |
From the repo root (the scripts shell out to git rev-parse):
pnpm install --no-frozen-lockfile
# 1) Prep: builds the .NET backend AND the dojo (use the stable ids)
node apps/dojo/scripts/prep-dojo-everything.js --only dojo,ag-ui-dotnet
# 2) Run: starts the dojo (9999) + AGUIDojoServer (8023) together, with LLMock env injected
node apps/dojo/scripts/run-dojo-everything.js --only dojo,ag-ui-dotnethttp://localhost:9999/ag-ui-dotnet/feature/agentic_chat.prep for ag-ui-dotnet runs dotnet restore && dotnet build on
AGUIDojoServer/AGUIDojoServer.csproj in sdks/dotnet/samples/AGUIClientServer.run for ag-ui-dotnet runs dotnet run --project AGUIDojoServer/AGUIDojoServer.csproj --urls "http://localhost:8023" --no-build — prep first or there's no build to run.Start just the .NET backend by hand (e.g. to debug):
cd sdks/dotnet/samples/AGUIClientServer
dotnet run --project AGUIDojoServer/AGUIDojoServer.csproj --urls "http://localhost:8023"The backend resolves its ChatClient from configuration (ChatClientAgentFactory.Initialize):
OPENAI_BASE_URL (any OpenAI-compatible endpoint / LLMock), else AZURE_OPENAI_ENDPOINT
(Entra ID), else public OpenAI with OPENAI_API_KEY. run-dojo-everything.js injects
OPENAI_BASE_URL=http://localhost:5555/v1 and OPENAI_API_KEY=sk-mock so it hits the LLMock.
Each scenario is an AG-UI endpoint on the .NET host wired to a frontend feature. To add or
change a .NET dojo scenario, touch these in lockstep:
AGUIDojoServer/Program.cs: add app.MapDojoEndpoint("/<feature>", ChatClientAgentFactory.Create…()).
Agent logic lives in ChatClientAgentFactory.cs.apps/dojo/src/agents.ts ("ag-ui-dotnet" block): add <feature>: "<feature>"
inside mapAgents; each maps to new HttpAgent({ url: \${envVars.aguiDotnetUrl}/` })`.apps/dojo/src/menu.ts (id: "ag-ui-dotnet"): add the feature to features.apps/dojo/scripts/generate-content-json.ts already maps ag-ui-dotnet to
Program.cs + ChatClientAgentFactory.cs; then regenerate files.json (below).aguiDotnetUrl/AGUI_DOTNET_URL already exist.Regenerate the committed source-viewer data after any menu.ts change:
cd apps/dojo && pnpm generate-content-json # writes src/files.json⚠️ CI job
check-generated-filesfails ifsrc/files.jsonis stale. Always regenerate and commit it after editingmenu.ts(or feature/README files).
cd apps/dojo/e2e
pnpm install --ignore-scripts
pnpm exec playwright install --with-deps chromium # first time only
# dojo (9999) + AGUIDojoServer (8023) must already be running (see above)
BASE_URL=http://localhost:9999 PLAYWRIGHT_SUITE=ag-ui-dotnet pnpm test -- tests/agUiDotnetTestsTests navigate to /ag-ui-dotnet/feature/<feature> and drive the chat UI via page objects in
apps/dojo/e2e/featurePages/.
dojo-e2e.yml)ag-ui-dotnet: test_path: tests/agUiDotnetTests, services: ["dojo", "ag-ui-dotnet"],
wait_on: http://localhost:9999,tcp:localhost:8023.pull_request/push paths including sdks/dotnet/**.9.0.x + 10.0.x, runs prep-dojo-everything.js --only then
run-dojo-everything.js --only, waits on the ports, then pnpm test -- tests/agUiDotnetTests.9999, AGUIDojoServer 8023. The dojo's AGUI_DOTNET_URL must point
to http://localhost:8023 (default in run-dojo-everything.js and env.ts).--no-build in run means you must run the prep step first; otherwise the dotnet run fails.OPENAI_BASE_URL=http://localhost:5555/v1 + OPENAI_API_KEY=sk-mock
are injected. Backend tool-rendering scenarios also honor AG_UI_MOCK_WEATHER=1 for determinism.BASE_URL is required — playwright.config.ts calls process.exit(1) if it's unset.files.json is the most common CI failure after touching menu.ts — run
pnpm generate-content-json and commit the result.34c3e0c
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.