关于 omni-content-builder
omni-content-builder 是通过 Omni CLI 以编程方式创建和管理文档、仪表板及应用的技能,面向构建或维护 Omni 内容的用户。它采用 v2 文档 API 的草稿到发布流程,并涵盖查询、控件、布局和发布前验证。
主要功能
- 01创建和编辑 Omni 文档
- 02配置仪表板图表与布局
- 03管理控件和筛选器
- 04通过草稿流程发布
- 05发布前验证内容
适用场景
- 01从数据模型创建仪表板
- 02调整现有仪表板的图表和布局
- 03为文档添加筛选控件
- 04验证并发布文档修改
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ exploreomni/ omni-agent-skills --skill omni-content-builder安装后在 Claude Code 中输入/omni-content-builder确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
evals/evals.jsonreferences/branch-bound-drafts.mdcontainers.mdcontrols.mddashboard-style.mddocument-lifecycle.mddocuments-v2.mddownloads.mdmarkdown-tiles.mdmustache.mdqueryPresentations.mdupdating-dashboards.mdvalidation-and-testing.mdvisConfig.mdworkbook-model.md详细介绍
Omni 内容构建器
通过 Omni CLI 以编程方式创建、更新和管理 Omni 文档、仪表板和应用,包括文档生命周期、草稿、工作簿模型、筛选器、控件和仪表板内容。
提示:使用
omni-model-explorer了解可用字段,并使用omni-content-explorer查找现有仪表板以便修改或参考。
文档通过 v2 documents API(omni documents v2-*)创建和编辑,该 API 使用明确的封装结构,包括 queryPresentations、controls、containers 和 settings,并通过 草稿 → 发布 流程进行编辑。这是构建、读取或更改文档的唯一途径——切勿回退到 v1 documents create/get 命令(v1 put/update 已在 CLI 1.2.2 中移除)。少数文档管理操作(列出、删除、移动、复制、下载)没有 v2 形式;请参阅下方的命令。
设计默认规范
这里的机制旨在构建一个 正确 的仪表板;若要打造一个 出色 的仪表板,请遵循 Omni 的仪表板最佳实践。以下要点是该指南在没有其他明确要求时的默认规范。它们绝不会凌驾于已给出的要求之上:用户指定的布局、图表类型、配色或控件位置优先;你正在编辑的现有仪表板惯例或当前生效的组织主题也同样优先。如果某项要求与默认规范冲突,请遵循该要求,最多只需提及一次默认规范。没有其他要求时,默认采用以下做法:
- 在左上角突出答案。 将主要 KPI / 用于回答问题的图表放在左上方——查看者通常会按 F/Z 形路径浏览。
- 每页放置 3–5 个图表。 超出此数量时,拆分到多个页面/标签页(请参阅 containers.md)。
- 颜色服务于功能,遵循 90/10 原则。 以中性色调为主,用一种强调色突出重点或状态,而非装饰。
- 根据问题选择图表——趋势 → 折线图/面积图/柱状图;排名 → 横向条形图;部分与整体 → 100% 堆叠图;相关性 → 散点图。
- 将控件放在其作用对象旁边, 并使用以操作为导向的标签(例如“按地区筛选”,而不是“地区”)。
- 将复杂性隐藏在父控件之后——一个控件驱动多个项目;不放置子控件(请参阅 controls.md)。
- 图表无需悬停即可读懂。 查看者应能直接从图表中获取关键信息;工具提示用于补充细节,而不是传递核心信息。
对于运营或高管仪表板,还应遵循 references/dashboard-style.md(打造可助人采取行动的仪表板):
- 按仍有机会改变的事项排序。 将有风险的事项排在已无法挽回的事项前;每行列表都注明负责人。
- 表格列数不超过 5 列,且表头不得截断。 否则使用 markdown
{{#result}}列表行;根据图块大小设置limit,并检查 PNG。 - 每个视图都支持下钻。 在 markdown 中使用
{{view.field.value}}显示名称和关键数字;.value_static仅用于展示。 - 日期一律使用相对日期——日期控件和每个图块筛选器都如此;标题或标签中不要使用月份名称。
- 每种颜色只表示一种含义, 并始终附带文本标签;明确设置单序列颜色。
- 在图块筛选器中固定范围;查看者控件不超过 5 个。
- 适合触发提醒的图块应使用简短的分类关注列表(约 10 行,并按阈值筛选),且在副标题中注明触发条件。
已知问题与安全默认规范
- 发布前务必运行完整的验证流程——请参阅下文的 验证流程。
- 图块读回的结构与写入时相同。
v2-get/v2-get-draft会以{ visType, config }的形式返回内部可视化配置,因此可以按原样编辑图块并将其补丁写回,包括恢复、复制和移动图块。验证写入的每个图块:读回图块并在发布前运行其查询。请参阅 references/documents-v2.md。 - 补丁按键合并;只有
containers(以及order数组)会被完整替换。 要更改一个图块,只发送对应的键。要删除图块,将其键设为null,并从order中移除。发送containers时,请发送已应用编辑的完整布局树;省略它则保留布局,并让服务自动放置新增图块。 - 创建或补丁请求未携带
containers时,新图块会自动放置——每个符合仪表板条件的图块都会放到第一页。只有在需要自行设置布局时才发送containers,并确保引用每个应显示的图块。请参阅 references/containers.md。 - 创建时的图块
"1"会与服务端种子图块合并,即使发送false,它仍会保留automaticVis: true(从图块"2"开始则会保留false)。如果这点很重要,请在草稿上再次补丁更新图块"1"。 - 控件只会显示在容器放置它的位置。 要隐藏控件,请将其从所有容器中移除;它仍会继续应用其值。请参阅 references/controls.md。
- 图块查询不包含
modelId。 不要在图块查询中发送modelId或model_extension_id;服务会将图块关联到文档的工作簿模型,并在不发出警告的情况下改写你发送的任何值。其他必需的查询字段列于 references/documents-v2.md;省略其中任意字段都会返回一条指出该字段的 400 错误。 - 硬性规则——未经用户明确决定,不得使用交接过来的 SQL 创建非主题图块。 先将每个查询映射到一个主题(请参阅
omni-query)。如果没有合适的主题,请停止并询问用户是要扩展现有主题还是创建新主题(通过omni-model-builder在分支上操作,且仅在获得确认后合并)。只有用户明确选择此路径后(拒绝建模、确实只需一次性使用,或必须使用userEditedSQL),才能创建非主题 /userEditedSQL图块;对于交接过来的 SQL,Access Boost 绝不是默认选项。请参阅基于主题构建查询。 - 查看者和受限查询者看不到非主题图块。
userEditedSQL有值的图块,或不含join_paths_from_topic_name的基础视图查询,均属于非主题图块。在最终确定此类图块之前,请询问仪表板的受众是否包括这些角色。如果包括,请建议将 Access Boost 作为单独且经过明确确认的步骤(它仅会让所选用户、群组或整个组织在仪表板上查看这些图块;需要组织功能以及文档的 Manager 权限),并使用满足需求的最小范围。未经用户同意,绝不要启用。请参阅 references/queryPresentations.md 中的 原始 SQL 图块 配方,以及omni-admin→ 文档权限。 --body会覆盖简写标志。 使用--body时,所有简写标志(--name、--summary、--branch-id等)都会被忽略,且不会发出警告。每次创建和补丁请求都要将这些字段放入 JSON 请求体;只有当标志足以构成完整请求时,才在不使用--body的情况下使用标志。- 工作簿模型 ID 会随每次草稿和发布而变化——每个草稿都会复制工作簿模型(包括扩展),发布时文档会切换到该副本。不要缓存工作簿模型 ID;每次需要时,都从
v2-get-draft(或omni documents list-drafts <identifier>)读取workbookModelId。 - Markdown 图块需要设置
automaticVis: false——否则渲染器会自动生成图表,导致图块空白。请参阅 references/visConfig.md;Markdown KPI 和卡片配方见 references/markdown-tiles.md。 - Mustache:从
filters读取筛选器的值。 要在图块标题中显示筛选器的当前值,请使用{{filters.…summary}};controls命名空间用于字段切换器、选择器和 Top-N 控件,用于筛选器时会渲染为空值。在 Markdown 可视化图块中,filters的键为view.field;在仪表板文本图块中,键为控件id。令牌和场景请参阅:references/mustache.md。 query.filters需要使用对象形式——相对日期简写("last 6 months")会抛出 500 错误;请发送{type:"date", kind:"TIME_FOR_INTERVAL_DURATION", ui_type:"PAST", left_side, right_side}。请参阅 references/documents-v2.md。- 没有实际
visConfig的图块会显示为“缺少项目”。 新图块的初始设置为visConfig.visType: null和automaticVis: false,因此不会绘制任何内容。如果用户指定了特定图表或格式,请为每个图块设置明确的visConfig(例如 references/visConfig.md 中的表格配方);否则设置automaticVis: true。创建请求会将每个图块放入order,因此问题始终要在图块的visConfig中修复。 - **“没有可用的图表”**表示内部配置、
visType或prefersChart有误。对于用户要求的图表,请在visConfig.visConfig.config下发送 references/visConfig.md 中的完整配置;只有在有意使用备用方案时才设置chartType: "table"。 - 每个查询都必须至少包含一个度量值——只有维度的查询会生成空白或无意义的图块(例如只有月份而没有数据)。
- 存在
pivots数组时,布尔筛选器可能会被静默丢弃(已报告的 Omni bug)。如果布尔筛选器未生效,请移除透视并再次测试。 - 使用
identifier,不要使用id——从v2-create/ 补丁响应或omni documents list记录中获取文档的identifier。 - 不要使用
omni unstable documents-import更新现有仪表板——导入会创建新文档,且可能丢弃新添加的图块。请在现有文档上使用草稿流程。 - 不要保存无效的查询级筛选器——如果
omni query run对图块查询筛选器返回服务端解析错误,请先验证一次未筛选的基础查询。不要将该无效筛选器保存到图块中。如果仪表板级控件可以满足需求,请使用该方案并通过读回进行验证;否则保持仪表板不变并报告阻碍。 - 限制失败更新的重试次数——如果补丁返回验证错误,最多只进行一次修正后重试。不要反复尝试不同的筛选器语法或循环调用端点。由于编辑是在草稿上进行的,恢复很简单:丢弃草稿(
omni documents discard-draft <identifier>),并报告保留了哪些内容——已发布的文档从未被修改。
前提条件
# Verify the Omni CLI is installed — if not, ask the user to install it
# See: https://github.com/exploreomni/cli#readme
command -v omni >/dev/null || echo "ERROR: Omni CLI is not installed."
# Verify the CLI has the v2 documents commands — if not, ask the user to upgrade it
omni documents v2-get --help >/dev/null 2>&1 || echo "ERROR: CLI is too old for the v2 documents API — upgrade it."
# Show available profiles and select the appropriate one
omni config show
# If multiple profiles exist, ask the user which to use, then switch:
omni config use <profile-name>
# Confirm the active profile is authenticated and inspect your permissions:
omni whoami whoami
身份验证:如果
whoami或任何调用返回 401,请让用户运行! omni config login <profile>。有关配置 Profile、何时可以自行运行登录,以及--schema的信息,请参阅omni-api-conventions规则。
发现命令
omni documents --help # Document operations (v2-* + lifecycle)
omni dashboards --help # Dashboard downloads
omni models yaml-create --help # Writing model YAML
omni documents v2-create --schema # Body schema + example (add --depth 1 for an overview, --field PATH to drill in)
提示:使用
-o json强制输出结构化内容,以便进行程序化解析;使用-o human输出易读的表格。默认值为auto(在 TTY 中输出人类可读内容,管道传输时输出 JSON)。--compact会移除缩进,便于通过管道传输。
命令
始终使用 documents v2-* 命令构建和编辑文档。 无论何种情况,都不要回退到 v1 的 documents create/get 路径来构建、读取或更改文档;v2 草稿流程已涵盖所有这些操作。
| 操作 | 命令 |
|---|---|
| 创建文档 | documents v2-create |
| 读取文档 / 草稿状态 | documents v2-get / v2-get-draft |
| 编辑文档(图块、控件、布局、设置、重命名) | documents v2-patch-draft(+ v2-patch-draft-by-identifier) |
| 获取工作簿模型 ID | documents v2-get(已发布文档)或 v2-get-draft(对应草稿)中的 workbookModelId;也可通过 documents list-drafts 获取 |
| 重命名文档标识符(slug) | documents v2-update-identifier <identifier> |
| 将图块绑定到查询模型或解除绑定 | 在草稿上使用 documents v2-bind-query-model / v2-unbind-query-model(CLI ≥ 1.1.2);请参阅 references/documents-v2.md |
| 发布草稿 | documents v2-publish-draft |
| 读取或编辑 应用(HTML,而非仪表板) | documents get-app / put-app / patch-app / remove-app(以及草稿和自动草稿形式)——alpha,CLI ≥ 1.4.0;请参阅 references/documents-v2.md |
少数文档管理操作没有 v2 形式——它们不是 v2 构建流程的替代方案,只是完成相应工作的唯一命令:documents list / list-drafts(查找文档和草稿)、documents discard-draft(放弃草稿)、documents delete / move / duplicate(生命周期管理)、documents get-queries(提取图块中可运行的查询以进行验证)、dashboards download / download-status、documents upgrade-layout(将经典布局仪表板升级为高级布局;此操作会发布,因此请先确认),以及 models yaml-create / validate(模型写入)。
仪表板架构
Omni 仪表板由文档构成。文档的 v2 状态是一个包含四个切片的信封:queryPresentations、controls、containers 和 settings(标注见 references/documents-v2.md):
- 磁贴位于
queryPresentations.data中,以记录键("1"、"2"……)为键;order表示标签页顺序。磁贴键必须是数字字符串("1"、"42")——像"revenue_kpi"或"probe"这样的描述性键会被拒绝,并返回400 … Invalid key in record。请在构建脚本中跟踪磁贴与含义的映射,而不是将其写在键中。 - 筛选器和交互式控件共用一个映射:
controls(见 references/controls.md)。与磁贴键不同,此处的控件 ID 可以是任意字符串("date_filter"、"granularity")——不要将这种自由度用于磁贴键,反之亦然。 - 布局是
containers树——只有容器引用了磁贴,该磁贴才会渲染(见 references/containers.md)。 - 每个文档还包含一个工作簿模型,用于管理各仪表板的模型变更(见 references/workbook-model.md)。
通过草稿编辑文档:v2-patch-draft 会创建草稿并应用补丁;在执行 v2-publish-draft 之前,已发布的文档不会受到影响。v2-get 返回已发布状态。v2-get-draft 返回草稿状态;使用草稿自身的 ID 调用 v2-get 也会返回该状态(响应中的 draftOf 表示对应的文档)。草稿还可以绑定到模型分支(见 references/branch-bound-drafts.md)。
基于主题构建查询
尽可能让每个磁贴的查询都基于主题构建:将查询的 table 设为主题的基础视图,并传入 join_paths_from_topic_name: <topic>,同时在呈现配置中设置 topicName: <topic>(呈现配置级别的 topicName 是磁贴专属的——独立查询没有对应配置)。随后,联接视图字段会通过基础视图对应的主题联接映射解析。完整结构——联接映射如何关联到联接视图字段、示例,以及如何使用 omni models get-topic 验证(base_view_name/join_via_map)——请参见 omni-query 中的 Build queries on a topic。
未基于主题构建的磁贴仍可运行(裸基础视图查询或使用全局 relationships 文件的原始 SQL userEditedSQL 磁贴),但受限查询者和查看者无法看到它。上文的两个已知问题规则说明了何时应提问以及何时应建议使用 Access Boost。要编写原始 SQL 磁贴并完成端到端的权限提升,请参见 references/queryPresentations.md → Raw-SQL tiles;有关权限提升命令和组织级前提条件,请参见 omni-admin → Document Permissions(使用带有 accessBoost 的 add-permits,或使用 update-permission-settings)。
编写限制(不同于上述可见性限制):如果你是受限查询者,就完全无法编写非主题查询/原始 SQL 磁贴——QUERY_TOPICS 只能查询主题——因此你构建的每个磁贴都必须基于主题。非主题查询 + Access Boost 的路径仅适用于由 QUERY_FULL_MODEL 作者为受限受众构建磁贴的情况。(使用 whoami 检查;参见 omni-admin → Model Roles & Caller Access。)
文档管理
使用 documents v2-create 创建文档,可以仅指定名称,也可以通过一个 --body 一次性传入完整信封(磁贴、控件、设置)。通过草稿补丁重命名(使用 --name,然后发布)。使用 documents delete / move / duplicate 删除、移动和复制文档;只有已发布的文档才能复制。示例、创建请求体的关键要点以及端到端构建工作流,见 references/document-lifecycle.md。
更新现有仪表板
编辑通过草稿流程进行;在发布之前,不会改动已发布的仪表板:
- 使用
omni documents v2-get <identifier> > doc.json读取当前状态;如果已有草稿,则使用v2-get-draft。如果没有文档标识符,请先通过omni-content-explorer或omni documents list查找文档。 - 编写补丁,只发送有改动的内容。补丁按键合并;
order数组和containers则会被完整替换。要删除磁贴,请将其键设为null,并从order中移除。 - 打开草稿:使用
omni documents v2-patch-draft <identifier> --body @patch.json,并在请求体中加入summary,同时保留返回的draftIdentifier。--body @file无需 shell 引号,并会在发送前检查 JSON。 - 验证草稿:使用
v2-get-draft <identifier> <draftIdentifier>读回草稿,并运行受影响的查询(请参阅验证循环)。使用v2-patch-draft-by-identifier <identifier> <draftIdentifier>迭代更新。 - 使用
omni documents v2-publish-draft <identifier>发布,然后分享链接(请参阅URL 模式)。要放弃草稿,请使用omni documents discard-draft <identifier>;已发布的文档不会受到影响。
错误映射、合并语义详情和操作示例见 references/updating-dashboards.md。
更新仪表板的模型
仪表板专属字段应放在文档的工作簿模型中,该模型扩展共享模型。首先根据你的访问权限(omni whoami whoami --model-id <sharedModelId>)确定新字段应放在哪里:表计算、共享模型的分支,或此工作簿模型。切勿写入架构模型。仅存在于尚未合并的分支中的字段需要使用绑定分支的草稿。使用 "mode": "extension" 编写工作簿模型 YAML;默认的组合模式会将你省略的所有字段标记为已忽略。决策步骤、yaml-create 操作示例、基于新字段构建磁贴的顺序,以及验证方法,详见:references/workbook-model.md。
仪表板筛选器和控件
筛选器和交互式控件共用一个封装切片:controls: {data, order}。每个条目都是 {config, map}——config 保存筛选器或控件定义,map 可选,用于按磁贴限定其范围。创建时即可包含这些内容,也可以稍后通过补丁添加(控件像磁贴一样按键合并);请求体创建示例见 references/controls.md。
controls.data中的键是任意 ID,且必须与order中的条目一致。- 筛选器类型(日期/字符串/数字/布尔值,均为必需)和交互式控件(字段/时间范围切换器)及其示例,详见 references/controls.md。
map可按磁贴限定控件范围:{"<tileKey>": false}表示排除某个磁贴;{"<tileKey>": "<fieldName>"}表示重新映射字段——筛选器和交互式切换器均适用。- 每个筛选器都必须包含
fieldName,且该值必须是完全限定的字段名(日期筛选器无需添加时间范围括号),否则筛选器不会绑定到任何列。 - 要复用现有仪表板中的筛选器,请使用
omni documents v2-get读回;其controls切片可以原样放入补丁。
应建模,还是用控件? 如果主题涉及的每个工作簿和仪表板都应包含某个筛选器,某个控件会驱动多列或度量阈值,或者某个控件会切换字段使用的列或度量,则应将该筛选器建模为仅用于筛选的字段。其他情况使用仪表板控件。完整判断标准(包括 Restricted Querier 可以执行的操作)见:references/controls.md。
文档设置
settings 是一个浅合并对象:crossfilterEnabled(点击一个图块中的值以筛选其他图块)、facetFilters、refreshInterval(秒;null 表示禁用)、runQueriesOn("current-page" / "all-pages" / null)和 customText(覆盖 {queryError, queryNoResults})。只修改需要变更的键。
布局(容器)
containers 树决定图块和控件的渲染位置:先是保留的 "filter-bar" 堆栈,然后每页各有一个 page 容器,每个容器包含一个由图块堆栈组成的 24 列 grid,并带有 gridPosition {x,y,w,h}。何时发送,以及它会替换整个布局的说明,见上文的“已知问题”。多页仪表板、页面切换器、分组带、图块内控件和尺寸规则:references/containers.md。
URL 模式
创建或找到内容后,务必向用户提供直接链接:
Dashboard: {OMNI_BASE_URL}/dashboards/{identifier}
Workbook: {OMNI_BASE_URL}/w/{identifier}
Draft: {OMNI_BASE_URL}/dashboards/{draftIdentifier}
identifier 来自 v2-create/patch 响应或 omni documents list;draftIdentifier 来自 v2-patch-draft 响应或 omni documents list-drafts。
将 {OMNI_BASE_URL} 替换为活动配置文件或环境中的实际基础 URL,并去掉末尾的斜杠。除非凭据不可用且你明确说明该 URL 是模板,否则不要返回字面占位符字符串。
验证循环
每次构建或更新都必须在发布之前进行验证:图块损坏、字段引用错误和规格配置不当可能会显示“Chart unavailable”或“No data”,且没有 API 错误。
- 使用
omni models validate <modelId>验证模型。 - 使用
omni query run先测试每个查询,包括仪表板将使用的筛选器。 - 检查每个可视化规格:
prefersChart: true、规格位于visConfig.visConfig.config下,并且chartType与其visType和configType匹配。 - 发布前验证草稿:使用
v2-get-draft读取草稿,运行每个图块的查询(omni documents get-queries+omni query run),并报告每个图块的状态和行数。
每个响应中需要检查的内容、完整的可视化规格表、检查清单,以及浏览器可访问时可选的浏览器检查(页面永远不会进入空闲状态,因此有自己的等待规则):references/validation-and-testing.md。
仪表板下载
下载是异步的:使用 omni dashboards download 启动下载,轮询 download-status 直到任务进入终止状态,然后使用 download-file 获取文件。单图块和数据格式、多页仪表板的单页限制,以及“Job failed to render”的含义:references/downloads.md。
文档参考
- Documents API · 仪表板下载 · Query API · Schedules API · 可视化类型
相关技能
- omni-model-explorer — 了解可用字段
- omni-model-builder — 创建共享模型字段
- omni-query — 添加到仪表板前测试查询
- omni-content-explorer — 查找现有仪表板以供参考
- omni-embed — 将已构建的仪表板嵌入外部应用
- omni-admin — 计划交付、收件人和仅限电子邮件的用户