关于 omni-model-explorer
omni-model-explorer 是通过 Omni CLI 探索语义模型的技能,供分析人员和模型维护者了解模型结构与可用字段。它支持检查主题、视图、字段、关系及 YAML,并可评估字段变更对内容的影响。
主要功能
- 01列出模型与主题
- 02检查视图、维度和度量
- 03查看表关系与默认筛选
- 04读取模型 YAML 和 AI 上下文
- 05验证字段变更影响
适用场景
- 01确认某类数据可用于哪些分析
- 02了解视图之间的连接关系
- 03检查主题配置的 AI 上下文
- 04评估移除字段对仪表板的影响
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ exploreomni/ omni-agent-skills --skill omni-model-explorer安装后在 Claude Code 中输入/omni-model-explorer确认已加载。
附带文件evals/evals.json
详细介绍
Omni 模型浏览器
通过 Omni CLI 探索并了解 Omni 语义模型。这是起点 — 在构建、查询或修改任何内容之前,先了解现有内容。
提示:从 Shared 模型开始 — 它包含经过整理的分析层。
前置条件
配置 Omni CLI:
# 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."
# 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
身份验证:配置文件通过 API 密钥或 OAuth 进行身份验证。如果
whoami(或任何调用)返回 401,请转交处理 — 请用户运行! omni config login <profile>(OAuth 2.1 浏览器流程;会在浏览器打开期间阻塞约 2 分钟)。不要在无头/CI 会话中自行运行config login(没有浏览器 → 超时);在本地交互式机器上则可以运行。有关配置文件设置(omni config init --auth oauth)以及如何通过--schema发现命令和请求正文结构,请参阅omni-api-conventions规则。
API 密钥:Settings > API Keys(Organization Admin),或 User Profile > Manage Account > Generate Token(Personal Access Token)。
发现命令
不确定有哪些操作或标志可用时:
omni models --help # List all model operations
omni models <operation> --help # Show flags and positional args
提示:使用
-o json强制输出结构化内容以供程序解析,或使用-o human输出易读的表格。默认值为auto(在 TTY 中输出人类可读内容,通过管道传输时输出 JSON)。
核心工作流
自顶向下探索:列出模型 → 选择模型 → 列出主题 → 检查主题 → 探索视图和字段。
步骤 1:列出可用模型
omni models list
返回模型(位于 records 键下 — {pageInfo, records:[…]},而非顶层),包含 id、name、connectionId 和 modelKind(SCHEMA 或 SHARED)。使用 SHARED 模型 — 它包含经过整理的语义层。
在繁忙的实例上,直接调用会分页(每页 20 条),且结果大多是
name: null的 WORKBOOK 模型 — 不要逐页浏览。 在服务端进行筛选:omni models list --model-kind SHARED --name "<exact name>"可通过一次调用按名称查找共享模型。
如需同时查看每个模型上的活动分支:
omni models list --include activeBranches
响应中的每个模型都会包含一个 branches 数组。每个分支都有一个 id(UUID)和 name — 在其他 API 调用中,将 id 用作 branchId 参数。
步骤 2:列出模型中的主题
主题是查询的入口点。每个主题都会定义一个基础视图,以及可用的联接视图集合。
omni models list-topics <modelId>
返回主题名称、基础视图、标签和说明。列表中混有常规主题和复合主题:复合条目的 is_composite: true,并会在 topics[] 中列出其组成主题(以及在 import_models 中列出任何跨模型导入项),且没有 base_view_name — 因此,对每个条目读取 base_view_name 的代码会得到 undefined。对复合主题执行 get-topic 会返回相同结构,并附带其 views 和 relationships。
步骤 3:检查主题
获取完整详情,包括所有视图、维度、度量、关系和 AI 上下文:
omni models get-topic <modelId> <topicName>
响应包含:
base_view_name— 主表views[]— 所有可访问的视图,每个视图都包含dimensions[]和measures[]relationships[]— 视图之间的联接方式default_filters— 默认应用的筛选条件ai_context— 给 Blobby(Omni 的 AI)的指令- 配置后提供的
sample_queries和 AI 字段选择元数据 - 对于复合主题:成员
topics、shared_views、带有各主题映射的shared_dimensions,以及可寻址的字段范围(@_shared_dimensions_.<name>、@_shared_views_.<view>.<field>、@<topic>.<view>.<field>);不存在base_view_name
步骤 4:读取模型 YAML
如需查看完整的语义模型定义:
# All YAML files
omni models yaml-get <modelId>
# Specific file
omni models yaml-get <modelId> --file-name order_items.view
# Regex filter
omni models yaml-get <modelId> --file-name '.*sales.*'
# From a branch (branchId is a UUID from the list models response)
omni models yaml-get <modelId> --branch-id <branchId>
mode 参数:combined(默认值)会合并架构和共享模型;extension 仅显示共享模型的自定义内容。
files 映射以每个文件的完整存储路径为键(例如 MARTS/order_items.view),而 --file-name 会在读取时按正则表达式匹配。使用 omni-model-builder 编辑时,请复用这个完全相同的键,包括任何文件夹前缀;使用缩短的名称会创建重复项,而不是编辑原文件。
模型架构
Omni 分为三层:
- 架构模型 — 根据数据库自动生成(只读)
- 共享模型 — 分析工程师的自定义内容(维度、度量、标签、主题、AI 上下文)
- 工作簿模型 — 每个仪表板的自定义内容(临时内容,不共享)
探索时,请使用 combined 视图查看所有可用内容。
关键概念
视图对应数据库表。每个视图都包含维度(可分组字段)和度量(聚合)。
主题将视图连接起来,形成可查询的单元,是经过整理的分析起点。主题包含一个基础视图、已连接的视图、默认筛选条件和 AI 上下文。
关系用于定义连接:join_from_view、join_to_view、on_sql、relationship_type(one_to_one、many_to_one、one_to_many、many_to_many)和 join_type(always_left、inner、full_outer)。
字段命名:view_name.field_name;日期粒度使用方括号表示法:orders.created_at[week]。
探索模式
“关于 X,我们有哪些数据?” — 列出主题 → 检查最相关的主题 → 查看视图和字段。
“这些表之间有什么关系?” — 检查主题的 relationships[] — 查看 join_from_view、join_to_view、on_sql 和 relationship_type。
“Y 有哪些可用度量?” — 检查包含视图 Y 的主题 → 查看 measures[] 数组及其 aggregate_type 和 sql 定义。
回退方案:yaml-get 中缺少预期视图
仅当常规探索未能找到结果时,才使用此模式 — 用户指定了某个视图,但它不在 yaml-get 或 get-topic 的响应中,或者某个关系引用了一个未出现的视图。如果 yaml-get 返回了预期内容,请跳过本节。
原因:yaml-get 只会返回当前已加载架构中的视图。如果某个架构处于卸载或非活动状态,其视图就不会显示。get-schemas 调用会列出连接知道的所有架构,包括已卸载和非活动的架构,因此在告知用户“未找到”之前,下一步应先调用它。
两步恢复:
# 1. List every schema (loaded, offloaded, and inactive)
omni models get-schemas <modelId>
# → {"schemas": ["ANALYTICS", "PUBLIC", "STAGING", ...]}
# 2. If the target schema is in the list, load just that schema
omni models yaml-get <modelId> --include-schemas PUBLIC
如果列表中完全没有该架构,这并非延迟加载问题 — 连接可能无权访问该架构,或者该架构尚未同步。请咨询连接管理员。
--include-schemas 的规则:
- 每次调用只能接受一个架构名称 — API 不接受逗号分隔的名称。如需加载多个架构,请逐个加载。
- 设置此参数后,响应只包含属于该架构的视图。即使关系引用了其他架构中的视图,这些关系也会保留。
- 如需限定到某个分支,可在
yaml-get中添加--branch-id <id>,或在get-schemas中添加--branch-id <id>(不同命令的标志名称不同 — 此处与 API 底层使用的大小写形式一致)。
计算字段
模型中的计算字段使用的格式与常规维度/度量不同。字段键为 calc_name,表达式属性为 sql_expression — 而不是 name/sql。
AI 上下文检查
当用户询问 Blobby 对某个主题了解什么时,请检查该主题并报告实际的 AI 配置,不要根据字段名称推断:
omni models get-topic <modelId> <topicName>
omni models yaml-get <modelId> --file-name '<topicName>\.topic'
读取 ai_context、sample_queries 和 AI 字段选择值。根据 CLI/API 的返回结构,get-topic 可能会将这些内容包装在顶层 topic 对象下;如果顶层的 ai_context 为 null,请检查 topic.ai_context,再判断是否不存在。如果 get-topic 未公开完整的 ai_fields 列表,请读取主题 YAML 并报告其中配置的 ai_fields。如果存在,请列出已配置的示例查询名称/提示词,以及这些查询使用的字段。
字段影响分析
在将变更推送到 dbt 之前,评估字段迁移或删除的影响范围:
- 创建模型分支,确保运行验证器检查前字段确实已不存在:
omni models create-branch <modelId> --name "field-impact-<field-name>"
然后,根据正在测试的变更使用相应的设置方式:
- 删除/重命名数据库列:在仓库变更生效后,于分支上刷新架构,然后验证该分支。
- 仅修改模型中的字段:使用
omni models yaml-create将修改后的 YAML 写入分支,并使用yaml-get返回的准确fileName键。
yaml-create 接受 JSON 请求体作为更新内容,不接受单独的 --file-name 或 --branch-id 标志:
omni models yaml-create <modelId> \
--body '{"branchId":"<branchId>","fileName":"public/order_items.view","yaml":"<full modified YAML string>"}'
使用响应以及 yaml-get --branch-id 回读结果,确认文件已写入分支。对于仅修改模型字段的影响分析,请从分支 YAML 中删除该字段自身的定义,但保留现有的依赖字段引用,除非用户计划的变更也会删除这些引用。omni models validate 正是利用这些未解析的引用,找出可能受影响的度量、维度、主题和联接。
除非 yaml-get --branch-id <branchId> 证明目标字段在已有分支中不存在或已重命名,否则不要复用该分支。名称相符但 YAML 未变更的分支不是有效的影响范围分析分支。
- 验证分支设置,再解读内容验证结果:
omni models yaml-get <modelId> --file-name '<viewName>\.view' --branch-id <branchId>
omni models validate <modelId> --branch-id <branchId>
精确验证字段定义,不要对整个文件进行子字符串搜索。例如,删除 dimensions: sale_price: {} 定义后,sql: ${sale_price} 中仍可能出现 sale_price;这是有效的影响测试分支,应报告为依赖引用。如果原字段定义仍出现在分支 YAML 中,请说明分支设置无效,并且不要声称验证器结果代表字段删除的影响。
- 针对已验证的分支运行内容验证器:
omni models content-validator-get <modelId> --branch-id <branchId>
这会返回所有存在已删除字段的失效引用的仪表板和图块。
大型内容集的干净结果可能仅代表引用检查通过。 内容量较大时,验证器会检查字段、视图和主题引用,而不会为每个查询生成执行计划,因此,即使查询引用的字段有效但已无法生成执行计划,也可能显示为干净结果。传入
--force-full-validation true(CLI ≥ 1.3.1)可为每个查询生成执行计划;对于大型模型,此操作会更慢。
- 搜索模型 YAML,查找其他引用(与第 3 步并行运行):
omni models yaml-get <modelId> --file-name '.*'
在响应中搜索字段名称,以查找其他视图、主题和计算字段中的引用。
- 报告:综合分支验证、内容验证器结果(失效的仪表板/图块)和 YAML 搜索结果(模型引用),生成结构化的影响范围报告。分别列出直接字段引用、经由依赖字段产生的连锁引用、原始 SQL 列引用,以及已保存内容的损坏情况。
不要对文档进行分页并逐个检查查询——内容验证器会通过一次调用为你完成此操作。
文档参考
相关技能
- omni-model-builder — 创建或修改视图、主题和字段
- omni-query — 对已发现的字段运行查询
- omni-ai-optimizer — 检查并改进主题上的 AI 上下文