恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
CrewAI Conversational Flows 中的 BYOC json-render:在 CopilotKit 中用 `{root, elements}` 扁平规范渲染声明式生成 UI
首页
资讯中心
/
CrewAI Conversational Flows 中的 BYOC json-render:在 CopilotKit 中用 `{root, elements}` 扁平规范渲染声明式生成 UI
CrewAI Conversational Flows 中的 BYOC json-render:在 CopilotKit 中用 `{root, elements}` 扁平规范渲染声明式生成 UI
发布时间:2026/9/12 12:44:53
CrewAI Conversational Flows 中的 BYOC json-render在 CopilotKit 中用{root, elements}扁平规范渲染声明式生成 UI【免费下载链接】CopilotKitThe Frontend Stack for Agents Generative UI. React, Angular, Mobile, Slack, and more. Makers of the AG-UI Protocol项目地址: https://gitcode.com/GitHub_Trending/co/CopilotKit导读本文围绕 CopilotKit 仓库内crewai-conversational-flows集成包的BYOC json-render声明式 UI 方案展开它以 CrewAI 的ChatWithCrewFlow为后端承载一个专用 CrewByocJsonRender让 Agent 输出一份严格符合json-render/react扁平元素规范{ root, elements }的 JSON 对象前端再通过JSONUIProvider与Renderer /将流式 JSON 实时转换为 MetricCard、BarChart、PieChart 三种目录组件。读完本文你将掌握该 demo 的完整链路Prompt → Crew → FastAPI 挂载 → Next.js Runtime Route → 前端渲染器、QA 验证步骤与已知集成断裂点能够复现并独立排查同类声明式 JSON 渲染集成。一、背景什么是 BYOC json-render以及它解决的问题在 Agent 驱动的对话式 UI 中一个常见痛点是如何让模型输出的结构化数据稳定地映射为真实的 UI 组件。直接让模型输出 JSX 或组件代码既不可控也不安全让模型输出自由文本再由前端正则解析则脆弱不堪。crewai-conversational-flows的 json-render 方案给出的答案是后端 Agent 被约束为只输出一个 JSON 对象且对象形态固定为json-render/react消费的扁平元素映射flat element map——{ root, elements }前端把这份 JSON 直接喂给Renderer /由注册表registry中三个受 Zod 校验的组件MetricCard / BarChart / PieChart完成渲染在 JSON 尚未合法、或模型偶尔输出纯文本时聊天界面自动回退到默认气泡保证永不白屏、永不卡死。该方案在仓库中的完整载体包括QA 测试文档qa/declarative-json-render.md本文骨架来源后端专用 Crewsrc/agents/byoc_json_render_agent.py前端渲染器src/app/demos/declarative-json-render/json-render-renderer.tsx运行时路由src/app/api/copilotkit-byoc-json-render/route.ts。值得说明的是虽然 Demo 页面与 QA 文档中的路由名称为declarative-json-render但后端模块刻意保留了byoc_前缀模块注释明确写道byoc_prefix on the backend module is deliberate and stays因为它是与主多 Agent 运行时隔离的自带后端Bring Your Own Crew专用入口。二、前置条件与依赖环境根据 QA 文档运行本 demo 需要满足以下前置条件Demo 页面可访问位于/demos/declarative-json-render后端健康agent_server.py正在运行且健康它把该 Crew 挂载在/conversational_flows/byoc-json-renderNext.js 运行时路由页面挂载/api/copilotkit-declarative-json-render作为runtimeUrl。但需要特别留意当前包内只存在 copilotkit-byoc-json-render/route.ts因此按现有代码demo 页在其运行时 URL 上会 404该问题详见下文集成注意事项属于已知遗留问题而非 QA 回归OPENAI_API_KEYAgent 后端GPT 模型需要该环境变量依赖包package.json中需存在json-render/core与json-render/react当前锁定版本为0.18.0见 package.json。2.1 依赖版本快照从 package.json 可以确认与本方案直接相关的依赖依赖版本作用json-render/core0.18.0声明式 JSON 规范的核心库json-render/react0.18.0JSONUIProvider/Renderer等 React 渲染组件copilotkit/react-core1.68.2CopilotKit根组件与聊天消息组件copilotkit/runtime1.68.2CopilotRuntime与运行时处理器ag-ui/client0.0.57HttpAgent连接 FastAPI 挂载的 Crewrecharts^2.15.0图表组件BarChart/PieChart底层实现QA 文档特别指出由于 JSON{ root, elements }规范比 hashbrown 的 token 流更冗长渲染预算会略高——60 秒内完成渲染是该 QA 对页面加载渲染的既定预算。三、后端实现CrewAI 专用 Crew 与 JSON 规范约束3.1 Crew 的整体设计byoc_json_render_agent.py 定义了一个名为ByocJsonRender的专用 Crew其核心设计决策包括单 Agent 单 Task一个JSON-Render Spec Emitter角色 Agent任务描述为Respond with a single JSON object matching the json-render/react flat-element spec预期输出为{ root, elements }JSON 对象顺序流程Process.sequentialLLM 配置为llmgpt-5.4同时设置chat_llmgpt-5.4chat_llm用于 CrewAI 对话流程中的闲聊/补充生成verboseFalse与空工具列表避免工具调用干扰纯 JSON 输出Crew 缓存通过模块级_cached_crew全局变量复用 Crew 实例避免每次请求重建适配器形态类暴露name与crew()方法注释明确说明该形态是为了匹配add_crewai_crew_fastapi_endpoint的调用约定。3.2 CrewAI 的关键坑覆盖平台系统提示词模块 docstring 记录了一个重要的 CrewAI 经验ChatWithCrewFlow 会在每一轮对话外层包裹一套 CrewAI platform 系统提示词这会与仅输出 JSON的要求冲突。因此这里通过install_custom_system_message安装硬覆盖用我们自己的 json-render schema prompt 替换组合后的系统消息。具体代码为preseed_system_prompt(CREW_NAME, BYOC_JSON_RENDER_SYSTEM_PROMPT) install_custom_system_message(CREW_NAME, BYOC_JSON_RENDER_SYSTEM_PROMPT)两个工具函数均来自agents._chat_flow_helpers。这一对调用分别负责预置与安装覆盖是保证 CrewAI 平台提示词不污染 JSON 输出的关键防线。任何基于 CrewAI Conversational Flows 做纯结构化输出的集成都值得借鉴这一模式。3.3 输出规范扁平元素映射{ root, elements }系统提示词BYOC_JSON_RENDER_SYSTEM_PROMPT要求 Agent 在收到 UI 请求时只返回一个 JSON 对象不得夹杂任何散文、markdown 代码围栏、前置解释、工具调用或澄清问题。对象必须匹配如下 schema{ root: id of the root element, elements: { id: { type: component name, props: { ... component-specific props ... }, children: [ id, ... ] } } }其中root是根元素 id 的字符串elements是一个 id → 元素描述的映射每个元素包含type组件名必须是注册表中的名称、props组件专属属性、可选的children子元素 id 数组。3.4 允许的组件目录与 props 契约系统提示词中完整给出了三个组件的 props 契约前端 Zod 校验ALLOWED_TYPES与之一一对应MetricCard字段类型说明labelstring指标名称valuestring指标值如$1.24Mtrendstring | null趋势描述示例12% vs last quarter、-3% vs last month、nullBarChart字段类型说明titlestring图表标题descriptionstring | null描述data{ label: string, value: number }[]数据点数组PieChart字段类型说明titlestring图表标题descriptionstring | null描述data{ label: string, value: number }[]数据点数组3.5 六条硬性规则提示词用编号规则约束模型行为QA 的健壮性断言无孤儿元素、无陌生组件类型、无 markdown 围栏全部来源于此只输出合法 JSON禁止 markdown 代码围栏、禁止对象之外的任何文本引用完整性root与任何children数组引用的 id必须出现在elements的键中多组件仪表盘结构用 root MetricCard 承载图表子节点或任选一个元素作 root、其余作为其 children禁止产生孤儿元素销售域真实数据使用收入、管道、转化率、类别、月份等真实感的销售域数值children可选一旦出现必须是字符串数组组件类型封闭不得发明上述三个之外的组件类型。3.6 三个内置 Worked Example提示词内置了三个完整示例QA 中的三个建议 pillSales dashboard / Revenue by category / Expense trend正是对这三个示例的复现示例一销售仪表盘MetricCard BarChart 嵌套{ root: revenue-metric, elements: { revenue-metric: { type: MetricCard, props: { label: Revenue (Q3), value: $1.24M, trend: 18% vs Q2 }, children: [revenue-bar] }, revenue-bar: { type: BarChart, props: { title: Monthly revenue, description: Revenue by month across Q3, data: [ { label: Jul, value: 380000 }, { label: Aug, value: 410000 }, { label: Sep, value: 450000 } ] } } } }示例二按类别拆分收入的饼图{ root: category-pie, elements: { category-pie: { type: PieChart, props: { title: Revenue by category, description: Share of total revenue by product category, data: [ { label: Enterprise, value: 540000 }, { label: SMB, value: 310000 }, { label: Self-serve, value: 220000 }, { label: Partner, value: 170000 } ] } } } }示例三月度支出的柱状图{ root: expense-bar, elements: { expense-bar: { type: BarChart, props: { title: Monthly expenses, description: Operating expenses by month, data: [ { label: Jul, value: 210000 }, { label: Aug, value: 225000 }, { label: Sep, value: 240000 } ] } } } }三个示例覆盖了{root, elements}规范的核心能力单组件渲染、嵌套渲染MetricCard 包裹 BarChart、以及根节点直接是叶子图表的三种拓扑。四、运行时链路从 Next.js Route 到 FastAPI 挂载点4.1 专用 Runtime Routeroute.ts 是一个独立运行时入口将byoc_json_renderCrew 与默认多 Agent 的/api/copilotkit运行时隔离通过AGENT_URL环境变量默认http://localhost:8000构造HttpAgent目标是{AGENT_URL}/conversational_flows/byoc-json-renderagents注册表中byoc_json_render与default均指向同一个 agent用createCopilotRuntimeHandler以single-route模式处理 POSTbasePath为/api/copilotkit-byoc-json-render捕获异常并返回{ error, stack }的 JSON 响应500。前端 Demo 页 page.tsx 通过CopilotKit runtimeUrl... agent...指向运行时并将聊天表面限制在max-w-4xl居中容器内。从源码结构看该页面的runtimeUrl写为/api/copilotkit-declarative-json-render与后端实际存在的copilotkit-byoc-json-render路由不一致——这正是 QA 文档标注的已知断裂点。4.2 后端的挂载方式agent_server.py位于 src/agent_server.py使用 FastAPI 承载 Crew。根据 QA 文档与route.ts的注释Crew 被挂载在/conversational_flows/byoc-json-render路径下前端HttpAgent正是向该路径发起请求。package.json的dev脚本也印证了双进程启动方式concurrently next dev --turbopack PYTHONPATH. python -m uvicorn agent_server:app --host 0.0.0.0 --port 8000 --reload即前端 Next.jsTurbopack与后端 uvicorn8000 端口、热重载并行启动AGENT_URL默认为http://localhost:8000。五、前端渲染流式 JSON 到组件的转换前端渲染逻辑集中在 json-render-renderer.tsx 中它替换默认的助手消息气泡CopilotChatAssistantMessage实现了流式回退 组件替换的核心机制5.1 渲染决策树const content typeof props.message.content string ? props.message.content : ; const spec useMemo(() parseSpec(content), [content]); // Stream not yet a valid spec (or plain prose) — render the default bubble. if (!spec) return CopilotChatAssistantMessage {...props} /; return ( div>导航到/demos/declarative-json-render聊天输入框composer可见三个建议 pill 出现标题分别为 Sales dashboard、Revenue by category、Expense trend控制台无报错。6.2 Sales dashboard 建议点击 Sales dashboard 建议60 秒内助手气泡中出现data-testidjson-render-root包裹容器容器内渲染出data-testidmetric-card容器内渲染出图表data-testidbar-chart或data-testidpie-chartMetricCard 的嵌套子节点Sales Dashboard 示例中的 BarChart正常渲染——不得被静默丢弃渲染完成后不显示任何原始 JSON 文本——流式 JSON 已被组件替换。6.3 Revenue by category点击 Revenue by category 建议60 秒内渲染出data-testidpie-chart包含多个类别切片与图例控制台不得出现useVisibility must be used within a VisibilityProvider错误这验证了JSONUIProvider正确包裹了Renderer。6.4 Expense trend点击 Expense trend 建议60 秒内渲染出data-testidbar-chart包含月份标签。6.5 自由文本提示输入 Show me a metric for quarterly revenue 并发送至少渲染出一个metric-card控制台无报错。6.6 多轮对话上一渲染可见后发送追问如 Now break that down by region新的助手消息出现新的 json-render 渲染且先前的渲染保留在对话记录中。6.7 异常输出处理若 Agent 偶尔回复非 JSON 文本可通过问 tell me a joke 强制触发聊天应回退为默认助手气泡渲染该原始文本无崩溃、无卡死的 loading 状态。七、预期结果与验收口径建议渲染在60 秒内落地预算略高于 hashbrown demo因为 JSON{ root, elements }规范比 hashbrown 的 token 流更冗长控制台无未捕获错误流式输出在 JSON 合法之前回退为纯文本解析成功后无缝切换为渲染组件QA 文档原话Streaming falls back to plain text until the JSON parses, then swaps to rendered components。八、集成注意事项与已知问题byoc_前缀是刻意保留的扁平 spec prompt 位于src/agents/byoc_json_render_agent.py模块命名不得随意改动已知断裂既有问题非本次 QA 回归Demo 页north-star 副本挂载runtimeUrl/api/copilotkit-declarative-json-render但本包只提供src/app/api/copilotkit-byoc-json-render/route.ts。在 API 路由改名或增加别名之前所有测试步骤都会在网络层失败——QA 文档明确要求将该问题作为独立修复项登记而不是当作 QA 缺陷测试标识约定没有byoc-json-render-roottest id也不存在/demos/byoc-json-render路由——只能在规范路由上断言data-testidjson-render-root。九、总结一套可复用的声明式 JSON 渲染模式从本 demo 可以提炼出四条可复用于其他 Agent 框架LangGraph、LlamaIndex、Pydantic AI 等的集成经验——仓库中claude-sdk-python/qa/byoc-json-render.md等平行 QA 文档也印证了该模式是 CopilotKit 全集成矩阵的统一范式用强约束提示词锁定输出形状schema 组件契约 规则 worked examples 四件套是让模型稳定输出{root, elements}的关键压制框架级系统提示词的干扰CrewAI 场景必须通过install_custom_system_message覆盖平台提示词LangGraph 等其他框架则依赖 prompt 自身的强约束前端做容错渲染流式回退默认气泡、代码围栏剥离、平衡花括号提取、白名单校验四层防御保证永不白屏为测试预留稳定的 DOM 契约data-testidjson-render-root、metric-card、bar-chart、pie-chart等测试标识让 QA 与 E2E 断言长期稳定。如需继续深入可对比阅读 claude-sdk-python/qa/byoc-json-render.md 与其他集成目录下的byoc_json_render_agent.py观察同一套{root, elements}规范在不同 Agent 框架下的提示词差异与共性。【免费下载链接】CopilotKitThe Frontend Stack for Agents Generative UI. React, Angular, Mobile, Slack, and more. Makers of the AG-UI Protocol项目地址: https://gitcode.com/GitHub_Trending/co/CopilotKit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考