Files
2026-07-13 12:58:18 +08:00

593 lines
22 KiB
YAML

name: Spring AI
slug: spring-ai
category: enterprise-platform
language: java
logo: /logos/spring-ai.svg
description: >-
CopilotKit integration with Spring AI. Java-based agent backend with full
feature coverage including frontend tools, in-chat and in-app human-in-the-
loop, generative UI, per-tool renderers, agent context, interrupt-adapted
scheduling (Strategy B), per-token state streaming, and prebuilt chat surfaces
(sidebar / popup / slots / headless). Demos that depend on LangGraph-specific
primitives (interrupt, multi-agent orchestration, MCP-driven UI) are
documented as skipped in PARITY_NOTES.md.
partner_docs: null
repo: https://github.com/CopilotKit/CopilotKit/tree/main/showcase/integrations/spring-ai
copilotkit_version: 2.0.0
deployed: true
docs_mode: hidden
sort_order: 170
generative_ui:
- constrained-explicit
- a2ui-dynamic-schema
interaction_modalities:
- sidebar
- embedded
- chat
not_supported_features:
# QUARANTINED pending a @copilotkit/react-core release. gen-ui-interrupt /
# interrupt-headless fail turn-2 on a useInterrupt/useHeadlessInterrupt
# RESUME-PATH hook bug in @copilotkit/react-core/v2: backend resumes + streams
# (HTTP 200) but the frontend never appends the confirmation assistant bubble,
# so the harness DOM settle-check times out. Fix is a published-package change
# (out of scope here); honestly marked not-supported (skipped-incapable, not
# green, not red) rather than a regression. Demos remain wired below.
- gen-ui-interrupt
- interrupt-headless
# Reasoning-family NSF: while spring-ai DOES emit REASONING_MESSAGE_* events
# for the `reasoning-custom` / `reasoning-default` demos (via the dedicated
# ReasoningController at /reasoning/, which writes raw-JSON
# REASONING_MESSAGE_START/CONTENT/END frames whose `type` matches the
# @ag-ui/core zod schema — workaround for the AG-UI Java SDK gap where
# Spring AI 1.0.1's SDK has no REASONING_MESSAGE_* subtypes), the following
# canonical reasoning cell-ids are NOT covered by that workaround and
# cannot mount here:
# * `reasoning-default-render` — alternate render-path for default
# reasoning that this Spring backend does not parallel.
# * `agentic-chat-reasoning` — agentic-chat composed with reasoning
# frames; spring-ai's default agent at `/` does not emit reasoning.
# * `tool-rendering-reasoning-chain` — registered against the default
# Spring agent at the root path (no reasoning emission), and spring-ai
# has no parallel multi-tool-call streaming surface to interleave with
# reasoning frames, so the reasoning-chain composition cannot mount.
# Skipped-incapable, not regressions. NSF entries are canonical cell-ids
# matching the dashboard cell-schema.
- reasoning-default-render
- agentic-chat-reasoning
- tool-rendering-reasoning-chain
features:
- cli-start
- agentic-chat
- tool-rendering-default-catchall
- tool-rendering-custom-catchall
- chat-customization-css
- frontend-tools
- frontend-tools-async
- gen-ui-agent
- gen-ui-tool-based
- open-gen-ui
- open-gen-ui-advanced
- declarative-gen-ui
- a2ui-fixed-schema
- prebuilt-sidebar
- prebuilt-popup
- chat-slots
- headless-simple
- headless-complete
- beautiful-chat
- readonly-state-agent-context
- shared-state-read-write
- shared-state-streaming
- subagents
- auth
- voice
- multimodal
- agent-config
- hitl-in-chat
- hitl-in-chat-booking
- hitl-in-app
- hitl
- tool-rendering
- mcp-apps
- declarative-hashbrown
- declarative-json-render
a2ui_pattern: schema-inline
agent_config_pattern: shared-state
auth_pattern: runtime-onrequest
demos:
- id: agentic-chat
name: Agentic Chat
description: Natural conversation with frontend tool execution
tags:
- chat-ui
route: /demos/agentic-chat
animated_preview_url:
highlight:
- src/main/java/com/copilotkit/showcase/springai/AgentConfig.java
- src/main/java/com/copilotkit/showcase/springai/AgentController.java
- src/app/demos/agentic-chat/page.tsx
- src/app/api/copilotkit/route.ts
- id: chat-customization-css
name: Chat Customization (CSS)
description: Default CopilotChat re-themed via scoped CSS overrides
tags:
- chat-ui
route: /demos/chat-customization-css
animated_preview_url:
highlight:
- src/app/demos/chat-customization-css/page.tsx
- src/app/demos/chat-customization-css/theme.css
- src/app/api/copilotkit/route.ts
- id: frontend-tools
name: Frontend Tools (In-App Actions)
description: Agent invokes client-side handlers registered with useFrontendTool
tags:
- interactivity
route: /demos/frontend-tools
animated_preview_url:
highlight:
- src/app/demos/frontend-tools/page.tsx
- src/app/api/copilotkit/route.ts
- id: frontend-tools-async
name: Frontend Tools (Async)
description:
useFrontendTool with an async handler — agent awaits a client-side
async operation and uses the returned result
tags:
- interactivity
route: /demos/frontend-tools-async
animated_preview_url:
highlight:
- src/app/demos/frontend-tools-async/page.tsx
- src/app/demos/frontend-tools-async/notes-card.tsx
- src/app/api/copilotkit/route.ts
- id: gen-ui-agent
name: Agentic Generative UI
description: Long-running agent tasks with generated UI
tags:
- generative-ui
route: /demos/gen-ui-agent
animated_preview_url:
highlight:
- src/app/demos/gen-ui-agent/page.tsx
- src/app/api/copilotkit/route.ts
- id: prebuilt-sidebar
name: "Pre-Built: Sidebar"
description: Docked sidebar chat via <CopilotSidebar />
tags:
- chat-ui
route: /demos/prebuilt-sidebar
animated_preview_url:
highlight:
- src/app/demos/prebuilt-sidebar/page.tsx
- src/app/api/copilotkit/route.ts
- id: prebuilt-popup
name: "Pre-Built: Popup"
description: Floating popup chat via <CopilotPopup />
tags:
- chat-ui
route: /demos/prebuilt-popup
animated_preview_url:
highlight:
- src/app/demos/prebuilt-popup/page.tsx
- src/app/api/copilotkit/route.ts
- id: chat-slots
name: Chat Customization (Slots)
description: Customize CopilotChat via its slot system
tags:
- chat-ui
route: /demos/chat-slots
animated_preview_url:
highlight:
- src/app/demos/chat-slots/page.tsx
- src/app/api/copilotkit/route.ts
- src/app/demos/chat-slots/slot-wrappers.tsx
- id: headless-simple
name: Headless Chat (Simple)
description: Minimal custom chat surface built on useAgent
tags:
- chat-ui
route: /demos/headless-simple
animated_preview_url:
highlight:
- src/app/demos/headless-simple/page.tsx
- src/app/api/copilotkit/route.ts
- id: readonly-state-agent-context
name: Readonly State (Agent Context)
description: Frontend provides read-only context to the agent via useAgentContext
tags:
- agent-state
route: /demos/readonly-state-agent-context
animated_preview_url:
highlight:
- src/app/demos/readonly-state-agent-context/page.tsx
- src/app/api/copilotkit/route.ts
- id: auth
name: Authentication
description:
Bearer-token gate via runtime onRequest hook with unauthenticated /
authenticated states
tags:
- chat-ui
route: /demos/auth
animated_preview_url:
highlight:
- src/app/demos/auth/page.tsx
- src/app/demos/auth/auth-banner.tsx
- src/app/demos/auth/use-demo-auth.ts
- src/app/demos/auth/demo-token.ts
- src/app/api/copilotkit-auth/[[...slug]]/route.ts
- id: open-gen-ui
name: Open Generative UI (Minimal)
description:
Agent streams HTML + CSS into a sandboxed iframe via the built-in
OpenGenerativeUIActivityRenderer
tags:
- generative-ui
route: /demos/open-gen-ui
animated_preview_url:
highlight:
- src/app/demos/open-gen-ui/page.tsx
- src/app/api/copilotkit-ogui/route.ts
- id: open-gen-ui-advanced
name: Open Generative UI (Advanced)
description: Sandboxed UI can call host-side functions (evaluateExpression,
notifyHost) via the provider's sandboxFunctions registration
tags:
- generative-ui
route: /demos/open-gen-ui-advanced
animated_preview_url:
highlight:
- src/app/demos/open-gen-ui-advanced/page.tsx
- src/app/demos/open-gen-ui-advanced/sandbox-functions.ts
- src/app/demos/open-gen-ui-advanced/suggestions.ts
- src/app/api/copilotkit-ogui/route.ts
- id: voice
name: Voice
description: CopilotChat mic button via a runtime mounted with
TranscriptionServiceOpenAI; transcribed text is forwarded to the Spring AI
backend
tags:
- interactivity
route: /demos/voice
animated_preview_url:
highlight:
- src/app/demos/voice/page.tsx
- src/app/demos/voice/sample-audio-button.tsx
- src/app/api/copilotkit-voice/[[...slug]]/route.ts
- id: agent-config
name: Agent Config Object
description:
Frontend forwards typed config (tone, expertise, responseLength) to
Spring, which rebuilds the system prompt per request
tags:
- agent-capabilities
route: /demos/agent-config
animated_preview_url:
highlight:
- src/main/java/com/copilotkit/showcase/springai/AgentConfigController.java
- src/app/demos/agent-config/page.tsx
- src/app/demos/agent-config/config-card.tsx
- src/app/demos/agent-config/use-agent-config.ts
- src/app/demos/agent-config/config-types.ts
- src/app/api/copilotkit-agent-config/route.ts
- id: a2ui-fixed-schema
name: A2UI Fixed Schema
description:
Dedicated Spring tool emits a fixed flight-card component tree plus
a data model; frontend catalog renders each component
tags:
- generative-ui
route: /demos/a2ui-fixed-schema
animated_preview_url:
highlight:
- src/main/java/com/copilotkit/showcase/springai/A2uiFixedSchemaController.java
- src/main/java/com/copilotkit/showcase/springai/tools/DisplayFlightTool.java
- src/app/demos/a2ui-fixed-schema/page.tsx
- src/app/demos/a2ui-fixed-schema/a2ui/definitions.ts
- src/app/demos/a2ui-fixed-schema/a2ui/renderers.tsx
- src/app/demos/a2ui-fixed-schema/a2ui/catalog.ts
- src/app/api/copilotkit-a2ui-fixed-schema/route.ts
- id: headless-complete
name: Headless Chat (Complete)
description: Full chat built from scratch on useAgent plus low-level render
hooks (useRenderToolCall, useRenderActivityMessage,
useRenderCustomMessages)
tags:
- chat-ui
route: /demos/headless-complete
animated_preview_url:
highlight:
- src/app/demos/headless-complete/page.tsx
- src/app/api/copilotkit/route.ts
- src/app/demos/headless-complete/chat/chat.tsx
- src/app/demos/headless-complete/hooks/use-tool-renderers.tsx
- src/app/demos/headless-complete/hooks/use-frontend-components.ts
- src/app/demos/headless-complete/hooks/use-headless-suggestions.ts
- src/app/demos/headless-complete/attachments/use-attachments-config.ts
- src/app/demos/headless-complete/tools/weather-card.tsx
- src/app/demos/headless-complete/tools/stock-card.tsx
- src/app/demos/headless-complete/tools/chart-card.tsx
- src/app/demos/headless-complete/tools/highlight-note.tsx
- id: beautiful-chat
name: Beautiful Chat
description:
Polished brand-themed chat surface over the Spring AI agent with
seeded suggestion pills
tags:
- chat-ui
route: /demos/beautiful-chat
animated_preview_url:
highlight:
- src/app/demos/beautiful-chat/page.tsx
- src/app/api/copilotkit/route.ts
- id: tool-rendering-reasoning-chain
name: Tool Rendering (Reasoning Chain)
description: Per-tool renderers (WeatherCard, FlightListCard) plus custom
reasoningMessage slot composed in a single chat
tags:
- generative-ui
route: /demos/tool-rendering-reasoning-chain
animated_preview_url:
highlight:
- src/app/demos/tool-rendering-reasoning-chain/page.tsx
- src/app/demos/tool-rendering-reasoning-chain/reasoning-block.tsx
- src/app/demos/tool-rendering-reasoning-chain/weather-card.tsx
- src/app/demos/tool-rendering-reasoning-chain/flight-list-card.tsx
- src/app/demos/tool-rendering-reasoning-chain/custom-catchall-renderer.tsx
- src/app/api/copilotkit/route.ts
- id: declarative-gen-ui
name: Declarative Generative UI
description: A2UI dynamic-schema against a branded catalog; backend owns the
`generate_a2ui` tool
tags:
- generative-ui
route: /demos/declarative-gen-ui
animated_preview_url:
highlight:
- src/main/java/com/copilotkit/showcase/springai/tools/GenerateA2uiTool.java
- src/app/demos/declarative-gen-ui/page.tsx
- src/app/demos/declarative-gen-ui/a2ui/definitions.ts
- src/app/demos/declarative-gen-ui/a2ui/renderers.tsx
- src/app/demos/declarative-gen-ui/a2ui/catalog.ts
- src/app/api/copilotkit-declarative-gen-ui/route.ts
- id: shared-state-read-write
name: Shared State (Read + Write)
description: Bidirectional shared state — UI writes preferences into agent
state; the agent's set_notes tool mutates state.notes and emits a
STATE_SNAPSHOT back to the UI
tags:
- agent-state
route: /demos/shared-state-read-write
animated_preview_url:
highlight:
- src/main/java/com/copilotkit/showcase/springai/SharedStateReadWriteController.java
- src/app/demos/shared-state-read-write/page.tsx
- src/app/demos/shared-state-read-write/preferences-card.tsx
- src/app/demos/shared-state-read-write/notes-card.tsx
- src/app/api/copilotkit-shared-state-read-write/route.ts
- id: shared-state-streaming
name: Shared State Streaming
description:
Per-token state streaming — the agent's write_document tool streams
content into state.document via STATE_SNAPSHOT events; the frontend
renders the growing document live
tags:
- agent-state
route: /demos/shared-state-streaming
animated_preview_url:
highlight:
- src/main/java/com/copilotkit/showcase/springai/SharedStateStreamingController.java
- src/app/demos/shared-state-streaming/page.tsx
- src/app/demos/shared-state-streaming/document-view.tsx
- src/app/api/copilotkit-shared-state-streaming/route.ts
- id: subagents
name: Sub-Agents
description:
Supervisor delegates to research / writing / critique sub-agents
(each its own ChatClient call). Every delegation appends a Delegation
entry to state.delegations and emits a STATE_SNAPSHOT for a live UI log
tags:
- agent-capabilities
route: /demos/subagents
animated_preview_url:
highlight:
- src/main/java/com/copilotkit/showcase/springai/SubagentsController.java
- src/app/demos/subagents/page.tsx
- src/app/demos/subagents/delegation-log.tsx
- src/app/api/copilotkit-subagents/route.ts
- id: multimodal
name: Multimodal Attachments
description: CopilotChat AttachmentsConfig for images + PDFs; sample files
inject through the same pipeline as the paperclip upload
tags:
- interactivity
route: /demos/multimodal
animated_preview_url:
highlight:
- src/app/demos/multimodal/page.tsx
- src/app/demos/multimodal/sample-attachment-buttons.tsx
- src/app/api/copilotkit-multimodal/route.ts
- id: hitl-in-chat
name: In-Chat Human in the Loop
description: User approves agent actions before execution via text input inside the chat
tags:
- interactivity
route: /demos/hitl-in-chat
animated_preview_url:
highlight:
- src/app/demos/hitl-in-chat/page.tsx
- src/app/demos/hitl-in-chat/time-picker-card.tsx
- src/app/api/copilotkit/route.ts
- id: hitl-in-app
name: In-App Human in the Loop
description:
Agent requests approval via useFrontendTool; the approval UI pops
up as an app-level modal OUTSIDE the chat
tags:
- interactivity
route: /demos/hitl-in-app
animated_preview_url:
highlight:
- src/app/demos/hitl-in-app/page.tsx
- src/app/demos/hitl-in-app/approval-dialog.tsx
- src/app/api/copilotkit/route.ts
- id: hitl
name: Human in the Loop (Steps)
description:
Multi-step HITL flow where the agent pauses for user confirmation
at each step
tags:
- interactivity
route: /demos/hitl
animated_preview_url:
highlight:
- src/app/demos/hitl/page.tsx
- src/app/api/copilotkit/route.ts
- id: tool-rendering
name: Tool Rendering
description: Backend agent tools rendered as UI components
tags:
- agent-capabilities
route: /demos/tool-rendering
animated_preview_url:
highlight:
- src/main/java/com/copilotkit/showcase/springai/tools/WeatherTool.java
- src/app/demos/tool-rendering/page.tsx
- src/app/api/copilotkit/route.ts
- id: cli-start
name: CLI Start Command
description: Copy-paste command to clone the canonical Spring AI starter
tags:
- chat-ui
command: "npx copilotkit@latest init --framework spring-ai"
- id: gen-ui-tool-based
name: Tool-Based Generative UI
description:
Frontend registers per-tool component renderers via useComponent;
the Spring agent calls render tools that paint chart components inline in
the chat
tags:
- generative-ui
route: /demos/gen-ui-tool-based
animated_preview_url:
highlight:
- src/app/demos/gen-ui-tool-based/page.tsx
- src/app/demos/gen-ui-tool-based/bar-chart.tsx
- src/app/demos/gen-ui-tool-based/pie-chart.tsx
- src/app/api/copilotkit/route.ts
- id: tool-rendering-default-catchall
name: Tool Rendering (Default Catch-all)
description:
Out-of-the-box tool rendering — the Spring backend defines tools;
the frontend adds zero custom renderers and relies on CopilotKit's
built-in default UI
tags:
- generative-ui
route: /demos/tool-rendering-default-catchall
animated_preview_url:
highlight:
- src/app/demos/tool-rendering-default-catchall/page.tsx
- src/main/java/com/copilotkit/showcase/springai/AgentConfig.java
- src/app/api/copilotkit/route.ts
- id: tool-rendering-custom-catchall
name: Tool Rendering (Custom Catch-all)
description: Single branded wildcard renderer via useDefaultRenderTool — the
same app-designed card paints every Spring tool call
tags:
- generative-ui
route: /demos/tool-rendering-custom-catchall
animated_preview_url:
highlight:
- src/app/demos/tool-rendering-custom-catchall/page.tsx
- src/app/demos/tool-rendering-custom-catchall/custom-catchall-renderer.tsx
- src/main/java/com/copilotkit/showcase/springai/AgentConfig.java
- src/app/api/copilotkit/route.ts
- id: hitl-in-chat-booking
name: In-Chat HITL (Booking)
description: Time-picker card rendered inline via useHumanInTheLoop for a
booking flow against the Spring AI agent
tags:
- interactivity
route: /demos/hitl-in-chat
animated_preview_url:
highlight:
- src/app/demos/hitl-in-chat/page.tsx
- src/app/demos/hitl-in-chat/time-picker-card.tsx
- src/app/api/copilotkit/route.ts
- id: mcp-apps
name: MCP Apps
description:
MCP server-driven UI via the runtime mcpApps middleware; sandboxed
iframe rendered via the built-in MCPAppsActivityRenderer
tags:
- generative-ui
route: /demos/mcp-apps
animated_preview_url:
highlight:
- src/app/demos/mcp-apps/page.tsx
- src/app/api/copilotkit-mcp-apps/route.ts
- id: declarative-hashbrown
name: "Declarative UI: Hashbrown"
description: Streaming structured output via @hashbrownai/react, rendering a sales dashboard catalog (MetricCard + PieChart + BarChart)
tags:
- generative-ui
route: /demos/declarative-hashbrown
animated_preview_url:
highlight:
- src/main/java/com/copilotkit/showcase/springai/ByocHashbrownController.java
- src/app/demos/declarative-hashbrown/page.tsx
- src/app/demos/declarative-hashbrown/hashbrown-renderer.tsx
- src/app/demos/declarative-hashbrown/metric-card.tsx
- src/app/demos/declarative-hashbrown/charts/bar-chart.tsx
- src/app/demos/declarative-hashbrown/charts/pie-chart.tsx
- src/app/demos/declarative-hashbrown/types.ts
- src/app/demos/declarative-hashbrown/suggestions.ts
- src/app/api/copilotkit-declarative-hashbrown/route.ts
- id: declarative-json-render
name: "Declarative UI: json-render"
description: Streaming structured output via @json-render/react, rendering a sales dashboard catalog (MetricCard + PieChart + BarChart)
tags:
- generative-ui
route: /demos/declarative-json-render
animated_preview_url:
highlight:
- src/main/java/com/copilotkit/showcase/springai/ByocJsonRenderController.java
- src/app/demos/declarative-json-render/page.tsx
- src/app/demos/declarative-json-render/json-render-renderer.tsx
- src/app/demos/declarative-json-render/metric-card.tsx
- src/app/demos/declarative-json-render/charts/bar-chart.tsx
- src/app/demos/declarative-json-render/charts/pie-chart.tsx
- src/app/demos/declarative-json-render/types.ts
- src/app/demos/declarative-json-render/suggestions.ts
- src/app/api/copilotkit-declarative-json-render/route.ts
- id: gen-ui-interrupt
name: Generative UI (Interrupt)
description:
Time-picker card rendered inline via useFrontendTool with an async
handler that blocks until the user picks a slot — Strategy B adaptation of
LangGraph's interrupt() primitive
tags:
- interactivity
route: /demos/gen-ui-interrupt
animated_preview_url:
highlight:
- src/main/java/com/copilotkit/showcase/springai/InterruptAgentController.java
- src/app/demos/gen-ui-interrupt/page.tsx
- src/app/demos/gen-ui-interrupt/_components/time-picker-card.tsx
- src/app/api/copilotkit/route.ts
- id: interrupt-headless
name: Headless Interrupt
description:
Time-picker popup rendered in the app surface (outside the chat)
via useFrontendTool with an async handler — headless variant of the
interrupt-adapted pattern
tags:
- interactivity
route: /demos/interrupt-headless
animated_preview_url:
highlight:
- src/main/java/com/copilotkit/showcase/springai/InterruptAgentController.java
- src/app/demos/interrupt-headless/page.tsx
- src/app/api/copilotkit/route.ts