Two silent failures in the Python SDK prevented frontend context from reaching the agent:
1. langgraph_default_merge_state rebuilt copilotkit as {actions} only, dropping the
useCopilotReadable items the TypeScript runtime had placed in state.copilotkit.context.
2. CopilotKitContext.properties were never forwarded through execute_agent → agent.execute(),
so <CopilotKit properties={...} /> values never reached state.copilotkit.properties.
Both fields now land cleanly under state["copilotkit"] on every agent invocation.
Also adds tests, a showcase example, and a new docs page.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
## Summary
- Remove the Open GenUI rendering strategy from all 17 showcase starters
- Clean up all supporting files: feature registries, constraints, e2e
tests, Python middleware, docs
- Regenerate all starters from updated template
### What was removed
The "open-genui" render mode allowed agents to generate arbitrary HTML
rendered in a sandboxed iframe. This is being extricated from starters
into a separate project. The core SDK `OpenGenerativeUIRenderer`
component is **not** affected — only the showcase starter UI option.
### Files changed
- **Template**: Deleted `open-genui/` renderer, updated types.ts,
page.tsx, suggestions hook
- **Registry**: Removed `open-gen-ui` and `byoc-opengenui` features from
all registries (shell, shell-dojolike, shared)
- **Constraints**: Removed "open" constraint block and open-gen-ui
references
- **E2E tests**: Removed Open GenUI test cases from starter-e2e,
screenshots, renderer-selector specs
- **Python middleware**: Removed OPEN_GENUI_INSTRUCTION and open-genui
handling from render_mode.py
- **Starters**: Regenerated all 17 via generate-starters.ts
- **Docs**: Updated QA-COVERAGE.md pill count from 5 to 4
### Local verification
- Docker build of langgraph-python starter: success
- Rendered page shows exactly 4 render modes (Tool-Based, A2UI,
json-render, HashBrown)
- Zero "open-genui" references in rendered HTML
- 521 validation tests pass
## Test plan
- [x] Docker build succeeds locally
- [x] Rendered starter shows 4 modes, no Open GenUI
- [x] Zero grep matches for open-genui across showcase/
- [x] 521 vitest validation tests pass
- [ ] CI green
🤖 Generated with [Claude Code](https://claude.com/claude-code)
The source package's src/agent/ was just committed — regenerating
the starter now correctly copies agent/index.ts and agent/package.json
into the starter directory, fixing the drift check.
1. Remove nested agent/package.json in TypeScript Dockerfile template to
prevent ESM module resolution failure (claude-sdk-typescript)
2. Use chown -R for /app in all Dockerfile templates so runtime-created
dirs (e.g. /app/src/mastra/public) are writable by non-root user
3. Pin mastra ecosystem deps to stable versions (1.6.0/1.25.0) in
generation script — floating beta tags caused version drift between
mastra CLI and @mastra/core
1. EACCES on /home/app: Dockerfile templates now create home dir for
non-root user before USER app (langgraph-ts, claude-sdk-ts, mastra)
2. IndexError Path.parents[4]: search_flights.py schema fallback now
guards against shallow Docker paths (agno, claude-sdk-py, ms-agent-py)
3. Wrong import path: rewritePythonImports() now converts
from agents.X to relative imports in starter agent dirs (langroid, crewai)
The generate-starters script was flattening src/main/{java,resources} into
agent/{java,resources}, breaking Maven builds. Add a post-copy step that
moves them to agent/src/main/{java,resources} as Maven expects.
The agent's system prompt didn't mention pieChart/barChart frontend
tools, so gpt-4o-mini would call query_data repeatedly instead of
rendering charts. Updated the system prompt to explicitly instruct
the agent to call query_data once then use pieChart/barChart, and
updated the query_data tool description to reinforce single-call
semantics.
Python starters were trying to run uvicorn with agent.<module>:app but
those modules don't export a FastAPI app. The demo packages use
agent_server.py as the FastAPI wrapper, so starters need it too.
Changes:
- Copy agent_server.py from each demo package into starter root,
rewriting "from agents." to "from agent." for the starter layout
- Update all non-langgraph Python devScripts to use agent_server:app
- Update Dockerfile.python to COPY agent_server.py for non-langgraph
- Update getEntrypointBlock() generic Python to use agent_server:app
- Make langgraph-fastapi use langgraph_cli dev like langgraph-python
(it was incorrectly configured as a uvicorn-based starter)
- Regenerate all starters
## Summary
- The langgraph-python starter crashes on Railway because `langgraph_cli
dev --config agent/langgraph.json` can't resolve module paths when
agents live in `agent/` with `dependencies: ["."]` pointing to `/app`
- Restructured starter to match the demo package's **proven working
layout**: agents in `src/agents/`, `langgraph.json` at project root,
entrypoint referencing root config
- Templatized `Dockerfile.python` with `{{AGENT_DIR}}` and
`{{DOCKER_EXTRA_COPY}}` variables so the generator handles different
agent directory structures
- Updated tests to use framework `agentDir` instead of hardcoding
`"agent"`
- All 17 starters regenerated, 518 tests passing
## Test plan
- [ ] Deploy langgraph-python starter to Railway — should return 200
like the demo package
- [ ] Verify other Python starters still build/deploy (Dockerfile
template changed for all)
- [ ] `npx tsx generate-starters.ts --check` passes
- [ ] All vitest suites pass: generate-starters.test.ts (248) +
starter-consistency.test.ts (270)
The langgraph-python starter crashes on Railway because of a directory
structure mismatch: agents were in agent/ with langgraph.json inside
agent/, causing langgraph_cli to fail resolving module paths.
Match the demo package's working layout:
- Move agents from agent/ to src/agents/ (same as demo)
- Put langgraph.json at project root (same as demo)
- Point entrypoint at root langgraph.json instead of agent/langgraph.json
- Templatize Dockerfile.python with AGENT_DIR and DOCKER_EXTRA_COPY vars
- Skip langgraph.json path rewriting when agentDir matches agentSourceDir
- Update tests to use framework agentDir instead of hardcoding "agent"
Regenerate all 17 starters.
## Summary
- Fixed `langgraph.json` graph path in the langgraph-python starter: was
`./src/agents/main.py:graph` (copied verbatim from demo package),
corrected to `./main.py:graph` (matching the flattened starter layout)
- Wrapped A2UI agent imports (`search_flights`, `generate_a2ui`) in
try/except in both the demo package and starter, so the agent starts
cleanly even when optional dependencies like copilotkit's `ToolRuntime`
patch aren't loaded
- Fixed `generate-starters.ts` to rewrite `langgraph.json` graph paths
when copying from packages to starters, preventing this drift in future
regenerations
## Test plan
- [ ] Run `npx tsx generate-starters.ts --check --slug langgraph-python`
(passes)
- [ ] Deploy langgraph-python starter to Railway and verify agent starts
without crash
- [ ] Verify core tools (query_data, get_weather, schedule_meeting) work
- [ ] Verify A2UI tools load when copilotkit runtime is available
The langgraph.json in the starter was copied verbatim from the demo package
with path ./src/agents/main.py:graph, but the starter flattens agents into
the agent/ dir so the correct path is ./main.py:graph.
Also wraps A2UI agent imports in try/except so the starter starts cleanly
even if copilotkit's ToolRuntime patch isn't available — these are optional
features that shouldn't prevent the core agent from running.
Fixes the generate-starters.ts script to rewrite langgraph.json graph paths
when copying from packages to starters, preventing this drift in the future.
The com.ag-ui.community artifacts aren't published to Maven Central,
so the Docker build fails when resolving dependencies. The demo package
Dockerfile already handles this by cloning the ag-ui repo and running
mvn install before building the agent — mirror that in the template
and regenerate the starter.
spring-ai: Use maven:3-eclipse-temurin-21 image with mvn instead of
missing ./mvnw wrapper.
ms-agent-dotnet: Replace addgroup/adduser (not available on aspnet:9.0)
with groupadd/useradd. Applied same fix to all four Dockerfile templates
for consistency.
mastra: Make Dockerfile.typescript template use {{AGENT_DIR}} variable
so mastra correctly gets src/mastra/ instead of hardcoded agent/.
Updated generate-starters.ts to substitute variables in Dockerfiles.
Generated from template via showcase/scripts/generate-starters.ts.
Each starter is fully self-contained with Sales Dashboard + 5 renderers,
self-contained agent backend, per-language Dockerfile (non-root user),
and deterministic entrypoint with agent health checks.
Marked linguist-generated=true in .gitattributes.