> Discover all available pages from the documentation index: https://mastra.zisheng.pro/llms.txt # CopilotKit 生成式 UI 生成式 UI 是指由 Agent 协助创建、用户可与之交互的界面。CopilotKit 使用单一轴线——**生成式 UI 光谱**——来组织这些界面,范围从作者控制(每个像素都由你决定)一直延伸到 Agent 自主创建(Agent 完全掌控渲染界面)。在轴线上的位置,体现了可预测性与覆盖广度之间的取舍。 该光谱分为三个层级: | 层级 | 界面控制者 | 原语 | | ------- | ---------------------------------------- | ---------------------------- | | **受控式** | 组件由你编写。Agent 选择要使用的组件及传入的数据。 | Tool 调用渲染、状态渲染、推理、将组件作为 Tool | | **声明式** | Agent 输出结构化规范。前端使用你注册的目录进行组合。 | A2UI(固定 schema 和灵活变体) | | **开放式** | UI 在其他位置(MCP Server)创建,并由你在 Sandbox 中运行。 | MCP Apps | 每个层级都由一个通过 `registerCopilotKit()` 暴露的 Mastra Agent(参阅 [CopilotKit 概览](https://mastra.zisheng.pro/guides/build-your-ui/copilotkit/overview)),以及前端中对应的 CopilotKit hook 组成。完整概念请参阅 CopilotKit 的[生成式 UI 光谱](https://www.copilotkit.ai/generative-ui-spectrum)和[生成式 UI 概览](https://docs.copilotkit.ai/concepts/generative-ui-overview)。 > **提示:** Mastra 的 [UI Dojo](https://ui-dojo.mastra.ai/) 提供可运行的 CopilotKit 示例。可浏览 `src/pages/copilot-kit` 下的源代码。 ## 受控式 你提供一组固定组件,由 Agent 选择要渲染的组件并提供数据。这种方式可预测且符合品牌规范,适合高流量界面。受控式原语使用 CopilotKit v2 API,从 `@copilotkit/react-core/v2` 导入。 ### Tool 调用渲染 将 Agent 的 Tool 调用渲染为 React 组件。像往常一样,在 Mastra Server 上定义 Agent 和 Tool: ```typescript import { Agent } from '@mastra/core/agent' import { weatherTool } from '../tools/weather-tool' export const weatherAgent = new Agent({ id: 'weather-agent', name: 'Weather Agent', instructions: 'Use the weatherTool to fetch current weather data.', model: 'openai/gpt-5.6-sol', tools: { weatherTool }, }) ``` 在前端使用 `useRenderTool`,按名称为 Tool 注册渲染器。它只负责渲染(不会执行 Tool);`render` 函数会接收 Tool 调用的 `status`,并在 Agent 返回后接收其 `result`: ```tsx import { z } from 'zod' import { CopilotChat } from '@copilotkit/react-ui' import { CopilotKit, useRenderTool } from '@copilotkit/react-core/v2' import { Weather } from '@/components/weather' function Chat() { useRenderTool( { name: 'weatherTool', parameters: z.object({ location: z.string() }), render: ({ status, result }) => { if (status !== 'complete') { return
Retrieving weather...
} return }, }, [], ) return } export default function Page() { return ( ) } ``` 由于 Mastra 会增量流式传输 Tool 调用参数,参数到达时会反复调用 `render` 函数,因此 UI 可以在 Agent 工作期间逐步绘制。 ### 将组件作为 Tool 注册 React 组件,让 Agent 将其作为 Tool 调用。CopilotKit 会使用类型化 props(通过 Zod schema 定义)内联渲染该组件: ```tsx import { z } from 'zod' import { useComponent } from '@copilotkit/react-core/v2' const schema = z.object({ text: z.string() }) function Callout({ text }: z.infer) { return
{text}
} function Chat() { useComponent({ name: 'callout', render: Callout, parameters: schema }, []) return } ``` Agent 会像调用其他 Tool 一样调用 `callout`,CopilotKit 则使用其传入的 props 渲染 `Callout`。 ### 状态渲染 根据 Agent 状态渲染 UI,并在状态流式传输时重新渲染。在 Mastra 中,Agent 状态是 Agent 的工作记忆,会随着变化流式传输到客户端。使用 `useAgent` 读取状态;`agent.state` 具有响应性,因此组件会自动更新: ```tsx import { useAgent } from '@copilotkit/react-core/v2' function TaskBoard() { const { agent } = useAgent() const tasks = (agent.state.tasks as any[]) ?? [] return (
    {tasks.map((task, i) => (
  • {task.title}: {task.status}
  • ))}
) } ``` ### 推理 推理无需配置:当 Mastra Agent 运行支持推理的模型时,`CopilotChat` 会以内联方式将模型的思考过程渲染为专用消息类型,无需额外代码。如需调整样式,请将自定义组件传给 `CopilotChat` 的 `reasoningMessage` 插槽。详情请参阅 CopilotKit 的[生成式 UI 指南](https://docs.copilotkit.ai/)。 ## 声明式 你不再为每个 Tool 指定固定组件,而是注册由类型化构建块组成的目录,Agent 针对每次请求将其组装成 UI 树。CopilotKit 将这种方式称为 **A2UI**(Agent-to-UI),它提供固定 schema 和灵活变体。它适合长尾的次要交互场景,在这些场景中,覆盖广度比像素级精确更重要。 最简便的方式是将目录传给 `` Provider。仅这一个 prop 就能启用 A2UI 渲染,并将 A2UI Tool 注入 Agent,因此无需修改后端: ```tsx import { CopilotKit } from '@copilotkit/react-core/v2' import { myCatalog } from './a2ui-catalog' export default function Page() { return ( {/* your app */} ) } ``` 目录定义原语(其 schema)和渲染器(各原语的显示方式)。在固定 schema 变体中,组件预先编写,Agent 的 Tool 只提供数据。灵活变体则让 Agent 可以更自由地组合 UI 树。请参阅 CopilotKit 的 [A2UI 文档](https://docs.copilotkit.ai/a2a/generative-ui/a2ui)。 ## 开放式 在光谱的最远端,Agent 完全掌控整个界面:UI 在其他位置创建,并在你的应用中通过 Sandbox 运行。CopilotKit 通过 **MCP Apps** 支持这种方式,由 MCP Server 提供在应用内部渲染的 UI。该层级以确定性换取新颖性,是整个光谱中最具实验性的部分。 最简便的方式无需改动前端:使用现有的 `` Provider 即可。在后端,通过 `mcpApps` 选项让 `registerCopilotKit()` 指向一个或多个 MCP Server(该选项会转发给 CopilotKit Runtime): ```typescript registerCopilotKit({ path: '/copilotkit', resourceId: 'weatherAgent', mcpApps: { servers: [{ type: 'http', url: 'http://localhost:3108/mcp', serverId: 'my-server' }], }, }) ``` 当 Agent 调用 MCP App Tool 时,CopilotKit 会在聊天中获取并渲染该 Tool 的 UI,无需额外的前端代码。请参阅 CopilotKit 的 [MCP Apps 文档](https://docs.copilotkit.ai/agno/generative-ui/mcp-apps)。 ## 应用控制与交互 有些功能位于光谱之外:它们用于控制应用或为运行设置审批关卡,而不是渲染 Agent 输出。[入门指南](https://mastra.zisheng.pro/guides/build-your-ui/copilotkit/overview)中介绍了这两类功能: - **前端 Tool**(`useFrontendTool`):让 Agent 操作你的应用。它属于 CopilotKit 独立的[应用控制](https://docs.copilotkit.ai/)概念,其他部分还包括共享状态和 Agent 上下文。 - **人在回路**:暂停运行,等待用户批准或编辑。后端请参阅 Mastra 的 [Agent 审批](https://mastra.zisheng.pro/docs/agents/agent-approval);前端请参阅 CopilotKit 的 [`useHumanInTheLoop`](https://docs.copilotkit.ai/reference/hooks/useHumanInTheLoop)。