Commit Graph

841 Commits

Author SHA1 Message Date
Martha Schumann bdc01e3c12 chore: bump CLI template @copilotkit/* versions to 1.55.2
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 16:56:19 -07:00
Martha Schumann c2b17a9ad8 test(e2e): simplify to form-filling only, fix windowBox ref in drag test 2026-04-10 16:14:26 -07:00
Martha Schumann c5b3951f38 test(e2e): guard isVisible against race on window open check 2026-04-10 16:07:24 -07:00
Martha Schumann bd19406f43 test(e2e): fix beforeEach to handle defaultOpen variants 2026-04-10 16:06:24 -07:00
Martha Schumann a8db5310f2 test(e2e): tighten chat layout assertions 2026-04-10 15:55:20 -07:00
Martha Schumann 271602e0d3 test(e2e): add chat window layout regression tests 2026-04-10 15:53:12 -07:00
Martha Schumann 92f5bba0e4 chore: bump @copilotkit/* versions to 1.55.1 in all integration templates
Templates had stale pinned versions ranging from 1.9.3 to 1.52.1.
The CLI does a verbatim sparse checkout of these files, so users
scaffolding via `copilotkit create` were getting old versions installed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 15:34:35 -07:00
Jordan Ritter ebcb227ba3 Remove redundant sed agent URL patches from test Dockerfiles
Source route.ts files now read process.env.AGENT_URL natively (PR #3737),
so the build-time sed patches and verification greps are no longer needed.

Also removes crewai-crews docker-route-override.ts and its COPY line,
since that starter's route.ts already has AGENT_URL support.
2026-04-10 11:02:54 -07:00
Alem Tuzlak ff2093102c chore(lint): add new oxlint rules and auto-fix violations
Enable stricter oxlint rules for better code health:
- typescript/consistent-type-imports: enforce `import type` for type-only imports
- typescript/no-import-type-side-effects: prefer top-level type imports
- import/consistent-type-specifier-style: consistent type specifier placement
- typescript/no-unnecessary-type-assertion: bump to error
- react/self-closing-comp: enforce self-closing JSX components
- unicorn/prefer-optional-catch-binding: drop unused catch params
- eslint/no-useless-computed-key: simplify object keys
- unicorn/prefer-string-slice: prefer .slice() over .substring()
- unicorn/prefer-array-flat-map: prefer .flatMap() over .map().flat()

All existing violations auto-fixed via oxlint --fix.
2026-04-10 19:29:32 +02:00
Alem Tuzlak c3fc0091a0 fix(runtime): widen TanStack message content type for adapter compat
TanStackChatMessage.content uses any[] for multimodal so
messages are directly passable to any adapter without casts.
Add env.d.ts with vite/client types for CSS imports.
2026-04-10 17:53:43 +02:00
Alem Tuzlak 4a69d7a8e3 feat(runtime): add multimodal support to TanStack converter
- Fix convertInputToTanStackAI silently dropping multimodal
  content (images, audio, video, documents) by converting
  AG-UI content parts to TanStack AI ContentPart format
- Switch react-router example from Hono server to a React
  Router resource route using createCopilotRuntimeHandler
- Both agents now use BuiltInAgent factory pattern
- Remove hono/react-router-hono-server deps from example
2026-04-10 17:15:57 +02:00
Tyler Slaton 7f2a9ae176 feat(runtime): add factory mode to BuiltInAgent for backend-agnostic LLM integration (#3572)
## Summary

Adds **factory mode** to `BuiltInAgent`, enabling backend-agnostic LLM
integration without introducing a new class. Users provide a factory
function that creates the LLM stream — CopilotKit handles lifecycle
events, stream-to-AG-UI conversion, error handling, and
abort/cancellation.

### What's included

- **Three backend types**: `aisdk` (Vercel AI SDK), `tanstack` (TanStack
AI), and `custom` (raw AG-UI events)
- **Stream converters**: `convertAISDKStream` and
`convertTanStackStream` extract AG-UI events from backend-native streams
- **Input helpers**: `convertInputToTanStackAI` and
`convertMessagesToVercelAISDKMessages` for message/prompt conversion
- **State management**: Automatic `STATE_SNAPSHOT`/`STATE_DELTA` event
extraction from tool results
- **Reasoning support**: Auto-close logic for providers that never emit
`reasoning-end` (e.g. `@ai-sdk/anthropic`)
- **273 tests** across 16 test files covering all backend types,
converters, state tools, multimodal, and edge cases
- **Docs**: Comprehensive factory mode guide with 16 examples covering
tools, reasoning, state, forwardedProps, structured output
- **Example app**: React Router example migrated to factory mode

### Architecture

Factory mode is a discriminated union on `BuiltInAgentConfiguration`:

```typescript
const agent = new BuiltInAgent({
  type: "aisdk",           // or "tanstack" | "custom"
  factory: ({ input, abortSignal }) =>
    streamText({ model: openai("gpt-4o"), messages: ..., abortSignal }),
});
```

No new public classes — `BuiltInAgent` handles both simple mode (model
string) and factory mode (user-owned LLM call).

## PR feedback addressed

### Critical fixes
- **C1/M3**: Fixed TOCTOU window — `abortController` now set
synchronously before Observable creation in classic `run()`, with
concurrent run guard
- **C2/M2**: Classic `tool-result` now checks both `output` and `result`
property names, with `try/catch` on `JSON.stringify`
- **C3**: Error case safely handles `undefined` `p.error` with proper
fallback chain

### Important fixes
- **I2**: `RUN_ERROR` events now include `threadId` and `runId` in
classic mode (matching factory mode)
- **I3**: State tool events guarded against `undefined` snapshot/delta
before emitting
- **I4**: `JSON.stringify` wrapped in try/catch with descriptive
fallback message
- **M1**: `assignToolsToAgents` now skips factory-mode agents (prevents
config corruption)
- **M5**: TanStack converter's dropped event types documented with clear
limitation note

### Suggestions addressed
- **S1**: `@ts-expect-error` on `clone()` middlewares documented with
rationale
- **M4**: `AgentFactoryContext.abortController` kept (needed by TanStack
AI) but JSDoc added discouraging direct `.abort()` calls

## Test plan

- [x] 273 unit tests pass across all 3 backend types
- [x] Build succeeds
- [x] React Router example compiles
- [x] Docs render correctly (Vercel preview)
2026-04-09 21:34:44 -07:00
Tyler Slaton 9b3ece99b9 chore(format): commit unformatted code
Signed-off-by: Tyler Slaton <tyler@copilotkit.ai>
2026-04-09 21:03:12 -07:00
Jordan Ritter a3ff477e16 feat: add /health endpoint to all starter integration examples (#3738)
## Summary

Adds a `/health` GET endpoint returning `{"status": "ok"}` to all 11
starter integration examples. This is a best practice for any deployed
service — health checks enable platform health monitoring, load balancer
probes, and container lifecycle management.

**11 starters updated:**
- adk, agent-spec, agno, crewai-crews, crewai-flows, langgraph-fastapi,
llamaindex, ms-agent-framework-dotnet, ms-agent-framework-python,
pydantic-ai, strands-python

**1 skipped:**
- langgraph-python — uses `langgraph dev` which provides its own `/ok`
endpoint

All `/health` endpoints are registered before any catch-all mount to
ensure they take priority (lesson learned from the pydantic-ai showcase
bug).

## Test plan

- [ ] Each starter builds successfully
- [ ] `curl localhost:8000/health` returns `{"status": "ok"}` on each
2026-04-09 20:50:06 -07:00
Tyler Slaton 214924c7f9 Merge branch 'main' into worktree-fancy-mapping-valley 2026-04-09 20:47:51 -07:00
Jordan Ritter 65508a641d feat: add /health endpoint to all starter integration examples 2026-04-09 20:40:10 -07:00
Jordan Ritter 89e99c65b7 Fix starter source bugs: configurable agent URL + crewai version bump (#3737)
## Summary

- **Configurable agent URL**: All starter `route.ts` files now read
`AGENT_URL` from environment with localhost fallback, enabling
deployment to non-localhost environments without code changes. Applied
to: pydantic-ai, adk, agno, llamaindex, ms-agent-framework-python,
ms-agent-framework-dotnet, crewai-crews.
- **crewai-crews version bump**: Bumped `ag-ui-crewai` from pinned
`==0.1.3` to `>=0.1.5` to pick up the `MethodExecutionFinishedEvent`
dict state fix from ag-ui-protocol/ag-ui#1478.
- **`.env.example` files**: Added `.env.example` with `OPENAI_API_KEY`
and `AGENT_URL` (correct default port per starter) to all affected
starters.

## Starters NOT touched (already configurable or different pattern)
- strands-python (uses `STRANDS_AGENT_URL`)
- langgraph-python / langgraph-js (use `LANGGRAPH_DEPLOYMENT_URL`)
- langgraph-fastapi (has docker-route-override)
- mastra (monolith, no separate agent URL)

## Test plan
- [ ] Verify each starter builds with `next build`
- [ ] Verify `AGENT_URL` env var is respected when set
- [ ] Verify localhost fallback works when `AGENT_URL` is unset
- [ ] Verify crewai-crews agent installs with `ag-ui-crewai>=0.1.5`
2026-04-09 20:35:05 -07:00
Jordan Ritter c374704d5e fix: bump ag-ui-crewai to >=0.1.5 for dict state bug fix
The starter pinned ag-ui-crewai==0.1.3 which crashes on crew completion:
'dict' object has no attribute 'messages' in MethodExecutionFinishedEvent
handler. Fixed upstream in ag-ui-protocol/ag-ui#1478, released in 0.1.5.
2026-04-09 20:27:24 -07:00
Jordan Ritter 147422bb85 feat: add universal AGENT_URL env var to all starters
Every starter's route.ts now reads process.env.AGENT_URL as the
primary agent endpoint, with framework-specific vars as fallback:

- AGENT_URL || "http://localhost:8000" (pydantic-ai, adk, agno, crewai,
  ms-agent-python, ms-agent-dotnet, strands-python)
- AGENT_URL || LANGGRAPH_DEPLOYMENT_URL || "http://localhost:8123"
  (langgraph-python, langgraph-js)
- AGENT_URL || "http://localhost:9000" (llamaindex)

Also adds .env.example with AGENT_URL to all starters.
2026-04-09 20:27:16 -07:00
Jordan Ritter bf3b95613b fix: remove catch-all route before adding override to avoid Next.js 16 conflict 2026-04-09 20:09:44 -07:00
Jordan Ritter 9205ee20ba fix: make ms-agent-dotnet endpoint configurable via OPENAI_BASE_URL for aimock proxy 2026-04-09 15:15:25 -07:00
Alem Tuzlak 3dd17c1c5b Merge branch 'main' into worktree-fancy-mapping-valley 2026-04-09 20:40:27 +02:00
Jordan Ritter ef55874072 fix: format files and add GHCR login to CI workflow 2026-04-09 09:16:05 -07:00
Jordan Ritter 7ddc0d8b2e feat: add Docker test infrastructure for all 12 starters 2026-04-09 08:33:21 -07:00
Jordan Ritter 5284614227 feat: add health monitoring with smoke endpoints, drift detection, and Slack alerts 2026-04-08 19:59:30 -07:00
Jordan Ritter 479e62cb7f feat: add unified showcase platform with CI, Docker starters, and 13 deployed integrations 2026-04-08 19:59:29 -07:00
Tyler Slaton 59a9c6f9d2 feat(langgraph-python): reorder suggestions
Signed-off-by: Tyler Slaton <tyler@copilotkit.ai>
2026-04-08 18:20:25 -07:00
Tyler Slaton 9feec6fe16 fix(langgraph-python): update dockerfile to mount int .pnpmfile.cjs
Signed-off-by: Tyler Slaton <tyler@copilotkit.ai>
2026-04-08 17:57:45 -07:00
Tyler Slaton e17aed817c fix(langgraph-python): update layout.tsx to be correct
Signed-off-by: Tyler Slaton <tyler@copilotkit.ai>
2026-04-08 17:49:36 -07:00
Tyler Slaton 8eaa429de2 chore(langgraph-python): bump versions
Signed-off-by: Tyler Slaton <tyler@copilotkit.ai>
2026-04-08 17:46:50 -07:00
Tyler Slaton 100a882ebe fix: repair protected-branch release flow 2026-04-08 15:18:10 -07:00
Markus Ecker e3c00af220 feat(examples): A2UI + OpenGenUI demos, updated aimock fixtures, dojo e2e fixes 2026-04-08 12:50:56 -07:00
Alem Tuzlak 9b15a7c378 fix(runtime): address PR review feedback
- Close TOCTOU window: set abortController synchronously before Observable
  creation in classic run(), matching factory run() pattern (M3)
- Add concurrent run guard to classic run() (C1)
- Add threadId/runId to RUN_ERROR events in classic mode (I2)
- Check both 'output' and 'result' property names in classic tool-result (C2/M2)
- Add try/catch around JSON.stringify in classic tool-result (I4/M2)
- Add undefined guards before emitting state snapshot/delta events (I3)
- Guard assignToolsToAgents against factory-mode agent configs (M1)
- Improve error handling in classic error case with proper fallback (C3)
- Improve TanStack converter TODO comment with known gap details (M5)
- Document @ts-expect-error on clone() middlewares access (S1)
- Add JSDoc to AgentFactoryContext.abortController (M4)
- Fix duplicate import and clean up react-router example
- Update docs AgentFactoryContext reference
2026-04-08 17:32:50 +02:00
Alem Tuzlak c6d8ab9e38 docs(example): update react-router example to use BuiltInAgent factory mode 2026-04-08 17:15:01 +02:00
Alem Tuzlak 5f0a718932 feat(agent): add convertInputToTanStackAI utility for message/prompt conversion 2026-04-08 17:14:45 +02:00
Alem Tuzlak 71445f0683 refactor(examples): use Agent class in React Router example 2026-04-08 17:14:42 +02:00
Alem Tuzlak 136bfc1182 Merge branch 'main' into feat/multimodal-builtin-agent 2026-04-07 09:51:46 +02:00
Max Korp 3bd279d680 fix: format files 2026-04-06 17:20:06 -07:00
Jordan Ritter d9f58fb388 feat(showcase): add deep-agents-finance-erp showcase (#3592)
## Summary

Adds a full-featured **Finance ERP showcase** demonstrating CopilotKit
v2 deep agents with:

- **Multi-agent orchestrator** (research + projections subagents via
`deepagents`)
- **14 frontend tools** rendered inline in the CopilotSidebar — charts,
cash position cards, dashboard widgets, and human-in-the-loop approval
dialogs
- **Customizable dashboard** with drag/resize widgets controlled by the
AI agent
- **Component gallery** at `/components` showcasing all frontend tool
renderers

### Architecture

```
Orchestrator (FinanceOS AI)
├── research subagent — queries ERP data (invoices, accounts, inventory, HR)
├── projections subagent — forecasts, scenario analysis, trend computation
└── frontend tools (registered as backend stubs) — AG-UI streams events,
    CopilotKit frontend matches to useFrontendTool renderers
```

Frontend tools are registered as lightweight `@tool` stubs on the
orchestrator. When the model calls them, the AG-UI adapter streams
`ToolCall` events that CopilotKit matches to `useFrontendTool` /
`useHumanInTheLoop` renderers by name. HITL tools use
`copilotkit_interrupt()` to pause the graph for user approval.

### Key files

| Area | Files |
|---|---|
| Agent | `agent/agent.py`, `agent/prompts.py`, `agent/tools.py`,
`agent/frontend_tools.py` |
| Frontend hooks | `src/hooks/use-render-chart.ts`,
`use-render-cash-position.ts`, `use-approve-invoice-payment.ts`, ... (14
total) |
| Dashboard | `src/context/dashboard-context.tsx`,
`src/components/dashboard/` |
| Layout | `src/components/layout/shell.tsx` (tool registration +
context sharing) |

All changes are scoped to `examples/showcases/deep-agents-finance-erp/`
— no SDK or package modifications.

## Test plan

- [ ] `cd agent && pip install -e . && python main.py` — agent starts on
:8123
- [ ] `cd .. && npm install && npm run dev` — frontend starts on :3000
- [ ] "What's our current cash position?" → `CashPositionCard` renders
inline
- [ ] "Give me a cash flow projection" → `InlineChatChart` renders
- [ ] "Process payment for overdue invoices" → `InvoiceApprovalCard`
with Approve/Reject
- [ ] "Remove the expense breakdown" → dashboard widget removed
- [ ] `/components` page renders all tool previews

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-04-06 16:19:14 -07:00
GeneralJerel c186e20e0d feat(showcase): add deep-agents-finance-erp project
Finance ERP showcase powered by CopilotKit deep agents. Includes a
Next.js 16 frontend with 7 CopilotKit-registered tools, a LangGraph
multi-agent backend (orchestrator + research/projections subagents),
Postgres-backed dashboard gallery with 12 widget types and 4 templates,
and human-in-the-loop approval flows for invoices and inventory.
2026-04-06 16:16:12 -07:00
Martha Kelly Schumann 2d4782f68d Merge branch 'main' into fix/a2ui-activity-thread-clone 2026-04-06 10:04:55 -07:00
Martha Schumann 07b9ec13ec chore(a2ui): add /a2ui-demo page and DemoButtonAgent for manual fix validation
Adds a minimal demo at /a2ui-demo that uses the demo-button agent to
reproduce and validate the A2UI thread-clone bug fix. The agent renders
an A2UI surface with a Confirm button on first run; clicking it fires a
second run that emits a text confirmation message.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 09:45:23 -07:00
Alem Tuzlak 53a2e9c6e3 Merge branch 'main' into feat/multimodal-builtin-agent 2026-04-06 17:30:11 +02:00
Alem Tuzlak 5f464e6a0d fix(example): map AG-UI text parts to TanStack AI format (text → content) 2026-04-06 15:34:17 +02:00
Alem Tuzlak 39344c00f7 fix(example): preserve multimodal content arrays in TanStack AI agent 2026-04-06 15:30:08 +02:00
Alem Tuzlak a076a69852 fix: correct tsconfig extends paths for v1 node examples 2026-04-06 14:55:07 +02:00
Alem Tuzlak 18c7a6001d feat: multimodal attachments — UI polish, deprecations, docs, codemod
Attachment queue & previews:
- Image lightbox with View Transition API morph animation
- Video lightbox with native controls and play button overlay
- Document lightbox (PDF via blob URL, text inline, info card fallback)
- Drop zone overlay with upload icon
- Filename preservation via InputContent metadata
- Proper video thumbnail sizing and play/pause indicator
- Fix attachment queue positioning (max-w-3xl constraint)
- Padding between X button and content for audio/document cards
- Document filenames wrap instead of truncating

Attachments config:
- onUploadFailed callback for validation/upload errors (file-too-large, invalid-type, upload-failed)
- onUpload accepts sync or async returns
- AttachmentUploadResult discriminated union with explicit interfaces
- Metadata field on Attachment and onUpload return type

AG-UI version bump:
- Bump @ag-ui/client, @ag-ui/core, @ag-ui/encoder, @ag-ui/proto to 0.0.51
- Remove process.env Vite workaround (fixed upstream in 0.0.51)

Deprecation lifecycle:
- @deprecated JSDoc on all legacy image upload APIs
- ImageRenderer, ImageRendererProps, ImageUpload type, imageUploadsEnabled prop,
  inputFileAccept prop, ImageRenderer prop, AIMessage.image, ImageData
- Codemod at codemods/migrate-attachments.ts (15 tests)
- Migration guide updated with codemod instructions and new type shapes

Docs:
- New guide: docs/(root)/multimodal-attachments.mdx
- Updated migration guide with onUpload return type, metadata, codemod section
- Cross-links from prebuilt-components and migration guide
- Label change: "Add photos or files" → "Add attachments"

Tests:
- CopilotChat.attachments.test.tsx — 5 tests for onUploadFailed
- migrate-attachments codemod — 15 tests
2026-04-06 14:55:06 +02:00
Alem Tuzlak 085ac18057 feat(example): dual agent setup — BuiltInAgent + TanStack AI with agent toggle 2026-04-06 14:54:47 +02:00
Alem Tuzlak 64ffb9bee9 feat(example): update react-router example to test multimodal attachments 2026-04-06 14:54:47 +02:00
Ran Shemtov 2afc3c380e Merge branch 'main' into claude/explore-agentcore-cli-a25GL 2026-04-06 13:59:33 +02:00