- 人工智能
- 大模型
- 代码智能体
- AI Agent
- 桌面应用
- 后端
- 前端
- CLI
【免费下载链接】ZCode
ZCode 是 AI 编程工作台,提供桌面应用、浏览器界面和终端 Agent。本仓库包含客户端、后端服务、共享 UI,以及 Agent CLI 与运行时源码。
SchemaDisplay 是 ZCode 仓库中 ai-elements 技能包提供的一个 React 组件,用于把 REST API 端点的 HTTP 方法、路径、参数以及请求/响应体 schema 渲染成结构化的开发者文档界面。本文以 schema-display.md 为骨架,结合仓库内 5 个可运行示例脚本与技能说明文件,完整讲解该组件的安装方式、全部 Props、类型定义、子组件组合方式以及递归嵌套渲染原理,读完即可在自己的 AI 编程工作台界面中直接复刻这套 API 文档展示能力。
一、组件定位:SchemaDisplay 解决什么问题
当 AI 编程工作台需要向用户展示「当前正在调用哪个 API、传了什么参数、返回什么结构」时,传统的做法是手写一组长篇 Markdown 说明,既难读又难维护。SchemaDisplay组件把这一过程组件化:它接收一个端点描述(方法、路径、参数、请求体、响应体)作为数据,输出一份带有颜色标识、可折叠区块、必填标记的交互式文档卡片。
该组件在仓库中的角色需要明确两点:
- 它是 ai-elements 组件库(源自 vercel/ai-elements,Apache-2.0 许可)中的一员,在 ZCode 仓库中以技能文档 + 示例脚本的形式被本地化集成,见 .agents/skills/ai-elements 目录;
- 组件本体由 CLI 安装到开发者自己的项目中(通常落在
@/components/ai-elements/目录),示例脚本则保存在 scripts 下,供直接复制参考。
从仓库结构看,当前 packages/ui/src/components/ai-elements 目录并未内置 schema-display 的实现文件,示例脚本中均通过@/components/ai-elements/schema-display路径导入,也就是说组件代码在运行add命令时才会下载并集成进用户项目——这与 ai-elements「组件代码进入你的代码库而非隐藏在库里」的设计一致。
二、安装:把 SchemaDisplay 加入你的项目
在开始之前,先确认环境满足 ai-elements 技能包的前置要求(见 SKILL.md):
- Node.js 18 或更高版本;
- 一个已安装AI SDK的 Next.js 项目;
- 项目已集成shadcn/ui(未安装时,CLI 会自动帮你装好)。
满足条件后,在项目根目录执行:
npx ai-elements@latest add schema-display注意命令运行器要与项目的
packageManager一致:pnpm 项目用pnpm dlx ai-elements@latest,bun 项目用bunx --bun ai-elements@latest。以下示例统一以npx演示,实际使用时请替换成对应运行器。
命令执行成功后,组件源码(含 Tailwind 样式类)会被写入你的 components 目录,无需额外配置即可直接 import 使用。若出现「module not found」错误,请检查tsconfig.json中是否配置了@/路径别名("paths": { "@/*": ["./*"] })。
三、核心特性一览
SchemaDisplay围绕「一眼看清一个端点的全貌」设计,官方特性包括:
- 颜色编码的 HTTP 方法徽章(Method Badge);
- 路径参数高亮:
/api/users/{userId}中的{userId}会被单独着色; - 可折叠的参数区块:避免参数过多时撑爆页面;
- 请求/响应体 schema 展示;
- 嵌套对象属性递归展示:对象内套对象、数组内套对象都能完整呈现;
- 必填字段指示器:
required: true的字段有醒目标记。
这些特性共同保证了:无论端点参数多复杂、响应结构多深,读者都能在一条垂直时间线内快速定位自己关心的字段。
四、HTTP 方法配色规范
组件用统一配色对方法做语义化区分,与行业惯例保持一致:
| 方法 | 颜色 |
|---|---|
GET | 绿色 |
POST | 蓝色 |
PUT | 橙色 |
PATCH | 黄色 |
DELETE | 红色 |
该方法徽章由子组件SchemaDisplayMethod渲染(见下文「子组件结构」),颜色规则可以直接在组件源码中自定义,例如将PATCH改为紫色以匹配你自己的设计系统。
五、Props 全解
5.1<SchemaDisplay />顶层属性
| Prop | 类型 | 默认值 | 说明 |
|---|---|---|---|
method | unknown | - | HTTP 方法(GET/POST/PUT/PATCH/DELETE 等)。 |
path | string | - | API 端点路径,路径参数用{name}包裹。 |
description | string | - | 端点用途描述。 |
parameters | SchemaParameter[] | - | URL/query/header 参数列表。 |
requestBody | SchemaProperty[] | - | 请求体属性列表。 |
responseBody | SchemaProperty[] | - | 响应体属性列表。 |
5.2SchemaParameter:参数类型
interface SchemaParameter { name: string; type: string; required?: boolean; description?: string; location?: "path" | "query" | "header"; }对每个字段逐一说明:
name:参数名,path参数必须与path属性中的{name}占位符一致;type:参数数据类型,如string、number、boolean;required:是否必填,缺省视为非必填;description:参数用途说明;location:参数所在位置,取值path/query/header。该字段不仅决定渲染位置,也决定了路径高亮逻辑——location: "path"的参数名会与路径中的{...}占位符匹配并高亮。
5.3SchemaProperty:请求/响应体属性
interface SchemaProperty { name: string; type: string; required?: boolean; description?: string; properties?: SchemaProperty[]; // For objects items?: SchemaProperty; // For arrays }这个接口是递归展示能力的关键:
type: "object"时,用properties列出其子属性(子属性自身也可以是 object,从而形成任意深度的嵌套);type: "array"时,用items描述数组元素的 schema(元素可以是对象,进一步嵌套);required、description与参数一致。
正是这种「属性再套属性」的递归结构,让一个三层乃至四层的 JSON 响应体也能被完整、清晰地呈现。
六、从基础到完整:4 个示例脚本的递进用法
仓库在 .agents/skills/ai-elements/scripts 下提供了 4 个递进示例,全部以"use client"开头,说明组件面向客户端渲染场景。
6.1 基础用法(零参数)
基础示例 展示了最小可用形态——只声明方法、路径和描述:
import { SchemaDisplay } from "@/components/ai-elements/schema-display"; const Example = () => ( <SchemaDisplay description="List all users" method="GET" path="/api/users" /> );6.2 带参数(path + query 混合)
参数示例 演示parameters的两种常见location:
const Example = () => ( <SchemaDisplay method="GET" parameters={[ { location: "path", name: "userId", required: true, type: "string" }, { location: "query", name: "include", type: "string" }, ]} path="/api/users/{userId}" /> );注意:userId声明为location: "path"且必填,与路径中的{userId}占位符一一对应;include则是非必填的 query 参数。这种「路径占位符与参数声明联动」的写法,是 SchemaDisplay 最实用的场景之一。
6.3 带请求/响应体
请求响应体示例 演示了requestBody与responseBody的用法:
const Example = () => ( <SchemaDisplay method="POST" path="/api/posts" requestBody={[ { name: "title", required: true, type: "string" }, { name: "content", required: true, type: "string" }, ]} responseBody={[ { name: "id", required: true, type: "string" }, { name: "createdAt", required: true, type: "string" }, ]} /> );请求体声明了必填的title与content,响应体声明了id与createdAt——两个区块会分别以「Request」和「Response」两个可折叠面板渲染。
6.4 嵌套属性
嵌套属性示例 展示递归展示的核心能力:
const Example = () => ( <SchemaDisplay method="POST" path="/api/posts" requestBody={[ { name: "author", properties: [ { name: "id", type: "string" }, { name: "name", type: "string" }, ], type: "object", }, { name: "title", required: true, type: "string" }, ]} /> );author是type: "object"的属性,通过properties展开出id与name两个子字段,渲染时由SchemaDisplayProperty递归生成缩进层级。若要表达数组,则使用items字段声明元素结构(见下节完整示例中的tags)。
七、组合式用法:完整示例的解剖
完整示例脚本 是理解 SchemaDisplay 组合模型的最佳入口。它除了传入数据,还显式组合了 5 个子组件:
import { SchemaDisplay, SchemaDisplayContent, SchemaDisplayDescription, SchemaDisplayHeader, SchemaDisplayMethod, SchemaDisplayParameters, SchemaDisplayPath, SchemaDisplayRequest, SchemaDisplayResponse, } from "@/components/ai-elements/schema-display"; const Example = () => ( <SchemaDisplay description="Create a new post for a specific user. Requires authentication." method="POST" parameters={[ { description: "The unique identifier of the user", location: "path", name: "userId", required: true, type: "string", }, { description: "Save as draft instead of publishing", location: "query", name: "draft", required: false, type: "boolean", }, ]} path="/api/users/{userId}/posts" requestBody={[ { description: "The post title", name: "title", required: true, type: "string" }, { description: "The post content in markdown format", name: "content", required: true, type: "string" }, { description: "Tags for categorization", items: { name: "tag", type: "string" }, name: "tags", type: "array", }, { description: "Additional metadata", name: "metadata", properties: [ { description: "SEO optimized title", name: "seoTitle", type: "string" }, { description: "Meta description", name: "seoDescription", type: "string" }, ], type: "object", }, ]} responseBody={[ { description: "Post ID", name: "id", required: true, type: "string" }, { name: "title", required: true, type: "string" }, { name: "content", required: true, type: "string" }, { description: "ISO 8601 timestamp", name: "createdAt", required: true, type: "string" }, { name: "author", properties: [ { name: "id", required: true, type: "string" }, { name: "name", required: true, type: "string" }, { name: "avatar", type: "string" }, ], required: true, type: "object", }, ]} > <SchemaDisplayHeader> <div className="flex items-center gap-3"> <SchemaDisplayMethod /> <SchemaDisplayPath /> </div> </SchemaDisplayHeader> <SchemaDisplayDescription /> <SchemaDisplayContent> <SchemaDisplayParameters /> <SchemaDisplayRequest /> <SchemaDisplayResponse /> </SchemaDisplayContent> </SchemaDisplay> );这段示例一次覆盖了前面 4 个示例的全部能力,值得注意的细节:
- 请求体同时使用
items(数组)与properties(对象):tags是type: "array"、用items定义元素{ name: "tag", type: "string" };metadata是type: "object"、用properties展开seoTitle与seoDescription; - 响应体嵌套两层:
author是必填对象,内部含必填的id/name与可选的avatar; - 组合模型:
SchemaDisplay作为数据容器,用SchemaDisplayHeader承载方法徽章与路径,用SchemaDisplayDescription渲染描述,用SchemaDisplayContent收纳参数、请求、响应三个可折叠区块。不传子组件时,组件按默认布局渲染;显式组合时则可完全控制排版(例如把 Method 与 Path 放进flex items-center gap-3的横排布局)。
八、子组件结构一览
SchemaDisplay采用「容器组件 + 插槽子组件」的分层设计,全部子组件如下:
| 子组件 | 职责 |
|---|---|
SchemaDisplayHeader | 头部容器,通常包裹方法徽章与路径 |
SchemaDisplayMethod | 渲染颜色编码的方法徽章 |
SchemaDisplayPath | 渲染路径,并高亮{...}中的路径参数 |
SchemaDisplayDescription | 渲染端点描述文本 |
SchemaDisplayContent | 主体内容容器 |
SchemaDisplayParameters | 可折叠的参数区块 |
SchemaDisplayParameter | 单个参数行 |
SchemaDisplayRequest | 可折叠的请求体区块 |
SchemaDisplayResponse | 可折叠的响应体区块 |
SchemaDisplayProperty | schema 属性行(递归渲染) |
SchemaDisplayExample | 代码示例块 |
其中SchemaDisplayProperty是递归实现的关键——当属性为 object/array 时,它会继续用自身渲染properties或items里的子属性,直到叶子节点;SchemaDisplayExample则可在每个区块内附上对应 JSON 示例,方便读者直接对照复制。
九、深入理解:组合模型、扩展方式与许可说明
9.1 代码进入你的代码库,天然可定制
ai-elements 的设计哲学是「组件代码下载进项目、而不是藏在 npm 包里」,见 SKILL.md 的 Usage 与 Customization 章节。这意味着安装后你可以直接打开components/ai-elements/schema-display.tsx修改实现,例如调整方法配色、改变折叠面板默认状态,或为SchemaDisplayProperty增加类型图标——没有黑盒,全部可改。同时组件与 ai-elements 其他组件一致,接受尽可能多的原生属性,便于在复用基础上叠加自己的样式与交互。
9.2 数据驱动的渲染模型
从 Props 设计可以推断,SchemaDisplay是典型的数据驱动组件:parameters、requestBody、responseBody都是纯数据数组,与渲染逻辑完全解耦。这意味着它天然适合与后端 OpenAPI/JSON Schema 解析结果对接——你只需要写一个转换层把 schema 映射成SchemaProperty[],就能把任何真实接口的文档直接喂给组件渲染。这种「声明式数据 → 递归渲染」的模型,也解释了为什么组件能同时支持参数折叠、请求/响应分栏与深层嵌套。
9.3 仓库内的来源与许可
ZCode 仓库对该技能的集成方式为「本地化 + 注释标注来源」:文档与脚本文件头部均注明Derived from vercel/ai-elements、Copyright 2023 Vercel, Inc. Licensed under Apache-2.0,并指向根目录 THIRD-PARTY-NOTICES.md 查看许可证与溯源信息;third-party/copied-components.json 与 third-party/inventory.json 中也登记了schema-display.md及各示例脚本的哈希与清单条目,便于审计依赖来源。在 ZCode 中复刻或改造该组件时,请遵守 Apache-2.0 的署名与许可要求。
十、写在最后
SchemaDisplay的价值在于把「API 端点文档」从静态文字变成可交互、可折叠、递归完整的组件:数据侧用SchemaParameter与SchemaProperty两个递归接口表达任意复杂的参数与请求/响应结构,渲染侧用 11 个子组件分层组合出颜色化、可折叠、可定制的展示界面。无论你是要在 AI 编程工作台里展示工具调用结果,还是在 Next.js 项目中做 API 文档页,都可以直接复用仓库 .agents/skills/ai-elements/scripts 下的 5 个示例作为起点,几行代码即可渲染出专业级的端点文档卡片。
- 人工智能
- 大模型
- 代码智能体
- AI Agent
- 桌面应用
- 后端
- 前端
- CLI
【免费下载链接】ZCode
ZCode 是 AI 编程工作台,提供桌面应用、浏览器界面和终端 Agent。本仓库包含客户端、后端服务、共享 UI,以及 Agent CLI 与运行时源码。
相关推荐
在 ZCode 中用 SchemaDisplay 组件渲染 REST API 端点文档:参数、请求体与响应体一站展示
在 ZCode 中用 SchemaDisplay 组件渲染 REST API 端点文档:参数、请求体与响应体一站展示 SchemaDisplay 是 ZCode
SchemaDisplay 组件实战:用 ai-elements 为 AI 应用渲染 REST API 端点文档
SchemaDisplay 组件实战:用 ai elements 为 AI 应用渲染 REST API 端点文档 在面向 AI Agent 的应用(如 Comp
后端前端CRM人工智能AI Agentngxtop API文档示例:常用端点的请求与响应示例
ngxtop API文档示例:常用端点的请求与响应示例 1. 概述 ngxtop是一款实时监控Nginx服务器访问日志的工具,它能够通过命令行方式提供灵活的日志
运维可观测性CLI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考