"use client"; import { useCopilotAction } from "@copilotkit/react-core"; import { useState } from "react"; export default function UniversalModuleRenderer() { const [currentSchema, setCurrentSchema] = useState(null); // 核心:这个 Action 让 AI 能够在聊天流中不仅回复文字,更能直接把这段 React 树“扔”到前端界面里! useCopilotAction({ name: "renderDynamicForm", description: "在页面上为一个新的业务模块渲染基于 JSON Schema 的动态表单,使用在对话中。", parameters: [ { name: "entityName", type: "string", description: "表单或业务实体的中文名称,如'客户拜访记录'" }, { name: "entityCode", type: "string", description: "该业务的唯一英文编码,如'customer_visit'" }, { name: "jsonSchema", type: "string", description: "完全按照刚才设计的 JSON Schema 标准化字符串" } ], handler: async ({ entityName, entityCode, jsonSchema }) => { // 这个动作代表 AI 的渲染指令已经送达前端 return "UI 渲染通道已打开并呈现给用户。"; }, render: ({ status, args }) => { // 状态机:大模型还在努力生成字的时候显示打草稿状态 if (status === "inProgress") { return (
正在构思 {args.entityName || '未知模块'} 的界面结构 (Generative UI IN PROGRESS)...
); } // 状态机:大模型生成完毕 if (!args.jsonSchema) return null; try { // 安全地解析大模型幻觉可能导致的脏 JSON const schemaObj = JSON.parse(args.jsonSchema); // 动态构建出完整的可填报表单 return (

{args.entityName}

{args.entityCode}
{Object.entries(schemaObj.properties || {}).map(([key, field]: [string, any]) => (
))}
); } catch (e) { // 回退 / 降级 UI (Fallback UI) return (

大模型格式幻觉,表单渲染失败

{args.jsonSchema}

); } } }); return